http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60013
--- Comment #5 from H.J. Lu <hjl.tools at gmail dot com> --- This in compute_bb_predicates while (!done) { done = true; FOR_EACH_BB_FN (bb, my_function) { struct predicate p = false_predicate (); edge e; edge_iterator ei; FOR_EACH_EDGE (e, ei, bb->preds) { if (e->src->aux) { struct predicate this_bb_predicate = *(struct predicate *) e->src->aux; if (e->aux) this_bb_predicate = and_predicates (summary->conds, &this_bb_predicate, (struct predicate *) e->aux); p = or_predicates (summary->conds, &p, &this_bb_predicate); if (true_predicate_p (&p)) break; } } if (false_predicate_p (&p)) gcc_assert (!bb->aux); else { if (!bb->aux) { done = false; Set to false on (gdb) call debug_bb (bb) <bb 13>: ABNORMAL_DISPATCHER (0); Should it call get_abnormal_succ_dispatcher to check here? bb->aux = pool_alloc (edge_predicate_pool); *((struct predicate *) bb->aux) = p; } else if (!predicates_equal_p (&p, (struct predicate *) bb->aux)) { done = false; *((struct predicate *) bb->aux) = p; } } } } goes into an infinite loop.