Skip to content

Commit 4226e0a

Browse files
authored
[TTI] Add SCEVExpansionBudget to loop unrolling options. (llvm#118316)
Add an extra know to UnrollingPreferences to let backends control the maximum budget for SCEV expansions. This gives backends more fine-grained control on the cost of the runtime checks for runtime unrolling. PR: llvm#118316
1 parent 2c88ac9 commit 4226e0a

File tree

7 files changed

+21
-10
lines changed

7 files changed

+21
-10
lines changed

llvm/include/llvm/Analysis/TargetTransformInfo.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,9 @@ class TargetTransformInfo {
615615
unsigned MaxIterationsCountToAnalyze;
616616
/// Don't disable runtime unroll for the loops which were vectorized.
617617
bool UnrollVectorizedLoop = false;
618+
/// Don't allow runtime unrolling if expanding the trip count takes more
619+
/// than SCEVExpansionBudget.
620+
unsigned SCEVExpansionBudget;
618621
};
619622

620623
/// Get target-customized preferences for the generic loop unrolling

llvm/include/llvm/Transforms/Utils/UnrollLoop.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ struct UnrollLoopOptions {
7575
bool UnrollRemainder;
7676
bool ForgetAllSCEV;
7777
const Instruction *Heart = nullptr;
78+
unsigned SCEVExpansionBudget;
7879
};
7980

8081
LoopUnrollResult UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI,
@@ -90,7 +91,7 @@ bool UnrollRuntimeLoopRemainder(
9091
bool UseEpilogRemainder, bool UnrollRemainder, bool ForgetAllSCEV,
9192
LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC,
9293
const TargetTransformInfo *TTI, bool PreserveLCSSA,
93-
Loop **ResultLoop = nullptr);
94+
unsigned SCEVExpansionBudget, Loop **ResultLoop = nullptr);
9495

