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:
parent
338f655dae
commit
b8b2b0094a
|
@ -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>
|
2011-07-19 Ira Rosen <ira.rosen@linaro.org>
|
||||||
|
|
||||||
PR tree-optimization/49771
|
PR tree-optimization/49771
|
||||||
|
|
|
@ -3231,7 +3231,7 @@ fold_nonarray_ctor_reference (tree type, tree ctor,
|
||||||
double_int bitoffset;
|
double_int bitoffset;
|
||||||
double_int byte_offset_cst = tree_to_double_int (byte_offset);
|
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 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,
|
/* Variable sized objects in static constructors makes no sense,
|
||||||
but field_size can be NULL for flexible array members. */
|
but field_size can be NULL for flexible array members. */
|
||||||
|
@ -3252,14 +3252,16 @@ fold_nonarray_ctor_reference (tree type, tree ctor,
|
||||||
else
|
else
|
||||||
bitoffset_end = double_int_zero;
|
bitoffset_end = double_int_zero;
|
||||||
|
|
||||||
/* Is OFFSET in the range (BITOFFSET, BITOFFSET_END)? */
|
access_end = double_int_add (uhwi_to_double_int (offset),
|
||||||
if (double_int_cmp (uhwi_to_double_int (offset), bitoffset, 0) >= 0
|
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
|
&& (field_size == NULL_TREE
|
||||||
|| double_int_cmp (uhwi_to_double_int (offset),
|
|| double_int_cmp (uhwi_to_double_int (offset),
|
||||||
bitoffset_end, 0) < 0))
|
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),
|
double_int inner_offset = double_int_sub (uhwi_to_double_int (offset),
|
||||||
bitoffset);
|
bitoffset);
|
||||||
/* We do have overlap. Now see if field is large enough to
|
/* 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. */
|
fields. */
|
||||||
if (double_int_cmp (access_end, bitoffset_end, 0) > 0)
|
if (double_int_cmp (access_end, bitoffset_end, 0) > 0)
|
||||||
return NULL_TREE;
|
return NULL_TREE;
|
||||||
|
if (double_int_cmp (uhwi_to_double_int (offset), bitoffset, 0) < 0)
|
||||||
|
return NULL_TREE;
|
||||||
return fold_ctor_reference (type, cval,
|
return fold_ctor_reference (type, cval,
|
||||||
double_int_to_uhwi (inner_offset), size);
|
double_int_to_uhwi (inner_offset), size);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
2011-07-19 Ira Rosen <ira.rosen@linaro.org>
|
||||||
|
|
||||||
PR tree-optimization/49771
|
PR tree-optimization/49771
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue