OSDN Git Service

* ifcvt.c (noce_process_if_block): Fail if A or B modified
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 May 2000 23:22:26 +0000 (23:22 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 4 May 2000 23:22:26 +0000 (23:22 +0000)
        between condition and jump.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@33689 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ifcvt.c

index 7595fcb..79be885 100644 (file)
@@ -1054,11 +1054,6 @@ noce_process_if_block (test_bb, then_bb, else_bb, join_bb)
   x = SET_DEST (set_a);
   a = SET_SRC (set_a);
 
-  /* X may not be mentioned between cond_earliest and the jump.  */
-  for (insn = jump; insn != if_info.cond_earliest; insn = PREV_INSN (insn))
-    if (INSN_P (insn) && reg_mentioned_p (x, insn))
-      return FALSE;
-
   /* Look for the other potential set.  Make sure we've got equivalent
      destinations.  */
   /* ??? This is overconservative.  Storing to two different mems is
@@ -1088,6 +1083,17 @@ noce_process_if_block (test_bb, then_bb, else_bb, join_bb)
     }
   b = (set_b ? SET_SRC (set_b) : x);
 
+  /* X may not be mentioned in the range (cond_earliest, jump].  */
+  for (insn = jump; insn != if_info.cond_earliest; insn = PREV_INSN (insn))
+    if (INSN_P (insn) && reg_mentioned_p (x, insn))
+      return FALSE;
+
+  /* A and B may not be modified in the range [cond_earliest, jump).  */
+  for (insn = if_info.cond_earliest; insn != jump; insn = NEXT_INSN (insn))
+    if (INSN_P (insn)
+       && (modified_in_p (a, insn) || modified_in_p (b, insn)))
+      return FALSE;
+
   /* Only operate on register destinations, and even then avoid extending
      the lifetime of hard registers on small register class machines.  */
   orig_x = x;