mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[LoopUnroll] Pass SCEV to getUnrollingPreferences hook. NFCI.
Reviewers: sanjoy, anna, reames, apilipenko, igor-laevsky, mkuper Subscribers: jholewinski, arsenm, mzolotukhin, nemanjai, nhaehnle, javed.absar, mcrosier, llvm-commits Differential Revision: https://reviews.llvm.org/D34531 llvm-svn: 306554
This commit is contained in:
parent
f7b4320d1e
commit
9c1c467f23
@ -366,7 +366,8 @@ public:
|
||||
/// \brief Get target-customized preferences for the generic loop unrolling
|
||||
/// transformation. The caller will initialize UP with the current
|
||||
/// target-independent defaults.
|
||||
void getUnrollingPreferences(Loop *L, UnrollingPreferences &UP) const;
|
||||
void getUnrollingPreferences(Loop *L, ScalarEvolution &,
|
||||
UnrollingPreferences &UP) const;
|
||||
|
||||
/// @}
|
||||
|
||||
@ -829,7 +830,8 @@ public:
|
||||
virtual bool isAlwaysUniform(const Value *V) = 0;
|
||||
virtual unsigned getFlatAddressSpace() = 0;
|
||||
virtual bool isLoweredToCall(const Function *F) = 0;
|
||||
virtual void getUnrollingPreferences(Loop *L, UnrollingPreferences &UP) = 0;
|
||||
virtual void getUnrollingPreferences(Loop *L, ScalarEvolution &,
|
||||
UnrollingPreferences &UP) = 0;
|
||||
virtual bool isLegalAddImmediate(int64_t Imm) = 0;
|
||||
virtual bool isLegalICmpImmediate(int64_t Imm) = 0;
|
||||
virtual bool isLegalAddressingMode(Type *Ty, GlobalValue *BaseGV,
|
||||
@ -1015,8 +1017,9 @@ public:
|
||||
bool isLoweredToCall(const Function *F) override {
|
||||
return Impl.isLoweredToCall(F);
|
||||
}
|
||||
void getUnrollingPreferences(Loop *L, UnrollingPreferences &UP) override {
|
||||
return Impl.getUnrollingPreferences(L, UP);
|
||||
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
UnrollingPreferences &UP) override {
|
||||
return Impl.getUnrollingPreferences(L, SE, UP);
|
||||
}
|
||||
bool isLegalAddImmediate(int64_t Imm) override {
|
||||
return Impl.isLegalAddImmediate(Imm);
|
||||
|
@ -217,7 +217,8 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
void getUnrollingPreferences(Loop *, TTI::UnrollingPreferences &) {}
|
||||
void getUnrollingPreferences(Loop *, ScalarEvolution &,
|
||||
TTI::UnrollingPreferences &) {}
|
||||
|
||||
bool isLegalAddImmediate(int64_t Imm) { return false; }
|
||||
|
||||
|
@ -277,7 +277,8 @@ public:
|
||||
|
||||
unsigned getInliningThresholdMultiplier() { return 1; }
|
||||
|
||||
void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP) {
|
||||
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP) {
|
||||
// This unrolling functionality is target independent, but to provide some
|
||||
// motivation for its intended use, for x86:
|
||||
|
||||
|
@ -116,8 +116,8 @@ bool TargetTransformInfo::isLoweredToCall(const Function *F) const {
|
||||
}
|
||||
|
||||
void TargetTransformInfo::getUnrollingPreferences(
|
||||
Loop *L, UnrollingPreferences &UP) const {
|
||||
return TTIImpl->getUnrollingPreferences(L, UP);
|
||||
Loop *L, ScalarEvolution &SE, UnrollingPreferences &UP) const {
|
||||
return TTIImpl->getUnrollingPreferences(L, SE, UP);
|
||||
}
|
||||
|
||||
bool TargetTransformInfo::isLegalAddImmediate(int64_t Imm) const {
|
||||
|
@ -645,10 +645,10 @@ unsigned AArch64TTIImpl::getMaxInterleaveFactor(unsigned VF) {
|
||||
return ST->getMaxInterleaveFactor();
|
||||
}
|
||||
|
||||
void AArch64TTIImpl::getUnrollingPreferences(Loop *L,
|
||||
void AArch64TTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP) {
|
||||
// Enable partial unrolling and runtime unrolling.
|
||||
BaseT::getUnrollingPreferences(L, UP);
|
||||
BaseT::getUnrollingPreferences(L, SE, UP);
|
||||
|
||||
// For inner loop, it is more likely to be a hot one, and the runtime check
|
||||
// can be promoted out from LICM pass, so the overhead is less, let's try
|
||||
|
@ -122,7 +122,8 @@ public:
|
||||
|
||||
int getCostOfKeepingLiveOverCall(ArrayRef<Type *> Tys);
|
||||
|
||||
void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP);
|
||||
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP);
|
||||
|
||||
Value *getOrCreateResultFromMemIntrinsic(IntrinsicInst *Inst,
|
||||
Type *ExpectedType);
|
||||
|
@ -63,7 +63,7 @@ static bool dependsOnLocalPhi(const Loop *L, const Value *Cond,
|
||||
return false;
|
||||
}
|
||||
|
||||
void AMDGPUTTIImpl::getUnrollingPreferences(Loop *L,
|
||||
void AMDGPUTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP) {
|
||||
UP.Threshold = 300; // Twice the default.
|
||||
UP.MaxCount = UINT_MAX;
|
||||
|
@ -68,7 +68,8 @@ public:
|
||||
|
||||
bool hasBranchDivergence() { return true; }
|
||||
|
||||
void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP);
|
||||
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP);
|
||||
|
||||
TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth) {
|
||||
assert(isPowerOf2_32(TyWidth) && "Ty width must be power of 2");
|
||||
|
@ -29,7 +29,7 @@ HexagonTTIImpl::getPopcntSupport(unsigned IntTyWidthInBit) const {
|
||||
}
|
||||
|
||||
// The Hexagon target can unroll loops with run-time trip counts.
|
||||
void HexagonTTIImpl::getUnrollingPreferences(Loop *L,
|
||||
void HexagonTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP) {
|
||||
UP.Runtime = UP.Partial = true;
|
||||
}
|
||||
|
@ -46,7 +46,8 @@ public:
|
||||
TTI::PopcntSupportKind getPopcntSupport(unsigned IntTyWidthInBit) const;
|
||||
|
||||
// The Hexagon target can unroll loops with run-time trip counts.
|
||||
void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP);
|
||||
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP);
|
||||
|
||||
// L1 cache prefetch.
|
||||
unsigned getPrefetchDistance() const;
|
||||
|
@ -141,9 +141,9 @@ int NVPTXTTIImpl::getArithmeticInstrCost(
|
||||
}
|
||||
}
|
||||
|
||||
void NVPTXTTIImpl::getUnrollingPreferences(Loop *L,
|
||||
void NVPTXTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP) {
|
||||
BaseT::getUnrollingPreferences(L, UP);
|
||||
BaseT::getUnrollingPreferences(L, SE, UP);
|
||||
|
||||
// Enable partial unrolling and runtime unrolling, but reduce the
|
||||
// threshold. This partially unrolls small loops which are often
|
||||
|
@ -61,7 +61,8 @@ public:
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>());
|
||||
|
||||
void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP);
|
||||
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP);
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -189,7 +189,7 @@ int PPCTTIImpl::getIntImmCost(unsigned Opcode, unsigned Idx, const APInt &Imm,
|
||||
return PPCTTIImpl::getIntImmCost(Imm, Ty);
|
||||
}
|
||||
|
||||
void PPCTTIImpl::getUnrollingPreferences(Loop *L,
|
||||
void PPCTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP) {
|
||||
if (ST->getDarwinDirective() == PPC::DIR_A2) {
|
||||
// The A2 is in-order with a deep pipeline, and concatenation unrolling
|
||||
@ -201,7 +201,7 @@ void PPCTTIImpl::getUnrollingPreferences(Loop *L,
|
||||
UP.AllowExpensiveTripCount = true;
|
||||
}
|
||||
|
||||
BaseT::getUnrollingPreferences(L, UP);
|
||||
BaseT::getUnrollingPreferences(L, SE, UP);
|
||||
}
|
||||
|
||||
bool PPCTTIImpl::enableAggressiveInterleaving(bool LoopHasReductions) {
|
||||
|
@ -52,7 +52,8 @@ public:
|
||||
Type *Ty);
|
||||
|
||||
TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth);
|
||||
void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP);
|
||||
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP);
|
||||
|
||||
/// @}
|
||||
|
||||
|
@ -238,7 +238,7 @@ SystemZTTIImpl::getPopcntSupport(unsigned TyWidth) {
|
||||
return TTI::PSK_Software;
|
||||
}
|
||||
|
||||
void SystemZTTIImpl::getUnrollingPreferences(Loop *L,
|
||||
void SystemZTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP) {
|
||||
// Find out if L contains a call, what the machine instruction count
|
||||
// estimate is, and how many stores there are.
|
||||
|
@ -45,7 +45,8 @@ public:
|
||||
|
||||
TTI::PopcntSupportKind getPopcntSupport(unsigned TyWidth);
|
||||
|
||||
void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP);
|
||||
void getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
||||
TTI::UnrollingPreferences &UP);
|
||||
|
||||
/// @}
|
||||
|
||||
|
@ -131,7 +131,7 @@ static const unsigned NoThreshold = UINT_MAX;
|
||||
/// Gather the various unrolling parameters based on the defaults, compiler
|
||||
/// flags, TTI overrides and user specified parameters.
|
||||
static TargetTransformInfo::UnrollingPreferences gatherUnrollingPreferences(
|
||||
Loop *L, const TargetTransformInfo &TTI, int OptLevel,
|
||||
Loop *L, ScalarEvolution &SE, const TargetTransformInfo &TTI, int OptLevel,
|
||||
Optional<unsigned> UserThreshold, Optional<unsigned> UserCount,
|
||||
Optional<bool> UserAllowPartial, Optional<bool> UserRuntime,
|
||||
Optional<bool> UserUpperBound) {
|
||||
@ -158,7 +158,7 @@ static TargetTransformInfo::UnrollingPreferences gatherUnrollingPreferences(
|
||||
UP.AllowPeeling = true;
|
||||
|
||||
// Override with any target specific settings
|
||||
TTI.getUnrollingPreferences(L, UP);
|
||||
TTI.getUnrollingPreferences(L, SE, UP);
|
||||
|
||||
// Apply size attributes
|
||||
if (L->getHeader()->getParent()->optForSize()) {
|
||||
@ -699,7 +699,7 @@ static uint64_t getUnrolledLoopSize(
|
||||
// Calculates unroll count and writes it to UP.Count.
|
||||
static bool computeUnrollCount(
|
||||
Loop *L, const TargetTransformInfo &TTI, DominatorTree &DT, LoopInfo *LI,
|
||||
ScalarEvolution *SE, OptimizationRemarkEmitter *ORE, unsigned &TripCount,
|
||||
ScalarEvolution &SE, OptimizationRemarkEmitter *ORE, unsigned &TripCount,
|
||||
unsigned MaxTripCount, unsigned &TripMultiple, unsigned LoopSize,
|
||||
TargetTransformInfo::UnrollingPreferences &UP, bool &UseUpperBound) {
|
||||
// Check for explicit Count.
|
||||
@ -770,7 +770,7 @@ static bool computeUnrollCount(
|
||||
// helps to remove a significant number of instructions.
|
||||
// To check that, run additional analysis on the loop.
|
||||
if (Optional<EstimatedUnrollCost> Cost = analyzeLoopUnrollCost(
|
||||
L, FullUnrollTripCount, DT, *SE, TTI,
|
||||
L, FullUnrollTripCount, DT, SE, TTI,
|
||||
UP.Threshold * UP.MaxPercentThresholdBoost / 100)) {
|
||||
unsigned Boost =
|
||||
getFullUnrollBoostingFactor(*Cost, UP.MaxPercentThresholdBoost);
|
||||
@ -926,7 +926,7 @@ static bool computeUnrollCount(
|
||||
}
|
||||
|
||||
static bool tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI,
|
||||
ScalarEvolution *SE, const TargetTransformInfo &TTI,
|
||||
ScalarEvolution &SE, const TargetTransformInfo &TTI,
|
||||
AssumptionCache &AC, OptimizationRemarkEmitter &ORE,
|
||||
bool PreserveLCSSA, int OptLevel,
|
||||
Optional<unsigned> ProvidedCount,
|
||||
@ -948,8 +948,8 @@ static bool tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI,
|
||||
bool NotDuplicatable;
|
||||
bool Convergent;
|
||||
TargetTransformInfo::UnrollingPreferences UP = gatherUnrollingPreferences(
|
||||
L, TTI, OptLevel, ProvidedThreshold, ProvidedCount, ProvidedAllowPartial,
|
||||
ProvidedRuntime, ProvidedUpperBound);
|
||||
L, SE, TTI, OptLevel, ProvidedThreshold, ProvidedCount,
|
||||
ProvidedAllowPartial, ProvidedRuntime, ProvidedUpperBound);
|
||||
// Exit early if unrolling is disabled.
|
||||
if (UP.Threshold == 0 && (!UP.Partial || UP.PartialThreshold == 0))
|
||||
return false;
|
||||
@ -977,8 +977,8 @@ static bool tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI,
|
||||
if (!ExitingBlock || !L->isLoopExiting(ExitingBlock))
|
||||
ExitingBlock = L->getExitingBlock();
|
||||
if (ExitingBlock) {
|
||||
TripCount = SE->getSmallConstantTripCount(L, ExitingBlock);
|
||||
TripMultiple = SE->getSmallConstantTripMultiple(L, ExitingBlock);
|
||||
TripCount = SE.getSmallConstantTripCount(L, ExitingBlock);
|
||||
TripMultiple = SE.getSmallConstantTripMultiple(L, ExitingBlock);
|
||||
}
|
||||
|
||||
// If the loop contains a convergent operation, the prelude we'd add
|
||||
@ -1000,8 +1000,8 @@ static bool tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI,
|
||||
// count.
|
||||
bool MaxOrZero = false;
|
||||
if (!TripCount) {
|
||||
MaxTripCount = SE->getSmallConstantMaxTripCount(L);
|
||||
MaxOrZero = SE->isBackedgeTakenCountMaxOrZero(L);
|
||||
MaxTripCount = SE.getSmallConstantMaxTripCount(L);
|
||||
MaxOrZero = SE.isBackedgeTakenCountMaxOrZero(L);
|
||||
// We can unroll by the upper bound amount if it's generally allowed or if
|
||||
// we know that the loop is executed either the upper bound or zero times.
|
||||
// (MaxOrZero unrolling keeps only the first loop test, so the number of
|
||||
@ -1030,7 +1030,7 @@ static bool tryToUnrollLoop(Loop *L, DominatorTree &DT, LoopInfo *LI,
|
||||
// Unroll the loop.
|
||||
if (!UnrollLoop(L, UP.Count, TripCount, UP.Force, UP.Runtime,
|
||||
UP.AllowExpensiveTripCount, UseUpperBound, MaxOrZero,
|
||||
TripMultiple, UP.PeelCount, LI, SE, &DT, &AC, &ORE,
|
||||
TripMultiple, UP.PeelCount, LI, &SE, &DT, &AC, &ORE,
|
||||
PreserveLCSSA))
|
||||
return false;
|
||||
|
||||
@ -1073,7 +1073,7 @@ public:
|
||||
|
||||
auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
|
||||
LoopInfo *LI = &getAnalysis<LoopInfoWrapperPass>().getLoopInfo();
|
||||
ScalarEvolution *SE = &getAnalysis<ScalarEvolutionWrapperPass>().getSE();
|
||||
ScalarEvolution &SE = getAnalysis<ScalarEvolutionWrapperPass>().getSE();
|
||||
const TargetTransformInfo &TTI =
|
||||
getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
|
||||
auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
|
||||
@ -1157,7 +1157,7 @@ PreservedAnalyses LoopUnrollPass::run(Loop &L, LoopAnalysisManager &AM,
|
||||
if (!AllowPartialUnrolling)
|
||||
AllowPartialParam = RuntimeParam = UpperBoundParam = false;
|
||||
bool Changed = tryToUnrollLoop(
|
||||
&L, AR.DT, &AR.LI, &AR.SE, AR.TTI, AR.AC, *ORE,
|
||||
&L, AR.DT, &AR.LI, AR.SE, AR.TTI, AR.AC, *ORE,
|
||||
/*PreserveLCSSA*/ true, OptLevel, /*Count*/ None,
|
||||
/*Threshold*/ None, AllowPartialParam, RuntimeParam, UpperBoundParam);
|
||||
if (!Changed)
|
||||
|
Loading…
x
Reference in New Issue
Block a user