diff options
Diffstat (limited to 'llvm/lib/Analysis/LoopNestAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/LoopNestAnalysis.cpp | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/llvm/lib/Analysis/LoopNestAnalysis.cpp b/llvm/lib/Analysis/LoopNestAnalysis.cpp index 7133abcc3504..2649ed60f762 100644 --- a/llvm/lib/Analysis/LoopNestAnalysis.cpp +++ b/llvm/lib/Analysis/LoopNestAnalysis.cpp @@ -206,11 +206,12 @@ unsigned LoopNest::getMaxPerfectDepth(const Loop &Root, ScalarEvolution &SE) { } const BasicBlock &LoopNest::skipEmptyBlockUntil(const BasicBlock *From, - const BasicBlock *End) { + const BasicBlock *End, + bool CheckUniquePred) { assert(From && "Expecting valid From"); assert(End && "Expecting valid End"); - if (From == End || !From->getSingleSuccessor()) + if (From == End || !From->getUniqueSuccessor()) return *From; auto IsEmpty = [](const BasicBlock *BB) { @@ -219,12 +220,13 @@ const BasicBlock &LoopNest::skipEmptyBlockUntil(const BasicBlock *From, // Visited is used to avoid running into an infinite loop. SmallPtrSet<const BasicBlock *, 4> Visited; - const BasicBlock *BB = From->getSingleSuccessor(); - const BasicBlock *PredBB = BB; - while (BB && BB != End && IsEmpty(BB) && !Visited.count(BB)) { + 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->getSingleSuccessor(); + BB = BB->getUniqueSuccessor(); } return (BB == End) ? *End : *PredBB; @@ -335,9 +337,11 @@ static bool checkLoopsStructure(const Loop &OuterLoop, const Loop &InnerLoop, // Ensure the inner loop exit block lead to the outer loop latch possibly // through empty blocks. - const BasicBlock &SuccInner = - LoopNest::skipEmptyBlockUntil(InnerLoop.getExitBlock(), OuterLoopLatch); - if (&SuccInner != OuterLoopLatch && &SuccInner != ExtraPhiBlock) { + if ((!ExtraPhiBlock || + &LoopNest::skipEmptyBlockUntil(InnerLoop.getExitBlock(), + ExtraPhiBlock) != ExtraPhiBlock) && + (&LoopNest::skipEmptyBlockUntil(InnerLoop.getExitBlock(), + OuterLoopLatch) != OuterLoopLatch)) { DEBUG_WITH_TYPE( VerboseDebug, dbgs() << "Inner loop exit block " << *InnerLoopExit |