diff --git a/llvm/include/llvm/Analysis/LoopInfo.h b/llvm/include/llvm/Analysis/LoopInfo.h --- a/llvm/include/llvm/Analysis/LoopInfo.h +++ b/llvm/include/llvm/Analysis/LoopInfo.h @@ -756,6 +756,14 @@ /// - guarded by a loop guard branch. bool isGuarded() const { return (getLoopGuardBranch() != nullptr); } + /// Return true if the loop is rotated + bool isRotated() const { + assert(!isInvalid() && "Loop not in a valid state!"); + BasicBlock *Latch = getLoopLatch(); + assert(Latch && "Expecting valid latch block."); + return isLoopExiting(Latch); + } + /// Return true if the loop induction variable starts at zero and increments /// by one each time through the loop. bool isCanonical(ScalarEvolution &SE) const; diff --git a/llvm/lib/Analysis/LoopInfo.cpp b/llvm/lib/Analysis/LoopInfo.cpp --- a/llvm/lib/Analysis/LoopInfo.cpp +++ b/llvm/lib/Analysis/LoopInfo.cpp @@ -365,7 +365,7 @@ BasicBlock *Latch = getLoopLatch(); assert(Preheader && Latch && "Expecting a loop with valid preheader and latch"); - assert(isLoopExiting(Latch) && "Only valid for rotated loop"); + assert(isRotated() && "Only valid for rotated loop"); Instruction *LatchTI = Latch->getTerminator(); if (!LatchTI || LatchTI->getNumSuccessors() != 2) diff --git a/llvm/unittests/Analysis/LoopInfoTest.cpp b/llvm/unittests/Analysis/LoopInfoTest.cpp --- a/llvm/unittests/Analysis/LoopInfoTest.cpp +++ b/llvm/unittests/Analysis/LoopInfoTest.cpp @@ -285,6 +285,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -343,6 +344,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -401,6 +403,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -459,6 +462,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -517,6 +521,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -576,6 +581,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -631,6 +637,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -689,6 +696,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -747,6 +755,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -804,6 +813,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -865,6 +875,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "indvars.iv"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -917,6 +928,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), nullptr); EXPECT_FALSE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -974,6 +986,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -1044,6 +1057,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "j"); EXPECT_EQ(L->getLoopGuardBranch(), OuterGuard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); // Next two basic blocks are for.outer and for.inner.preheader - skip // them. @@ -1068,6 +1082,7 @@ EXPECT_EQ(L->getInductionVariable(SE)->getName(), "i"); EXPECT_EQ(L->getLoopGuardBranch(), InnerGuard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); } @@ -1149,6 +1164,7 @@ L->isAuxiliaryInductionVariable(Instruction_mulopcode, SE)); EXPECT_EQ(L->getLoopGuardBranch(), Guard); EXPECT_TRUE(L->isGuarded()); + EXPECT_TRUE(L->isRotated()); }); }