+2008-11-17 Jakub Jelinek <jakub@redhat.com>
+
+ 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.
+
2008-11-17 Uros Bizjak <ubizjak@gmail.com>
PR middle-end/37908
&& 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