https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81318
--- Comment #24 from Martin Liška <marxin at gcc dot gnu.org> --- (In reply to Jan Hubicka from comment #23) > determine_unlikely_bbs is intended to propagate known to be cold bbs > (profile_count::zero) rather than guessed_zero so it seems to do the job > correctly here, because we decide to trust the cold attribute (I am still > undecided if we don't want to invent unlikely attribute for that). > > I will take a look why this leads to ICE on propagating frequencies. Ok, so assuming we want to have profile_count::zero, then we assign the same to all edges reaching the BB. And for outgoing edges we: FOR_EACH_EDGE (e, ei, bb->succs) if (!(e->count == profile_count::zero ()) && unlikely_executed_edge_p (e)) { if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "Edge %i->%i is locally unlikely\n", bb->index, e->dest->index); e->count = profile_count::zero (); } which fails because the edges is neither EH or FAKE edge. So we should probably test when setting probabilities to: diff --git a/gcc/predict.c b/gcc/predict.c index 198fa919d74..a10e9991667 100644 --- a/gcc/predict.c +++ b/gcc/predict.c @@ -1291,7 +1291,8 @@ combine_predictions_for_bb (basic_block bb, bool dry_run) } clear_bb_predictions (bb); - if (!bb->count.initialized_p () && !dry_run) + if (!first->probability.initialized_p () + && !second->probability.initialized_p() && !dry_run) { first->probability = profile_probability::from_reg_br_prob_base (combined_probability); What do you think Honza?