aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/jump.c4
-rw-r--r--gcc/rtl.h1
-rw-r--r--gcc/rtlanal.c46
4 files changed, 56 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e206ac6..e1093ca 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+Thu Nov 26 00:19:19 1998 Richard Henderson <rth@cygnus.com>
+
+ * 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.
+
Wed Nov 25 23:32:02 1998 Ian Dall <Ian.Dall@dsto.defence.gov.au>
Matthias Pfaller <leo@dachau.marco.de>
diff --git a/gcc/jump.c b/gcc/jump.c
index 25cae32..784e63d 100644
--- a/gcc/jump.c
+++ b/gcc/jump.c
@@ -521,7 +521,7 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan)
|| ! modified_between_p (SET_SRC (temp4), p, temp2))
/* Verify that registers used by the jump are not clobbered
by the instruction being moved. */
- && ! modified_between_p (PATTERN (temp), temp2,
+ && ! regs_set_between_p (PATTERN (temp), temp2,
NEXT_INSN (temp2)))
{
emit_insn_after_with_line_notes (PATTERN (temp2), p, temp2);
@@ -622,7 +622,7 @@ jump_optimize (f, cross_jump, noop_moves, after_regscan)
&& ! modified_between_p (SET_SRC (temp4), insert_after, temp)
/* Verify that registers used by the jump are not clobbered
by the instruction being moved. */
- && ! modified_between_p (PATTERN (temp), temp3,
+ && ! regs_set_between_p (PATTERN (temp), temp3,
NEXT_INSN (temp3))
&& invert_jump (temp, JUMP_LABEL (insn)))
{
diff --git a/gcc/rtl.h b/gcc/rtl.h
index c5b816d..1bff7d3 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -982,6 +982,7 @@ extern int reg_referenced_p PROTO((rtx, rtx));
extern int reg_used_between_p PROTO((rtx, rtx, rtx));
extern int reg_referenced_between_p PROTO((rtx, rtx, rtx));
extern int reg_set_between_p PROTO((rtx, rtx, rtx));
+extern int regs_set_between_p PROTO((rtx, rtx, rtx));
extern int modified_between_p PROTO((rtx, rtx, rtx));
extern int no_labels_between_p PROTO((rtx, rtx));
extern int modified_in_p PROTO((rtx, rtx));
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. */