aboutsummaryrefslogtreecommitdiff
path: root/gcc/predict.c
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2018-12-31 14:46:08 +0100
committerMartin Liska <marxin@gcc.gnu.org>2018-12-31 13:46:08 +0000
commitb3282dfe1a1601accd3bd012898c2bc807e0d078 (patch)
treef6a353dcdd9481af9384378d339ef833ae34ac6d /gcc/predict.c
parent41ee4e75ab27ebf63d1512fc56e673fdee74e8aa (diff)
downloadgcc-b3282dfe1a1601accd3bd012898c2bc807e0d078.zip
gcc-b3282dfe1a1601accd3bd012898c2bc807e0d078.tar.gz
gcc-b3282dfe1a1601accd3bd012898c2bc807e0d078.tar.bz2
predict.c (set_even_probabilities): Include also unlikely_count in calculation.
). 2018-12-31 Martin Liska <mliska@suse.cz> * predict.c (set_even_probabilities): Include also unlikely_count in calculation. (combine_predictions_for_bb): Consider also HOT and COLD labels predictions. * predict.def (PRED_HOT_LABEL): Move it just after __builtin_expect_with_probability predictor. (PRED_COLD_LABEL): Likewise. 2018-12-31 Martin Liska <mliska@suse.cz> * g++.dg/predict-2.C: New test. * g++.dg/predict-3.C: New test. * g++.dg/predict-4.C: New test. * gcc.dg/tree-ssa/attr-hotcold-2.c: Adjust test-case. From-SVN: r267485
Diffstat (limited to 'gcc/predict.c')
-rw-r--r--gcc/predict.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/predict.c b/gcc/predict.c
index 5ad252c..81dbb67 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -878,11 +878,18 @@ set_even_probabilities (basic_block bb,
profile_probability prob
= profile_probability::from_reg_br_prob_base (p);
profile_probability remainder = prob.invert ();
+ remainder -= profile_probability::very_unlikely ()
+ .apply_scale (unlikely_count, 1);
+ int count = nedges - unlikely_count - 1;
+ gcc_assert (count >= 0);
+ profile_probability even = remainder.apply_scale (1, count);
if (prediction->ep_edge == e)
e->probability = prob;
+ else if (unlikely_edges != NULL && unlikely_edges->contains (e))
+ e->probability = profile_probability::very_unlikely ();
else
- e->probability = remainder.apply_scale (1, nedges - 1);
+ e->probability = even;
}
else
e->probability = profile_probability::never ();
@@ -1217,10 +1224,12 @@ combine_predictions_for_bb (basic_block bb, bool dry_run)
if (preds)
for (pred = *preds; pred; pred = pred->ep_next)
{
- if (pred->ep_probability <= PROB_VERY_UNLIKELY)
+ if (pred->ep_probability <= PROB_VERY_UNLIKELY
+ || pred->ep_predictor == PRED_COLD_LABEL)
unlikely_edges.add (pred->ep_edge);
if (pred->ep_probability >= PROB_VERY_LIKELY
- || pred->ep_predictor == PRED_BUILTIN_EXPECT)
+ || pred->ep_predictor == PRED_BUILTIN_EXPECT
+ || pred->ep_predictor == PRED_HOT_LABEL)
likely_edges.add (pred);
}