aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-sra.c
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2010-03-04 19:16:32 +0100
committerMartin Jambor <jamborm@gcc.gnu.org>2010-03-04 19:16:32 +0100
commit76f76cd0e5b4937539b950168c35e4dfae85ddcf (patch)
tree5e8f94867eced6d80a37c527c54cbb6595b332c0 /gcc/tree-sra.c
parent83ff92fb26e8ca8c4552fd0e038a15b64c2a0cea (diff)
downloadgcc-76f76cd0e5b4937539b950168c35e4dfae85ddcf.zip
gcc-76f76cd0e5b4937539b950168c35e4dfae85ddcf.tar.gz
gcc-76f76cd0e5b4937539b950168c35e4dfae85ddcf.tar.bz2
re PR tree-optimization/43164 (ice in completely_scalarize_record, at tree-sra.c:85)
2010-03-04 Martin Jambor <mjambor@suse.cz> PR tree-optimization/43164 PR tree-optimization/43191 * tree-sra.c (type_consists_of_records_p): Reject records with zero-size bit-fields at the end. * testsuite/gcc.c-torture/compile/pr43164.c: New test. * testsuite/gcc.c-torture/compile/pr43191.c: Likewise. From-SVN: r157232
Diffstat (limited to 'gcc/tree-sra.c')
-rw-r--r--gcc/tree-sra.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index 86620e0..d32ef38 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -802,13 +802,15 @@ create_access (tree expr, gimple stmt, bool write)
/* Return true iff TYPE is a RECORD_TYPE with fields that are either of gimple
- register types or (recursively) records with only these two kinds of
- fields. */
+ register types or (recursively) records with only these two kinds of fields.
+ It also returns false if any of these records has a zero-size field as its
+ last field. */
static bool
type_consists_of_records_p (tree type)
{
tree fld;
+ bool last_fld_has_zero_size = false;
if (TREE_CODE (type) != RECORD_TYPE)
return false;
@@ -821,7 +823,13 @@ type_consists_of_records_p (tree type)
if (!is_gimple_reg_type (ft)
&& !type_consists_of_records_p (ft))
return false;
+
+ last_fld_has_zero_size = tree_low_cst (DECL_SIZE (fld), 1) == 0;
}
+
+ if (last_fld_has_zero_size)
+ return false;
+
return true;
}