From 1994bfea41d3cea4650b1678c13a70bf88186839 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 18 Jan 2007 15:56:33 +0100 Subject: [PATCH] tree-vrp.c (finalize_jump_threads): Do not call cleanup_cfg by hand. * tree-vrp.c (finalize_jump_threads): Do not call cleanup_cfg by hand. * tree-tailcall (add_virtual_phis): Likewise. (optimize_tail_call): Return TODOs. (execute_tail_calls): Return TODOs. * tree-ssa-ccp (execute_fold_all_builtins): Do cleanup_cfg via TODO. * tree-cfgcleanup.c (cleanup_tree_cfg_loop): Return if something changed. * tree-ssa-forwprop.c (tree_ssa_forward_propagate_single_use_value): Cleanup cfg using TODO. * tree-flow.h (cleanup_tree_cfg_loop): Update prototype. * passes.c (execute_function_todo): When cleanup did something, remove unused locals. * tree-cfg.c (pass_build_cfg): Add cleanup_cfg TODO. (make_edges): Don't cleanup_cfg. From-SVN: r120900 --- gcc/ChangeLog | 17 +++++++++++++++++ gcc/passes.c | 15 ++++++++++----- gcc/tree-cfg.c | 5 +---- gcc/tree-cfgcleanup.c | 3 ++- gcc/tree-flow.h | 2 +- gcc/tree-ssa-ccp.c | 4 +--- gcc/tree-ssa-forwprop.c | 2 +- gcc/tree-tailcall.c | 20 ++++++++------------ gcc/tree-vrp.c | 8 ++------ 9 files changed, 43 insertions(+), 33 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7edc6df8bfa..4fae499454d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +2007-01-18 Jan Hubicka + + * tree-vrp.c (finalize_jump_threads): Do not call cleanup_cfg by hand. + * tree-tailcall (add_virtual_phis): Likewise. + (optimize_tail_call): Return TODOs. + (execute_tail_calls): Return TODOs. + * tree-ssa-ccp (execute_fold_all_builtins): Do cleanup_cfg via TODO. + * tree-cfgcleanup.c (cleanup_tree_cfg_loop): Return if something + changed. + * tree-ssa-forwprop.c (tree_ssa_forward_propagate_single_use_value): + Cleanup cfg using TODO. + * tree-flow.h (cleanup_tree_cfg_loop): Update prototype. + * passes.c (execute_function_todo): When cleanup did something, remove + unused locals. + * tree-cfg.c (pass_build_cfg): Add cleanup_cfg TODO. + (make_edges): Don't cleanup_cfg. + 2007-01-18 Uros Bizjak * reg-stack.c (subst_stack_regs_pat) [UNSPEC_SINCOS_COS, diff --git a/gcc/passes.c b/gcc/passes.c index 9cb2c5284e4..0ab5f4815e4 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -818,14 +818,19 @@ execute_function_todo (void *data) if (!flags) return; - /* Always cleanup the CFG before trying to update SSA . */ + /* Always cleanup the CFG before trying to update SSA. */ if (flags & TODO_cleanup_cfg) { - if (current_loops) - cleanup_tree_cfg_loop (); - else - cleanup_tree_cfg (); + bool cleanup; + if (current_loops) + cleanup = cleanup_tree_cfg_loop (); + else + cleanup = cleanup_tree_cfg (); + + if (cleanup && (cfun->curr_properties & PROP_ssa)) + flags |= TODO_remove_unused_locals; + /* When cleanup_tree_cfg merges consecutive blocks, it may perform some simplistic propagation when removing single valued PHI nodes. This propagation may, in turn, cause the diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index e4971384438..e9111d93fac 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -237,7 +237,7 @@ struct tree_opt_pass pass_build_cfg = PROP_cfg, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_verify_stmts, /* todo_flags_finish */ + TODO_verify_stmts | TODO_cleanup_cfg, /* todo_flags_finish */ 0 /* letter */ }; @@ -579,9 +579,6 @@ make_edges (void) /* Fold COND_EXPR_COND of each COND_EXPR. */ fold_cond_expr_cond (); - - /* Clean up the graph and warn for unreachable code. */ - cleanup_tree_cfg (); } diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c index 13a3b0b0ea8..547b67af471 100644 --- a/gcc/tree-cfgcleanup.c +++ b/gcc/tree-cfgcleanup.c @@ -574,7 +574,7 @@ cleanup_tree_cfg (void) /* Cleanup cfg and repair loop structures. */ -void +bool cleanup_tree_cfg_loop (void) { bool changed = cleanup_tree_cfg (); @@ -597,6 +597,7 @@ cleanup_tree_cfg_loop (void) #endif scev_reset (); } + return changed; } /* Merge the PHI nodes at BB into those at BB's sole successor. */ diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index 7ebe52f4afe..de2f0f9f243 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -678,7 +678,7 @@ extern basic_block move_sese_region_to_fn (struct function *, basic_block, /* In tree-cfgcleanup.c */ extern bool cleanup_tree_cfg (void); -extern void cleanup_tree_cfg_loop (void); +extern bool cleanup_tree_cfg_loop (void); /* In tree-pretty-print.c. */ extern void dump_generic_bb (FILE *, basic_block, int, int); diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index f2f09ed0d47..b6c3599f9d9 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -2630,9 +2630,7 @@ execute_fold_all_builtins (void) } /* Delete unreachable blocks. */ - if (cfg_changed) - cleanup_tree_cfg (); - return 0; + return cfg_changed ? TODO_cleanup_cfg : 0; } diff --git a/gcc/tree-ssa-forwprop.c b/gcc/tree-ssa-forwprop.c index 66cc8b46acc..ca1d0a81f91 100644 --- a/gcc/tree-ssa-forwprop.c +++ b/gcc/tree-ssa-forwprop.c @@ -1041,7 +1041,7 @@ tree_ssa_forward_propagate_single_use_vars (void) } if (cfg_changed) - cleanup_tree_cfg (); + todoflags |= TODO_cleanup_cfg; return todoflags; } diff --git a/gcc/tree-tailcall.c b/gcc/tree-tailcall.c index c652e582d25..b5696789657 100644 --- a/gcc/tree-tailcall.c +++ b/gcc/tree-tailcall.c @@ -829,8 +829,6 @@ add_virtual_phis (void) if (!is_gimple_reg (var) && gimple_default_def (cfun, var) != NULL_TREE) mark_sym_for_renaming (var); } - - update_ssa (TODO_update_ssa_only_virtuals); } /* Optimizes the tailcall described by T. If OPT_TAILCALLS is true, also @@ -865,7 +863,7 @@ optimize_tail_call (struct tailcall *t, bool opt_tailcalls) /* Optimizes tail calls in the function, turning the tail recursion into iteration. */ -static void +static unsigned int tree_optimize_tail_calls_1 (bool opt_tailcalls) { edge e; @@ -877,7 +875,7 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls) edge_iterator ei; if (!suitable_for_tail_opt_p ()) - return; + return 0; if (opt_tailcalls) opt_tailcalls = suitable_for_tail_call_opt_p (); @@ -985,20 +983,19 @@ tree_optimize_tail_calls_1 (bool opt_tailcalls) } if (changed) - { - free_dominance_info (CDI_DOMINATORS); - cleanup_tree_cfg (); - } + free_dominance_info (CDI_DOMINATORS); if (phis_constructed) add_virtual_phis (); + if (changed) + return TODO_cleanup_cfg | TODO_update_ssa_only_virtuals; + return 0; } static unsigned int execute_tail_recursion (void) { - tree_optimize_tail_calls_1 (false); - return 0; + return tree_optimize_tail_calls_1 (false); } static bool @@ -1010,8 +1007,7 @@ gate_tail_calls (void) static unsigned int execute_tail_calls (void) { - tree_optimize_tail_calls_1 (true); - return 0; + return tree_optimize_tail_calls_1 (true); } struct tree_opt_pass pass_tail_recursion = diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index e4f5e639c51..b466edf4c6f 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -4894,13 +4894,9 @@ finalize_jump_threads (void) cfg_altered = thread_through_all_blocks (); /* If we threaded jumps, then we need to recompute the dominance - information, to safely do that we must clean up the CFG first. */ + information. */ if (cfg_altered) - { - free_dominance_info (CDI_DOMINATORS); - cleanup_tree_cfg (); - calculate_dominance_info (CDI_DOMINATORS); - } + free_dominance_info (CDI_DOMINATORS); VEC_free (tree, heap, stack); }