[llvm-dev] SimplifyCFG, llvm.loop and latch blocks

Johannes Doerfert via llvm-dev llvm-dev at lists.llvm.org
Tue Apr 13 11:34:50 PDT 2021


On 4/13/21 11:06 AM, Jeroen Dobbelaere wrote:
> Hi Johannes et al,
>
>> -----Original Message-----
>> From: Johannes Doerfert
>> Sent: Monday, April 12, 2021 00:05
>>
>> I follow the part about simplify CFG dropping information but I don't
>> see how loop-simplify moves
>> things to the wrong loop, not to say it couldn't, latches are associated
>> with loops but we annotat
>> e branches which are not :(
>>
>>   From what I can see, the loops, identified by their headers, have the
>> following annotations before
>> and after those two passes
>> (https://www.godbolt.org/z/xMn8K8a6G ).
>> What
>> am I missing here, do I need
>> more intermediate transformations?
>>
>> loop            | before                   | after
>> do.cond         | unroll count 2           | none
>> for.cond        | mustprogress, no-unroll  | mustprogress, no-unroll
>> for.cond1       | mustprogress             | mustprogress
>>
> An example of pass order (deduced from -O2) that shows the problem:
> --simplifycfg --sroa --simplifycfg  --instcombine --licm --simplifycfg --loop-simplify --loop-rotate --licm --simplifycfg --loop-simplify -loops -enable-new-pm=0
>
> See https://www.godbolt.org/z/EW95YjW8h
>
> It has following panes:
> - on the left: the source code
> - top right: the loop info after the passes mentioned above, except for the last '--loop-simplify'.
>    This shows that %for.cond.cleanup3 serves as a latch for two loops. (outer and middle)
> - middle right: same info, now with the last '--loop-simplify'. It states that '%do.body.loopexit' is
>    the latch for the outer loop.
> - bottom right: resulting code, corresponding to the 'middle right' pane. There you can see that
>    the '%do.body.loopexit' contains a branch with an annotation that was originally on the middle loop.
>    This annotation also states 'llvm.loop.mustprogress'.
>    The branch in the latch block for the middle loop (%for.cond.cleanup3) does not contain a loop annotation
>    any more.
>
Right. That shows the problem nicely. As mentioned before, latches are 
not tied to loops, which
is the core issue here.


>>> Questions:
>>> - The branch in 'do.cond' is simplified, but I have the impression that at
>> the same time, the loop annotation is omitted.
>>>     This sounds like a bug ?
>> It is a "usability bug" in simplify CFG. If the surviving edge of a
>> branch is the latch we could keep the annotation.
>> With the existing problem that latches are not tied to loops but
>> branches are not.
>>
>>
>>> - Is it a correct assumption that we should not merge blocks if both have a
>> branch instruction with a !llvm.loop annotation set ?
>>
>> I doubt this is a viable option, too many places to check a non-trivial
>> condition that is control flow dependent.
>
> I tried this out and, while fixing the observed loop annotation jumping issue, it has a severe impact on resulting code quality.
> One of the reasons being that almost every loop that clang produces has a loop annotation attached...

I don't believe this is a viable option anyway, too many places to keep 
track of this.


>
>
>> Instead, I think we might want to rethink the entire latch association
>> concept. Headers are unique, they have unique
>> terminators, maybe we should use those to avoid the situation in which
>> one branch defines two latches. That said, I'd
> Can metadata be attached to a basic block ?

I doubt it, but that is not a conceptual issue. I haven't checked the
current code but I took a trip down memory lane instead:

https://reviews.llvm.org/D19597


> Can loop headers end up being merged in some way ?

Loop headers are tied to loops, so sharing a header means it's the
same loop. Loop fusion exists but intuitively I'd say that it can handle 
mismatches in
annotations easily. I think the next step is to determine why latches were
chosen over headers, maybe we are overlooking something here.


>
>> need to go back to the original introduction of the metadata to
>> determine why latches were chosen over "headers".
>>
>> ~ Johannes
>>
> Thanks,
>
> Jeroen Dobbelaere
>


More information about the llvm-dev mailing list