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.

Reply via email to