From: Richard Guenther Date: Mon, 12 Mar 2012 10:43:17 +0000 (+0000) Subject: tree-sra.c (create_access_replacement): Only rename the replacement if we can rewrite... X-Git-Tag: misc/gccgo-go1_1_2~4062 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=3f5f659208192192b83af727ab2f0103c16c1c44;p=thirdparty%2Fgcc.git tree-sra.c (create_access_replacement): Only rename the replacement if we can rewrite it into SSA form. 2012-03-12 Richard Guenther * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da514e8a9353..b35706a8facc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-03-12 Richard Guenther + + * 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 PR tree-optimization/52533 diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 9f75650d7a79..eb7b62a72c50 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 710f24eeba6b..65267a92f831 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;