From 3253eafbda8e4af9522ecb9316bd8a2b1c853888 Mon Sep 17 00:00:00 2001 From: Jan Hubicka Date: Thu, 18 Jan 2007 10:11:57 +0100 Subject: [PATCH] tree-ssa-ccp.c (ccp_finalize): Return if something changed. * tree-ssa-ccp.c (ccp_finalize): Return if something changed. (execute_ssa_ccp): Return flags conditionally. * tree-ssa-propagate.c (substitue_and_fold): Return if something was changed. * tree-ssa-propagate.h (substitute_and_fold): Update prototype. From-SVN: r120894 --- gcc/ChangeLog | 8 ++++++++ gcc/tree-ssa-ccp.c | 41 ++++++++++++++++++---------------------- gcc/tree-ssa-propagate.c | 11 ++++++++--- gcc/tree-ssa-propagate.h | 2 +- 4 files changed, 35 insertions(+), 27 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index caaf93290d2..6539a7e7e1d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +18-01-2007 Jan Hubicka + + * tree-ssa-ccp.c (ccp_finalize): Return if something changed. + (execute_ssa_ccp): Return flags conditionally. + * tree-ssa-propagate.c (substitue_and_fold): Return if something was + changed. + * tree-ssa-propagate.h (substitute_and_fold): Update prototype. + 18-01-2007 Steven Bosscher * cfgcleanup.c (cleanup_cfg): Detect cfglayout mode and set diff --git a/gcc/tree-ssa-ccp.c b/gcc/tree-ssa-ccp.c index efd3a26e986..f2f09ed0d47 100644 --- a/gcc/tree-ssa-ccp.c +++ b/gcc/tree-ssa-ccp.c @@ -665,15 +665,18 @@ ccp_initialize (void) /* Do final substitution of propagated values, cleanup the flowgraph and - free allocated storage. */ + free allocated storage. -static void + Return TRUE when something was optimized. */ + +static bool ccp_finalize (void) { /* Perform substitutions based on the known constant values. */ - substitute_and_fold (const_val, false); + bool something_changed = substitute_and_fold (const_val, false); free (const_val); + return something_changed;; } @@ -1397,21 +1400,24 @@ ccp_visit_stmt (tree stmt, edge *taken_edge_p, tree *output_p) /* Main entry point for SSA Conditional Constant Propagation. */ -static void +static unsigned int execute_ssa_ccp (bool store_ccp) { do_store_ccp = store_ccp; ccp_initialize (); ssa_propagate (ccp_visit_stmt, ccp_visit_phi_node); - ccp_finalize (); + if (ccp_finalize ()) + return (TODO_cleanup_cfg | TODO_update_ssa | TODO_update_smt_usage + | TODO_remove_unused_locals); + else + return 0; } static unsigned int do_ssa_ccp (void) { - execute_ssa_ccp (false); - return 0; + return execute_ssa_ccp (false); } @@ -1435,13 +1441,8 @@ struct tree_opt_pass pass_ccp = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_cleanup_cfg - | TODO_dump_func - | TODO_update_ssa - | TODO_ggc_collect - | TODO_verify_ssa - | TODO_verify_stmts - | TODO_update_smt_usage, /* todo_flags_finish */ + TODO_dump_func | TODO_verify_ssa + | TODO_verify_stmts | TODO_ggc_collect,/* todo_flags_finish */ 0 /* letter */ }; @@ -1450,8 +1451,7 @@ static unsigned int do_ssa_store_ccp (void) { /* If STORE-CCP is not enabled, we just run regular CCP. */ - execute_ssa_ccp (flag_tree_store_ccp != 0); - return 0; + return execute_ssa_ccp (flag_tree_store_ccp != 0); } static bool @@ -1477,13 +1477,8 @@ struct tree_opt_pass pass_store_ccp = 0, /* properties_provided */ 0, /* properties_destroyed */ 0, /* todo_flags_start */ - TODO_dump_func - | TODO_update_ssa - | TODO_ggc_collect - | TODO_verify_ssa - | TODO_cleanup_cfg - | TODO_verify_stmts - | TODO_update_smt_usage, /* todo_flags_finish */ + TODO_dump_func | TODO_verify_ssa + | TODO_verify_stmts | TODO_ggc_collect,/* todo_flags_finish */ 0 /* letter */ }; diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c index 68c1b51ea16..040d972cf4f 100644 --- a/gcc/tree-ssa-propagate.c +++ b/gcc/tree-ssa-propagate.c @@ -1137,15 +1137,18 @@ fold_predicate_in (tree stmt) expressions are evaluated with a call to vrp_evaluate_conditional. This will only give meaningful results when called from tree-vrp.c (the information used by vrp_evaluate_conditional is built by the - VRP pass). */ + VRP pass). -void + Return TRUE when something changed. */ + +bool substitute_and_fold (prop_value_t *prop_value, bool use_ranges_p) { basic_block bb; + bool something_changed = false; if (prop_value == NULL && !use_ranges_p) - return; + return false; if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "\nSubstituing values and folding statements\n\n"); @@ -1234,6 +1237,7 @@ substitute_and_fold (prop_value_t *prop_value, bool use_ranges_p) /* Determine what needs to be done to update the SSA form. */ pop_stmt_changes (bsi_stmt_ptr (i)); + something_changed = true; } else { @@ -1261,6 +1265,7 @@ substitute_and_fold (prop_value_t *prop_value, bool use_ranges_p) fprintf (dump_file, "Predicates folded: %6ld\n", prop_stats.num_pred_folded); } + return something_changed; } #include "gt-tree-ssa-propagate.h" diff --git a/gcc/tree-ssa-propagate.h b/gcc/tree-ssa-propagate.h index dac9a5e959a..0994c8ac576 100644 --- a/gcc/tree-ssa-propagate.h +++ b/gcc/tree-ssa-propagate.h @@ -120,6 +120,6 @@ bool stmt_makes_single_load (tree); bool stmt_makes_single_store (tree); prop_value_t *get_value_loaded_by (tree, prop_value_t *); bool replace_uses_in (tree, bool *, prop_value_t *); -void substitute_and_fold (prop_value_t *, bool); +bool substitute_and_fold (prop_value_t *, bool); #endif /* _TREE_SSA_PROPAGATE_H */