diff options
author | Anna Thomas <anna@azul.com> | 2018-12-21 19:45:05 +0000 |
---|---|---|
committer | Anna Thomas <anna@azul.com> | 2018-12-21 19:45:05 +0000 |
commit | 18be3cb6064070ef712291111c3275c1f04b6446 (patch) | |
tree | 7dc14f094a71616b51f4eb8d7b52d998ede0e60a /llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp | |
parent | d76cc59d9c9254151af754b3fbee93e35584eed1 (diff) | |
download | bcm5719-llvm-18be3cb6064070ef712291111c3275c1f04b6446.tar.gz bcm5719-llvm-18be3cb6064070ef712291111c3275c1f04b6446.zip |
[RuntimeUnrolling] NFC: Add TODO and comments in connectProlog
Currently, runtime unrolling does not support loops where multiple
exiting blocks exit to the latchExit. Added TODO and other code
clarifications for ConnectProlog code.
llvm-svn: 349944
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp index 3606ec4b9fc..386621844fe 100644 --- a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp @@ -70,6 +70,17 @@ static void ConnectProlog(Loop *L, Value *BECount, unsigned Count, BasicBlock *PreHeader, BasicBlock *NewPreHeader, ValueToValueMapTy &VMap, DominatorTree *DT, LoopInfo *LI, bool PreserveLCSSA) { + // Loop structure should be the following: + // Preheader + // PrologPreHeader + // ... + // PrologLatch + // PrologExit + // NewPreheader + // Header + // ... + // Latch + // LatchExit BasicBlock *Latch = L->getLoopLatch(); assert(Latch && "Loop must have a latch"); BasicBlock *PrologLatch = cast<BasicBlock>(VMap[Latch]); @@ -83,14 +94,21 @@ static void ConnectProlog(Loop *L, Value *BECount, unsigned Count, for (PHINode &PN : Succ->phis()) { // Add a new PHI node to the prolog end block and add the // appropriate incoming values. + // TODO: This code assumes that the PrologExit (or the LatchExit block for + // prolog loop) contains only one predecessor from the loop, i.e. the + // PrologLatch. When supporting multiple-exiting block loops, we can have + // two or more blocks that have the LatchExit as the target in the + // original loop. PHINode *NewPN = PHINode::Create(PN.getType(), 2, PN.getName() + ".unr", PrologExit->getFirstNonPHI()); // Adding a value to the new PHI node from the original loop preheader. // This is the value that skips all the prolog code. if (L->contains(&PN)) { + // Succ is loop header. NewPN->addIncoming(PN.getIncomingValueForBlock(NewPreHeader), PreHeader); } else { + // Succ is LatchExit NewPN->addIncoming(UndefValue::get(PN.getType()), PreHeader); } |