Commit 8b5d71cd by Jan Hubicka

predict.c (propagate_unlikely_bbs_forward): Break out from ...


	* predict.c (propagate_unlikely_bbs_forward): Break out from ...
	(determine_unlikely_bbs): ... here.
	* predict.h (propagate_unlikely_bbs_forward): Declare.
	* cfgexpand.c (pass_expand::execute): Use it.
	* bb-reorder.c (sanitize_hot_paths): Do not consider known to be
	unlikely edges.
	(find_rarely_executed_basic_blocks_and_crossing_edges): Use
	propagate_unlikely_bbs_forward.

From-SVN: r250360
parent 95a60a5c
...@@ -1525,6 +1525,11 @@ sanitize_hot_paths (bool walk_up, unsigned int cold_bb_count, ...@@ -1525,6 +1525,11 @@ sanitize_hot_paths (bool walk_up, unsigned int cold_bb_count,
if (e->flags & EDGE_DFS_BACK) if (e->flags & EDGE_DFS_BACK)
continue; continue;
/* Do not expect profile insanities when profile was not adjusted. */
if (e->probability == profile_probability::never ()
|| e->count == profile_count::zero ())
continue;
if (BB_PARTITION (reach_bb) != BB_COLD_PARTITION) if (BB_PARTITION (reach_bb) != BB_COLD_PARTITION)
{ {
found = true; found = true;
...@@ -1555,6 +1560,10 @@ sanitize_hot_paths (bool walk_up, unsigned int cold_bb_count, ...@@ -1555,6 +1560,10 @@ sanitize_hot_paths (bool walk_up, unsigned int cold_bb_count,
{ {
if (e->flags & EDGE_DFS_BACK) if (e->flags & EDGE_DFS_BACK)
continue; continue;
/* Do not expect profile insanities when profile was not adjusted. */
if (e->probability == profile_probability::never ()
|| e->count == profile_count::zero ())
continue;
/* Select the hottest edge using the edge count, if it is non-zero, /* Select the hottest edge using the edge count, if it is non-zero,
then fallback to the edge frequency and finally the edge then fallback to the edge frequency and finally the edge
probability. */ probability. */
...@@ -1576,6 +1585,10 @@ sanitize_hot_paths (bool walk_up, unsigned int cold_bb_count, ...@@ -1576,6 +1585,10 @@ sanitize_hot_paths (bool walk_up, unsigned int cold_bb_count,
/* We have a hot bb with an immediate dominator that is cold. /* We have a hot bb with an immediate dominator that is cold.
The dominator needs to be re-marked hot. */ The dominator needs to be re-marked hot. */
BB_SET_PARTITION (reach_bb, BB_HOT_PARTITION); BB_SET_PARTITION (reach_bb, BB_HOT_PARTITION);
if (dump_file)
fprintf (dump_file, "Promoting bb %i to hot partition to sanitize "
"profile of bb %i in %s walk\n", reach_bb->index,
bb->index, walk_up ? "backward" : "forward");
cold_bb_count--; cold_bb_count--;
/* Now we need to examine newly-hot reach_bb to see if it is also /* Now we need to examine newly-hot reach_bb to see if it is also
...@@ -1603,6 +1616,8 @@ find_rarely_executed_basic_blocks_and_crossing_edges (void) ...@@ -1603,6 +1616,8 @@ find_rarely_executed_basic_blocks_and_crossing_edges (void)
unsigned int cold_bb_count = 0; unsigned int cold_bb_count = 0;
auto_vec<basic_block> bbs_in_hot_partition; auto_vec<basic_block> bbs_in_hot_partition;
propagate_unlikely_bbs_forward ();
/* Mark which partition (hot/cold) each basic block belongs in. */ /* Mark which partition (hot/cold) each basic block belongs in. */
FOR_EACH_BB_FN (bb, cfun) FOR_EACH_BB_FN (bb, cfun)
{ {
......
...@@ -6480,6 +6480,11 @@ pass_expand::execute (function *fun) ...@@ -6480,6 +6480,11 @@ pass_expand::execute (function *fun)
if (fun->eh->region_tree != NULL) if (fun->eh->region_tree != NULL)
finish_eh_generation (); finish_eh_generation ();
/* BB subdivision may have created basic blocks that are are only reachable
from unlikely bbs but not marked as such in the profile. */
if (optimize)
propagate_unlikely_bbs_forward ();
/* Remove unreachable blocks, otherwise we cannot compute dominators /* Remove unreachable blocks, otherwise we cannot compute dominators
which are needed for loop state verification. As a side-effect which are needed for loop state verification. As a side-effect
this also compacts blocks. this also compacts blocks.
......
...@@ -98,6 +98,7 @@ extern const char *predictor_name (enum br_predictor); ...@@ -98,6 +98,7 @@ extern const char *predictor_name (enum br_predictor);
extern void rebuild_frequencies (void); extern void rebuild_frequencies (void);
extern void report_predictor_hitrates (void); extern void report_predictor_hitrates (void);
extern void force_edge_cold (edge, bool); extern void force_edge_cold (edge, bool);
extern void propagate_unlikely_bbs_forward (void);
extern void add_reg_br_prob_note (rtx_insn *, profile_probability); extern void add_reg_br_prob_note (rtx_insn *, profile_probability);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment