Message ID | 543F8C67.3020402@mentor.com |
---|---|
State | New |
Headers | show |
On 10/16/14 03:14, Tom de Vries wrote: > Eric, > > this patch is the second half of the fix for PR61605. > > It make sure in pass_cprop_hardreg that, if available we use the > call-specific information provided by fuse-caller-save, rather than the > generic regs_invalidated_by_call info. > > The 2 patches together allow an insn to removed from the > gcc.target/i386/fuse-caller-save.c testcase, which is updated > accordingly in this patch. > > Bootstrapped and reg-tested on x86_64. > > OK for trunk? > > Thanks, > - Tom > > 0002-Use-fuse-caller-save-info-in-cprop-hardreg.patch > > > 2014-10-13 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. OK. Jeff
Tom, This patch broke arm thumb1 bootstrap. Please check details at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63718 Best Regards Joey On Fri, Oct 17, 2014 at 5:57 AM, Jeff Law <law@redhat.com> wrote: > On 10/16/14 03:14, Tom de Vries wrote: >> >> Eric, >> >> this patch is the second half of the fix for PR61605. >> >> It make sure in pass_cprop_hardreg that, if available we use the >> call-specific information provided by fuse-caller-save, rather than the >> generic regs_invalidated_by_call info. >> >> The 2 patches together allow an insn to removed from the >> gcc.target/i386/fuse-caller-save.c testcase, which is updated >> accordingly in this patch. >> >> Bootstrapped and reg-tested on x86_64. >> >> OK for trunk? >> >> Thanks, >> - Tom >> >> 0002-Use-fuse-caller-save-info-in-cprop-hardreg.patch >> >> >> 2014-10-13 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. > > OK. > Jeff >
2014-10-13 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. diff --git a/gcc/regcprop.c b/gcc/regcprop.c index c71de98..304820f 100644 --- a/gcc/regcprop.c +++ b/gcc/regcprop.c @@ -1000,6 +1000,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)) { @@ -1018,8 +1019,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); diff --git a/gcc/testsuite/gcc.target/i386/fuse-caller-save.c b/gcc/testsuite/gcc.target/i386/fuse-caller-save.c index 7e2b11d..a6e8f1c 100644 --- a/gcc/testsuite/gcc.target/i386/fuse-caller-save.c +++ b/gcc/testsuite/gcc.target/i386/fuse-caller-save.c @@ -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 } } */ -- 1.9.1