flow.c (propagate_one_insn): Kill function return value registers across tail calls.

* flow.c (propagate_one_insn): Kill function return value
        registers across tail calls.

From-SVN: r68546
This commit is contained in:
Richard Henderson 2003-06-26 13:45:18 -07:00 committed by Richard Henderson
parent d444b5e897
commit 99af0d26bd
2 changed files with 8 additions and 2 deletions

View File

@ -1,5 +1,8 @@
2003-06-26 Richard Henderson <rth@redhat.com>
* flow.c (propagate_one_insn): Kill function return value
registers across tail calls.
* flow.c (propagate_one_insn): Preserve live-at-end registers
across tail calls.

View File

@ -1799,13 +1799,16 @@ propagate_one_insn (pbi, insn)
cond, insn, pbi->flags);
/* Calls change all call-used and global registers; sibcalls do not
clobber anything that must be preserved at end-of-function. */
clobber anything that must be preserved at end-of-function,
except for return values. */
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)
&& ! (sibcall_p && REGNO_REG_SET_P (live_at_end, i)))
&& ! (sibcall_p
&& REGNO_REG_SET_P (live_at_end, i)
&& !FUNCTION_VALUE_REGNO_P (i)))
{
/* We do not want REG_UNUSED notes for these registers. */
mark_set_1 (pbi, CLOBBER, regno_reg_rtx[i], cond, insn,