diff options
author | Richard Guenther <rguenther@suse.de> | 2009-03-04 09:02:59 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2009-03-04 09:02:59 +0000 |
commit | 57e454eeb292919f4a36d9a8462676d1b9e32e39 (patch) | |
tree | 9d83061c5e3044ef5f072f26e30286a11349d55d /gcc/tree-sra.c | |
parent | a6fe9ed43e2cb62e8616dbb825172b9e9db7ed98 (diff) | |
download | gcc-57e454eeb292919f4a36d9a8462676d1b9e32e39.zip gcc-57e454eeb292919f4a36d9a8462676d1b9e32e39.tar.gz gcc-57e454eeb292919f4a36d9a8462676d1b9e32e39.tar.bz2 |
re PR tree-optimization/39339 (SRA miscompilation of vte)
2009-03-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39339
* tree-sra.c (try_instantiate_multiple_fields): Make it
no longer ICE on the above.
* gcc.c-torture/execute/pr39339.c: New testcase.
From-SVN: r144598
Diffstat (limited to 'gcc/tree-sra.c')
-rw-r--r-- | gcc/tree-sra.c | 16 |
1 files changed, 4 insertions, 12 deletions
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 636e30b..6149ff5 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1713,16 +1713,6 @@ try_instantiate_multiple_fields (struct sra_elt *elt, tree f) gcc_assert (block && block->is_scalar); var = block->replacement; - - if ((bit & ~alchk) - || (HOST_WIDE_INT)size != tree_low_cst (DECL_SIZE (var), 1)) - { - block->replacement = fold_build3 (BIT_FIELD_REF, - TREE_TYPE (block->element), var, - bitsize_int (size), - bitsize_int (bit & ~alchk)); - } - block->in_bitfld_block = 2; /* Add the member fields to the group, such that they access @@ -1736,12 +1726,14 @@ try_instantiate_multiple_fields (struct sra_elt *elt, tree f) gcc_assert (fld && fld->is_scalar && !fld->replacement); fld->replacement = fold_build3 (BIT_FIELD_REF, field_type, var, - DECL_SIZE (f), + bitsize_int (TYPE_PRECISION (field_type)), bitsize_int ((TREE_INT_CST_LOW (DECL_FIELD_OFFSET (f)) * BITS_PER_UNIT + (TREE_INT_CST_LOW - (DECL_FIELD_BIT_OFFSET (f)))) + (DECL_FIELD_BIT_OFFSET (f))) + - (TREE_INT_CST_LOW + (TREE_OPERAND (block->element, 2)))) & ~alchk)); fld->in_bitfld_block = 1; } |