aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorSteve Christiansen <smc@us.ibm.com>2001-11-07 06:24:46 +0000
committerRichard Henderson <rth@gcc.gnu.org>2001-11-06 22:24:46 -0800
commitbc532bf72b5c4f37de75c7ef08a364cfd491f7f2 (patch)
treec5fddc0c80d6ba84addceb45d48bd84d3fa42ce7 /gcc
parent2a2be25e129c9d24ed6d7eeb5b2cab6c630a2d5b (diff)
downloadgcc-bc532bf72b5c4f37de75c7ef08a364cfd491f7f2.zip
gcc-bc532bf72b5c4f37de75c7ef08a364cfd491f7f2.tar.gz
gcc-bc532bf72b5c4f37de75c7ef08a364cfd491f7f2.tar.bz2
* loop.c (loop_regs_scan): Don't invalidate PIC register.
From-SVN: r46817
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/loop.c17
2 files changed, 16 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3d76402..ab7b2fa 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/loop.c b/gcc/loop.c
index 8b2f8da..bc22852 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -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