rtlanal.c (rtx_unstable_p, [...]): Don't consider pic register stable if PIC_OFFSET_T...
authorRichard Henderson <rth@cygnus.com>
Tue, 24 Oct 2000 23:01:11 +0000 (16:01 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Tue, 24 Oct 2000 23:01:11 +0000 (16:01 -0700)
        * rtlanal.c (rtx_unstable_p, rtx_varies_p): Don't consider pic
        register stable if PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.

From-SVN: r37040

gcc/ChangeLog
gcc/rtlanal.c

index 9ab283a5966fa42ce632659920be66ff4837e8d2..e4c278bf4123bb6ad6096f569228fdc7497e4e3a 100644 (file)
@@ -1,3 +1,8 @@
+2000-10-24  Richard Henderson  <rth@cygnus.com>
+
+       * rtlanal.c (rtx_unstable_p, rtx_varies_p): Don't consider pic
+       register stable if PIC_OFFSET_TABLE_REG_CALL_CLOBBERED.
+
 2000-10-24  Aldy Hernandez  <aldyh@redhat.com>
 
         * gcse.c (cprop_insn): do not propagate constants into jump_insn
index 52a430b12ff8a1ced2e35c02201ca34120206e17..88b49fe649eff498ec0da97dc8c1d40d0b45c47d 100644 (file)
@@ -70,9 +70,17 @@ rtx_unstable_p (x)
 
     case REG:
       /* As in rtx_varies_p, we have to use the actual rtx, not reg number.  */
-      return ! (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
-               || x == arg_pointer_rtx || x == pic_offset_table_rtx
-               || RTX_UNCHANGING_P (x));
+      if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
+         || x == arg_pointer_rtx || RTX_UNCHANGING_P (x))
+       return 0;
+#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
+      /* ??? When call-clobbered, the value is stable modulo the restore
+        that must happen after a call.  This currently screws up local-alloc
+        into believing that the restore is not needed.  */
+      if (x == pic_offset_table_rtx)
+       return 0;
+#endif
+      return 1;
 
     case ASM_OPERANDS:
       if (MEM_VOLATILE_P (x))
@@ -135,8 +143,17 @@ rtx_varies_p (x)
         and arg pointers and not just the register number in case we have
         eliminated the frame and/or arg pointer and are using it
         for pseudos.  */
-      return ! (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
-               || x == arg_pointer_rtx || x == pic_offset_table_rtx);
+      if (x == frame_pointer_rtx || x == hard_frame_pointer_rtx
+         || x == arg_pointer_rtx)
+       return 0;
+#ifndef PIC_OFFSET_TABLE_REG_CALL_CLOBBERED
+      /* ??? When call-clobbered, the value is stable modulo the restore
+        that must happen after a call.  This currently screws up local-alloc
+        into believing that the restore is not needed.  */
+      if (x == pic_offset_table_rtx)
+       return 0;
+#endif
+      return 1;
 
     case LO_SUM:
       /* The operand 0 of a LO_SUM is considered constant