OSDN Git Service

PR tree-optimization/50078
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 28 Nov 2011 21:03:11 +0000 (21:03 +0000)
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 28 Nov 2011 21:03:11 +0000 (21:03 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@181786 138bc75d-0d04-0410-961f-82ee72b054a4

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

index a2b33de..c66ec82 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 72c3fac..ee4a714 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 d707db5..6ab4731 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);