gimplify.c (shortcut_cond_expr): Re-compute side-effects.
authorStuart Hastings <stuart@apple.com>
Thu, 27 Jan 2005 01:03:27 +0000 (01:03 +0000)
committerStuart Hastings <stuart@gcc.gnu.org>
Thu, 27 Jan 2005 01:03:27 +0000 (01:03 +0000)
2005-01-26  Stuart Hastings  <stuart@apple.com>

* gcc/gimplify.c (shortcut_cond_expr): Re-compute side-effects.
* gcc/testsuite/gcc.c-torture/execute/20050125-1.c: New.

From-SVN: r94300

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

index 3f158552670ec38ef9a827ceb6997d9066596fda..f21d9d2ff35d43743595e53de1f548da539a34db 100644 (file)
@@ -1,3 +1,8 @@
+2005-01-26  Stuart Hastings  <stuart@apple.com>
+
+       * gcc/gimplify.c (shortcut_cond_expr): Re-compute side-effects.
+       * gcc/testsuite/gcc.c-torture/execute/20050125-1.c: New.
+
 2005-01-26  Richard Henderson  <rth@redhat.com>
 
        PR middle-end/18008
index ac9ae14a74a7d4b1f21064a9738aedfd9b387beb..0fd39436325dfcdfc29bca9a025bd20920414bf4 100644 (file)
@@ -1923,6 +1923,7 @@ shortcut_cond_expr (tree expr)
        {
          TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
          then_ = shortcut_cond_expr (expr);
+         then_se = then_ && TREE_SIDE_EFFECTS (then_);
          pred = TREE_OPERAND (pred, 0);
          expr = build (COND_EXPR, void_type_node, pred, then_, NULL_TREE);
        }
@@ -1937,6 +1938,7 @@ shortcut_cond_expr (tree expr)
        {
          TREE_OPERAND (expr, 0) = TREE_OPERAND (pred, 1);
          else_ = shortcut_cond_expr (expr);
+         else_se = else_ && TREE_SIDE_EFFECTS (else_);
          pred = TREE_OPERAND (pred, 0);
          expr = build (COND_EXPR, void_type_node, pred, NULL_TREE, else_);
        }
diff --git a/gcc/testsuite/gcc.c-torture/execute/20050125-1.c b/gcc/testsuite/gcc.c-torture/execute/20050125-1.c
new file mode 100644 (file)
index 0000000..3dc15b5
--- /dev/null
@@ -0,0 +1,35 @@
+/* Verify that the CALL sideeffect isn't optimized away.  */
+/* Contributed by Greg Parker  25 Jan 2005  <gparker@apple.com> */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+struct parse {
+  char *next;
+  char *end;
+  int error;
+};
+
+int seterr(struct parse *p, int err)
+{
+  p->error = err;
+  return 0;
+}
+
+void bracket_empty(struct parse *p)
+{
+  if (((p->next < p->end) && (*p->next++) == ']')  ||  seterr(p, 7)) { }
+}
+
+int main(int argc __attribute__((unused)), char **argv __attribute__((unused)))
+{
+  struct parse p;
+  p.next = p.end = (char *)0x12345;
+
+  p.error = 0;
+  bracket_empty(&p);
+  if (p.error != 7)
+    abort ();
+
+  return 0;
+}