diff options
author | Richard Henderson <rth@cygnus.com> | 1998-11-25 16:21:27 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1998-11-25 16:21:27 -0800 |
commit | a2e1a0bf9ecd3e3c2cb9807288b2641b96accf8b (patch) | |
tree | a8e4b386012b812294eceb6f1f915f256cbe6217 /gcc/rtlanal.c | |
parent | 8357595779418585b4390bb66be518b32374965a (diff) | |
download | gcc-a2e1a0bf9ecd3e3c2cb9807288b2641b96accf8b.zip gcc-a2e1a0bf9ecd3e3c2cb9807288b2641b96accf8b.tar.gz gcc-a2e1a0bf9ecd3e3c2cb9807288b2641b96accf8b.tar.bz2 |
rtlanal.c (regs_set_between_p): New function.
* rtlanal.c (regs_set_between_p): New function.
* rtl.h (regs_set_between_p): Prototype it.
* jump.c (jump_optimize): Use it instead of modified_between_p
in the Sep 2 change.
From-SVN: r23888
Diffstat (limited to 'gcc/rtlanal.c')
-rw-r--r-- | gcc/rtlanal.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/gcc/rtlanal.c b/gcc/rtlanal.c index 031d103..0abe244 100644 --- a/gcc/rtlanal.c +++ b/gcc/rtlanal.c @@ -500,6 +500,52 @@ reg_set_p (reg, insn) } /* Similar to reg_set_between_p, but check all registers in X. Return 0 + only if none of them are modified between START and END. Do not + consider non-registers one way or the other. */ + +int +regs_set_between_p (x, start, end) + rtx x; + rtx start, end; +{ + enum rtx_code code = GET_CODE (x); + char *fmt; + int i, j; + + switch (code) + { + case CONST_INT: + case CONST_DOUBLE: + case CONST: + case SYMBOL_REF: + case LABEL_REF: + case PC: + case CC0: + return 0; + + case REG: + return reg_set_between_p (x, start, end); + + default: + break; + } + + fmt = GET_RTX_FORMAT (code); + for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--) + { + if (fmt[i] == 'e' && regs_set_between_p (XEXP (x, i), start, end)) + return 1; + + else if (fmt[i] == 'E') + for (j = XVECLEN (x, i) - 1; j >= 0; j--) + if (regs_set_between_p (XVECEXP (x, i, j), start, end)) + return 1; + } + + return 0; +} + +/* Similar to reg_set_between_p, but check all registers in X. Return 0 only if none of them are modified between START and END. Return 1 if X contains a MEM; this routine does not perform any memory aliasing. */ |