re PR middle-end/48814 (Incorrect scalar increment result)
authorRichard Guenther <rguenther@suse.de>
Fri, 16 Mar 2012 11:48:48 +0000 (11:48 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 16 Mar 2012 11:48:48 +0000 (11:48 +0000)
2012-03-16  Richard Guenther  <rguenther@suse.de>
Kai Tietz  <ktietz@redhat.com>

PR middle-end/48814
* gimplify.c (gimplify_self_mod_expr): Evaluate postfix
side-effects completely in the pre-queue and use a temporary
for the result.

* gcc.c-torture/execute/pr48814-1.c: New test.
* gcc.c-torture/execute/pr48814-2.c: New test.
* gcc.dg/tree-ssa/assign-1.c: New test.
* gcc.dg/tree-ssa/assign-2.c: New test.
* gcc.dg/tree-ssa/assign-3.c: New test.

Co-Authored-By: Kai Tietz <ktietz@redhat.com>
From-SVN: r185465

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr48814-1.c [new file with mode: 0644]
gcc/testsuite/gcc.c-torture/execute/pr48814-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/assign-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/assign-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/assign-3.c [new file with mode: 0644]

index c8272188caa1e19f6fda2bb06fb574569cf4f983..e18d220975f00e30dd424fe03b9019e60e1eb664 100644 (file)
@@ -1,3 +1,11 @@
+2012-03-16  Richard Guenther  <rguenther@suse.de>
+       Kai Tietz  <ktietz@redhat.com>
+
+       PR middle-end/48814
+       * gimplify.c (gimplify_self_mod_expr): Evaluate postfix
+       side-effects completely in the pre-queue and use a temporary
+       for the result.
+
 2012-03-16  Richard Guenther  <rguenther@suse.de>
 
        * stor-layout.c (finish_bitfield_representative): Fall back
index 07eb8fd81df08b76a007c5725568fc4a42367f4d..3c412944e334aaee80fe82f6652f94355c2ffb1f 100644 (file)
@@ -2265,17 +2265,18 @@ gimplify_self_mod_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
       arith_code = POINTER_PLUS_EXPR;
     }
 
-  t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
-
   if (postfix)
     {
-      gimplify_assign (lvalue, t1, orig_post_p);
+      tree t2 = get_initialized_tmp_var (lhs, pre_p, NULL);
+      t1 = build2 (arith_code, TREE_TYPE (*expr_p), t2, rhs);
+      gimplify_assign (lvalue, t1, pre_p);
       gimplify_seq_add_seq (orig_post_p, post);
-      *expr_p = lhs;
+      *expr_p = t2;
       return GS_ALL_DONE;
     }
   else
     {
+      t1 = build2 (arith_code, TREE_TYPE (*expr_p), lhs, rhs);
       *expr_p = build2 (MODIFY_EXPR, TREE_TYPE (lvalue), lvalue, t1);
       return GS_OK;
     }
index eddbface0f9845dffe864294b58ed67a20558ebd..ba1e455391a43f1994d4226b4a1eb4025e443bac 100644 (file)
@@ -1,3 +1,13 @@
+2012-03-16  Richard Guenther  <rguenther@suse.de>
+       Kai Tietz  <ktietz@redhat.com>
+
+       PR middle-end/48814
+       * gcc.c-torture/execute/pr48814-1.c: New test.
+       * gcc.c-torture/execute/pr48814-2.c: New test.
+       * gcc.dg/tree-ssa/assign-1.c: New test.
+       * gcc.dg/tree-ssa/assign-2.c: New test.
+       * gcc.dg/tree-ssa/assign-3.c: New test.
+
 2012-03-16  Richard Guenther  <rguenther@suse.de>
 
        * gnat.dg/specs/pack7.ads: New testcase.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr48814-1.c b/gcc/testsuite/gcc.c-torture/execute/pr48814-1.c
new file mode 100644 (file)
index 0000000..452aaab
--- /dev/null
@@ -0,0 +1,18 @@
+extern void abort (void);
+
+int arr[] = {1,2,3,4};
+int count = 0;
+
+int __attribute__((noinline))
+incr (void)
+{
+  return ++count;
+}
+
+int main()
+{
+  arr[count++] = incr ();
+  if (count != 2 || arr[count] != 3)
+    abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr48814-2.c b/gcc/testsuite/gcc.c-torture/execute/pr48814-2.c
new file mode 100644 (file)
index 0000000..9eea328
--- /dev/null
@@ -0,0 +1,18 @@
+extern void abort (void);
+
+int arr[] = {1,2,3,4};
+int count = 0;
+
+int
+incr (void)
+{
+  return ++count;
+}
+
+int main()
+{
+  arr[count++] = incr ();
+  if (count != 2 || arr[count] != 3)
+    abort ();
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/assign-1.c b/gcc/testsuite/gcc.dg/tree-ssa/assign-1.c
new file mode 100644 (file)
index 0000000..f95f03f
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+volatile int count;
+void bar(int);
+void foo()
+{
+ bar(count++);
+}
+
+/* { dg-final { scan-tree-dump-times "count =" 1 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/assign-2.c b/gcc/testsuite/gcc.dg/tree-ssa/assign-2.c
new file mode 100644 (file)
index 0000000..47c3822
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+volatile int count;
+int arr[4];
+void foo()
+{
+ arr[count++] = 0;
+}
+
+/* { dg-final { scan-tree-dump-times "count =" 1 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/assign-3.c b/gcc/testsuite/gcc.dg/tree-ssa/assign-3.c
new file mode 100644 (file)
index 0000000..e5426d7
--- /dev/null
@@ -0,0 +1,24 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fdump-tree-gimple" } */
+
+extern void abort (void);
+struct S { int i; };
+struct S arr[32];
+volatile int count = 0;
+
+struct S __attribute__((noinline))
+incr ()
+{
+  ++count;
+}
+
+int main()
+{
+  arr[count++] = incr ();
+  if (count != 2)
+    abort ();
+  return 0;
+}
+
+/* { dg-final { scan-tree-dump-times " = count;" 3 "gimple" } } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */