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.