9596
LoopUnrollResult UnrollAndJamLoop(Loop *L, unsigned Count, unsigned TripCount,
9697
unsigned TripMultiple, bool UnrollRemainder,

llvm/lib/Transforms/Scalar/LoopUnrollPass.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
#include "llvm/Transforms/Utils/LoopPeel.h"
5858
#include "llvm/Transforms/Utils/LoopSimplify.h"
5959
#include "llvm/Transforms/Utils/LoopUtils.h"
60+
#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
6061
#include "llvm/Transforms/Utils/SizeOpts.h"
6162
#include "llvm/Transforms/Utils/UnrollLoop.h"
6263
#include <algorithm>
@@ -218,6 +219,7 @@ TargetTransformInfo::UnrollingPreferences llvm::gatherUnrollingPreferences(
218219
UP.UnrollAndJam = false;
219220
UP.UnrollAndJamInnerLoopThreshold = 60;
220221
UP.MaxIterationsCountToAnalyze = UnrollMaxIterationsCountToAnalyze;
222+
UP.SCEVExpansionBudget = SCEVCheapExpansionBudget;
221223

222224
// Override with any target specific settings
223225
TTI.getUnrollingPreferences(L, SE, UP, &ORE);
@@ -1349,6 +1351,7 @@ tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI, ScalarEvolution &SE,
13491351
ULO.Runtime = UP.Runtime;
13501352
ULO.ForgetAllSCEV = ForgetAllSCEV;
13511353
ULO.Heart = getLoopConvergenceHeart(L);
1354+
ULO.SCEVExpansionBudget = UP.SCEVExpansionBudget;
13521355
LoopUnrollResult UnrollResult = UnrollLoop(
13531356
L, ULO, LI, &SE, &DT, &AC, &TTI, &ORE, PreserveLCSSA, &RemainderLoop, AA);
13541357
if (UnrollResult == LoopUnrollResult::Unmodified)

llvm/lib/Transforms/Utils/LoopUnroll.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
#include "llvm/Transforms/Utils/Local.h"
6161
#include "llvm/Transforms/Utils/LoopSimplify.h"
6262
#include "llvm/Transforms/Utils/LoopUtils.h"
63+
#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
6364
#include "llvm/Transforms/Utils/SimplifyIndVar.h"
6465
#include "llvm/Transforms/Utils/UnrollLoop.h"
6566
#include "llvm/Transforms/Utils/ValueMapper.h"
@@ -589,10 +590,10 @@ llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI,
589590
: isEpilogProfitable(L);
590591

591592
if (ULO.Runtime &&
592-
!UnrollRuntimeLoopRemainder(L, ULO.Count, ULO.AllowExpensiveTripCount,
593-
EpilogProfitability, ULO.UnrollRemainder,
594-
ULO.ForgetAllSCEV, LI, SE, DT, AC, TTI,
595-
PreserveLCSSA, RemainderLoop)) {
593+
!UnrollRuntimeLoopRemainder(
594+
L, ULO.Count, ULO.AllowExpensiveTripCount, EpilogProfitability,
595+
ULO.UnrollRemainder, ULO.ForgetAllSCEV, LI, SE, DT, AC, TTI,
596+
PreserveLCSSA, ULO.SCEVExpansionBudget, RemainderLoop)) {
596597
if (ULO.Force)
597598
ULO.Runtime = false;
598599
else {

llvm/lib/Transforms/Utils/LoopUnrollAndJam.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
4949
#include "llvm/Transforms/Utils/Cloning.h"
5050
#include "llvm/Transforms/Utils/LoopUtils.h"
51+
#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
5152
#include "llvm/Transforms/Utils/UnrollLoop.h"
5253
#include "llvm/Transforms/Utils/ValueMapper.h"
5354
#include <assert.h>
@@ -241,7 +242,8 @@ llvm::UnrollAndJamLoop(Loop *L, unsigned Count, unsigned TripCount,
241242
if (!UnrollRuntimeLoopRemainder(L, Count, /*AllowExpensiveTripCount*/ false,
242243
/*UseEpilogRemainder*/ true,
243244
UnrollRemainder, /*ForgetAllSCEV*/ false,
244-
LI, SE, DT, AC, TTI, true, EpilogueLoop)) {
245+
LI, SE, DT, AC, TTI, true,
246+
SCEVCheapExpansionBudget, EpilogueLoop)) {
245247
LLVM_DEBUG(dbgs() << "Won't unroll-and-jam; remainder loop could not be "
246248
"generated when assuming runtime trip count\n");
247249
return LoopUnrollResult::Unmodified;

llvm/lib/Transforms/Utils/LoopUnrollRuntime.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -582,7 +582,8 @@ bool llvm::UnrollRuntimeLoopRemainder(
582582
Loop *L, unsigned Count, bool AllowExpensiveTripCount,
583583
bool UseEpilogRemainder, bool UnrollRemainder, bool ForgetAllSCEV,
584584
LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC,
585-
const TargetTransformInfo *TTI, bool PreserveLCSSA, Loop **ResultLoop) {
585+
const TargetTransformInfo *TTI, bool PreserveLCSSA,
586+
unsigned SCEVExpansionBudget, Loop **ResultLoop) {
586587
LLVM_DEBUG(dbgs() << "Trying runtime unrolling on Loop: \n");
587588
LLVM_DEBUG(L->dump());
588589
LLVM_DEBUG(UseEpilogRemainder ? dbgs() << "Using epilog remainder.\n"
@@ -672,8 +673,8 @@ bool llvm::UnrollRuntimeLoopRemainder(
672673
const DataLayout &DL = Header->getDataLayout();
673674
SCEVExpander Expander(*SE, DL, "loop-unroll");
674675
if (!AllowExpensiveTripCount &&
675-
Expander.isHighCostExpansion(TripCountSC, L, SCEVCheapExpansionBudget,
676-
TTI, PreHeaderBR)) {
676+
Expander.isHighCostExpansion(TripCountSC, L, SCEVExpansionBudget, TTI,
677+
PreHeaderBR)) {
677678
LLVM_DEBUG(dbgs() << "High cost for expanding trip count scev!\n");
678679
return false;
679680
}

llvm/unittests/Transforms/Utils/UnrollLoopTest.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,6 @@ while.end: ; preds = %while.cond
7373

7474
bool ret =
7575
UnrollRuntimeLoopRemainder(L, 4, true, false, false, false, &LI, &SE, &DT,
76-
&AC, /*TTI=*/nullptr, PreserveLCSSA);
76+
&AC, /*TTI=*/nullptr, PreserveLCSSA, 4);
7777
EXPECT_FALSE(ret);
7878
}

0 commit comments

Comments
 (0)