re PR middle-end/42898 (volatile structures and compound literal initializers)
2010-01-31 Richard Guenther <rguenther@suse.de> PR middle-end/42898 * gimplify.c (gimplify_init_constructor): For volatile LHS initialize a temporary. * gcc.dg/torture/pr42898.c: New testcase. From-SVN: r156404
This commit is contained in:
parent
6e4a660f12
commit
61c7cbf8e5
4 changed files with 49 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
2010-01-31 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/42898
|
||||
* gimplify.c (gimplify_init_constructor): For volatile LHS
|
||||
initialize a temporary.
|
||||
|
||||
2010-01-31 Matthias Klose <doko@ubuntu.com>
|
||||
|
||||
* configure.ac: Fix __stack_chk_fail check for cross builds configured
|
||||
|
|
|
@ -3745,6 +3745,21 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
|
|||
}
|
||||
}
|
||||
|
||||
/* If the target is volatile and we have non-zero elements
|
||||
initialize the target from a temporary. */
|
||||
if (TREE_THIS_VOLATILE (object)
|
||||
&& !TREE_ADDRESSABLE (type)
|
||||
&& num_nonzero_elements > 0)
|
||||
{
|
||||
tree temp = create_tmp_var (TYPE_MAIN_VARIANT (type), NULL);
|
||||
TREE_OPERAND (*expr_p, 0) = temp;
|
||||
*expr_p = build2 (COMPOUND_EXPR, TREE_TYPE (*expr_p),
|
||||
*expr_p,
|
||||
build2 (MODIFY_EXPR, void_type_node,
|
||||
object, temp));
|
||||
return GS_OK;
|
||||
}
|
||||
|
||||
if (notify_temp_creation)
|
||||
return GS_OK;
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2010-01-31 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/42898
|
||||
* gcc.dg/torture/pr42898.c: New testcase.
|
||||
|
||||
2010-01-31 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/38324
|
||||
|
|
23
gcc/testsuite/gcc.dg/torture/pr42898.c
Normal file
23
gcc/testsuite/gcc.dg/torture/pr42898.c
Normal file
|
@ -0,0 +1,23 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-fdump-tree-optimized" } */
|
||||
|
||||
struct hardware {
|
||||
int parm1:8;
|
||||
int :4;
|
||||
int parm2:4;
|
||||
int parm3:15;
|
||||
int parm4:1;
|
||||
};
|
||||
|
||||
void f1(volatile struct hardware *ptr)
|
||||
{
|
||||
*ptr=(struct hardware) {
|
||||
.parm1=42,
|
||||
.parm2=13,
|
||||
.parm3=11850,
|
||||
.parm4=1,
|
||||
};
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-times "\\*ptr" 1 "optimized" } } */
|
||||
/* { dg-final { cleanup-tree-dump "optimized" } } */
|
Loading…
Add table
Reference in a new issue