123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465 |
- //===- LoopNestAnalysis.cpp - Loop Nest Analysis --------------------------==//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- ///
- /// \file
- /// The implementation for the loop nest analysis.
- ///
- //===----------------------------------------------------------------------===//
- #include "llvm/Analysis/LoopNestAnalysis.h"
- #include "llvm/ADT/BreadthFirstIterator.h"
- #include "llvm/ADT/Statistic.h"
- #include "llvm/Analysis/PostDominators.h"
- #include "llvm/Analysis/ValueTracking.h"
- using namespace llvm;
- #define DEBUG_TYPE "loopnest"
- #ifndef NDEBUG
- static const char *VerboseDebug = DEBUG_TYPE "-verbose";
- #endif
- /// Determine whether the loops structure violates basic requirements for
- /// perfect nesting:
- /// - the inner loop should be the outer loop's only child
- /// - the outer loop header should 'flow' into the inner loop preheader
- /// or jump around the inner loop to the outer loop latch
- /// - if the inner loop latch exits the inner loop, it should 'flow' into
- /// the outer loop latch.
- /// Returns true if the loop structure satisfies the basic requirements and
- /// false otherwise.
- static bool checkLoopsStructure(const Loop &OuterLoop, const Loop &InnerLoop,
- ScalarEvolution &SE);
- //===----------------------------------------------------------------------===//
- // LoopNest implementation
- //
- LoopNest::LoopNest(Loop &Root, ScalarEvolution &SE)
- : MaxPerfectDepth(getMaxPerfectDepth(Root, SE)) {
- append_range(Loops, breadth_first(&Root));
- }
- std::unique_ptr<LoopNest> LoopNest::getLoopNest(Loop &Root,
- ScalarEvolution &SE) {
- return std::make_unique<LoopNest>(Root, SE);
- }
- static CmpInst *getOuterLoopLatchCmp(const Loop &OuterLoop) {
- const BasicBlock *Latch = OuterLoop.getLoopLatch();
- assert(Latch && "Expecting a valid loop latch");
- const BranchInst *BI = dyn_cast<BranchInst>(Latch->getTerminator());
- assert(BI && BI->isConditional() &&
- "Expecting loop latch terminator to be a branch instruction");
- CmpInst *OuterLoopLatchCmp = dyn_cast<CmpInst>(BI->getCondition());
- DEBUG_WITH_TYPE(
- VerboseDebug, if (OuterLoopLatchCmp) {
- dbgs() << "Outer loop latch compare instruction: " << *OuterLoopLatchCmp
- << "\n";
- });
- return OuterLoopLatchCmp;
- }
- static CmpInst *getInnerLoopGuardCmp(const Loop &InnerLoop) {
- BranchInst *InnerGuard = InnerLoop.getLoopGuardBranch();
- CmpInst *InnerLoopGuardCmp =
- (InnerGuard) ? dyn_cast<CmpInst>(InnerGuard->getCondition()) : nullptr;
- DEBUG_WITH_TYPE(
- VerboseDebug, if (InnerLoopGuardCmp) {
- dbgs() << "Inner loop guard compare instruction: " << *InnerLoopGuardCmp
- << "\n";
- });
- return InnerLoopGuardCmp;
- }
- static bool checkSafeInstruction(const Instruction &I,
- const CmpInst *InnerLoopGuardCmp,
- const CmpInst *OuterLoopLatchCmp,
- Optional<Loop::LoopBounds> OuterLoopLB) {
- bool IsAllowed =
- isSafeToSpeculativelyExecute(&I) || isa<PHINode>(I) || isa<BranchInst>(I);
- if (!IsAllowed)
- return false;
- // The only binary instruction allowed is the outer loop step instruction,
- // the only comparison instructions allowed are the inner loop guard
- // compare instruction and the outer loop latch compare instruction.
- if ((isa<BinaryOperator>(I) && &I != &OuterLoopLB->getStepInst()) ||
- (isa<CmpInst>(I) && &I != OuterLoopLatchCmp && &I != InnerLoopGuardCmp)) {
- return false;
- }
- return true;
- }
- bool LoopNest::arePerfectlyNested(const Loop &OuterLoop, const Loop &InnerLoop,
- ScalarEvolution &SE) {
- return (analyzeLoopNestForPerfectNest(OuterLoop, InnerLoop, SE) ==
- PerfectLoopNest);
- }
- LoopNest::LoopNestEnum LoopNest::analyzeLoopNestForPerfectNest(
- const Loop &OuterLoop, const Loop &InnerLoop, ScalarEvolution &SE) {
- assert(!OuterLoop.isInnermost() && "Outer loop should have subloops");
- assert(!InnerLoop.isOutermost() && "Inner loop should have a parent");
- LLVM_DEBUG(dbgs() << "Checking whether loop '" << OuterLoop.getName()
- << "' and '" << InnerLoop.getName()
- << "' are perfectly nested.\n");
- // Determine whether the loops structure satisfies the following requirements:
- // - the inner loop should be the outer loop's only child
- // - the outer loop header should 'flow' into the inner loop preheader
- // or jump around the inner loop to the outer loop latch
- // - if the inner loop latch exits the inner loop, it should 'flow' into
- // the outer loop latch.
- if (!checkLoopsStructure(OuterLoop, InnerLoop, SE)) {
- LLVM_DEBUG(dbgs() << "Not perfectly nested: invalid loop structure.\n");
- return InvalidLoopStructure;
- }
- // Bail out if we cannot retrieve the outer loop bounds.
- auto OuterLoopLB = OuterLoop.getBounds(SE);
- if (OuterLoopLB == None) {
- LLVM_DEBUG(dbgs() << "Cannot compute loop bounds of OuterLoop: "
- << OuterLoop << "\n";);
- return OuterLoopLowerBoundUnknown;
- }
- CmpInst *OuterLoopLatchCmp = getOuterLoopLatchCmp(OuterLoop);
- CmpInst *InnerLoopGuardCmp = getInnerLoopGuardCmp(InnerLoop);
- // Determine whether instructions in a basic block are one of:
- // - the inner loop guard comparison
- // - the outer loop latch comparison
- // - the outer loop induction variable increment
- // - a phi node, a cast or a branch
- auto containsOnlySafeInstructions = [&](const BasicBlock &BB) {
- return llvm::all_of(BB, [&](const Instruction &I) {
- bool IsSafeInstr = checkSafeInstruction(I, InnerLoopGuardCmp,
- OuterLoopLatchCmp, OuterLoopLB);
- if (IsSafeInstr) {
- DEBUG_WITH_TYPE(VerboseDebug, {
- dbgs() << "Instruction: " << I << "\nin basic block:" << BB
- << "is unsafe.\n";
- });
- }
- return IsSafeInstr;
- });
- };
- // Check the code surrounding the inner loop for instructions that are deemed
- // unsafe.
- const BasicBlock *OuterLoopHeader = OuterLoop.getHeader();
- const BasicBlock *OuterLoopLatch = OuterLoop.getLoopLatch();
- const BasicBlock *InnerLoopPreHeader = InnerLoop.getLoopPreheader();
- if (!containsOnlySafeInstructions(*OuterLoopHeader) ||
- !containsOnlySafeInstructions(*OuterLoopLatch) ||
- (InnerLoopPreHeader != OuterLoopHeader &&
- !containsOnlySafeInstructions(*InnerLoopPreHeader)) ||
- !containsOnlySafeInstructions(*InnerLoop.getExitBlock())) {
- LLVM_DEBUG(dbgs() << "Not perfectly nested: code surrounding inner loop is "
- "unsafe\n";);
- return ImperfectLoopNest;
- }
- LLVM_DEBUG(dbgs() << "Loop '" << OuterLoop.getName() << "' and '"
- << InnerLoop.getName() << "' are perfectly nested.\n");
- return PerfectLoopNest;
- }
- LoopNest::InstrVectorTy LoopNest::getInterveningInstructions(
- const Loop &OuterLoop, const Loop &InnerLoop, ScalarEvolution &SE) {
- InstrVectorTy Instr;
- switch (analyzeLoopNestForPerfectNest(OuterLoop, InnerLoop, SE)) {
- case PerfectLoopNest:
- LLVM_DEBUG(dbgs() << "The loop Nest is Perfect, returning empty "
- "instruction vector. \n";);
- return Instr;
- case InvalidLoopStructure:
- LLVM_DEBUG(dbgs() << "Not perfectly nested: invalid loop structure. "
- "Instruction vector is empty.\n";);
- return Instr;
- case OuterLoopLowerBoundUnknown:
- LLVM_DEBUG(dbgs() << "Cannot compute loop bounds of OuterLoop: "
- << OuterLoop << "\nInstruction vector is empty.\n";);
- return Instr;
- case ImperfectLoopNest:
- break;
- }
- // Identify the outer loop latch comparison instruction.
- auto OuterLoopLB = OuterLoop.getBounds(SE);
- CmpInst *OuterLoopLatchCmp = getOuterLoopLatchCmp(OuterLoop);
- CmpInst *InnerLoopGuardCmp = getInnerLoopGuardCmp(InnerLoop);
- auto GetUnsafeInstructions = [&](const BasicBlock &BB) {
- for (const Instruction &I : BB) {
- if (!checkSafeInstruction(I, InnerLoopGuardCmp, OuterLoopLatchCmp,
- OuterLoopLB)) {
- Instr.push_back(&I);
- DEBUG_WITH_TYPE(VerboseDebug, {
- dbgs() << "Instruction: " << I << "\nin basic block:" << BB
- << "is unsafe.\n";
- });
- }
- }
- };
- // Check the code surrounding the inner loop for instructions that are deemed
- // unsafe.
- const BasicBlock *OuterLoopHeader = OuterLoop.getHeader();
- const BasicBlock *OuterLoopLatch = OuterLoop.getLoopLatch();
- const BasicBlock *InnerLoopPreHeader = InnerLoop.getLoopPreheader();
- const BasicBlock *InnerLoopExitBlock = InnerLoop.getExitBlock();
- GetUnsafeInstructions(*OuterLoopHeader);
- GetUnsafeInstructions(*OuterLoopLatch);
- GetUnsafeInstructions(*InnerLoopExitBlock);
- if (InnerLoopPreHeader != OuterLoopHeader) {
- GetUnsafeInstructions(*InnerLoopPreHeader);
- }
- return Instr;
- }
- SmallVector<LoopVectorTy, 4>
- LoopNest::getPerfectLoops(ScalarEvolution &SE) const {
- SmallVector<LoopVectorTy, 4> LV;
- LoopVectorTy PerfectNest;
- for (Loop *L : depth_first(const_cast<Loop *>(Loops.front()))) {
- if (PerfectNest.empty())
- PerfectNest.push_back(L);
- auto &SubLoops = L->getSubLoops();
- if (SubLoops.size() == 1 && arePerfectlyNested(*L, *SubLoops.front(), SE)) {
- PerfectNest.push_back(SubLoops.front());
- } else {
- LV.push_back(PerfectNest);
- PerfectNest.clear();
- }
- }
- return LV;
- }
- unsigned LoopNest::getMaxPerfectDepth(const Loop &Root, ScalarEvolution &SE) {
- LLVM_DEBUG(dbgs() << "Get maximum perfect depth of loop nest rooted by loop '"
- << Root.getName() << "'\n");
- const Loop *CurrentLoop = &Root;
- const auto *SubLoops = &CurrentLoop->getSubLoops();
- unsigned CurrentDepth = 1;
- while (SubLoops->size() == 1) {
- const Loop *InnerLoop = SubLoops->front();
- if (!arePerfectlyNested(*CurrentLoop, *InnerLoop, SE)) {
- LLVM_DEBUG({
- dbgs() << "Not a perfect nest: loop '" << CurrentLoop->getName()
- << "' is not perfectly nested with loop '"
- << InnerLoop->getName() << "'\n";
- });
- break;
- }
- CurrentLoop = InnerLoop;
- SubLoops = &CurrentLoop->getSubLoops();
- ++CurrentDepth;
- }
- return CurrentDepth;
- }
- const BasicBlock &LoopNest::skipEmptyBlockUntil(const BasicBlock *From,
- const BasicBlock *End,
- bool CheckUniquePred) {
- assert(From && "Expecting valid From");
- assert(End && "Expecting valid End");
- if (From == End || !From->getUniqueSuccessor())
- return *From;
- auto IsEmpty = [](const BasicBlock *BB) {
- return (BB->getInstList().size() == 1);
- };
- // Visited is used to avoid running into an infinite loop.
- SmallPtrSet<const BasicBlock *, 4> Visited;
- const BasicBlock *BB = From->getUniqueSuccessor();
- const BasicBlock *PredBB = From;
- while (BB && BB != End && IsEmpty(BB) && !Visited.count(BB) &&
- (!CheckUniquePred || BB->getUniquePredecessor())) {
- Visited.insert(BB);
- PredBB = BB;
- BB = BB->getUniqueSuccessor();
- }
- return (BB == End) ? *End : *PredBB;
- }
- static bool checkLoopsStructure(const Loop &OuterLoop, const Loop &InnerLoop,
- ScalarEvolution &SE) {
- // The inner loop must be the only outer loop's child.
- if ((OuterLoop.getSubLoops().size() != 1) ||
- (InnerLoop.getParentLoop() != &OuterLoop))
- return false;
- // We expect loops in normal form which have a preheader, header, latch...
- if (!OuterLoop.isLoopSimplifyForm() || !InnerLoop.isLoopSimplifyForm())
- return false;
- const BasicBlock *OuterLoopHeader = OuterLoop.getHeader();
- const BasicBlock *OuterLoopLatch = OuterLoop.getLoopLatch();
- const BasicBlock *InnerLoopPreHeader = InnerLoop.getLoopPreheader();
- const BasicBlock *InnerLoopLatch = InnerLoop.getLoopLatch();
- const BasicBlock *InnerLoopExit = InnerLoop.getExitBlock();
- // We expect rotated loops. The inner loop should have a single exit block.
- if (OuterLoop.getExitingBlock() != OuterLoopLatch ||
- InnerLoop.getExitingBlock() != InnerLoopLatch || !InnerLoopExit)
- return false;
- // Returns whether the block `ExitBlock` contains at least one LCSSA Phi node.
- auto ContainsLCSSAPhi = [](const BasicBlock &ExitBlock) {
- return any_of(ExitBlock.phis(), [](const PHINode &PN) {
- return PN.getNumIncomingValues() == 1;
- });
- };
- // Returns whether the block `BB` qualifies for being an extra Phi block. The
- // extra Phi block is the additional block inserted after the exit block of an
- // "guarded" inner loop which contains "only" Phi nodes corresponding to the
- // LCSSA Phi nodes in the exit block.
- auto IsExtraPhiBlock = [&](const BasicBlock &BB) {
- return BB.getFirstNonPHI() == BB.getTerminator() &&
- all_of(BB.phis(), [&](const PHINode &PN) {
- return all_of(PN.blocks(), [&](const BasicBlock *IncomingBlock) {
- return IncomingBlock == InnerLoopExit ||
- IncomingBlock == OuterLoopHeader;
- });
- });
- };
- const BasicBlock *ExtraPhiBlock = nullptr;
- // Ensure the only branch that may exist between the loops is the inner loop
- // guard.
- if (OuterLoopHeader != InnerLoopPreHeader) {
- const BasicBlock &SingleSucc =
- LoopNest::skipEmptyBlockUntil(OuterLoopHeader, InnerLoopPreHeader);
- // no conditional branch present
- if (&SingleSucc != InnerLoopPreHeader) {
- const BranchInst *BI = dyn_cast<BranchInst>(SingleSucc.getTerminator());
- if (!BI || BI != InnerLoop.getLoopGuardBranch())
- return false;
- bool InnerLoopExitContainsLCSSA = ContainsLCSSAPhi(*InnerLoopExit);
- // The successors of the inner loop guard should be the inner loop
- // preheader or the outer loop latch possibly through empty blocks.
- for (const BasicBlock *Succ : BI->successors()) {
- const BasicBlock *PotentialInnerPreHeader = Succ;
- const BasicBlock *PotentialOuterLatch = Succ;
- // Ensure the inner loop guard successor is empty before skipping
- // blocks.
- if (Succ->getInstList().size() == 1) {
- PotentialInnerPreHeader =
- &LoopNest::skipEmptyBlockUntil(Succ, InnerLoopPreHeader);
- PotentialOuterLatch =
- &LoopNest::skipEmptyBlockUntil(Succ, OuterLoopLatch);
- }
- if (PotentialInnerPreHeader == InnerLoopPreHeader)
- continue;
- if (PotentialOuterLatch == OuterLoopLatch)
- continue;
- // If `InnerLoopExit` contains LCSSA Phi instructions, additional block
- // may be inserted before the `OuterLoopLatch` to which `BI` jumps. The
- // loops are still considered perfectly nested if the extra block only
- // contains Phi instructions from InnerLoopExit and OuterLoopHeader.
- if (InnerLoopExitContainsLCSSA && IsExtraPhiBlock(*Succ) &&
- Succ->getSingleSuccessor() == OuterLoopLatch) {
- // Points to the extra block so that we can reference it later in the
- // final check. We can also conclude that the inner loop is
- // guarded and there exists LCSSA Phi node in the exit block later if
- // we see a non-null `ExtraPhiBlock`.
- ExtraPhiBlock = Succ;
- continue;
- }
- DEBUG_WITH_TYPE(VerboseDebug, {
- dbgs() << "Inner loop guard successor " << Succ->getName()
- << " doesn't lead to inner loop preheader or "
- "outer loop latch.\n";
- });
- return false;
- }
- }
- }
- // Ensure the inner loop exit block lead to the outer loop latch possibly
- // through empty blocks.
- if ((!ExtraPhiBlock ||
- &LoopNest::skipEmptyBlockUntil(InnerLoop.getExitBlock(),
- ExtraPhiBlock) != ExtraPhiBlock) &&
- (&LoopNest::skipEmptyBlockUntil(InnerLoop.getExitBlock(),
- OuterLoopLatch) != OuterLoopLatch)) {
- DEBUG_WITH_TYPE(
- VerboseDebug,
- dbgs() << "Inner loop exit block " << *InnerLoopExit
- << " does not directly lead to the outer loop latch.\n";);
- return false;
- }
- return true;
- }
- AnalysisKey LoopNestAnalysis::Key;
- raw_ostream &llvm::operator<<(raw_ostream &OS, const LoopNest &LN) {
- OS << "IsPerfect=";
- if (LN.getMaxPerfectDepth() == LN.getNestDepth())
- OS << "true";
- else
- OS << "false";
- OS << ", Depth=" << LN.getNestDepth();
- OS << ", OutermostLoop: " << LN.getOutermostLoop().getName();
- OS << ", Loops: ( ";
- for (const Loop *L : LN.getLoops())
- OS << L->getName() << " ";
- OS << ")";
- return OS;
- }
- //===----------------------------------------------------------------------===//
- // LoopNestPrinterPass implementation
- //
- PreservedAnalyses LoopNestPrinterPass::run(Loop &L, LoopAnalysisManager &AM,
- LoopStandardAnalysisResults &AR,
- LPMUpdater &U) {
- if (auto LN = LoopNest::getLoopNest(L, AR.SE))
- OS << *LN << "\n";
- return PreservedAnalyses::all();
- }
|