diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-07-29 20:15:26 +0000 |
| commit | 344a3780b2e33f6ca763666c380202b18aab72a3 (patch) | |
| tree | f0b203ee6eb71d7fdd792373e3c81eb18d6934dd /llvm/lib/Analysis/LoopNestAnalysis.cpp | |
| parent | b60736ec1405bb0a8dd40989f67ef4c93da068ab (diff) | |
vendor/llvm-project/llvmorg-13-init-16847-g88e66fa60ae5vendor/llvm-project/llvmorg-12.0.1-rc2-0-ge7dac564cd0evendor/llvm-project/llvmorg-12.0.1-0-gfed41342a82f
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 |
