cfgcleanup.c (flow_find_cross_jump): Delete any REG_EQUAL notes that would be invalid...
authorRichard Earnshaw <rearnsha@arm.com>
Fri, 21 Sep 2001 14:39:28 +0000 (14:39 +0000)
committerRichard Earnshaw <rearnsha@gcc.gnu.org>
Fri, 21 Sep 2001 14:39:28 +0000 (14:39 +0000)
* cfgcleanup.c (flow_find_cross_jump): Delete any REG_EQUAL notes
that would be invalid after a merge.

From-SVN: r45727

gcc/ChangeLog
gcc/cfgcleanup.c

index 4dfc2e023c4a4582a848c322cffef451b9d15410..49148b0a3c92914b3ff1a920f72131802db94933 100644 (file)
@@ -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.
index 314d9f401cf6331bd2f50fef298ab79e8b48f3d7..a3ddcac872ea07a181058add16edf33ce06ef554 100644 (file)
@@ -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++;