diff options
Diffstat (limited to 'gcc/tree-ssa-forwprop.c')
-rw-r--r-- | gcc/tree-ssa-forwprop.c | 36 |
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 |