]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/42898 (volatile structures and compound literal initializers)
authorEric Botcazou <ebotcazou@adacore.com>
Sun, 31 Jan 2010 21:08:15 +0000 (21:08 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Sun, 31 Jan 2010 21:08:15 +0000 (21:08 +0000)
2010-01-31  Eric Botcazou  <ebotcazou@adacore.com>

PR middle-end/42898
Backport from mainline:
2009-04-23  Eric Botcazou  <ebotcazou@adacore.com>

* gimplify.c (gimplify_modify_expr_rhs) <VAR_DECL>: Do not do a direct
assignment from the constructor either if the target is volatile.

From-SVN: r156416

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr42898-2.c [new file with mode: 0644]

index e05c1fd7c699be681202cb11506f7c9cd79ff9e1..67438610a93092a7e0b772064738e9033c65a0b3 100644 (file)
@@ -1,3 +1,12 @@
+2010-01-31  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/42898
+       Backport from mainline:
+       2009-04-23  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * gimplify.c (gimplify_modify_expr_rhs) <VAR_DECL>: Do not do a direct
+       assignment from the constructor either if the target is volatile.
+
 2010-01-31  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/42898
index 71af972b2659938a4b6ad0315d0d4f3583241a28..897c185c1437d046d1f305feea2aa43658a7e543 100644 (file)
@@ -3566,11 +3566,14 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p, tree *to_p, tree *pre_p,
     switch (TREE_CODE (*from_p))
       {
       case VAR_DECL:
-       /* If we're assigning from a constant constructor, move the
-          constructor expression to the RHS of the MODIFY_EXPR.  */
+       /* If we're assigning from a read-only variable initialized with
+          a constructor, do the direct assignment from the constructor,
+          but only if neither source nor target are volatile since this
+          latter assignment might end up being done on a per-field basis.  */
        if (DECL_INITIAL (*from_p)
            && TREE_READONLY (*from_p)
            && !TREE_THIS_VOLATILE (*from_p)
+           && !TREE_THIS_VOLATILE (*to_p)
            && TREE_CODE (DECL_INITIAL (*from_p)) == CONSTRUCTOR)
          {
            tree old_from = *from_p;
index 000461bc853d3cbceea727e1882e9e79b3d0ff16..ca235f90799f020f613d90595497f779105dbe11 100644 (file)
@@ -1,3 +1,8 @@
+2010-01-31  Eric Botcazou  <ebotcazou@adacore.com>
+
+       PR middle-end/42898
+       * gcc.dg/torture/pr42898-2.c: New test.
+
 2010-01-31  Richard Guenther  <rguenther@suse.de>
 
        * gcc.dg/torture/pr42898.c: Skip -O0.
diff --git a/gcc/testsuite/gcc.dg/torture/pr42898-2.c b/gcc/testsuite/gcc.dg/torture/pr42898-2.c
new file mode 100644 (file)
index 0000000..32c9427
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-do compile } */
+/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
+/* { dg-options "-fdump-tree-optimized" } */
+
+struct hardware {
+  int parm1:8;
+  int :4;
+  int parm2:4;
+  int parm3:15;
+  int parm4:1;
+};
+
+const struct hardware h = {
+  .parm1=42,
+  .parm2=13,
+  .parm3=11850,
+  .parm4=1,
+};
+
+void f1(volatile struct hardware *ptr)
+{
+  *ptr = h;
+}
+
+/* { dg-final { scan-tree-dump-times "\\*ptr" 1 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */