Hi!

As shown by the testcases, we shouldn't try to optimize volatile
stores resp. loads in tree-ssa-phiopt.c.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2013-01-25  Jakub Jelinek  <ja...@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.

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

--- gcc/tree-ssa-phiopt.c.jj    2013-01-11 09:02:55.000000000 +0100
+++ gcc/tree-ssa-phiopt.c       2013-01-25 16:27:24.813349943 +0100
@@ -1342,7 +1342,7 @@ nt_init_block (struct dom_walk_data *dat
     {
       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 midd
 
   /* 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_
   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, b
 
       /* 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);
--- gcc/testsuite/gcc.dg/pr56098-1.c.jj 2013-01-25 16:30:22.152341505 +0100
+++ gcc/testsuite/gcc.dg/pr56098-1.c    2013-01-25 16:30:55.000000000 +0100
@@ -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" } } */
--- gcc/testsuite/gcc.dg/pr56098-2.c.jj 2013-01-25 16:55:37.474537207 +0100
+++ gcc/testsuite/gcc.dg/pr56098-2.c    2013-01-25 16:57:34.802867044 +0100
@@ -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" } } */

        Jakub

Reply via email to