aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cfgcleanup.c16
2 files changed, 21 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4dfc2e0..49148b0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+21-09-2001 Richard Earnshaw (reanrsha@arm.com)
+
+ * cfgcleanup.c (flow_find_cross_jump): Delete any REG_EQUAL notes
+ that would be invalid after a merge.
+
Fri Sep 21 14:24:29 CEST 2001 Jan Hubicka <jh@suse.cz>
* basic-block.h (flow_delete_insn, flow_delete_insn_chain): Kill.
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 314d9f4..a3ddcac 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -583,6 +583,22 @@ flow_find_cross_jump (mode, bb1, bb2, f1, f2)
/* Don't begin a cross-jump with a USE or CLOBBER insn. */
if (GET_CODE (p1) != USE && GET_CODE (p1) != CLOBBER)
{
+ /* If the merged insns have different REG_EQUAL notes, then
+ remove them. */
+ rtx equiv1 = find_reg_equal_equiv_note (i1);
+ rtx equiv2 = find_reg_equal_equiv_note (i2);
+
+ if (equiv1 && !equiv2)
+ remove_note (i1, equiv1);
+ else if (!equiv1 && equiv2)
+ remove_note (i2, equiv2);
+ else if (equiv1 && equiv2
+ && !rtx_equal_p (XEXP (equiv1, 0), XEXP (equiv2, 0)))
+ {
+ remove_note (i1, equiv1);
+ remove_note (i2, equiv2);
+ }
+
afterlast1 = last1, afterlast2 = last2;
last1 = i1, last2 = i2;
ninsns++;