forked from OSchip/llvm-project
[TTI] Add getInliningThresholdMultiplier.
Summary: InlineCost's threshold is multiplied by this value. This lets us adjust the inlining threshold up or down on a per-target basis. For example, we might want to increase the threshold on targets where calls are unusually expensive. Reviewers: chandlerc Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D18560 llvm-svn: 266405
This commit is contained in:
parent
7dba2e0d0c
commit
8650a4da93
|
@ -166,6 +166,14 @@ public:
|
|||
/// This overload allows specifying a set of candidate argument values.
|
||||
int getCallCost(const Function *F, ArrayRef<const Value *> Arguments) const;
|
||||
|
||||
/// \returns A value by which our inlining threshold should be multiplied.
|
||||
/// This is primarily used to bump up the inlining threshold wholesale on
|
||||
/// targets where calls are unusually expensive.
|
||||
///
|
||||
/// TODO: This is a rather blunt instrument. Perhaps altering the costs of
|
||||
/// individual classes of instructions would be better.
|
||||
unsigned getInliningThresholdMultiplier() const;
|
||||
|
||||
/// \brief Estimate the cost of an intrinsic when lowered.
|
||||
///
|
||||
/// Mirrors the \c getCallCost method but uses an intrinsic identifier.
|
||||
|
@ -600,6 +608,7 @@ public:
|
|||
virtual int getCallCost(const Function *F, int NumArgs) = 0;
|
||||
virtual int getCallCost(const Function *F,
|
||||
ArrayRef<const Value *> Arguments) = 0;
|
||||
virtual unsigned getInliningThresholdMultiplier() = 0;
|
||||
virtual int getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
|
||||
ArrayRef<Type *> ParamTys) = 0;
|
||||
virtual int getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
|
||||
|
@ -722,6 +731,9 @@ public:
|
|||
ArrayRef<const Value *> Arguments) override {
|
||||
return Impl.getCallCost(F, Arguments);
|
||||
}
|
||||
unsigned getInliningThresholdMultiplier() override {
|
||||
return Impl.getInliningThresholdMultiplier();
|
||||
}
|
||||
int getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
|
||||
ArrayRef<Type *> ParamTys) override {
|
||||
return Impl.getIntrinsicCost(IID, RetTy, ParamTys);
|
||||
|
|
|
@ -128,6 +128,8 @@ public:
|
|||
return TTI::TCC_Basic * (NumArgs + 1);
|
||||
}
|
||||
|
||||
unsigned getInliningThresholdMultiplier() { return 1; }
|
||||
|
||||
unsigned getIntrinsicCost(Intrinsic::ID IID, Type *RetTy,
|
||||
ArrayRef<Type *> ParamTys) {
|
||||
switch (IID) {
|
||||
|
|
|
@ -216,6 +216,8 @@ public:
|
|||
return BaseT::getOperationCost(Opcode, Ty, OpTy);
|
||||
}
|
||||
|
||||
unsigned getInliningThresholdMultiplier() { return 1; }
|
||||
|
||||
void getUnrollingPreferences(Loop *L, TTI::UnrollingPreferences &UP) {
|
||||
// This unrolling functionality is target independent, but to provide some
|
||||
// motivation for its intended use, for x86:
|
||||
|
|
|
@ -655,6 +655,10 @@ void CallAnalyzer::updateThreshold(CallSite CS, Function &Callee) {
|
|||
ColdThreshold.getNumOccurrences() > 0) &&
|
||||
ColdCallee && ColdThreshold < Threshold)
|
||||
Threshold = ColdThreshold;
|
||||
|
||||
// Finally, take the target-specific inlining threshold multiplier into
|
||||
// account.
|
||||
Threshold *= TTI.getInliningThresholdMultiplier();
|
||||
}
|
||||
|
||||
bool CallAnalyzer::visitCmpInst(CmpInst &I) {
|
||||
|
|
|
@ -66,6 +66,10 @@ int TargetTransformInfo::getCallCost(const Function *F,
|
|||
return Cost;
|
||||
}
|
||||
|
||||
unsigned TargetTransformInfo::getInliningThresholdMultiplier() const {
|
||||
return TTIImpl->getInliningThresholdMultiplier();
|
||||
}
|
||||
|
||||
int TargetTransformInfo::getIntrinsicCost(
|
||||
Intrinsic::ID IID, Type *RetTy, ArrayRef<const Value *> Arguments) const {
|
||||
int Cost = TTIImpl->getIntrinsicCost(IID, RetTy, Arguments);
|
||||
|
|
Loading…
Reference in New Issue