This fixes issues I noticed when working on the bitfield expansion issues.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2012-03-05 Richard Guenther <rguent...@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. Index: gcc/tree-sra.c =================================================================== *** gcc/tree-sra.c.orig 2012-02-21 12:59:35.000000000 +0100 --- gcc/tree-sra.c 2012-02-24 12:52:39.000000000 +0100 *************** create_access_replacement (struct access *** 1922,1934 **** repl = create_tmp_var (access->type, "SR"); add_referenced_var (repl); ! if (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; DECL_SOURCE_LOCATION (repl) = DECL_SOURCE_LOCATION (access->base); DECL_ARTIFICIAL (repl) = 1; --- 1922,1940 ---- repl = create_tmp_var (access->type, "SR"); add_referenced_var (repl); ! if (!access->grp_partial_lhs ! && rename) mark_sym_for_renaming (repl); ! 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; Index: gcc/tree-cfg.c =================================================================== *** gcc/tree-cfg.c.orig 2012-02-24 12:29:18.000000000 +0100 --- gcc/tree-cfg.c 2012-02-24 12:52:39.000000000 +0100 *************** verify_expr (tree *tp, int *walk_subtree *** 2879,2895 **** 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)))) { 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)))) { error ("mode precision of non-integral result does not " "match field size of BIT_FIELD_REF"); --- 2879,2897 ---- error ("invalid position or size operand to BIT_FIELD_REF"); return t; } ! 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; } ! 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");