aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-sra.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2009-03-04 09:02:59 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2009-03-04 09:02:59 +0000
commit57e454eeb292919f4a36d9a8462676d1b9e32e39 (patch)
tree9d83061c5e3044ef5f072f26e30286a11349d55d /gcc/tree-sra.c
parenta6fe9ed43e2cb62e8616dbb825172b9e9db7ed98 (diff)
downloadgcc-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.c16
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;
}