re PR tree-optimization/49768 (C99 style union initializations does not work as expected with optimizations)

PR tree-optimization/49768
	* gimple-fold.c (fold_nonarray_ctor_reference): Return NULL
	if offset is smaller than bitoffset, but offset+size is bigger
	than bitoffset.

	* gcc.c-torture/execute/pr49768.c: New test.

From-SVN: r176437
This commit is contained in:
Jakub Jelinek 2011-07-19 11:24:28 +02:00 committed by Jakub Jelinek
parent 338f655dae
commit b8b2b0094a
4 changed files with 33 additions and 5 deletions

View File

@ -1,3 +1,10 @@
2011-07-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/49768
* gimple-fold.c (fold_nonarray_ctor_reference): Return NULL
if offset is smaller than bitoffset, but offset+size is bigger
than bitoffset.
2011-07-19 Ira Rosen <ira.rosen@linaro.org>
PR tree-optimization/49771

View File

@ -3231,7 +3231,7 @@ fold_nonarray_ctor_reference (tree type, tree ctor,
double_int bitoffset;
double_int byte_offset_cst = tree_to_double_int (byte_offset);
double_int bits_per_unit_cst = uhwi_to_double_int (BITS_PER_UNIT);
double_int bitoffset_end;
double_int bitoffset_end, access_end;
/* Variable sized objects in static constructors makes no sense,
but field_size can be NULL for flexible array members. */
@ -3252,14 +3252,16 @@ fold_nonarray_ctor_reference (tree type, tree ctor,
else
bitoffset_end = double_int_zero;
/* Is OFFSET in the range (BITOFFSET, BITOFFSET_END)? */
if (double_int_cmp (uhwi_to_double_int (offset), bitoffset, 0) >= 0
access_end = double_int_add (uhwi_to_double_int (offset),
uhwi_to_double_int (size));
/* Is there any overlap between [OFFSET, OFFSET+SIZE) and
[BITOFFSET, BITOFFSET_END)? */
if (double_int_cmp (access_end, bitoffset, 0) > 0
&& (field_size == NULL_TREE
|| double_int_cmp (uhwi_to_double_int (offset),
bitoffset_end, 0) < 0))
{
double_int access_end = double_int_add (uhwi_to_double_int (offset),
uhwi_to_double_int (size));
double_int inner_offset = double_int_sub (uhwi_to_double_int (offset),
bitoffset);
/* We do have overlap. Now see if field is large enough to
@ -3267,6 +3269,8 @@ fold_nonarray_ctor_reference (tree type, tree ctor,
fields. */
if (double_int_cmp (access_end, bitoffset_end, 0) > 0)
return NULL_TREE;
if (double_int_cmp (uhwi_to_double_int (offset), bitoffset, 0) < 0)
return NULL_TREE;
return fold_ctor_reference (type, cval,
double_int_to_uhwi (inner_offset), size);
}

View File

@ -1,3 +1,8 @@
2011-07-19 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/49768
* gcc.c-torture/execute/pr49768.c: New test.
2011-07-19 Ira Rosen <ira.rosen@linaro.org>
PR tree-optimization/49771

View File

@ -0,0 +1,12 @@
/* PR tree-optimization/49768 */
extern void abort (void);
int
main ()
{
static struct { unsigned int : 1; unsigned int s : 1; } s = { .s = 1 };
if (s.s != 1)
abort ();
return 0;
}