re PR tree-optimization/50078 (combine wrong code: volatile accesses optimized out)
authorJakub Jelinek <jakub@redhat.com>
Mon, 28 Nov 2011 21:03:11 +0000 (22:03 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 28 Nov 2011 21:03:11 +0000 (22:03 +0100)
PR tree-optimization/50078
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Copy over
TREE_THIS_VOLATILE also from the old to new lhs resp. rhs.

* gcc.dg/pr50078.c: New test.

From-SVN: r181786

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr50078.c [new file with mode: 0644]
gcc/tree-ssa-forwprop.c

index a2b33deac3fa12b2d4aa0f9b1a8ba58ea4abd9b7..c66ec827e0b6120f3ff7d0e0ab2be159dba89d0c 100644 (file)
@@ -1,5 +1,9 @@
 2011-11-28  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/50078
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Copy over
+       TREE_THIS_VOLATILE also from the old to new lhs resp. rhs.
+
        PR tree-optimization/50682
        * tree-eh.c (maybe_remove_unreachable_handlers): New function.
        * tree-flow.h (maybe_remove_unreachable_handlers): New prototype.
index 72c3fac85e71eb32cfda34252e7c75e53eac45c4..ee4a71492a83337f4b775d6beae4db05a64355d0 100644 (file)
@@ -1,5 +1,8 @@
 2011-11-28  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/50078
+       * gcc.dg/pr50078.c: New test.
+
        PR tree-optimization/50682
        * g++.dg/opt/pr50682.C: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr50078.c b/gcc/testsuite/gcc.dg/pr50078.c
new file mode 100644 (file)
index 0000000..a8aee43
--- /dev/null
@@ -0,0 +1,14 @@
+/* PR tree-optimization/50078 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+unsigned nonvolvar[2];
+
+void
+test (int arg)
+{
+  unsigned v = *(volatile unsigned *) (&nonvolvar[arg]);
+  *(volatile unsigned *) (&nonvolvar[arg]) = v;
+}
+
+/* { dg-final { scan-assembler-times "movl\[^\n\r\]*nonvolvar" 2 { target { { i?86-*-* x86_64-*-* } && nonpic } } } } */
index d707db520e342a273d86082003770ca9dbf621f6..6ab47317770a455be163de331bc05fbb355d8ff6 100644 (file)
@@ -910,7 +910,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
                     TREE_TYPE (gimple_assign_rhs1 (use_stmt))))
        {
          tree *def_rhs_basep = &TREE_OPERAND (def_rhs, 0);
-         tree new_offset, new_base, saved;
+         tree new_offset, new_base, saved, new_lhs;
          while (handled_component_p (*def_rhs_basep))
            def_rhs_basep = &TREE_OPERAND (*def_rhs_basep, 0);
          saved = *def_rhs_basep;
@@ -930,8 +930,9 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
                                   new_base, new_offset);
          TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (lhs);
          TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (lhs);
-         gimple_assign_set_lhs (use_stmt,
-                                unshare_expr (TREE_OPERAND (def_rhs, 0)));
+         new_lhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
+         gimple_assign_set_lhs (use_stmt, new_lhs);
+         TREE_THIS_VOLATILE (new_lhs) = TREE_THIS_VOLATILE (lhs);
          *def_rhs_basep = saved;
          tidy_after_forward_propagate_addr (use_stmt);
          /* Continue propagating into the RHS if this was not the
@@ -991,7 +992,7 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
                     TREE_TYPE (TREE_OPERAND (def_rhs, 0))))
        {
          tree *def_rhs_basep = &TREE_OPERAND (def_rhs, 0);
-         tree new_offset, new_base, saved;
+         tree new_offset, new_base, saved, new_rhs;
          while (handled_component_p (*def_rhs_basep))
            def_rhs_basep = &TREE_OPERAND (*def_rhs_basep, 0);
          saved = *def_rhs_basep;
@@ -1011,8 +1012,9 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
                                   new_base, new_offset);
          TREE_THIS_VOLATILE (*def_rhs_basep) = TREE_THIS_VOLATILE (rhs);
          TREE_THIS_NOTRAP (*def_rhs_basep) = TREE_THIS_NOTRAP (rhs);
-         gimple_assign_set_rhs1 (use_stmt,
-                                 unshare_expr (TREE_OPERAND (def_rhs, 0)));
+         new_rhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
+         gimple_assign_set_rhs1 (use_stmt, new_rhs);
+         TREE_THIS_VOLATILE (new_rhs) = TREE_THIS_VOLATILE (rhs);
          *def_rhs_basep = saved;
          fold_stmt_inplace (use_stmt_gsi);
          tidy_after_forward_propagate_addr (use_stmt);