aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@gcc.gnu.org>2017-07-19 18:09:39 +0000
committerJan Hubicka <hubicka@gcc.gnu.org>2017-07-19 18:09:39 +0000
commit8b5d71cd61ecf0793cab732aad7232d6da4620fc (patch)
tree67f93353f64100487da1968df36ba48d260db79d
parent95a60a5c8c5620da65d588b6b8c71f8145a31993 (diff)
downloadgcc-8b5d71cd61ecf0793cab732aad7232d6da4620fc.zip
gcc-8b5d71cd61ecf0793cab732aad7232d6da4620fc.tar.gz
gcc-8b5d71cd61ecf0793cab732aad7232d6da4620fc.tar.bz2
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
-rw-r--r--gcc/bb-reorder.c15
-rw-r--r--gcc/cfgexpand.c5
-rw-r--r--gcc/predict.h1
3 files changed, 21 insertions, 0 deletions
diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c
index a421f6b..17a1ea3 100644
--- a/gcc/bb-reorder.c
+++ b/gcc/bb-reorder.c
@@ -1525,6 +1525,11 @@ sanitize_hot_paths (bool walk_up, unsigned int cold_bb_count,
if (e->flags & EDGE_DFS_BACK)
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)
{
found = true;
@@ -1555,6 +1560,10 @@ sanitize_hot_paths (bool walk_up, unsigned int cold_bb_count,
{
if (e->flags & EDGE_DFS_BACK)
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,
then fallback to the edge frequency and finally the edge
probability. */
@@ -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.
The dominator needs to be re-marked hot. */
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--;
/* 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)
unsigned int cold_bb_count = 0;
auto_vec<basic_block> bbs_in_hot_partition;
+ propagate_unlikely_bbs_forward ();
+
/* Mark which partition (hot/cold) each basic block belongs in. */
FOR_EACH_BB_FN (bb, cfun)
{
diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c
index 3e1d24d..c9d8118 100644
--- a/gcc/cfgexpand.c
+++ b/gcc/cfgexpand.c
@@ -6480,6 +6480,11 @@ pass_expand::execute (function *fun)
if (fun->eh->region_tree != NULL)
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
which are needed for loop state verification. As a side-effect
this also compacts blocks.
diff --git a/gcc/predict.h b/gcc/predict.h
index a6cf1ee..9b8b140 100644
--- a/gcc/predict.h
+++ b/gcc/predict.h
@@ -98,6 +98,7 @@ extern const char *predictor_name (enum br_predictor);
extern void rebuild_frequencies (void);
extern void report_predictor_hitrates (void);
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);