re PR middle-end/45819 (unexpected unaligned access to volatile int)
authorRichard Guenther <rguenther@suse.de>
Fri, 22 Jul 2011 11:55:30 +0000 (11:55 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Fri, 22 Jul 2011 11:55:30 +0000 (11:55 +0000)
2011-07-22  Richard Guenther  <rguenther@suse.de>

PR tree-optimization/45819
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Properly
preserve volatile and notrap flags.

* gcc.dg/pr45819.c: New testcase.

From-SVN: r176623

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

index dfba411ffe394a43dd429997f3960c50b91e5f9f..cb9c3ae8d9421ee8efd55e9c784c92dfd9e591d0 100644 (file)
@@ -1,3 +1,9 @@
+2011-07-22  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/45819
+       * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Properly
+       preserve volatile and notrap flags.
+
 2011-07-22  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
            Ralf Wildenhues  <Ralf.Wildenhues@gmx.de>
 
index bae0698f5a5bff3909771f27a1e37b6f0ed42725..d4f641e486782ea5d51e4c55efa3e1db6e5e2459 100644 (file)
@@ -1,3 +1,8 @@
+2011-07-22  Richard Guenther  <rguenther@suse.de>
+
+       PR tree-optimization/45819
+       * gcc.dg/pr45819.c: New testcase.
+
 2011-07-22  Uros Bizjak  <ubizjak@gmail.com>
 
        * lib/target-supports.exp (check_ifunc_available): Rewrite.
diff --git a/gcc/testsuite/gcc.dg/pr45819.c b/gcc/testsuite/gcc.dg/pr45819.c
new file mode 100644 (file)
index 0000000..de96800
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+struct ehci_regs {
+    char x;
+    unsigned int port_status[0];
+} __attribute__ ((packed));
+
+struct ehci_hcd {
+    struct ehci_regs *regs;
+};
+
+int ehci_hub_control (struct ehci_hcd *ehci, int wIndex)
+{
+  unsigned int *status_reg = &ehci->regs->port_status[wIndex];
+  return *(volatile unsigned int *)status_reg;
+}
+
+/* { dg-final { scan-tree-dump "={v}" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
index c08cb18e7afe7e53d460a1d0159d0b6b4bfc9c4a..40db9285b9882a1dd838b81ae145ee9bd811d5d7 100644 (file)
@@ -875,6 +875,8 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
            }
          *def_rhs_basep = build2 (MEM_REF, TREE_TYPE (*def_rhs_basep),
                                   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)));
          *def_rhs_basep = saved;
@@ -927,9 +929,9 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
          tidy_after_forward_propagate_addr (use_stmt);
          return res;
        }
-      /* If the LHS is a plain dereference and the value type is the same as
+      /* If the RHS is a plain dereference and the value type is the same as
          that of the pointed-to type of the address we can put the
-        dereferenced address on the LHS preserving the original alias-type.  */
+        dereferenced address on the RHS preserving the original alias-type.  */
       else if (gimple_assign_rhs1 (use_stmt) == rhs
               && useless_type_conversion_p
                    (TREE_TYPE (gimple_assign_lhs (use_stmt)),
@@ -954,6 +956,8 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
            }
          *def_rhs_basep = build2 (MEM_REF, TREE_TYPE (*def_rhs_basep),
                                   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)));
          *def_rhs_basep = saved;