OSDN Git Service

PR target/11052
authorrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Jun 2003 17:19:06 +0000 (17:19 +0000)
committerrearnsha <rearnsha@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 6 Jun 2003 17:19:06 +0000 (17:19 +0000)
* ifcvt.c (noce_process_if_block): Fail if the destination has
side-effects.

gcc.c-torture/execute/20030606-1.c: New.

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

gcc/ChangeLog
gcc/ifcvt.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20030606-1.c [new file with mode: 0644]

index f674788..5d04111 100644 (file)
@@ -1,3 +1,9 @@
+2003-06-06  Richard Earnshaw  <rearnsha@arm.com>
+
+       PR target/11052
+       * ifcvt.c (noce_process_if_block): Fail if the destination has
+       side-effects.
+
 2003-06-06  Jason Merrill  <jason@redhat.com>
 
        * stmt.c (resolve_asm_operand_names): Rename from
index baac041..8747906 100644 (file)
@@ -1821,6 +1821,15 @@ noce_process_if_block (ce_info)
          || modified_between_p (x, PREV_INSN (if_info.cond_earliest), jump))
        insn_b = set_b = NULL_RTX;
     }
+
+  /* If x has side effects then only the if-then-else form is safe to
+     convert.  But even in that case we would need to restore any notes
+     (such as REG_INC) at then end.  That can be tricky if 
+     noce_emit_move_insn expands to more than one insn, so disable the
+     optimization entirely for now if there are side effects.  */
+  if (side_effects_p (x))
+    return FALSE;
+
   b = (set_b ? SET_SRC (set_b) : x);
 
   /* Only operate on register destinations, and even then avoid extending
index f14b689..470d696 100644 (file)
@@ -1,3 +1,7 @@
+2003-06-06  Richard Earnshaw  <rearnsha@arm.com>
+
+       gcc.c-torture/execute/20030606-1.c: New.
+
 2003-06-06  Roger Sayle  <roger@eyesopen.com>
 
        * gcc.dg/builtins-2.c: Correct check-in of incorrect version.
diff --git a/gcc/testsuite/gcc.c-torture/execute/20030606-1.c b/gcc/testsuite/gcc.c-torture/execute/20030606-1.c
new file mode 100644 (file)
index 0000000..51054d9
--- /dev/null
@@ -0,0 +1,27 @@
+
+int * foo (int *x, int b)
+{
+
+  *(x++) = 55;
+  if (b)
+    *(x++) = b;
+
+  return x;
+}
+
+main()
+{
+  int a[5];
+
+  memset (a, 1, sizeof (a));
+
+  if (foo(a, 0) - a != 1 || a[0] != 55 || a[1] != a[4])
+    abort();
+
+  memset (a, 1, sizeof (a));
+
+  if (foo(a, 2) - a != 2 || a[0] != 55 || a[1] != 2)
+    abort();
+
+  exit (0);
+}