aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-03-12 10:43:17 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-03-12 10:43:17 +0000
commit3f5f659208192192b83af727ab2f0103c16c1c44 (patch)
treec4db522d46c717e3c63a6d84f7549bb941bf12d1
parent01c1f20dc516ba119bb6162119533914165d6451 (diff)
downloadgcc-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/ChangeLog9
-rw-r--r--gcc/tree-cfg.c14
-rw-r--r--gcc/tree-sra.c16
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;