Fix sched REG_DEAD note handling bug found by post-reload-flow pass.
* sched.c (update_flow_info): Add code to ! found_orig_dest case to handle deleted no-op moves of hard registers. * haifa-sched.c (update_flow_info): Likewise. From-SVN: r23431
This commit is contained in:
parent
839366ddec
commit
faff4ab8c5
@ -1,3 +1,9 @@
|
||||
Thu Oct 29 19:05:17 1998 Jim Wilson <wilson@cygnus.com>
|
||||
|
||||
* sched.c (update_flow_info): Add code to ! found_orig_dest case to
|
||||
handle deleted no-op moves of hard registers.
|
||||
* haifa-sched.c (update_flow_info): Likewise.
|
||||
|
||||
Thu Oct 29 18:07:47 1998 Jeffrey A Law (law@cygnus.com)
|
||||
|
||||
* mips.md (reload_{in,out}{si,di}): Emit a USE of HILO at the end
|
||||
|
@ -8340,7 +8340,27 @@ update_flow_info (notes, first, last, orig_insn)
|
||||
}
|
||||
else if (!found_orig_dest)
|
||||
{
|
||||
/* This should never happen. */
|
||||
int i, regno;
|
||||
|
||||
/* Should never reach here for a pseudo reg. */
|
||||
if (REGNO (orig_dest) >= FIRST_PSEUDO_REGISTER)
|
||||
abort ();
|
||||
|
||||
/* This can happen for a hard register, if the splitter
|
||||
does not bother to emit instructions which would be no-ops.
|
||||
We try to verify that this is the case by checking to see if
|
||||
the original instruction uses all of the registers that it
|
||||
set. This case is OK, because deleting a no-op can not affect
|
||||
REG_DEAD notes on other insns. If this is not the case, then
|
||||
abort. */
|
||||
|
||||
regno = REGNO (orig_dest);
|
||||
for (i = HARD_REGNO_NREGS (regno, GET_MODE (orig_dest)) - 1;
|
||||
i >= 0; i--)
|
||||
if (! refers_to_regno_p (regno + i, regno + i + 1, orig_insn,
|
||||
NULL_PTR))
|
||||
break;
|
||||
if (i >= 0)
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
|
22
gcc/sched.c
22
gcc/sched.c
@ -4174,7 +4174,27 @@ update_flow_info (notes, first, last, orig_insn)
|
||||
}
|
||||
else if (! found_orig_dest)
|
||||
{
|
||||
/* This should never happen. */
|
||||
int i, regno;
|
||||
|
||||
/* Should never reach here for a pseudo reg. */
|
||||
if (REGNO (orig_dest) >= FIRST_PSEUDO_REGISTER)
|
||||
abort ();
|
||||
|
||||
/* This can happen for a hard register, if the splitter
|
||||
does not bother to emit instructions which would be no-ops.
|
||||
We try to verify that this is the case by checking to see if
|
||||
the original instruction uses all of the registers that it
|
||||
set. This case is OK, because deleting a no-op can not affect
|
||||
REG_DEAD notes on other insns. If this is not the case, then
|
||||
abort. */
|
||||
|
||||
regno = REGNO (orig_dest);
|
||||
for (i = HARD_REGNO_NREGS (regno, GET_MODE (orig_dest)) - 1;
|
||||
i >= 0; i--)
|
||||
if (! refers_to_regno_p (regno + i, regno + i + 1, orig_insn,
|
||||
NULL_PTR))
|
||||
break;
|
||||
if (i >= 0)
|
||||
abort ();
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user