aboutsummaryrefslogtreecommitdiff
path: root/gcc/rtlanal.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1998-11-25 16:21:27 -0800
committerRichard Henderson <rth@gcc.gnu.org>1998-11-25 16:21:27 -0800
commita2e1a0bf9ecd3e3c2cb9807288b2641b96accf8b (patch)
treea8e4b386012b812294eceb6f1f915f256cbe6217 /gcc/rtlanal.c
parent8357595779418585b4390bb66be518b32374965a (diff)
downloadgcc-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.c46
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. */