mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-15 16:10:41 +08:00
Use fuse-caller-save info in cprop-hardreg
2014-10-17 Tom de Vries <tom@codesourcery.com> PR rtl-optimization/61605 * regcprop.c (copyprop_hardreg_forward_1): Use regs_invalidated_by_this_call instead of regs_invalidated_by_call. * gcc.target/i386/fuse-caller-save.c: Update addition check. Add movl absence check. From-SVN: r216365
This commit is contained in:
parent
8c8fe66309
commit
8d696651ab
@ -1,3 +1,9 @@
|
||||
2014-10-17 Tom de Vries <tom@codesourcery.com>
|
||||
|
||||
PR rtl-optimization/61605
|
||||
* regcprop.c (copyprop_hardreg_forward_1): Use
|
||||
regs_invalidated_by_this_call instead of regs_invalidated_by_call.
|
||||
|
||||
2014-10-17 Tom de Vries <tom@codesourcery.com>
|
||||
|
||||
PR rtl-optimization/61605
|
||||
|
@ -1005,6 +1005,7 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
|
||||
unsigned int set_nregs = 0;
|
||||
unsigned int regno;
|
||||
rtx exp;
|
||||
HARD_REG_SET regs_invalidated_by_this_call;
|
||||
|
||||
for (exp = CALL_INSN_FUNCTION_USAGE (insn); exp; exp = XEXP (exp, 1))
|
||||
{
|
||||
@ -1023,8 +1024,11 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
|
||||
}
|
||||
}
|
||||
|
||||
get_call_reg_set_usage (insn,
|
||||
®s_invalidated_by_this_call,
|
||||
regs_invalidated_by_call);
|
||||
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
|
||||
if ((TEST_HARD_REG_BIT (regs_invalidated_by_call, regno)
|
||||
if ((TEST_HARD_REG_BIT (regs_invalidated_by_this_call, regno)
|
||||
|| HARD_REGNO_CALL_PART_CLOBBERED (regno, vd->e[regno].mode))
|
||||
&& (regno < set_regno || regno >= set_regno + set_nregs))
|
||||
kill_value_regno (regno, 1, vd);
|
||||
|
@ -1,3 +1,9 @@
|
||||
2014-10-17 Tom de Vries <tom@codesourcery.com>
|
||||
|
||||
PR rtl-optimization/61605
|
||||
* gcc.target/i386/fuse-caller-save.c: Update addition check. Add movl
|
||||
absence check.
|
||||
|
||||
2014-10-17 Markus Trippelsdorf <markus@trippelsdorf.de>
|
||||
|
||||
PR middle-end/61848
|
||||
|
@ -20,5 +20,13 @@ foo (int y)
|
||||
/* { dg-final { scan-assembler-not "push" } } */
|
||||
/* { dg-final { scan-assembler-not "pop" } } */
|
||||
|
||||
/* Check that addition uses dx. */
|
||||
/* { dg-final { scan-assembler-times "addl\t%\[re\]?dx, %\[re\]?ax" 1 } } */
|
||||
/* PR61605. If the first argument register and the return register differ, then
|
||||
bar leaves the first argument register intact. That means in foo that the
|
||||
first argument register still contains y after bar has been called, and
|
||||
there's no need to copy y to a different register before the call, to be able
|
||||
to use it after the call.
|
||||
Check that the copy is absent. */
|
||||
/* { dg-final { scan-assembler-not "movl" { target { ! ia32 } } } } */
|
||||
|
||||
/* Check that addition uses di (in case of no copy) or dx (in case of copy). */
|
||||
/* { dg-final { scan-assembler-times "addl\t%\[re\]?d\[ix\], %\[re\]?ax" 1 } } */
|
||||
|
Loading…
x
Reference in New Issue
Block a user