Commit f20731b7 by Jeff Law Committed by Jeff Law

passes.c (init_optimization_passes): Replace copy propagation passes immediately…

passes.c (init_optimization_passes): Replace copy propagation passes immediately after DOM with phi-only copy...

       * 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.

From-SVN: r104705
parent 3542b7cc
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> 2005-09-27 Nick Clifton <nickc@redhat.com>
* libgcc2.c (__popcount_tab): Remove redundant prototype. * libgcc2.c (__popcount_tab): Remove redundant prototype.
......
...@@ -494,6 +494,12 @@ init_optimization_passes (void) ...@@ -494,6 +494,12 @@ init_optimization_passes (void)
NEXT_PASS (pass_merge_phi); NEXT_PASS (pass_merge_phi);
NEXT_PASS (pass_dominator); 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_phiopt);
NEXT_PASS (pass_may_alias); NEXT_PASS (pass_may_alias);
NEXT_PASS (pass_tail_recursion); NEXT_PASS (pass_tail_recursion);
...@@ -508,7 +514,13 @@ init_optimization_passes (void) ...@@ -508,7 +514,13 @@ init_optimization_passes (void)
NEXT_PASS (pass_may_alias); NEXT_PASS (pass_may_alias);
NEXT_PASS (pass_rename_ssa_copies); NEXT_PASS (pass_rename_ssa_copies);
NEXT_PASS (pass_dominator); 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_dce);
NEXT_PASS (pass_dse); NEXT_PASS (pass_dse);
NEXT_PASS (pass_may_alias); NEXT_PASS (pass_may_alias);
...@@ -529,7 +541,13 @@ init_optimization_passes (void) ...@@ -529,7 +541,13 @@ init_optimization_passes (void)
NEXT_PASS (pass_sink_code); NEXT_PASS (pass_sink_code);
NEXT_PASS (pass_tree_loop); NEXT_PASS (pass_tree_loop);
NEXT_PASS (pass_dominator); 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); NEXT_PASS (pass_cd_dce);
/* FIXME: If DCE is not run before checking for uninitialized uses, /* FIXME: If DCE is not run before checking for uninitialized uses,
......
...@@ -275,6 +275,7 @@ extern struct tree_opt_pass pass_sink_code; ...@@ -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_fre;
extern struct tree_opt_pass pass_linear_transform; extern struct tree_opt_pass pass_linear_transform;
extern struct tree_opt_pass pass_copy_prop; 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_ccp;
extern struct tree_opt_pass pass_store_copy_prop; extern struct tree_opt_pass pass_store_copy_prop;
extern struct tree_opt_pass pass_vrp; extern struct tree_opt_pass pass_vrp;
......
...@@ -838,10 +838,12 @@ copy_prop_visit_phi_node (tree phi) ...@@ -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 static void
init_copy_prop (void) init_copy_prop (bool phis_only)
{ {
basic_block bb; basic_block bb;
...@@ -866,7 +868,7 @@ init_copy_prop (void) ...@@ -866,7 +868,7 @@ init_copy_prop (void)
lists of the propagator. */ lists of the propagator. */
if (stmt_ends_bb_p (stmt)) if (stmt_ends_bb_p (stmt))
DONT_SIMULATE_AGAIN (stmt) = false; 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; DONT_SIMULATE_AGAIN (stmt) = false;
else else
{ {
...@@ -917,10 +919,15 @@ fini_copy_prop (void) ...@@ -917,10 +919,15 @@ fini_copy_prop (void)
} }
/* Main entry point to the copy propagator. The algorithm propagates /* Main entry point to the copy propagator.
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 PHIS_ONLY is true if we should only consider PHI nodes as generating
following example shows how the algorithm proceeds at a high level: 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 1 a_24 = x_1
2 a_2 = PHI <a_24, x_1> 2 a_2 = PHI <a_24, x_1>
...@@ -1020,10 +1027,10 @@ fini_copy_prop (void) ...@@ -1020,10 +1027,10 @@ fini_copy_prop (void)
x_53 and x_54 are both copies of x_898. */ x_53 and x_54 are both copies of x_898. */
static void 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; 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); ssa_propagate (copy_prop_visit_stmt, copy_prop_visit_phi_node);
fini_copy_prop (); fini_copy_prop ();
} }
...@@ -1038,7 +1045,7 @@ gate_copy_prop (void) ...@@ -1038,7 +1045,7 @@ gate_copy_prop (void)
static void static void
do_copy_prop (void) do_copy_prop (void)
{ {
execute_copy_prop (false); execute_copy_prop (false, false);
} }
struct tree_opt_pass pass_copy_prop = struct tree_opt_pass pass_copy_prop =
...@@ -1063,6 +1070,34 @@ 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 static bool
gate_store_copy_prop (void) gate_store_copy_prop (void)
{ {
...@@ -1077,7 +1112,7 @@ static void ...@@ -1077,7 +1112,7 @@ static void
store_copy_prop (void) store_copy_prop (void)
{ {
/* If STORE-COPY-PROP is not enabled, we just run regular COPY-PROP. */ /* 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 = struct tree_opt_pass pass_store_copy_prop =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment