rs6000: Rewrite rs6000_reg_live_or_pic_offset_p
authorSegher Boessenkool <segher@kernel.crashing.org>
Sat, 31 Oct 2015 19:50:09 +0000 (20:50 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Sat, 31 Oct 2015 19:50:09 +0000 (20:50 +0100)
This function is quite a puzzle; untangle it.  No functional change.

2015-10-31  Segher Boessenkool  <segher@kernel.crashing.org>

* config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p): Rewrite.

From-SVN: r229634

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index c4ad5e4ee8d4b5bf977280b12372568de050e996..ff4a7ff7ee414875abc818420286ec36cd7c6c13 100644 (file)
@@ -1,3 +1,7 @@
+2015-10-31  Segher Boessenkool  <segher@kernel.crashing.org>
+
+       * config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p): Rewrite.
+
 2015-10-31  Segher Boessenkool  <segher@kernel.crashing.org>
 
        * config/rs6000/rs6000.c (rs6000_reg_live_or_pic_offset_p): Use the
index 75ddaa2d3fc57cde020a8ad88df6d2bb043b8b5f..271c3f91b4a72a406f1b1adbbdd8bc4772bf75df 100644 (file)
@@ -22021,22 +22021,27 @@ save_reg_p (int r)
 static bool
 rs6000_reg_live_or_pic_offset_p (int reg)
 {
+  /* We need to mark the PIC offset register live for the same conditions
+     as it is set up, or otherwise it won't be saved before we clobber it.  */
+
+  if (reg == RS6000_PIC_OFFSET_TABLE_REGNUM && !TARGET_SINGLE_PIC_BASE)
+    {
+      if (TARGET_TOC && TARGET_MINIMAL_TOC
+         && (crtl->calls_eh_return
+             || df_regs_ever_live_p (reg)
+             || get_pool_size ()))
+       return true;
+
+      if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
+         && flag_pic)
+       return true;
+    }
+
   /* If the function calls eh_return, claim used all the registers that would
-     be checked for liveness otherwise.  This is required for the PIC offset
-     register with -mminimal-toc on AIX, as it is advertised as "fixed" for
-     register allocation purposes in this case.  */
-
-  return (((crtl->calls_eh_return || df_regs_ever_live_p (reg))
-           && (!call_used_regs[reg]
-               || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
-                  && !TARGET_SINGLE_PIC_BASE
-                   && TARGET_TOC && TARGET_MINIMAL_TOC)))
-          || (reg == RS6000_PIC_OFFSET_TABLE_REGNUM
-             && !TARGET_SINGLE_PIC_BASE
-              && ((DEFAULT_ABI == ABI_V4 && flag_pic != 0)
-                  || (DEFAULT_ABI == ABI_DARWIN && flag_pic)
-                 || (TARGET_TOC && TARGET_MINIMAL_TOC
-                     && get_pool_size () != 0))));
+     be checked for liveness otherwise.  */
+
+  return ((crtl->calls_eh_return || df_regs_ever_live_p (reg))
+         && !call_used_regs[reg]);
 }
 
 /* Return the first fixed-point register that is required to be