[TTI] Add SCEVExpansionBudget to loop unrolling options. (#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: https://github.com/llvm/llvm-project/pull/118316
This commit is contained in:
@@ -615,6 +615,9 @@ public:
|
||||
unsigned MaxIterationsCountToAnalyze;
|
||||
/// Don't disable runtime unroll for the loops which were vectorized.
|
||||
bool UnrollVectorizedLoop = false;
|
||||
/// Don't allow runtime unrolling if expanding the trip count takes more
|
||||
/// than SCEVExpansionBudget.
|
||||
unsigned SCEVExpansionBudget;
|
||||
};
|
||||
|
||||
/// Get target-customized preferences for the generic loop unrolling
|
||||
|
||||
@@ -75,6 +75,7 @@ struct UnrollLoopOptions {
|
||||
bool UnrollRemainder;
|
||||
bool ForgetAllSCEV;
|
||||
const Instruction *Heart = nullptr;
|
||||
unsigned SCEVExpansionBudget;
|
||||
};
|
||||
|
||||
LoopUnrollResult UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI,
|
||||
@@ -90,7 +91,7 @@ bool UnrollRuntimeLoopRemainder(
|
||||
bool UseEpilogRemainder, bool UnrollRemainder, bool ForgetAllSCEV,
|
||||
LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC,
|
||||
const TargetTransformInfo *TTI, bool PreserveLCSSA,
|
||||
Loop **ResultLoop = nullptr);
|
||||
unsigned SCEVExpansionBudget, Loop **ResultLoop = nullptr);
|
||||
|
||||
LoopUnrollResult UnrollAndJamLoop(Loop *L, unsigned Count, unsigned TripCount,
|
||||
unsigned TripMultiple, bool UnrollRemainder,
|
||||
|
||||
@@ -57,6 +57,7 @@
|
||||
#include "llvm/Transforms/Utils/LoopPeel.h"
|
||||
#include "llvm/Transforms/Utils/LoopSimplify.h"
|
||||
#include "llvm/Transforms/Utils/LoopUtils.h"
|
||||
#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
|
||||
#include "llvm/Transforms/Utils/SizeOpts.h"
|
||||
#include "llvm/Transforms/Utils/UnrollLoop.h"
|
||||
#include <algorithm>
|
||||
@@ -218,6 +219,7 @@ TargetTransformInfo::UnrollingPreferences llvm::gatherUnrollingPreferences(
|
||||
UP.UnrollAndJam = false;
|
||||
UP.UnrollAndJamInnerLoopThreshold = 60;
|
||||
UP.MaxIterationsCountToAnalyze = UnrollMaxIterationsCountToAnalyze;
|
||||
UP.SCEVExpansionBudget = SCEVCheapExpansionBudget;
|
||||
|
||||
// Override with any target specific settings
|
||||
TTI.getUnrollingPreferences(L, SE, UP, &ORE);
|
||||
@@ -1349,6 +1351,7 @@ tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI, ScalarEvolution &SE,
|
||||
ULO.Runtime = UP.Runtime;
|
||||
ULO.ForgetAllSCEV = ForgetAllSCEV;
|
||||
ULO.Heart = getLoopConvergenceHeart(L);
|
||||
ULO.SCEVExpansionBudget = UP.SCEVExpansionBudget;
|
||||
LoopUnrollResult UnrollResult = UnrollLoop(
|
||||
L, ULO, LI, &SE, &DT, &AC, &TTI, &ORE, PreserveLCSSA, &RemainderLoop, AA);
|
||||
if (UnrollResult == LoopUnrollResult::Unmodified)
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
#include "llvm/Transforms/Utils/Local.h"
|
||||
#include "llvm/Transforms/Utils/LoopSimplify.h"
|
||||
#include "llvm/Transforms/Utils/LoopUtils.h"
|
||||
#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
|
||||
#include "llvm/Transforms/Utils/SimplifyIndVar.h"
|
||||
#include "llvm/Transforms/Utils/UnrollLoop.h"
|
||||
#include "llvm/Transforms/Utils/ValueMapper.h"
|
||||
@@ -589,10 +590,10 @@ llvm::UnrollLoop(Loop *L, UnrollLoopOptions ULO, LoopInfo *LI,
|
||||
: isEpilogProfitable(L);
|
||||
|
||||
if (ULO.Runtime &&
|
||||
!UnrollRuntimeLoopRemainder(L, ULO.Count, ULO.AllowExpensiveTripCount,
|
||||
EpilogProfitability, ULO.UnrollRemainder,
|
||||
ULO.ForgetAllSCEV, LI, SE, DT, AC, TTI,
|
||||
PreserveLCSSA, RemainderLoop)) {
|
||||
!UnrollRuntimeLoopRemainder(
|
||||
L, ULO.Count, ULO.AllowExpensiveTripCount, EpilogProfitability,
|
||||
ULO.UnrollRemainder, ULO.ForgetAllSCEV, LI, SE, DT, AC, TTI,
|
||||
PreserveLCSSA, ULO.SCEVExpansionBudget, RemainderLoop)) {
|
||||
if (ULO.Force)
|
||||
ULO.Runtime = false;
|
||||
else {
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
|
||||
#include "llvm/Transforms/Utils/Cloning.h"
|
||||
#include "llvm/Transforms/Utils/LoopUtils.h"
|
||||
#include "llvm/Transforms/Utils/ScalarEvolutionExpander.h"
|
||||
#include "llvm/Transforms/Utils/UnrollLoop.h"
|
||||
#include "llvm/Transforms/Utils/ValueMapper.h"
|
||||
#include <assert.h>
|
||||
@@ -241,7 +242,8 @@ llvm::UnrollAndJamLoop(Loop *L, unsigned Count, unsigned TripCount,
|
||||
if (!UnrollRuntimeLoopRemainder(L, Count, /*AllowExpensiveTripCount*/ false,
|
||||
/*UseEpilogRemainder*/ true,
|
||||
UnrollRemainder, /*ForgetAllSCEV*/ false,
|
||||
LI, SE, DT, AC, TTI, true, EpilogueLoop)) {
|
||||
LI, SE, DT, AC, TTI, true,
|
||||
SCEVCheapExpansionBudget, EpilogueLoop)) {
|
||||
LLVM_DEBUG(dbgs() << "Won't unroll-and-jam; remainder loop could not be "
|
||||
"generated when assuming runtime trip count\n");
|
||||
return LoopUnrollResult::Unmodified;
|
||||
|
||||
@@ -582,7 +582,8 @@ bool llvm::UnrollRuntimeLoopRemainder(
|
||||
Loop *L, unsigned Count, bool AllowExpensiveTripCount,
|
||||
bool UseEpilogRemainder, bool UnrollRemainder, bool ForgetAllSCEV,
|
||||
LoopInfo *LI, ScalarEvolution *SE, DominatorTree *DT, AssumptionCache *AC,
|
||||
const TargetTransformInfo *TTI, bool PreserveLCSSA, Loop **ResultLoop) {
|
||||
const TargetTransformInfo *TTI, bool PreserveLCSSA,
|
||||
unsigned SCEVExpansionBudget, Loop **ResultLoop) {
|
||||
LLVM_DEBUG(dbgs() << "Trying runtime unrolling on Loop: \n");
|
||||
LLVM_DEBUG(L->dump());
|
||||
LLVM_DEBUG(UseEpilogRemainder ? dbgs() << "Using epilog remainder.\n"
|
||||
@@ -672,8 +673,8 @@ bool llvm::UnrollRuntimeLoopRemainder(
|
||||
const DataLayout &DL = Header->getDataLayout();
|
||||
SCEVExpander Expander(*SE, DL, "loop-unroll");
|
||||
if (!AllowExpensiveTripCount &&
|
||||
Expander.isHighCostExpansion(TripCountSC, L, SCEVCheapExpansionBudget,
|
||||
TTI, PreHeaderBR)) {
|
||||
Expander.isHighCostExpansion(TripCountSC, L, SCEVExpansionBudget, TTI,
|
||||
PreHeaderBR)) {
|
||||
LLVM_DEBUG(dbgs() << "High cost for expanding trip count scev!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -73,6 +73,6 @@ while.end: ; preds = %while.cond
|
||||
|
||||
bool ret =
|
||||
UnrollRuntimeLoopRemainder(L, 4, true, false, false, false, &LI, &SE, &DT,
|
||||
&AC, /*TTI=*/nullptr, PreserveLCSSA);
|
||||
&AC, /*TTI=*/nullptr, PreserveLCSSA, 4);
|
||||
EXPECT_FALSE(ret);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user