* loop.c (loop_regs_scan): Don't invalidate PIC register.
authorSteve Christiansen <smc@us.ibm.com>
Wed, 7 Nov 2001 06:24:46 +0000 (06:24 +0000)
committerRichard Henderson <rth@gcc.gnu.org>
Wed, 7 Nov 2001 06:24:46 +0000 (22:24 -0800)
From-SVN: r46817

gcc/ChangeLog
gcc/loop.c

index 3d76402fec9678f7794bad33ba46a5c281bca996..ab7b2fad794bd9442881b4357c391d689a3c2a82 100644 (file)
@@ -1,3 +1,7 @@
+2001-11-06  Steve Christiansen  <smc@us.ibm.com>
+
+       * loop.c (loop_regs_scan):  Don't invalidate PIC register.
+
 2001-11-06  Eric Christopher  <echristo@redhat.com>
 
        * config/mips/mips.md(movdf_internal2): Add constraints for float
index 8b2f8daf01374086f71ee55bace27bb4ed684751..bc2285238ecd34613a98fe820db2024f1922d7a6 100644 (file)
@@ -8819,11 +8819,18 @@ loop_regs_scan (loop, extra_size)
        memset (last_set, 0, regs->num * sizeof (rtx));
     }
 
-  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
-    {
-      regs->array[i].may_not_optimize = 1;
-      regs->array[i].set_in_loop = 1;
-    }
+  /* Invalidate all hard registers clobbered by calls.  With one exception:
+     a call-clobbered PIC register is still function-invariant for our
+     purposes, since we can hoist any PIC calculations out of the loop.
+     Thus the call to rtx_varies_p.  */
+  if (LOOP_INFO (loop)->has_call)
+    for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
+      if (TEST_HARD_REG_BIT (regs_invalidated_by_call, i)
+          && rtx_varies_p (gen_rtx_REG (Pmode, i), /*for_alias=*/1))
+        {
+          regs->array[i].may_not_optimize = 1;
+          regs->array[i].set_in_loop = 1;
+        }
 
 #ifdef AVOID_CCMODE_COPIES
   /* Don't try to move insns which set CC registers if we should not