aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-forwprop.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2008-11-17 21:58:52 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2008-11-17 21:58:52 +0100
commit286ba5b3078d6d71896afe5f95d21bc6d20154b6 (patch)
tree2fda85eef94cf204f819a91ac43fc189c8adafb3 /gcc/tree-ssa-forwprop.c
parent5ef87778f1d3f5b25a82fd313911c4a376974c07 (diff)
downloadgcc-286ba5b3078d6d71896afe5f95d21bc6d20154b6.zip
gcc-286ba5b3078d6d71896afe5f95d21bc6d20154b6.tar.gz
gcc-286ba5b3078d6d71896afe5f95d21bc6d20154b6.tar.bz2
re PR middle-end/38140 (ice for C code with -O2)
PR middle-end/38140 * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): If propagating x = &a into *x = b, add a cast if not useless type conversion or don't optimize if another stmt would be needed. * gcc.dg/pr38140.c: New test. From-SVN: r141949
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r--gcc/tree-ssa-forwprop.c27
1 files changed, 21 insertions, 6 deletions
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index 5626b10..333ef82 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -721,13 +721,28 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
&& TREE_OPERAND (lhs, 0) == name
&& may_propagate_address_into_dereference (def_rhs, lhs))
{
- *lhsp = unshare_expr (TREE_OPERAND (def_rhs, 0));
- fold_stmt_inplace (use_stmt);
- tidy_after_forward_propagate_addr (use_stmt);
+ bool valid = true;
+ if (lhsp == gimple_assign_lhs_ptr (use_stmt)
+ && !useless_type_conversion_p (TREE_TYPE (TREE_OPERAND (def_rhs, 0)),
+ TREE_TYPE (rhs))
+ && !CONVERT_EXPR_CODE_P (rhs_code))
+ {
+ if (rhs_code == SSA_NAME)
+ gimple_assign_set_rhs_code (use_stmt, NOP_EXPR);
+ else
+ valid = false;
+ }
+ if (valid)
+ {
+ *lhsp = unshare_expr (TREE_OPERAND (def_rhs, 0));
+ fold_stmt_inplace (use_stmt);
+ tidy_after_forward_propagate_addr (use_stmt);
- /* Continue propagating into the RHS if this was not the only use. */
- if (single_use_p)
- return true;
+ /* Continue propagating into the RHS if this was not the only
+ use. */
+ if (single_use_p)
+ return true;
+ }
}
/* Strip away any outer COMPONENT_REF, ARRAY_REF or ADDR_EXPR