diff options
author | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-11-18 13:09:15 +0000 |
---|---|---|
committer | hubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-11-18 13:09:15 +0000 |
commit | 63aab97df901f60f2e854e6ad3e7e47fd72e74ae (patch) | |
tree | 5ccc2b57b37b756a5c2cf26a4da08e0c6de03283 /gcc | |
parent | 8e78b58c2aa924fed285f175b325da48f2f4e631 (diff) | |
download | gcc-63aab97df901f60f2e854e6ad3e7e47fd72e74ae.tar.gz |
* predict.c (compute_function_frequency): Export.
* predict.h (compute_function_frequency): Declare.
* tree-optimize.c (execute_fixup_cfg): Rescale frequencies.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@154291 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/predict.c | 3 | ||||
-rw-r--r-- | gcc/predict.h | 1 | ||||
-rw-r--r-- | gcc/tree-optimize.c | 73 |
4 files changed, 52 insertions, 31 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a28276c278c..443ce2eb858 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2009-11-18 Jan Hubicka <jh@suse.cz> + + * predict.c (compute_function_frequency): Export. + * predict.h (compute_function_frequency): Declare. + * tree-optimize.c (execute_fixup_cfg): Rescale frequencies. + 2009-11-18 Martin Jambor <mjambor@suse.cz> * passes.c (ipa_write_summaries): Call renumber_gimple_stmt_uids diff --git a/gcc/predict.c b/gcc/predict.c index becff10615b..df859066b96 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -77,7 +77,6 @@ static sreal real_zero, real_one, real_almost_one, real_br_prob_base, static void combine_predictions_for_insn (rtx, basic_block); static void dump_prediction (FILE *, enum br_predictor, int, basic_block, int); static void predict_paths_leading_to (basic_block, enum br_predictor, enum prediction); -static void compute_function_frequency (void); static void choose_function_section (void); static bool can_predict_insn_p (const_rtx); @@ -2145,7 +2144,7 @@ estimate_bb_frequencies (void) } /* Decide whether function is hot, cold or unlikely executed. */ -static void +void compute_function_frequency (void) { basic_block bb; diff --git a/gcc/predict.h b/gcc/predict.h index 0e040410768..18e57d77065 100644 --- a/gcc/predict.h +++ b/gcc/predict.h @@ -41,5 +41,6 @@ extern void estimate_bb_frequencies (void); extern const char *predictor_name (enum br_predictor); extern tree build_predict_expr (enum br_predictor, enum prediction); extern void tree_estimate_probability (void); +extern void compute_function_frequency (void); #endif /* GCC_PREDICT_H */ diff --git a/gcc/tree-optimize.c b/gcc/tree-optimize.c index 7affd1627c5..61d687daa13 100644 --- a/gcc/tree-optimize.c +++ b/gcc/tree-optimize.c @@ -245,36 +245,51 @@ execute_fixup_cfg (void) basic_block bb; gimple_stmt_iterator gsi; int todo = gimple_in_ssa_p (cfun) ? TODO_verify_ssa : 0; + gcov_type count_scale; + edge e; + edge_iterator ei; - if (cfun->eh) - FOR_EACH_BB (bb) - { - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) - { - gimple stmt = gsi_stmt (gsi); - tree decl = is_gimple_call (stmt) - ? gimple_call_fndecl (stmt) - : NULL; - - if (decl - && gimple_call_flags (stmt) & (ECF_CONST - | ECF_PURE - | ECF_LOOPING_CONST_OR_PURE)) - { - if (gimple_in_ssa_p (cfun)) - { - todo |= TODO_update_ssa | TODO_cleanup_cfg; - mark_symbols_for_renaming (stmt); - update_stmt (stmt); - } - } - - maybe_clean_eh_stmt (stmt); - } - - if (gimple_purge_dead_eh_edges (bb)) - todo |= TODO_cleanup_cfg; - } + if (ENTRY_BLOCK_PTR->count) + count_scale = (cgraph_node (current_function_decl)->count * REG_BR_PROB_BASE + + ENTRY_BLOCK_PTR->count / 2) / ENTRY_BLOCK_PTR->count; + else + count_scale = REG_BR_PROB_BASE; + + FOR_EACH_BB (bb) + { + bb->count = (bb->count * count_scale + + REG_BR_PROB_BASE / 2) / REG_BR_PROB_BASE; + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple stmt = gsi_stmt (gsi); + tree decl = is_gimple_call (stmt) + ? gimple_call_fndecl (stmt) + : NULL; + + if (decl + && gimple_call_flags (stmt) & (ECF_CONST + | ECF_PURE + | ECF_LOOPING_CONST_OR_PURE)) + { + if (gimple_in_ssa_p (cfun)) + { + todo |= TODO_update_ssa | TODO_cleanup_cfg; + mark_symbols_for_renaming (stmt); + update_stmt (stmt); + } + } + + maybe_clean_eh_stmt (stmt); + } + + if (gimple_purge_dead_eh_edges (bb)) + todo |= TODO_cleanup_cfg; + FOR_EACH_EDGE (e, ei, bb->succs) + e->count = (e->count * count_scale + + REG_BR_PROB_BASE / 2) / REG_BR_PROB_BASE; + } + if (count_scale != REG_BR_PROB_BASE) + compute_function_frequency (); /* Dump a textual representation of the flowgraph. */ if (dump_file) |