diff options
author | Richard Guenther <rguenther@suse.de> | 2012-03-12 10:43:17 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-03-12 10:43:17 +0000 |
commit | 3f5f659208192192b83af727ab2f0103c16c1c44 (patch) | |
tree | c4db522d46c717e3c63a6d84f7549bb941bf12d1 | |
parent | 01c1f20dc516ba119bb6162119533914165d6451 (diff) | |
download | gcc-3f5f659208192192b83af727ab2f0103c16c1c44.zip gcc-3f5f659208192192b83af727ab2f0103c16c1c44.tar.gz gcc-3f5f659208192192b83af727ab2f0103c16c1c44.tar.bz2 |
tree-sra.c (create_access_replacement): Only rename the replacement if we can rewrite it into SSA form.
2012-03-12 Richard Guenther <rguenther@suse.de>
* tree-sra.c (create_access_replacement): Only rename the
replacement if we can rewrite it into SSA form. Properly
mark register typed replacements that we cannot rewrite
with TREE_ADDRESSABLE.
* tree-cfg.c (verify_expr): Fix BIT_FIELD_REF verification
for aggregate or BLKmode results.
From-SVN: r185221
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 14 | ||||
-rw-r--r-- | gcc/tree-sra.c | 16 |
3 files changed, 28 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da514e8..b35706a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-03-12 Richard Guenther <rguenther@suse.de> + + * tree-sra.c (create_access_replacement): Only rename the + replacement if we can rewrite it into SSA form. Properly + mark register typed replacements that we cannot rewrite + with TREE_ADDRESSABLE. + * tree-cfg.c (verify_expr): Fix BIT_FIELD_REF verification + for aggregate or BLKmode results. + 2012-03-12 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/52533 diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 9f75650..eb7b62a 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -2790,17 +2790,19 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED) error ("invalid position or size operand to BIT_FIELD_REF"); return t; } - else if (INTEGRAL_TYPE_P (TREE_TYPE (t)) - && (TYPE_PRECISION (TREE_TYPE (t)) - != TREE_INT_CST_LOW (TREE_OPERAND (t, 1)))) + if (INTEGRAL_TYPE_P (TREE_TYPE (t)) + && (TYPE_PRECISION (TREE_TYPE (t)) + != TREE_INT_CST_LOW (TREE_OPERAND (t, 1)))) { error ("integral result type precision does not match " "field size of BIT_FIELD_REF"); return t; } - if (!INTEGRAL_TYPE_P (TREE_TYPE (t)) - && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (t))) - != TREE_INT_CST_LOW (TREE_OPERAND (t, 1)))) + else if (!INTEGRAL_TYPE_P (TREE_TYPE (t)) + && !AGGREGATE_TYPE_P (TREE_TYPE (t)) + && TYPE_MODE (TREE_TYPE (t)) != BLKmode + && (GET_MODE_PRECISION (TYPE_MODE (TREE_TYPE (t))) + != TREE_INT_CST_LOW (TREE_OPERAND (t, 1)))) { error ("mode precision of non-integral result does not " "match field size of BIT_FIELD_REF"); diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 710f24e..65267a9 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1924,13 +1924,19 @@ create_access_replacement (struct access *access, bool rename) repl = create_tmp_var (access->type, "SR"); add_referenced_var (repl); - if (rename) + if (!access->grp_partial_lhs + && rename) mark_sym_for_renaming (repl); - if (!access->grp_partial_lhs - && (TREE_CODE (access->type) == COMPLEX_TYPE - || TREE_CODE (access->type) == VECTOR_TYPE)) - DECL_GIMPLE_REG_P (repl) = 1; + if (TREE_CODE (access->type) == COMPLEX_TYPE + || TREE_CODE (access->type) == VECTOR_TYPE) + { + if (!access->grp_partial_lhs) + DECL_GIMPLE_REG_P (repl) = 1; + } + else if (access->grp_partial_lhs + && is_gimple_reg_type (access->type)) + TREE_ADDRESSABLE (repl) = 1; DECL_SOURCE_LOCATION (repl) = DECL_SOURCE_LOCATION (access->base); DECL_ARTIFICIAL (repl) = 1; |