diff options
author | Martin Jambor <mjambor@suse.cz> | 2010-03-04 19:16:32 +0100 |
---|---|---|
committer | Martin Jambor <jamborm@gcc.gnu.org> | 2010-03-04 19:16:32 +0100 |
commit | 76f76cd0e5b4937539b950168c35e4dfae85ddcf (patch) | |
tree | 5e8f94867eced6d80a37c527c54cbb6595b332c0 /gcc/tree-sra.c | |
parent | 83ff92fb26e8ca8c4552fd0e038a15b64c2a0cea (diff) | |
download | gcc-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.c | 12 |
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; } |