diff options
author | Michael Kuperstein <mkuper@google.com> | 2017-01-26 01:04:11 +0000 |
---|---|---|
committer | Michael Kuperstein <mkuper@google.com> | 2017-01-26 01:04:11 +0000 |
commit | 5dd55e8405d66842219883a55563ec45cc010da4 (patch) | |
tree | 7ddc915e234eb02c440d117caa7b9294cbbbb95a /llvm/lib/Transforms/Utils/LoopUnroll.cpp | |
parent | d230de27f8aa70dca0194f8d5b0030bd557c0909 (diff) | |
download | llvm-5dd55e8405d66842219883a55563ec45cc010da4.zip llvm-5dd55e8405d66842219883a55563ec45cc010da4.tar.gz llvm-5dd55e8405d66842219883a55563ec45cc010da4.tar.bz2 |
[LoopUnroll] Properly update loopinfo for runtime unrolling by 2
Even when we don't create a remainder loop (that is, when we unroll by 2), we
may duplicate nested loops into the remainder. This is complicated by the fact
the remainder may itself be either inserted into an outer loop, or at the top
level. In the latter case, we may need to create new top-level loops.
Differential Revision: https://reviews.llvm.org/D29156
llvm-svn: 293124
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUnroll.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUnroll.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUnroll.cpp b/llvm/lib/Transforms/Utils/LoopUnroll.cpp index 7cd69d2..5c3c940 100644 --- a/llvm/lib/Transforms/Utils/LoopUnroll.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnroll.cpp @@ -199,11 +199,14 @@ const Loop* llvm::addClonedBlockToLoopInfo(BasicBlock *OriginalBB, assert(OriginalBB == OldLoop->getHeader() && "Header should be first in RPO"); + NewLoop = new Loop(); Loop *NewLoopParent = NewLoops.lookup(OldLoop->getParentLoop()); - assert(NewLoopParent && - "Expected parent loop before sub-loop in RPO"); - NewLoop = new Loop; - NewLoopParent->addChildLoop(NewLoop); + + if (NewLoopParent) + NewLoopParent->addChildLoop(NewLoop); + else + LI->addTopLevelLoop(NewLoop); + NewLoop->addBasicBlockToLoop(ClonedBB, *LI); return OldLoop; } else { |