[LLVMdev] llvm.loop metadata placement and critical edge splitting
atrick at apple.com
Mon Oct 6 10:55:11 PDT 2014
While reviewing a fix for maintaining loop metadata (http://reviews.llvm.org/D5539) I noticed that we make a strict assumption about the metadata being attached to the branch that is an immediate predecessor of the loop header. This does not work well with LLVM's approach of lazy critical edge splitting. I've proposed working around this with heroics inside the critical edges splitting utility, but feel that the workaround is really unnecessary because the design could be fixed more easily. I was not involved in the original design discussion for llvm.loop metadata, so I want to get feedback before proposing a direction.
My question is: Why can't we define requirements of loop metadata such that *critical edge splitting does not invalidate loop metadata*.
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:
br i1 %c, label %loop.tail, label %exit, !llvm.loop
br label %loop.body
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.
With that design change we can remove any current workarounds from SplitCriticalEdge and simply preserve loop metadata, which remains valid by definition.
More information about the llvm-dev