From bc1d3d97f7832e31539c93967932fe0d9332ea0d Mon Sep 17 00:00:00 2001 From: rguenth Date: Thu, 23 Apr 2015 11:19:45 +0000 Subject: [PATCH] 2015-04-23 Richard Biener * passes.def: Remove copy propagation passes run directly after CCP. * tree-ssa-ccp.c (get_value_for_expr): Fall back to a COPY for SSA names. (ccp_visit_phi_node): Rework to handle first executable edge specially. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@222360 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 8 ++++++++ gcc/passes.def | 2 -- gcc/tree-ssa-ccp.c | 50 ++++++++++++++++++++++++++++---------------------- 3 files changed, 36 insertions(+), 24 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c56113e1dd6..6e2742837c0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-04-23 Richard Biener + + * passes.def: Remove copy propagation passes run directly after CCP. + * tree-ssa-ccp.c (get_value_for_expr): Fall back to a COPY for + SSA names. + (ccp_visit_phi_node): Rework to handle first executable edge + specially. + 2015-04-23 Matthew Wahab * config/arm/arm.h (LEGITIMIZE_RELOAD_ADDRESS): Remove. diff --git a/gcc/passes.def b/gcc/passes.def index 4c20cdf0dfc..6dce1419de1 100644 --- a/gcc/passes.def +++ b/gcc/passes.def @@ -159,7 +159,6 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_ccp); /* After CCP we rewrite no longer addressed locals into SSA form if possible. */ - NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_complete_unrolli); NEXT_PASS (pass_phiprop); NEXT_PASS (pass_forwprop); @@ -211,7 +210,6 @@ along with GCC; see the file COPYING3. If not see NEXT_PASS (pass_ccp); /* After CCP we rewrite no longer addressed locals into SSA form if possible. */ - NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_cse_sincos); NEXT_PASS (pass_optimize_bswap); NEXT_PASS (pass_split_crit_edges); diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index 1d7cafeb807..b14c12d8b18 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -539,9 +539,14 @@ set_lattice_value (tree var, ccp_prop_value_t new_val) if (old_val->lattice_val != new_val.lattice_val || (new_val.lattice_val == CONSTANT && (TREE_CODE (new_val.value) != TREE_CODE (old_val->value) - || simple_cst_equal (new_val.value, old_val->value) != 1 || (TREE_CODE (new_val.value) == INTEGER_CST - && new_val.mask != old_val->mask)))) + && (new_val.mask != old_val->mask + || (wi::bit_and_not (wi::to_widest (old_val->value), + new_val.mask) + != wi::bit_and_not (wi::to_widest (new_val.value), + new_val.mask)))) + || (TREE_CODE (new_val.value) != INTEGER_CST + && !operand_equal_p (new_val.value, old_val->value, 0))))) { /* ??? We would like to delay creation of INTEGER_CSTs from partially constants here. */ @@ -623,6 +628,15 @@ get_value_for_expr (tree expr, bool for_bits_p) && val.lattice_val == CONSTANT && TREE_CODE (val.value) == ADDR_EXPR) val = get_value_from_alignment (val.value); + /* Fall back to a copy value. */ + if (!for_bits_p + && val.lattice_val == VARYING + && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (expr)) + { + val.lattice_val = CONSTANT; + val.value = expr; + val.mask = -1; + } } else if (is_gimple_min_invariant (expr) && (!for_bits_p || TREE_CODE (expr) != ADDR_EXPR)) @@ -1068,7 +1082,7 @@ static enum ssa_prop_result ccp_visit_phi_node (gphi *phi) { unsigned i; - ccp_prop_value_t *old_val, new_val; + ccp_prop_value_t new_val; if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -1076,25 +1090,11 @@ ccp_visit_phi_node (gphi *phi) print_gimple_stmt (dump_file, phi, 0, dump_flags); } - old_val = get_value (gimple_phi_result (phi)); - switch (old_val->lattice_val) - { - case VARYING: - return SSA_PROP_VARYING; - - case CONSTANT: - new_val = *old_val; - break; - - case UNDEFINED: - new_val.lattice_val = UNDEFINED; - new_val.value = NULL_TREE; - break; - - default: - gcc_unreachable (); - } + new_val.lattice_val = UNDEFINED; + new_val.value = NULL_TREE; + new_val.mask = 0; + bool first = true; for (i = 0; i < gimple_phi_num_args (phi); i++) { /* Compute the meet operator over all the PHI arguments flowing @@ -1116,7 +1116,13 @@ ccp_visit_phi_node (gphi *phi) tree arg = gimple_phi_arg (phi, i)->def; ccp_prop_value_t arg_val = get_value_for_expr (arg, false); - ccp_lattice_meet (gimple_bb (phi), &new_val, &arg_val); + if (first) + { + new_val = arg_val; + first = false; + } + else + ccp_lattice_meet (gimple_bb (phi), &new_val, &arg_val); if (dump_file && (dump_flags & TDF_DETAILS)) { -- 2.11.4.GIT