This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix VCE folding in forwprop
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sat, 18 Oct 2008 20:08:54 +0200 (CEST)
- Subject: [PATCH] Fix VCE folding in forwprop
This fixes VCE folding to only apply if either it retains a VCE or
the whole rhs is replaced. Otherwise we may force something into
a register that is not.
Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.
Richard.
2008-10-18 Richard Guenther <rguenther@suse.de>
* tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Guard
VIEW_CONVERT_EXPR case against invalid gimple.
Index: gcc/tree-ssa-forwprop.c
===================================================================
*** gcc/tree-ssa-forwprop.c (revision 141150)
--- gcc/tree-ssa-forwprop.c (working copy)
*************** forward_propagate_addr_expr_1 (tree name
*** 767,774 ****
&& TREE_OPERAND (rhs, 0) == name
&& TYPE_SIZE (TREE_TYPE (rhs))
&& TYPE_SIZE (TREE_TYPE (TREE_OPERAND (def_rhs, 0)))
! /* Function decls should not be used for VCE either as it could be
! a function descriptor that we want and not the actual function code. */
&& TREE_CODE (TREE_OPERAND (def_rhs, 0)) != FUNCTION_DECL
/* We should not convert volatile loads to non volatile loads. */
&& !TYPE_VOLATILE (TREE_TYPE (rhs))
--- 767,774 ----
&& TREE_OPERAND (rhs, 0) == name
&& TYPE_SIZE (TREE_TYPE (rhs))
&& TYPE_SIZE (TREE_TYPE (TREE_OPERAND (def_rhs, 0)))
! /* Function decls should not be used for VCE either as it could be a
! function descriptor that we want and not the actual function code. */
&& TREE_CODE (TREE_OPERAND (def_rhs, 0)) != FUNCTION_DECL
/* We should not convert volatile loads to non volatile loads. */
&& !TYPE_VOLATILE (TREE_TYPE (rhs))
*************** forward_propagate_addr_expr_1 (tree name
*** 776,797 ****
&& operand_equal_p (TYPE_SIZE (TREE_TYPE (rhs)),
TYPE_SIZE (TREE_TYPE (TREE_OPERAND (def_rhs, 0))), 0))
{
! bool res = true;
! tree new_rhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
! new_rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (rhs), new_rhs);
! /* If we have folded the VCE, then we have to create a new statement. */
! if (TREE_CODE (new_rhs) != VIEW_CONVERT_EXPR)
! {
! gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
! new_rhs = force_gimple_operand_gsi (&gsi, new_rhs, true, NULL, true, GSI_SAME_STMT);
! /* As we change the deference to a SSA_NAME, we need to return false to make sure that
! the statement does not get removed. */
! res = false;
! }
! *rhsp = new_rhs;
! fold_stmt_inplace (use_stmt);
! tidy_after_forward_propagate_addr (use_stmt);
! return res;
}
/* If the use of the ADDR_EXPR is not a POINTER_PLUS_EXPR, there
--- 776,802 ----
&& operand_equal_p (TYPE_SIZE (TREE_TYPE (rhs)),
TYPE_SIZE (TREE_TYPE (TREE_OPERAND (def_rhs, 0))), 0))
{
! tree new_rhs = unshare_expr (TREE_OPERAND (def_rhs, 0));
! new_rhs = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (rhs), new_rhs);
! if (TREE_CODE (new_rhs) != VIEW_CONVERT_EXPR)
! {
! /* If we have folded the VIEW_CONVERT_EXPR then the result is only
! valid if we can replace the whole rhs of the use statement. */
! if (rhs != gimple_assign_rhs1 (use_stmt))
! return false;
! new_rhs = force_gimple_operand_gsi (use_stmt_gsi, new_rhs, true, NULL,
! true, GSI_NEW_STMT);
! gimple_assign_set_rhs1 (use_stmt, new_rhs);
! }
! else
! {
! /* We may have arbitrary VIEW_CONVERT_EXPRs in a nested component
! reference. Place it there and fold the thing. */
! *rhsp = new_rhs;
! fold_stmt_inplace (use_stmt);
! }
! tidy_after_forward_propagate_addr (use_stmt);
! return true;
}
/* If the use of the ADDR_EXPR is not a POINTER_PLUS_EXPR, there