From 965b98d04ba5577aaaa2e1e48a8d9ba6dba35da9 Mon Sep 17 00:00:00 2001 From: Jan Hubicka <jh@suse.cz> Date: Wed, 18 Nov 2009 14:09:15 +0100 Subject: [PATCH] predict.c (compute_function_frequency): Export. * predict.c (compute_function_frequency): Export. * predict.h (compute_function_frequency): Declare. * tree-optimize.c (execute_fixup_cfg): Rescale frequencies. From-SVN: r154291 --- gcc/ChangeLog | 6 ++++ gcc/predict.c | 3 +- gcc/predict.h | 1 + gcc/tree-optimize.c | 73 +++++++++++++++++++++++++++------------------ 4 files changed, 52 insertions(+), 31 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a28276c278c0..443ce2eb8583 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 becff10615b4..df859066b96b 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 0e040410768f..18e57d770656 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 7affd1627c59..61d687daa13a 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) -- GitLab