[LLVMdev] llvm.loop metadata placement and critical edge splitting
Andrew Trick
atrick at apple.com
Tue Oct 7 08:40:41 PDT 2014
> On Oct 7, 2014, at 5:39 AM, hadi sadeghi <hasadegh at elis.ugent.be> wrote:
>
>
>>>>> I think fixing this may be an easy change to LoopInfo get/setLoopID.
>>>>> The rule would be simple, if the loop back branch is unconditional,
>>>>> and it has a single predecessor, the metadata is expected on the
>>>>> predecessaor's conditional branch:
>>>>>
>>>>> loop.body:
>>>>> ...
>>>>> br i1 %c, label %loop.tail, label %exit, !llvm.loop
>>>>>
>>>>> loop.tail:
>>>>> ...
>>>>> br label %loop.body
>>>>>
>>>>> exit:
>>>>> ret
>>>>>
>>>>> If the loop tail does not have a single predecessor (complex control
>>>>> flow occurs after the loop test), then the metadata can still be
>>>>> placed on the unconditional branch. Either way, we don't need to
>>>>> worry about edge splitting. Only a signficant loop restructuring will
>>>>> invalidate the metadata.
>>>>>
>>>>> I don't think any change is necessary when clang emits a loop with an
>>>>> unconditional backedge, but someone will want to verify with some
>>>>> test cases. If a change is needed it should also be easy.
>>>>>
>
> I have couple of questions regarding this proposal, does not it change
> llvm's standard Loop structure ? I guess some optimizations working around
> standard loop structure. another issue could be that simplify-cfg might
> optimize out such an unconditional branch (I am not sure about it).
> I was working around preserving loop metadata for while, our proposal was to
> attach loop metadata to both, back-edge and loop's phi nodes (phi nodes at
> the start of loop Header), since in SSA from, a loop can be identified by
> its phi nodes. this solution worked for us, but our benchmarks were limited
> to MPEG and H264. do you think this could be considered as a general solution ?
The proposal is that passes can convert a loop between these two canonical forms:
(1)
loop.body:
...
br i1 %c, label %loop.tail, label %exit, !llvm.loop
exit:
ret
(2)
loop.body:
...
br i1 %c, label %loop.tail, label %exit, !llvm.loop
loop.tail:
; split critical edge
br label %loop.body
exit:
ret
without affecting loop metadata.
SplitCriticalEdges transforms from 1->2. SimplifyCFG transforms from 2->1.
It doesn’t change the form of the loop that any pass sees, just changes where a the pass needs to look for the metadata if the loop is already in form 2.
-Andy
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20141007/eaab38f7/attachment.html>
More information about the llvm-dev
mailing list