aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/LoopNestAnalysis.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Analysis/LoopNestAnalysis.cpp')
-rw-r--r--llvm/lib/Analysis/LoopNestAnalysis.cpp22
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