aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/passes.c11
-rw-r--r--gcc/tree-cfg.c5
-rw-r--r--gcc/tree-cfgcleanup.c3
-rw-r--r--gcc/tree-flow.h2
-rw-r--r--gcc/tree-ssa-ccp.c4
-rw-r--r--gcc/tree-ssa-forwprop.c2
-rw-r--r--gcc/tree-tailcall.c20
-rw-r--r--gcc/tree-vrp.c8
9 files changed, 41 insertions, 31 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7edc6df8..4fae499 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,20 @@
+2007-01-18 Jan Hubicka <jh@suse.cz>
+
+ * 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 <ubizjak@gmail.com>
* reg-stack.c (subst_stack_regs_pat) [UNSPEC_SINCOS_COS,
diff --git a/gcc/passes.c b/gcc/passes.c
index 9cb2c52..0ab5f48 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)
{
+ bool cleanup;
+
if (current_loops)
- cleanup_tree_cfg_loop ();
+ cleanup = cleanup_tree_cfg_loop ();
else
- cleanup_tree_cfg ();
+ 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 e497138..e9111d9 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 13a3b0b0..547b67a 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 7ebe52f..de2f0f9 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 f2f09ed0..b6c3599 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 66cc8b4..ca1d0a8 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 c652e58..b569678 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 e4f5e63..b466edf 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);
}