[PATCH, rs6000] Don't mark the TOC reg as set up in prologue

Pat Haugen pthaugen@linux.vnet.ibm.com
Thu Sep 14 16:53:00 GMT 2017


On 09/14/2017 11:35 AM, Segher Boessenkool wrote:
> On Thu, Sep 14, 2017 at 10:18:55AM -0500, Pat Haugen wrote:
>> --- gcc/config/rs6000/rs6000.c	(revision 252029)
>> +++ gcc/config/rs6000/rs6000.c	(working copy)
>> @@ -37807,6 +37807,11 @@ rs6000_set_up_by_prologue (struct hard_r
>>      add_to_hard_reg_set (&set->set, Pmode, RS6000_PIC_OFFSET_TABLE_REGNUM);
>>    if (cfun->machine->split_stack_argp_used)
>>      add_to_hard_reg_set (&set->set, Pmode, 12);
>> +
>> +  /* Make sure the hard reg set doesn't include r2, which was possibly added
>> +     via PIC_OFFSET_TABLE_REGNUM.  */
>> +  if (TARGET_TOC)
>> +    remove_from_hard_reg_set (&set->set, Pmode, TOC_REGNUM);
>>  }
> Hrm, can't you simply not add it in the first place?  Just a few lines up?

As we discussed offline, that is RS6000_PIC_OFFSET_TABLE_REGNUM (i.e.
r30). PIC_OFFSET_REGNUM is added in shrink-wrap.c:try_shrink_wrapping().

I noticed that the test fails on 32-bit because there's no prologue and
hence no shrink-wrapping to be performed. Following is updated testcase
which limits it to 64-bit. Ok?

-Pat

Index: gcc/testsuite/gcc.target/powerpc/r2_shrink-wrap.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/r2_shrink-wrap.c	(nonexistent)
+++ gcc/testsuite/gcc.target/powerpc/r2_shrink-wrap.c	(working copy)
@@ -0,0 +1,17 @@
+/* { dg-do compile { target { lp64 } } } */
+/* { dg-options "-O2 -fdump-rtl-pro_and_epilogue" } */
+
+/* Verify we move the prologue past the TOC reference of 'j' and
shrink-wrap
+   the function. */
+void bar();
+int j;
+void foo(int i)
+{
+  j = i;
+  if (i > 0)
+    {
+      bar();
+    }
+}
+
+/* { dg-final { scan-rtl-dump-times "Performing shrink-wrapping" 1
"pro_and_epilogue" } } */



More information about the Gcc-patches mailing list