------- Comment #10 from ebotcazou at gcc dot gnu dot org 2007-11-06 15:14 ------- Things start to go awry much earlier though, at the end of the first VRP pass when jumps are threaded. More specifically in update_bb_profile_for_threading
if (prob > taken_edge->probability) { if (dump_file) fprintf (dump_file, "Jump threading proved probability of edge " "%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; } is triggered a bunch times. Now, that it is triggered means that the local update of block frequency doesn't work and a global update would be needed. So we end up with a bunch of predecessors of the EXIT block with frequency greater than BB_FREQ_MAX / 2, which doesn't make much sense. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33737