aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-forwprop.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2011-08-30 14:06:00 +0000
committerRichard Guenther <rguenther@suse.de>2011-08-30 14:06:00 +0000
commit79365354493e04a0d7ac3a8c5e770abadb894fac (patch)
tree04e75f6b96cabc5abbb23cc93d17526c05e9e9f7 /gcc/tree-ssa-forwprop.c
parent89956c24554b7c4fe0ec1ea1bbe2fefded20d2a5 (diff)
2011-08-30 Richard Guenther <rguenther@suse.de>
PR middle-end/48571 * gimple.h (maybe_fold_offset_to_address): Remove. (maybe_fold_offset_to_reference): Likewise. (maybe_fold_stmt_addition): Likewise. (may_propagate_address_into_dereference): Likewise. * tree-inline.c (remap_gimple_op_r): Do not reconstruct array references. * gimple-fold.c (canonicalize_constructor_val): Likewise. Canonicalize invariant POINTER_PLUS_EXPRs to invariant MEM_REF addresses instead. (may_propagate_address_into_dereference): Remove. (maybe_fold_offset_to_array_ref): Likewise. (maybe_fold_offset_to_reference): Likewise. (maybe_fold_offset_to_address): Likewise. (maybe_fold_stmt_addition): Likewise. (fold_gimple_assign): Do not reconstruct array references but instead canonicalize invariant POINTER_PLUS_EXPRs to invariant MEM_REF addresses. (gimple_fold_stmt_to_constant_1): Likewise. * tree-ssa-forwprop.c (forward_propagate_addr_expr_1): Likewise. * gimplify.c (gimplify_conversion): Likewise. (gimplify_expr): Likewise. * gcc.c-torture/execute/pr48571-1.c: New testcase. * gcc.dg/tree-ssa/ssa-ccp-25.c: Remove. * gcc.dg/tree-ssa/ssa-ccp-26.c: Likewise. * gcc.dg/pr36902.c: XFAIL. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@178312 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r--gcc/tree-ssa-forwprop.c36
1 files changed, 13 insertions, 23 deletions
diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c
index 00121796613..7dd5e08ac6d 100644
--- a/gcc/tree-ssa-forwprop.c
+++ b/gcc/tree-ssa-forwprop.c
@@ -1002,31 +1002,21 @@ forward_propagate_addr_expr_1 (tree name, tree def_rhs,
return false;
rhs2 = gimple_assign_rhs2 (use_stmt);
- /* Try to optimize &x[C1] p+ C2 where C2 is a multiple of the size
- of the elements in X into &x[C1 + C2/element size]. */
+ /* Optimize &x[C1] p+ C2 to &x p+ C3 with C3 = C1 * element_size + C2. */
if (TREE_CODE (rhs2) == INTEGER_CST)
{
- tree new_rhs = maybe_fold_stmt_addition (gimple_location (use_stmt),
- TREE_TYPE (def_rhs),
- def_rhs, rhs2);
- if (new_rhs)
- {
- tree type = TREE_TYPE (gimple_assign_lhs (use_stmt));
- new_rhs = unshare_expr (new_rhs);
- if (!useless_type_conversion_p (type, TREE_TYPE (new_rhs)))
- {
- if (!is_gimple_min_invariant (new_rhs))
- new_rhs = force_gimple_operand_gsi (use_stmt_gsi, new_rhs,
- true, NULL_TREE,
- true, GSI_SAME_STMT);
- new_rhs = fold_convert (type, new_rhs);
- }
- gimple_assign_set_rhs_from_tree (use_stmt_gsi, new_rhs);
- use_stmt = gsi_stmt (*use_stmt_gsi);
- update_stmt (use_stmt);
- tidy_after_forward_propagate_addr (use_stmt);
- return true;
- }
+ tree new_rhs = build1_loc (gimple_location (use_stmt),
+ ADDR_EXPR, TREE_TYPE (def_rhs),
+ fold_build2 (MEM_REF,
+ TREE_TYPE (TREE_TYPE (def_rhs)),
+ unshare_expr (def_rhs),
+ fold_convert (ptr_type_node,
+ rhs2)));
+ gimple_assign_set_rhs_from_tree (use_stmt_gsi, new_rhs);
+ use_stmt = gsi_stmt (*use_stmt_gsi);
+ update_stmt (use_stmt);
+ tidy_after_forward_propagate_addr (use_stmt);
+ return true;
}
/* Try to optimize &x[0] p+ OFFSET where OFFSET is defined by