diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2017-06-16 21:02:11 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2017-06-16 19:02:11 +0000 |
commit | 8d71d7cd025d5b0b62a8cb9fd99c38f1b37fcc7d (patch) | |
tree | fed441147d5e488b93f698072d73bb2b5d0fd12b /gcc/predict.c | |
parent | 8fb0ae8223ee3529675d2f66aa4ca94af776e943 (diff) | |
download | gcc-8d71d7cd025d5b0b62a8cb9fd99c38f1b37fcc7d.zip gcc-8d71d7cd025d5b0b62a8cb9fd99c38f1b37fcc7d.tar.gz gcc-8d71d7cd025d5b0b62a8cb9fd99c38f1b37fcc7d.tar.bz2 |
predict.c (force_edge_cold): Handle declaring edges impossible more aggresively.
* predict.c (force_edge_cold): Handle declaring edges impossible
more aggresively.
From-SVN: r249276
Diffstat (limited to 'gcc/predict.c')
-rw-r--r-- | gcc/predict.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/gcc/predict.c b/gcc/predict.c index 1cb7dc5..60d1a09 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -3968,6 +3968,7 @@ force_edge_cold (edge e, bool impossible) profile_count old_count = e->count; int old_probability = e->probability; int prob_scale = REG_BR_PROB_BASE; + bool uninitialized_exit = false; /* If edge is already improbably or cold, just return. */ if (e->probability <= (impossible ? PROB_VERY_UNLIKELY : 0) @@ -3978,6 +3979,8 @@ force_edge_cold (edge e, bool impossible) { if (e2->count.initialized_p ()) count_sum += e2->count; + else + uninitialized_exit = true; prob_sum += e2->probability; } @@ -3989,7 +3992,7 @@ force_edge_cold (edge e, bool impossible) = MIN (e->probability, impossible ? 0 : PROB_VERY_UNLIKELY); if (impossible) e->count = profile_count::zero (); - if (old_probability) + else if (old_probability) e->count = e->count.apply_scale (e->probability, old_probability); else e->count = e->count.apply_scale (1, REG_BR_PROB_BASE); @@ -4016,6 +4019,34 @@ force_edge_cold (edge e, bool impossible) else { e->probability = REG_BR_PROB_BASE; + if (e->src->count == profile_count::zero ()) + return; + if (count_sum == profile_count::zero () && !uninitialized_exit + && impossible) + { + bool found = false; + for (gimple_stmt_iterator gsi = gsi_start_bb (e->src); + !gsi_end_p (gsi); gsi_next (&gsi)) + { + if (stmt_can_terminate_bb_p (gsi_stmt (gsi))) + { + found = true; + break; + } + } + if (!found) + { + if (dump_file && (dump_flags & TDF_DETAILS)) + fprintf (dump_file, + "Making bb %i impossible and dropping count to 0.\n", + e->src->index); + e->count = profile_count::zero (); + e->src->count = profile_count::zero (); + FOR_EACH_EDGE (e2, ei, e->src->preds) + force_edge_cold (e2, impossible); + return; + } + } /* If we did not adjusting, the source basic block has no likely edeges leaving other direction. In that case force that bb cold, too. |