[llvm] [LoopUnroll] Rotate loop before unrolling inside of UnrollRuntimeLoopRemainder (PR #148243)
Florian Hahn via llvm-commits
llvm-commits at lists.llvm.org
Tue Jul 22 04:11:33 PDT 2025
================
@@ -587,21 +536,116 @@ llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI,
UnrollRuntimeEpilog.getNumOccurrences() ? UnrollRuntimeEpilog
: isEpilogProfitable(L);
- if (ULO.Runtime &&
- !UnrollRuntimeLoopRemainder(L, ULO.Count, ULO.AllowExpensiveTripCount,
- EpilogProfitability, ULO.UnrollRemainder,
- ULO.ForgetAllSCEV, LI, SE, DT, AC, TTI,
- PreserveLCSSA, ULO.SCEVExpansionBudget,
- ULO.RuntimeUnrollMultiExit, RemainderLoop)) {
+ bool LoopRotated = false;
+ bool ReminderUnrolled = false;
+ if (ULO.Runtime) {
+ // Call unroll with disabled rotation, to see if it is possible without it.
+ ReminderUnrolled = UnrollRuntimeLoopRemainder(
+ L, ULO.Count, ULO.AllowExpensiveTripCount, EpilogProfitability,
+ ULO.UnrollRemainder, ULO.ForgetAllSCEV, LI, SE, DT, AC, TTI,
+ PreserveLCSSA, ULO.SCEVExpansionBudget, ULO.RuntimeUnrollMultiExit,
+ RemainderLoop);
+
+ // If unroll is not possible, then try with loop rotation.
+ if (!ReminderUnrolled) {
+ BasicBlock *OrigHeader = L->getHeader();
+ BranchInst *BI = dyn_cast<BranchInst>(OrigHeader->getTerminator());
+ if (BI && !BI->isUnconditional() &&
+ isa<SCEVCouldNotCompute>(SE->getExitCount(L, L->getLoopLatch())) &&
+ !isa<SCEVCouldNotCompute>(SE->getExitCount(L, OrigHeader))) {
+ LLVM_DEBUG(
+ dbgs() << " Rotating loop to make the exit count computable.\n");
+ SimplifyQuery SQ{OrigHeader->getDataLayout()};
+ SQ.TLI = nullptr;
+ SQ.DT = DT;
+ SQ.AC = AC;
+ LoopRotated =
+ llvm::LoopRotation(L, LI, TTI, AC, DT, SE,
+ /*MemorySSAUpdater*/ nullptr, SQ,
+ /*RotationOnly*/ false, /*Threshold*/ 16,
+ /*IsUtilMode*/ false, /*PrepareForLTO*/ false,
+ [](Loop *, ScalarEvolution *) { return true; });
----------------
fhahn wrote:
(LoopUnroll itself works on both rotated and unrotated loops in a similar way)
https://github.com/llvm/llvm-project/pull/148243
More information about the llvm-commits
mailing list