[LoopUnrollRuntime] NFC: use the precomputed loop exit in ConnectProlog
Minor refactoring to use the preexisting loop exit that's already calculated. We do not need to recompute the loop exit in ConnectProlog. Apart from avoiding redundant computation, this is required for supporting multiple loop exits when Prolog remainder loops are generated. llvm-svn: 307417
This commit is contained in:
parent
c260e0eb56
commit
734ab3f75c
|
@ -65,9 +65,11 @@ static cl::opt<bool> UnrollRuntimeMultiExit(
|
|||
/// than the unroll factor.
|
||||
///
|
||||
static void ConnectProlog(Loop *L, Value *BECount, unsigned Count,
|
||||
BasicBlock *PrologExit, BasicBlock *PreHeader,
|
||||
BasicBlock *NewPreHeader, ValueToValueMapTy &VMap,
|
||||
DominatorTree *DT, LoopInfo *LI, bool PreserveLCSSA) {
|
||||
BasicBlock *PrologExit,
|
||||
BasicBlock *OriginalLoopLatchExit,
|
||||
BasicBlock *PreHeader, BasicBlock *NewPreHeader,
|
||||
ValueToValueMapTy &VMap, DominatorTree *DT,
|
||||
LoopInfo *LI, bool PreserveLCSSA) {
|
||||
BasicBlock *Latch = L->getLoopLatch();
|
||||
assert(Latch && "Loop must have a latch");
|
||||
BasicBlock *PrologLatch = cast<BasicBlock>(VMap[Latch]);
|
||||
|
@ -142,17 +144,15 @@ static void ConnectProlog(Loop *L, Value *BECount, unsigned Count,
|
|||
// then (BECount + 1) cannot unsigned-overflow.
|
||||
Value *BrLoopExit =
|
||||
B.CreateICmpULT(BECount, ConstantInt::get(BECount->getType(), Count - 1));
|
||||
BasicBlock *Exit = L->getUniqueExitBlock();
|
||||
assert(Exit && "Loop must have a single exit block only");
|
||||
// Split the exit to maintain loop canonicalization guarantees
|
||||
SmallVector<BasicBlock*, 4> Preds(predecessors(Exit));
|
||||
SplitBlockPredecessors(Exit, Preds, ".unr-lcssa", DT, LI,
|
||||
SmallVector<BasicBlock *, 4> Preds(predecessors(OriginalLoopLatchExit));
|
||||
SplitBlockPredecessors(OriginalLoopLatchExit, Preds, ".unr-lcssa", DT, LI,
|
||||
PreserveLCSSA);
|
||||
// Add the branch to the exit block (around the unrolled loop)
|
||||
B.CreateCondBr(BrLoopExit, Exit, NewPreHeader);
|
||||
B.CreateCondBr(BrLoopExit, OriginalLoopLatchExit, NewPreHeader);
|
||||
InsertPt->eraseFromParent();
|
||||
if (DT)
|
||||
DT->changeImmediateDominator(Exit, PrologExit);
|
||||
DT->changeImmediateDominator(OriginalLoopLatchExit, PrologExit);
|
||||
}
|
||||
|
||||
/// Connect the unrolling epilog code to the original loop.
|
||||
|
@ -782,8 +782,8 @@ bool llvm::UnrollRuntimeLoopRemainder(Loop *L, unsigned Count,
|
|||
} else {
|
||||
// Connect the prolog code to the original loop and update the
|
||||
// PHI functions.
|
||||
ConnectProlog(L, BECount, Count, PrologExit, PreHeader, NewPreHeader,
|
||||
VMap, DT, LI, PreserveLCSSA);
|
||||
ConnectProlog(L, BECount, Count, PrologExit, LatchExit, PreHeader,
|
||||
NewPreHeader, VMap, DT, LI, PreserveLCSSA);
|
||||
}
|
||||
|
||||
// If this loop is nested, then the loop unroller changes the code in the
|
||||
|
|
Loading…
Reference in New Issue