diff mbox

[PR61605,2/2] Use fuse-caller-save info in pass_cprop_hardreg

Message ID 543F8C67.3020402@mentor.com
State New
Headers show

Commit Message

Tom de Vries Oct. 16, 2014, 9:14 a.m. UTC
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

Comments

Jeff Law Oct. 16, 2014, 9:57 p.m. UTC | #1
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
Joey Ye Nov. 3, 2014, 8:20 a.m. UTC | #2
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
>
diff mbox

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.

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,
+				  &regs_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