Hi, this is another small fix to improve upatting fater profile. update_bb_profile_for_threading was buggy in years by computing probability before updating frequency. Moreover for bugus profiles it is better to avoid dropping count to complete 0 because that implies optimization for size.
Bootstrapped/regtested x86_64-linux,c omitted. Honza Index: ChangeLog =================================================================== --- ChangeLog (revision 244748) +++ ChangeLog (working copy) @@ -1,3 +1,8 @@ +2017-01-21 Jan Hubicka <hubi...@ucw.cz> + + PR lto/78407 + * cfg.c (update_bb_profile_for_threading): Fix updating of probablity. + 2017-01-21 Bernd Schmidt <bschm...@redhat.com> rtl-optimization/79125 Index: cfg.c =================================================================== --- cfg.c (revision 244732) +++ cfg.c (working copy) @@ -869,6 +869,10 @@ update_bb_profile_for_threading (basic_b bb->count = 0; } + bb->frequency -= edge_frequency; + if (bb->frequency < 0) + bb->frequency = 0; + /* Compute the probability of TAKEN_EDGE being reached via threaded edge. Watch for overflows. */ if (bb->frequency) @@ -882,15 +886,12 @@ update_bb_profile_for_threading (basic_b "%i->%i too small (it is %i, should be %i).\n", taken_edge->src->index, taken_edge->dest->index, taken_edge->probability, prob); - prob = taken_edge->probability; + prob = taken_edge->probability * 6 / 8; } /* Now rescale the probabilities. */ taken_edge->probability -= prob; prob = REG_BR_PROB_BASE - prob; - bb->frequency -= edge_frequency; - if (bb->frequency < 0) - bb->frequency = 0; if (prob <= 0) { if (dump_file)