mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-19 22:41:28 +08:00
tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Guard VIEW_CONVERT_EXPR case against invalid gimple.
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. From-SVN: r141212
This commit is contained in:
parent
8168c08f08
commit
73a5f1995f
@ -1,3 +1,8 @@
|
||||
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.
|
||||
|
||||
2008-10-17 Andreas Krebbel <krebbel1@de.ibm.com>
|
||||
|
||||
* c-parser.c (c_parser_binary_expression): Silence the
|
||||
|
@ -767,8 +767,8 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
||||
&& 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. */
|
||||
/* 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))
|
||||
@ -776,22 +776,27 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
|
||||
&& 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;
|
||||
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
|
||||
|
Loading…
x
Reference in New Issue
Block a user