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,

Zdenek

Reply via email to