re PR middle-end/56098 (conditional write through volatile pointer produces unintende...
authorJakub Jelinek <jakub@redhat.com>
Fri, 25 Jan 2013 20:03:54 +0000 (21:03 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 25 Jan 2013 20:03:54 +0000 (21:03 +0100)
PR tree-optimization/56098
* tree-ssa-phiopt.c (nt_init_block): Don't call add_or_mark_expr
for stmts with volatile ops.
(cond_store_replacement): Don't optimize if assign has volatile ops.
(cond_if_else_store_replacement_1): Don't optimize if either
then_assign or else_assign have volatile ops.
(hoist_adjacent_loads): Don't optimize if either def1 or def2 have
volatile ops.

* gcc.dg/pr56098-1.c: New test.
* gcc.dg/pr56098-2.c: New test.

From-SVN: r195475

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr56098-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr56098-2.c [new file with mode: 0644]
gcc/tree-ssa-phiopt.c

index 85152febbdceb388a6fd7078dc8ece7a5f4dbe4c..3897b8d6a7e1f1c45d301ffe5b611d1e25901274 100644 (file)
@@ -1,3 +1,14 @@
+2013-01-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/56098
+       * tree-ssa-phiopt.c (nt_init_block): Don't call add_or_mark_expr
+       for stmts with volatile ops.
+       (cond_store_replacement): Don't optimize if assign has volatile ops.
+       (cond_if_else_store_replacement_1): Don't optimize if either
+       then_assign or else_assign have volatile ops.
+       (hoist_adjacent_loads): Don't optimize if either def1 or def2 have
+       volatile ops.
+
 2013-01-25  Georg-Johann Lay  <avr@gjlay.de>
 
        * doc/invoke.texi (AVR Built-in Macros): Document __XMEGA__.
index d00476ef161690761919560e06b167293ac805a1..db9f3679bf89b85b4846bbb10a6daf449c9d03e5 100644 (file)
@@ -1,3 +1,9 @@
+2013-01-25  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/56098
+       * gcc.dg/pr56098-1.c: New test.
+       * gcc.dg/pr56098-2.c: New test.
+
 2013-01-25  Georg-Johann Lay  <avr@gjlay.de>
 
        PR target/54222
diff --git a/gcc/testsuite/gcc.dg/pr56098-1.c b/gcc/testsuite/gcc.dg/pr56098-1.c
new file mode 100644 (file)
index 0000000..c3b081a
--- /dev/null
@@ -0,0 +1,16 @@
+/* PR tree-optimization/56098 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+volatile int *p;
+
+void
+foo (int x)
+{
+  *p = 1;
+  if (x)
+    *p = 2;
+}
+
+/* { dg-final { scan-tree-dump-not "=\[^\n\r]*\\*p" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/pr56098-2.c b/gcc/testsuite/gcc.dg/pr56098-2.c
new file mode 100644 (file)
index 0000000..3c967b5
--- /dev/null
@@ -0,0 +1,19 @@
+/* PR tree-optimization/56098 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fhoist-adjacent-loads -fdump-tree-optimized" } */
+
+struct S { volatile int i; volatile int j; };
+
+int
+bar (struct S *x, int y)
+{
+  int r;
+  if (y)
+    r = x->i;
+  else
+    r = x->j;
+  return r;
+}
+
+/* { dg-final { scan-tree-dump-not "r_\[0-9]* =.v. \[^\n\r]*;\[\n\r]*  r_\[0-9]* =.v. " "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
index 697e33cf5b8583a071258ecd4fde27e8f9cee6be..eee497296ca1cd7b8a3ff73dbb83855261a16936 100644 (file)
@@ -1342,7 +1342,7 @@ nt_init_block (struct dom_walk_data *data ATTRIBUTE_UNUSED, basic_block bb)
     {
       gimple stmt = gsi_stmt (gsi);
 
-      if (gimple_assign_single_p (stmt))
+      if (gimple_assign_single_p (stmt) && !gimple_has_volatile_ops (stmt))
        {
          add_or_mark_expr (bb, gimple_assign_lhs (stmt), nontrap_set, true);
          add_or_mark_expr (bb, gimple_assign_rhs1 (stmt), nontrap_set, false);
@@ -1419,7 +1419,8 @@ cond_store_replacement (basic_block middle_bb, basic_block join_bb,
 
   /* Check if middle_bb contains of only one store.  */
   if (!assign
-      || !gimple_assign_single_p (assign))
+      || !gimple_assign_single_p (assign)
+      || gimple_has_volatile_ops (assign))
     return false;
 
   locus = gimple_location (assign);
@@ -1490,9 +1491,11 @@ cond_if_else_store_replacement_1 (basic_block then_bb, basic_block else_bb,
   if (then_assign == NULL
       || !gimple_assign_single_p (then_assign)
       || gimple_clobber_p (then_assign)
+      || gimple_has_volatile_ops (then_assign)
       || else_assign == NULL
       || !gimple_assign_single_p (else_assign)
-      || gimple_clobber_p (else_assign))
+      || gimple_clobber_p (else_assign)
+      || gimple_has_volatile_ops (else_assign))
     return false;
 
   lhs = gimple_assign_lhs (then_assign);
@@ -1829,7 +1832,9 @@ hoist_adjacent_loads (basic_block bb0, basic_block bb1,
 
       /* Both statements must be assignments whose RHS is a COMPONENT_REF.  */
       if (!gimple_assign_single_p (def1)
-         || !gimple_assign_single_p (def2))
+         || !gimple_assign_single_p (def2)
+         || gimple_has_volatile_ops (def1)
+         || gimple_has_volatile_ops (def2))
        continue;
 
       ref1 = gimple_assign_rhs1 (def1);