This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix some SRA and GIMPLE verification issues
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 12 Mar 2012 11:40:37 +0100 (CET)
- Subject: [PATCH] Fix some SRA and GIMPLE verification issues
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 <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.
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");