haifa-sched.c (create_reg_dead_note): Detect and handle another case where we kill more regs after sched than were...

* haifa-sched.c (create_reg_dead_note): Detect and handle another
        case where we kill more regs after sched than were killed before
        sched.
        * sched.c (create_reg_dead_note): Similarly.

From-SVN: r17183
This commit is contained in:
Jeff Law 1997-12-22 01:55:49 -07:00
parent 1d88b804fb
commit 04029ca245
2 changed files with 23 additions and 0 deletions

View file

@ -4467,6 +4467,23 @@ create_reg_dead_note (reg, insn)
while (reg_note_regs < regs_killed)
{
link = XEXP (link, 1);
/* LINK might be zero if we killed more registers after scheduling
than before, and the last hard register we kill is actually
multiple hard regs.
This is normal for interblock scheduling, so deal with it in
that case, else abort. */
if (link == NULL_RTX && current_nr_blocks <= 1)
abort ();
else if (link == NULL_RTX)
{
link = rtx_alloc (EXPR_LIST);
PUT_REG_NOTE_KIND (link, REG_DEAD);
XEXP (link, 0) = gen_rtx (REG, word_mode, 0);
XEXP (link, 1) = NULL_RTX;
}
reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
: HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),
GET_MODE (XEXP (link, 0))));

View file

@ -2218,6 +2218,12 @@ create_reg_dead_note (reg, insn)
GET_MODE (XEXP (link, 0))));
while (reg_note_regs < regs_killed)
{
/* LINK might be zero if we killed more registers after scheduling
than before, and the last hard register we kill is actually
multiple hard regs. */
if (link == NULL_RTX)
abort ();
link = XEXP (link, 1);
reg_note_regs += (REGNO (XEXP (link, 0)) >= FIRST_PSEUDO_REGISTER ? 1
: HARD_REGNO_NREGS (REGNO (XEXP (link, 0)),