summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp
diff options
context:
space:
mode:
authorMichael Zolotukhin <mzolotukhin@apple.com>2016-09-08 03:51:30 +0000
committerMichael Zolotukhin <mzolotukhin@apple.com>2016-09-08 03:51:30 +0000
commite72997a5244d75b73fc4351d6d3aa17ab07ea7bd (patch)
tree6617df8f00498ca71c5bd3c4ea7bebae5a094acb /llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp
parent8239617acd85db048b70570a4e51edee010cfb24 (diff)
downloadbcm5719-llvm-e72997a5244d75b73fc4351d6d3aa17ab07ea7bd.tar.gz
bcm5719-llvm-e72997a5244d75b73fc4351d6d3aa17ab07ea7bd.zip
Revert "[LoopUnroll] Properly update loop-info when cloning prologues and epilogues."
This reverts commit r280901. This caused a bunch of failures, reverting it until I investigate them. llvm-svn: 280905
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp65
1 files changed, 11 insertions, 54 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp
index ee8bd350edb..5758a415f12 100644
--- a/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp
+++ b/llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp
@@ -291,10 +291,15 @@ static void CloneLoopBlocks(Loop *L, Value *NewIter,
Function *F = Header->getParent();
LoopBlocksDFS::RPOIterator BlockBegin = LoopBlocks.beginRPO();
LoopBlocksDFS::RPOIterator BlockEnd = LoopBlocks.endRPO();
+ Loop *NewLoop = nullptr;
Loop *ParentLoop = L->getParentLoop();
-
- // The map from original loops to their cloned copies.
- SmallDenseMap<const Loop *, Loop *, 4> NewLoops;
+ if (CreateRemainderLoop) {
+ NewLoop = new Loop();
+ if (ParentLoop)
+ ParentLoop->addChildLoop(NewLoop);
+ else
+ LI->addTopLevelLoop(NewLoop);
+ }
// For each block in the original loop, create a new copy,
// and update the value map with the newly created values.
@@ -302,57 +307,10 @@ static void CloneLoopBlocks(Loop *L, Value *NewIter,
BasicBlock *NewBB = CloneBasicBlock(*BB, VMap, "." + suffix, F);
NewBlocks.push_back(NewBB);
- // Figure out which loop NewBB is in.
- auto findClonedLoop = [&](const Loop *OldLoop) {
- Loop *&NewLoop = NewLoops[OldLoop];
- // If we've encountered this loop before, return it right away.
- if (NewLoop)
- return NewLoop;
-
- // If BB is from L, and we're not creating a remainder, the loop for
- // NewBB will be ParentLoop, which might be null. Update NewLoops map and
- // return ParentLoop.
- if (OldLoop == L && !CreateRemainderLoop)
- return (NewLoop = ParentLoop);
-
- // Now we know that there should be a cloned counterpart for OldLoop, but
- // we haven't seen it yet. Note that OldLoop might be L if we're
- // generating a remainder loop, or it can be an inner loop of L - in this
- // case we'll recreate the loop structure of L in its clone.
-
- // This is a first block belonging to OldLoop encountered in our RPO
- // traversal.
- assert(*BB == OldLoop->getHeader() && "Header should be first in RPO");
-
- NewLoop = new Loop;
- Loop *OldLoopParent = OldLoop->getParentLoop();
- // If OldLoop has a parent loop, we have two options:
- // 1. ParentLoop is the parent of L. It won't be cloned, and it will
- // be a parent for NewLoop too.
- // 2. ParentLoop is not a parent of L. In this case, it should be one
- // of the cloned loops and we should be able to find it in our map.
- //
- // If OldLoop doesn't have a parent, then NewLoop should be yet another
- // top-level loop.
- if (OldLoopParent) {
- Loop *NewLoopParent = ParentLoop == OldLoopParent
- ? ParentLoop
- : NewLoops.lookup(OldLoopParent);
- assert(NewLoopParent && "Expected parent loop before sub-loop in RPO");
- NewLoopParent->addChildLoop(NewLoop);
- } else
- LI->addTopLevelLoop(NewLoop);
- return NewLoop;
- };
-
- Loop *NewLoop = findClonedLoop(LI->getLoopFor(*BB));
-
- assert(NewLoop ||
- (!CreateRemainderLoop && !ParentLoop) &&
- "NewLoop can only be null if we are cloning top-level loop "
- "without creating a remainder loop.");
if (NewLoop)
NewLoop->addBasicBlockToLoop(NewBB, *LI);
+ else if (ParentLoop)
+ ParentLoop->addBasicBlockToLoop(NewBB, *LI);
VMap[*BB] = NewBB;
if (Header == *BB) {
@@ -411,8 +369,7 @@ static void CloneLoopBlocks(Loop *L, Value *NewIter,
NewPHI->setIncomingValue(idx, V);
}
}
- if (CreateRemainderLoop) {
- Loop *NewLoop = NewLoops[L];
+ if (NewLoop) {
// Add unroll disable metadata to disable future unrolling for this loop.
SmallVector<Metadata *, 4> MDs;
// Reserve first location for self reference to the LoopID metadata node.
OpenPOWER on IntegriCloud