Hi,
> > > We ICEd on attached testcase because we didn't properly detected the
> > > latch edge. Furthermore, I think the code for re-computing latches
> > > is somehow broken at the moment. In fix_loop_structure we have
> > > /* If there was no latch, schedule the loop for removal. */
> > > if (!first_latch)
> > > loop->header = NULL;
> > > /* If there was a single latch and it belongs to the loop of the
> > > header, record it. */
> > > else if (latch
> > > && latch->src->loop_father == loop)
> > > loop->latch = latch->src;
> > > /* Otherwise there are multiple latches which are eventually
> > > disambiguated below. */
> > > else
> > > loop->latch = NULL;
> > > but I don't think we can use the ->loop_father info, because that is
> > > already cleared by
> > > FOR_EACH_BB (bb)
> > > {
> > > if (changed_bbs)
> > > bb->aux = (void *) (size_t) loop_depth (bb->loop_father);
> > > bb->loop_father = current_loops->tree_root;
> > > }
> > > earlier on.
> >
> > I am not quite sure why we test "&& latch->src->loop_father == loop" in
> > the first place. Would things work if that condition is removed?
> > I don't much like your proposed patch (as well as the current state),
> > as according to the specification of fix_loop_structure, we are not
> > allowed to assume anything about the bb --> loop mapping,
>
> I tried that approach, too, and it worked (even regtested that
> successfully).
let's go with that, then (as well as updating the missleading comment before
the test).
> I was however worried that we might end up with an edge
> coming out of BB
> from different loop heading into the header. In this case setting up
> loop's latch as the source of the latch edge would be wrong.
Actually, the comment suggesting that possibility does not make much sense.
A latch (a predecessor of the header H that is dominated by H) belongs to
the loop headed by H by definition, so I am not quite sure what the test was
supposed to do.
The latch block may of course belong to a subloop of the loop, but that is not
forbidden (and it is taken care of further in fix_loop_structure through
force_single_succ_latches
in the situations where we want to avoid this possibility),
Zdenek