summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2009-11-18 13:09:15 +0000
committerhubicka <hubicka@138bc75d-0d04-0410-961f-82ee72b054a4>2009-11-18 13:09:15 +0000
commit63aab97df901f60f2e854e6ad3e7e47fd72e74ae (patch)
tree5ccc2b57b37b756a5c2cf26a4da08e0c6de03283 /gcc
parent8e78b58c2aa924fed285f175b325da48f2f4e631 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/predict.c3
-rw-r--r--gcc/predict.h1
-rw-r--r--gcc/tree-optimize.c73
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)