diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2002-10-15 14:38:10 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@gcc.gnu.org> | 2002-10-15 14:38:10 +0000 |
commit | 2d34c587907abe84bc4af668e18b5293e531e66e (patch) | |
tree | a5f854079aaa6b4a3eba047321597644ab46094b /gcc/loop.c | |
parent | 38364bd2f572728a98625b490bf3bc427f367a91 (diff) | |
download | gcc-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.c | 19 |
1 files changed, 19 insertions, 0 deletions
@@ -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: |