diff options
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/passes.c | 22 | ||||
-rw-r--r-- | gcc/tree-pass.h | 1 | ||||
-rw-r--r-- | gcc/tree-ssa-copy.c | 57 |
4 files changed, 80 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d0e34c8c45f..fd231baa496 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2005-09-27 Jeff Law <law@redhat.com> + + * passes.c (init_optimization_passes): Replace copy propagation + passes immediately after DOM with phi-only copy propagation + pases. Add phi-only copy propagation pass after first DOM pass. + * tree-pass.h (pass_phi_only_copy_prop): Declare. + * tree-ssa-copy.c (init_copy_prop): Accept new PHI_ONLY argument. + If true, then mark all non-control statements with DONT_SIMULATE_AGAIN. + (execute_copy_prop): Accept new PHI_ONLY argument. Pass it along + to init_copy_prop. Callers updated. + (do_phi_only_copy_prop): New function. + (pass_phi_only_copy_prop): New pass descriptor. + 2005-09-27 Nick Clifton <nickc@redhat.com> * libgcc2.c (__popcount_tab): Remove redundant prototype. diff --git a/gcc/passes.c b/gcc/passes.c index 6a35b1750a7..b03eae39f43 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -494,6 +494,12 @@ init_optimization_passes (void) NEXT_PASS (pass_merge_phi); NEXT_PASS (pass_dominator); + /* The only copy propagation opportunities left after DOM + should be due to degenerate PHI nodes. So rather than + run the full copy propagator, just discover and copy + propagate away the degenerate PHI nodes. */ + NEXT_PASS (pass_phi_only_copy_prop); + NEXT_PASS (pass_phiopt); NEXT_PASS (pass_may_alias); NEXT_PASS (pass_tail_recursion); @@ -508,7 +514,13 @@ init_optimization_passes (void) NEXT_PASS (pass_may_alias); NEXT_PASS (pass_rename_ssa_copies); NEXT_PASS (pass_dominator); - NEXT_PASS (pass_copy_prop); + + /* The only copy propagation opportunities left after DOM + should be due to degenerate PHI nodes. So rather than + run the full copy propagator, just discover and copy + propagate away the degenerate PHI nodes. */ + NEXT_PASS (pass_phi_only_copy_prop); + NEXT_PASS (pass_dce); NEXT_PASS (pass_dse); NEXT_PASS (pass_may_alias); @@ -529,7 +541,13 @@ init_optimization_passes (void) NEXT_PASS (pass_sink_code); NEXT_PASS (pass_tree_loop); NEXT_PASS (pass_dominator); - NEXT_PASS (pass_copy_prop); + + /* The only copy propagation opportunities left after DOM + should be due to degenerate PHI nodes. So rather than + run the full copy propagator, just discover and copy + propagate away the degenerate PHI nodes. */ + NEXT_PASS (pass_phi_only_copy_prop); + NEXT_PASS (pass_cd_dce); /* FIXME: If DCE is not run before checking for uninitialized uses, diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h index 57dc029438e..6674884944a 100644 --- a/gcc/tree-pass.h +++ b/gcc/tree-pass.h @@ -275,6 +275,7 @@ extern struct tree_opt_pass pass_sink_code; extern struct tree_opt_pass pass_fre; extern struct tree_opt_pass pass_linear_transform; extern struct tree_opt_pass pass_copy_prop; +extern struct tree_opt_pass pass_phi_only_copy_prop; extern struct tree_opt_pass pass_store_ccp; extern struct tree_opt_pass pass_store_copy_prop; extern struct tree_opt_pass pass_vrp; diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c index 47ac55f3b5f..575fe09d6e4 100644 --- a/gcc/tree-ssa-copy.c +++ b/gcc/tree-ssa-copy.c @@ -838,10 +838,12 @@ copy_prop_visit_phi_node (tree phi) } -/* Initialize structures used for copy propagation. */ +/* Initialize structures used for copy propagation. PHIS_ONLY is true + if we should only consider PHI nodes as generating copy propagation + opportunities. */ static void -init_copy_prop (void) +init_copy_prop (bool phis_only) { basic_block bb; @@ -866,7 +868,7 @@ init_copy_prop (void) lists of the propagator. */ if (stmt_ends_bb_p (stmt)) DONT_SIMULATE_AGAIN (stmt) = false; - else if (stmt_may_generate_copy (stmt)) + else if (!phis_only && stmt_may_generate_copy (stmt)) DONT_SIMULATE_AGAIN (stmt) = false; else { @@ -917,10 +919,15 @@ fini_copy_prop (void) } -/* Main entry point to the copy propagator. The algorithm propagates - the value COPY-OF using ssa_propagate. For every variable X_i, - COPY-OF(X_i) indicates which variable is X_i created from. The - following example shows how the algorithm proceeds at a high level: +/* Main entry point to the copy propagator. + + PHIS_ONLY is true if we should only consider PHI nodes as generating + copy propagation opportunities. + + The algorithm propagates the value COPY-OF using ssa_propagate. For + every variable X_i, COPY-OF(X_i) indicates which variable is X_i created + from. The following example shows how the algorithm proceeds at a + high level: 1 a_24 = x_1 2 a_2 = PHI <a_24, x_1> @@ -1020,10 +1027,10 @@ fini_copy_prop (void) x_53 and x_54 are both copies of x_898. */ static void -execute_copy_prop (bool store_copy_prop) +execute_copy_prop (bool store_copy_prop, bool phis_only) { do_store_copy_prop = store_copy_prop; - init_copy_prop (); + init_copy_prop (phis_only); ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node); fini_copy_prop (); } @@ -1038,7 +1045,7 @@ gate_copy_prop (void) static void do_copy_prop (void) { - execute_copy_prop (false); + execute_copy_prop (false, false); } struct tree_opt_pass pass_copy_prop = @@ -1063,6 +1070,34 @@ struct tree_opt_pass pass_copy_prop = }; +static void +do_phi_only_copy_prop (void) +{ + execute_copy_prop (false, true); +} + +struct tree_opt_pass pass_phi_only_copy_prop = +{ + "phionlycopyprop", /* name */ + gate_copy_prop, /* gate */ + do_phi_only_copy_prop, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_TREE_COPY_PROP, /* tv_id */ + PROP_ssa | PROP_alias | PROP_cfg, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + TODO_cleanup_cfg + | TODO_dump_func + | TODO_ggc_collect + | TODO_verify_ssa + | TODO_update_ssa, /* todo_flags_finish */ + 0 /* letter */ +}; + + static bool gate_store_copy_prop (void) { @@ -1077,7 +1112,7 @@ static void store_copy_prop (void) { /* If STORE-COPY-PROP is not enabled, we just run regular COPY-PROP. */ - execute_copy_prop (flag_tree_store_copy_prop != 0); + execute_copy_prop (flag_tree_store_copy_prop != 0, false); } struct tree_opt_pass pass_store_copy_prop = |