diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2021-05-29 09:31:28 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2021-05-29 09:37:32 +0200 |
commit | 625920dabf49443d76ae05f954b0aabe33a76eba (patch) | |
tree | 46ccf44ffe75f32c07570974c4ac6daea6f81f92 /llvm/lib/Transforms/Utils/LoopUnroll.cpp | |
parent | b577ec495698c585837db3893c5662d3aa0aab87 (diff) | |
download | llvm-625920dabf49443d76ae05f954b0aabe33a76eba.zip llvm-625920dabf49443d76ae05f954b0aabe33a76eba.tar.gz llvm-625920dabf49443d76ae05f954b0aabe33a76eba.tar.bz2 |
[LoopUnroll] Make DomTree explicitly required (NFC)
Some of the code was already assuming that DT is non-null, so
make that requirement more explicit and remove unnecessary null
checks.
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUnroll.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUnroll.cpp | 80 |
1 files changed, 38 insertions, 42 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUnroll.cpp b/llvm/lib/Transforms/Utils/LoopUnroll.cpp index 3574abe..8ae9095 100644 --- a/llvm/lib/Transforms/Utils/LoopUnroll.cpp +++ b/llvm/lib/Transforms/Utils/LoopUnroll.cpp @@ -285,6 +285,7 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI, const TargetTransformInfo *TTI, OptimizationRemarkEmitter *ORE, bool PreserveLCSSA, Loop **RemainderLoop) { + assert(DT && "DomTree is required"); if (!L->getLoopPreheader()) { LLVM_DEBUG(dbgs() << " Can't unroll; loop preheader-insertion failed.\n"); @@ -654,16 +655,14 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI, // dedicated entry block (copy of the header block), this header's copy // dominates all copied blocks. That means, dominance relations in the // copied body are the same as in the original body. - if (DT) { - if (*BB == Header) - DT->addNewBlock(New, Latches[It - 1]); - else { - auto BBDomNode = DT->getNode(*BB); - auto BBIDom = BBDomNode->getIDom(); - BasicBlock *OriginalBBIDom = BBIDom->getBlock(); - DT->addNewBlock( - New, cast<BasicBlock>(LastValueMap[cast<Value>(OriginalBBIDom)])); - } + if (*BB == Header) + DT->addNewBlock(New, Latches[It - 1]); + else { + auto BBDomNode = DT->getNode(*BB); + auto BBIDom = BBDomNode->getIDom(); + BasicBlock *OriginalBBIDom = BBIDom->getBlock(); + DT->addNewBlock( + New, cast<BasicBlock>(LastValueMap[cast<Value>(OriginalBBIDom)])); } } @@ -767,7 +766,7 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI, // Immediate dominator of such block might change, because we add more // routes which can lead to the exit: we can now reach it from the copied // iterations too. - if (DT && ULO.Count > 1) { + if (ULO.Count > 1) { for (auto *BB : OriginalLoopBlocks) { auto *BBDomNode = DT->getNode(BB); SmallVector<BasicBlock *, 16> ChildrenToUpdate; @@ -808,7 +807,7 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI, } } - assert(!DT || !UnrollVerifyDomtree || + assert(!UnrollVerifyDomtree || DT->verify(DominatorTree::VerificationLevel::Fast)); DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Lazy); @@ -862,39 +861,36 @@ LoopUnrollResult llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI, if (PreserveLCSSA && OuterL && CompletelyUnroll && !NeedToFixLCSSA) NeedToFixLCSSA |= ::needToInsertPhisForLCSSA(OuterL, UnrolledLoopBlocks, LI); - // If we have a pass and a DominatorTree we should re-simplify impacted loops - // to ensure subsequent analyses can rely on this form. We want to simplify + // Make sure that loop-simplify form is preserved. We want to simplify // at least one layer outside of the loop that was unrolled so that any // changes to the parent loop exposed by the unrolling are considered. - if (DT) { - if (OuterL) { - // OuterL includes all loops for which we can break loop-simplify, so - // it's sufficient to simplify only it (it'll recursively simplify inner - // loops too). - if (NeedToFixLCSSA) { - // LCSSA must be performed on the outermost affected loop. The unrolled - // loop's last loop latch is guaranteed to be in the outermost loop - // after LoopInfo's been updated by LoopInfo::erase. - Loop *LatchLoop = LI->getLoopFor(Latches.back()); - Loop *FixLCSSALoop = OuterL; - if (!FixLCSSALoop->contains(LatchLoop)) - while (FixLCSSALoop->getParentLoop() != LatchLoop) - FixLCSSALoop = FixLCSSALoop->getParentLoop(); - - formLCSSARecursively(*FixLCSSALoop, *DT, LI, SE); - } else if (PreserveLCSSA) { - assert(OuterL->isLCSSAForm(*DT) && - "Loops should be in LCSSA form after loop-unroll."); - } - - // TODO: That potentially might be compile-time expensive. We should try - // to fix the loop-simplified form incrementally. - simplifyLoop(OuterL, DT, LI, SE, AC, nullptr, PreserveLCSSA); - } else { - // Simplify loops for which we might've broken loop-simplify form. - for (Loop *SubLoop : LoopsToSimplify) - simplifyLoop(SubLoop, DT, LI, SE, AC, nullptr, PreserveLCSSA); + if (OuterL) { + // OuterL includes all loops for which we can break loop-simplify, so + // it's sufficient to simplify only it (it'll recursively simplify inner + // loops too). + if (NeedToFixLCSSA) { + // LCSSA must be performed on the outermost affected loop. The unrolled + // loop's last loop latch is guaranteed to be in the outermost loop + // after LoopInfo's been updated by LoopInfo::erase. + Loop *LatchLoop = LI->getLoopFor(Latches.back()); + Loop *FixLCSSALoop = OuterL; + if (!FixLCSSALoop->contains(LatchLoop)) + while (FixLCSSALoop->getParentLoop() != LatchLoop) + FixLCSSALoop = FixLCSSALoop->getParentLoop(); + + formLCSSARecursively(*FixLCSSALoop, *DT, LI, SE); + } else if (PreserveLCSSA) { + assert(OuterL->isLCSSAForm(*DT) && + "Loops should be in LCSSA form after loop-unroll."); } + + // TODO: That potentially might be compile-time expensive. We should try + // to fix the loop-simplified form incrementally. + simplifyLoop(OuterL, DT, LI, SE, AC, nullptr, PreserveLCSSA); + } else { + // Simplify loops for which we might've broken loop-simplify form. + for (Loop *SubLoop : LoopsToSimplify) + simplifyLoop(SubLoop, DT, LI, SE, AC, nullptr, PreserveLCSSA); } return CompletelyUnroll ? LoopUnrollResult::FullyUnrolled |