mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-01-09 17:35:42 +08:00
flow.c (propagate_one_insn): Preserve live-at-end registers across tail calls.
* flow.c (propagate_one_insn): Preserve live-at-end registers across tail calls. From-SVN: r68544
This commit is contained in:
parent
4dbda6f04a
commit
d444b5e897
@ -1,3 +1,8 @@
|
||||
2003-06-26 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* flow.c (propagate_one_insn): Preserve live-at-end registers
|
||||
across tail calls.
|
||||
|
||||
2003-06-26 J"orn Rennecke <joern.rennecke@superh.com>
|
||||
|
||||
* reload.c (can_reload_into): New function.
|
||||
|
13
gcc/flow.c
13
gcc/flow.c
@ -1770,8 +1770,10 @@ propagate_one_insn (pbi, insn)
|
||||
|
||||
if (GET_CODE (insn) == CALL_INSN)
|
||||
{
|
||||
int i;
|
||||
regset live_at_end;
|
||||
bool sibcall_p;
|
||||
rtx note, cond;
|
||||
int i;
|
||||
|
||||
cond = NULL_RTX;
|
||||
if (GET_CODE (PATTERN (insn)) == COND_EXEC)
|
||||
@ -1796,9 +1798,14 @@ propagate_one_insn (pbi, insn)
|
||||
mark_set_1 (pbi, CLOBBER, XEXP (XEXP (note, 0), 0),
|
||||
cond, insn, pbi->flags);
|
||||
|
||||
/* Calls change all call-used and global registers. */
|
||||
/* Calls change all call-used and global registers; sibcalls do not
|
||||
clobber anything that must be preserved at end-of-function. */
|
||||
|
||||
sibcall_p = SIBLING_CALL_P (insn);
|
||||
live_at_end = EXIT_BLOCK_PTR->global_live_at_start;
|
||||
for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
|
||||
if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
|
||||
if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i)
|
||||
&& ! (sibcall_p && REGNO_REG_SET_P (live_at_end, i)))
|
||||
{
|
||||
/* We do not want REG_UNUSED notes for these registers. */
|
||||
mark_set_1 (pbi, CLOBBER, regno_reg_rtx[i], cond, insn,
|
||||
|
Loading…
Reference in New Issue
Block a user