diff options
author | J"orn Rennecke <amylaar@cygnus.co.uk> | 1999-03-29 11:56:45 +0000 |
---|---|---|
committer | Joern Rennecke <amylaar@gcc.gnu.org> | 1999-03-29 12:56:45 +0100 |
commit | fdb1833aca45ffa413e21438ea6a11e7f57785f9 (patch) | |
tree | f30603a88d3538b8e75b6362181fbee7df011d25 /gcc/loop.c | |
parent | aa4778b68476a63cc7e54a9cee1664a2ad0fcacc (diff) | |
download | gcc-fdb1833aca45ffa413e21438ea6a11e7f57785f9.zip gcc-fdb1833aca45ffa413e21438ea6a11e7f57785f9.tar.gz gcc-fdb1833aca45ffa413e21438ea6a11e7f57785f9.tar.bz2 |
loop.c (maybe_eliminate_biv): For libcalls that set a giv, skip to end of libcall.
* loop.c (maybe_eliminate_biv): For libcalls that set a giv, skip to
end of libcall.
From-SVN: r26056
Diffstat (limited to 'gcc/loop.c')
-rw-r--r-- | gcc/loop.c | 20 |
1 files changed, 20 insertions, 0 deletions
@@ -8121,6 +8121,26 @@ maybe_eliminate_biv (bl, loop_start, end, eliminate_p, threshold, insn_count) enum rtx_code code = GET_CODE (p); rtx where = threshold >= insn_count ? loop_start : p; + /* If this is a libcall that sets a giv, skip ahead to its end. */ + if (GET_RTX_CLASS (code) == 'i') + { + rtx note = find_reg_note (p, REG_LIBCALL, NULL_RTX); + + if (note) + { + rtx last = XEXP (note, 0); + rtx set = single_set (last); + + if (set && GET_CODE (SET_DEST (set)) == REG) + { + int regno = REGNO (SET_DEST (set)); + + if (REG_IV_TYPE (regno) == GENERAL_INDUCT + && REG_IV_INFO (regno)->src_reg == bl->biv->src_reg) + p = last; + } + } + } if ((code == INSN || code == JUMP_INSN || code == CALL_INSN) && reg_mentioned_p (reg, PATTERN (p)) && ! maybe_eliminate_biv_1 (PATTERN (p), p, bl, eliminate_p, where)) |