aboutsummaryrefslogtreecommitdiff
path: root/gcc/loop.c
diff options
context:
space:
mode:
authorUlrich Weigand <uweigand@de.ibm.com>2002-10-15 14:38:10 +0000
committerUlrich Weigand <uweigand@gcc.gnu.org>2002-10-15 14:38:10 +0000
commit2d34c587907abe84bc4af668e18b5293e531e66e (patch)
treea5f854079aaa6b4a3eba047321597644ab46094b /gcc/loop.c
parent38364bd2f572728a98625b490bf3bc427f367a91 (diff)
downloadgcc-2d34c587907abe84bc4af668e18b5293e531e66e.zip
gcc-2d34c587907abe84bc4af668e18b5293e531e66e.tar.gz
gcc-2d34c587907abe84bc4af668e18b5293e531e66e.tar.bz2
re PR rtl-optimization/7409 (loop optimization)
PR opt/7409 * loop.c (loop_regs_scan): Mark registers used for function argument passing as MAY_NOT_OPTIMIZE. From-SVN: r58158
Diffstat (limited to 'gcc/loop.c')
-rw-r--r--gcc/loop.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/loop.c b/gcc/loop.c
index d6b3a80..be4b12d 100644
--- a/gcc/loop.c
+++ b/gcc/loop.c
@@ -9676,6 +9676,25 @@ loop_regs_scan (loop, extra_size)
if (GET_CODE (insn) == CODE_LABEL || GET_CODE (insn) == JUMP_INSN)
memset (last_set, 0, regs->num * sizeof (rtx));
+
+ /* Invalidate all registers used for function argument passing.
+ We check rtx_varies_p for the same reason as below, to allow
+ optimizing PIC calculations. */
+ if (GET_CODE (insn) == CALL_INSN)
+ {
+ rtx link;
+ for (link = CALL_INSN_FUNCTION_USAGE (insn);
+ link;
+ link = XEXP (link, 1))
+ {
+ rtx op, reg;
+
+ if (GET_CODE (op = XEXP (link, 0)) == USE
+ && GET_CODE (reg = XEXP (op, 0)) == REG
+ && rtx_varies_p (reg, 1))
+ regs->array[REGNO (reg)].may_not_optimize = 1;
+ }
+ }
}
/* Invalidate all hard registers clobbered by calls. With one exception: