Index: llvm/lib/Transforms/Scalar/LoopRotation.cpp =================================================================== --- llvm/lib/Transforms/Scalar/LoopRotation.cpp +++ llvm/lib/Transforms/Scalar/LoopRotation.cpp @@ -569,9 +569,8 @@ return true; } -/// Rotate \c L as many times as possible. Return true if the loop is rotated -/// at least once. -static bool iterativelyRotateLoop(Loop *L, unsigned MaxHeaderSize, LoopInfo *LI, +/// Rotate loop L. Return true if the loop is rotated. +static bool rotateLoop(Loop *L, unsigned MaxHeaderSize, LoopInfo *LI, const TargetTransformInfo *TTI, AssumptionCache *AC, DominatorTree *DT, ScalarEvolution *SE) { @@ -582,13 +581,8 @@ // upward. Rotation may not be needed if the loop tail can be folded into the // loop exit. bool SimplifiedLatch = simplifyLoopLatch(L, LI, DT); - - // One loop can be rotated multiple times. - bool MadeChange = false; - while (rotateLoop(L, MaxHeaderSize, LI, TTI, AC, DT, SE, SimplifiedLatch)) { - MadeChange = true; - SimplifiedLatch = false; - } + bool MadeChange = rotateLoop(L, MaxHeaderSize, LI, TTI, AC, DT, SE, + SimplifiedLatch); // Restore the loop metadata. // NB! We presume LoopRotation DOESN'T ADD its own metadata. @@ -613,7 +607,7 @@ auto *DT = FAM.getCachedResult(*F); auto *SE = FAM.getCachedResult(*F); - bool Changed = iterativelyRotateLoop(&L, MaxHeaderSize, LI, TTI, AC, DT, SE); + bool Changed = rotateLoop(&L, MaxHeaderSize, LI, TTI, AC, DT, SE); if (!Changed) return PreservedAnalyses::all(); return getLoopPassPreservedAnalyses(); @@ -654,7 +648,7 @@ auto *SEWP = getAnalysisIfAvailable(); auto *SE = SEWP ? &SEWP->getSE() : nullptr; - return iterativelyRotateLoop(L, MaxHeaderSize, LI, TTI, AC, DT, SE); + return rotateLoop(L, MaxHeaderSize, LI, TTI, AC, DT, SE); } }; }