rs6000.c (rs6000_set_up_by_prologue): Make sure the TOC reg (r2) isn't in the set...
authorPat Haugen <pthaugen@us.ibm.com>
Thu, 14 Sep 2017 18:29:44 +0000 (18:29 +0000)
committerPat Haugen <pthaugen@gcc.gnu.org>
Thu, 14 Sep 2017 18:29:44 +0000 (18:29 +0000)
* config/rs6000/rs6000.c (rs6000_set_up_by_prologue): Make sure the TOC
reg (r2) isn't in the set of registers defined in the prologue.

* gcc.target/powerpc/r2_shrink-wrap.c: New.

From-SVN: r252768

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/r2_shrink-wrap.c [new file with mode: 0644]

index 31c9d0afb2b25806fa06340476ac554dfc428a73..b66faebbc15189269c0c1863d914cfbd20955eec 100644 (file)
@@ -1,3 +1,8 @@
+2017-09-14  Pat Haugen  <pthaugen@us.ibm.com>
+
+       * config/rs6000/rs6000.c (rs6000_set_up_by_prologue): Make sure the TOC
+       reg (r2) isn't in the set of registers defined in the prologue.
+
 2017-09-14  Richard Sandiford  <richard.sandiford@linaro.org>
            Alan Hayward  <alan.hayward@arm.com>
            David Sherwood  <david.sherwood@arm.com>
index 3fee22836feedfb8eecf8a041683278f6a890f06..6dd726e4de4b585ec293317729f4a529994292d3 100644 (file)
@@ -37804,6 +37804,11 @@ rs6000_set_up_by_prologue (struct hard_reg_set_container *set)
     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);
 }
 
 \f
index ad6ef296cbb7f7508cc9875e08d4a81e02d6a09e..005c0b9882c4625d5dd736200dc58e9df6a9275c 100644 (file)
@@ -1,3 +1,7 @@
+2017-09-14  Pat Haugen  <pthaugen@us.ibm.com>
+
+       * gcc.target/powerpc/r2_shrink-wrap.c: New.
+
 2017-09-14  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
        * gcc.target/powerpc/fold-vec-ld-longlong.c: Add
diff --git a/gcc/testsuite/gcc.target/powerpc/r2_shrink-wrap.c b/gcc/testsuite/gcc.target/powerpc/r2_shrink-wrap.c
new file mode 100644 (file)
index 0000000..b81b9b1
--- /dev/null
@@ -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" } } */