forked from OSchip/llvm-project
[TTI] NFC: Change getCmpSelInstrCost to return InstructionCost
This patch migrates the TTI cost interfaces to return an InstructionCost. See this patch for the introduction of the type: https://reviews.llvm.org/D91174 See this thread for context: http://lists.llvm.org/pipermail/llvm-dev/2020-November/146408.html Reviewed By: dmgreen Differential Revision: https://reviews.llvm.org/D100203
This commit is contained in:
parent
2285dfb73f
commit
db134e2428
|
@ -1118,8 +1118,8 @@ public:
|
|||
/// 'I' parameter. The \p VecPred parameter can be used to indicate the select
|
||||
/// is using a compare with the specified predicate as condition. When vector
|
||||
/// types are passed, \p VecPred must be used for all lanes.
|
||||
int getCmpSelInstrCost(
|
||||
unsigned Opcode, Type *ValTy, Type *CondTy = nullptr,
|
||||
InstructionCost
|
||||
getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy = nullptr,
|
||||
CmpInst::Predicate VecPred = CmpInst::BAD_ICMP_PREDICATE,
|
||||
TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput,
|
||||
const Instruction *I = nullptr) const;
|
||||
|
@ -1583,7 +1583,8 @@ public:
|
|||
unsigned Index) = 0;
|
||||
virtual int getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr) = 0;
|
||||
virtual int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
virtual InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I) = 0;
|
||||
|
@ -2059,7 +2060,7 @@ public:
|
|||
const Instruction *I = nullptr) override {
|
||||
return Impl.getCFInstrCost(Opcode, CostKind, I);
|
||||
}
|
||||
int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I) override {
|
||||
|
|
|
@ -525,7 +525,7 @@ public:
|
|||
return 1;
|
||||
}
|
||||
|
||||
unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I) const {
|
||||
|
|
|
@ -928,7 +928,7 @@ public:
|
|||
return BaseT::getCFInstrCost(Opcode, CostKind, I);
|
||||
}
|
||||
|
||||
unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr) {
|
||||
|
@ -963,7 +963,7 @@ public:
|
|||
unsigned Num = cast<FixedVectorType>(ValVTy)->getNumElements();
|
||||
if (CondTy)
|
||||
CondTy = CondTy->getScalarType();
|
||||
unsigned Cost = thisT()->getCmpSelInstrCost(
|
||||
InstructionCost Cost = thisT()->getCmpSelInstrCost(
|
||||
Opcode, ValVTy->getScalarType(), CondTy, VecPred, CostKind, I);
|
||||
|
||||
// Return the cost of multiple scalar invocation plus the cost of
|
||||
|
@ -1346,7 +1346,7 @@ public:
|
|||
: TTI::OP_None;
|
||||
// fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
|
||||
// fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
|
||||
unsigned Cost = 0;
|
||||
InstructionCost Cost = 0;
|
||||
Cost +=
|
||||
thisT()->getArithmeticInstrCost(BinaryOperator::Or, RetTy, CostKind);
|
||||
Cost +=
|
||||
|
@ -1612,7 +1612,7 @@ public:
|
|||
// abs(X) = select(icmp(X,0),X,sub(0,X))
|
||||
// minmax(X,Y) = select(icmp(X,Y),X,Y)
|
||||
Type *CondTy = RetTy->getWithNewBitWidth(1);
|
||||
unsigned Cost = 0;
|
||||
InstructionCost Cost = 0;
|
||||
// TODO: Ideally getCmpSelInstrCost would accept an icmp condition code.
|
||||
Cost +=
|
||||
thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, RetTy, CondTy,
|
||||
|
@ -1707,7 +1707,7 @@ public:
|
|||
// Overflow -> (LHSSign == RHSSign) && (LHSSign != SumSign)
|
||||
// Sub:
|
||||
// Overflow -> (LHSSign != RHSSign) && (LHSSign != SumSign)
|
||||
unsigned Cost = 0;
|
||||
InstructionCost Cost = 0;
|
||||
Cost += thisT()->getArithmeticInstrCost(Opcode, SumTy, CostKind);
|
||||
Cost += 3 * thisT()->getCmpSelInstrCost(
|
||||
Instruction::ICmp, SumTy, OverflowTy,
|
||||
|
@ -1727,7 +1727,7 @@ public:
|
|||
? BinaryOperator::Add
|
||||
: BinaryOperator::Sub;
|
||||
|
||||
unsigned Cost = 0;
|
||||
InstructionCost Cost = 0;
|
||||
Cost += thisT()->getArithmeticInstrCost(Opcode, SumTy, CostKind);
|
||||
Cost +=
|
||||
thisT()->getCmpSelInstrCost(BinaryOperator::ICmp, SumTy, OverflowTy,
|
||||
|
@ -2015,7 +2015,7 @@ public:
|
|||
"expecting floating point or integer type for min/max reduction");
|
||||
CmpOpcode = Instruction::ICmp;
|
||||
}
|
||||
unsigned MinMaxCost = 0;
|
||||
InstructionCost MinMaxCost = 0;
|
||||
unsigned ShuffleCost = 0;
|
||||
std::pair<unsigned, MVT> LT =
|
||||
thisT()->getTLI()->getTypeLegalizationCost(DL, Ty);
|
||||
|
|
|
@ -797,14 +797,12 @@ int TargetTransformInfo::getCFInstrCost(unsigned Opcode,
|
|||
return Cost;
|
||||
}
|
||||
|
||||
int TargetTransformInfo::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I) const {
|
||||
InstructionCost TargetTransformInfo::getCmpSelInstrCost(
|
||||
unsigned Opcode, Type *ValTy, Type *CondTy, CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind, const Instruction *I) const {
|
||||
assert((I == nullptr || I->getOpcode() == Opcode) &&
|
||||
"Opcode should reflect passed instruction.");
|
||||
int Cost =
|
||||
InstructionCost Cost =
|
||||
TTIImpl->getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind, I);
|
||||
assert(Cost >= 0 && "TTI should not produce negative costs!");
|
||||
return Cost;
|
||||
|
|
|
@ -840,8 +840,9 @@ int AArch64TTIImpl::getAddressComputationCost(Type *Ty, ScalarEvolution *SE,
|
|||
return 1;
|
||||
}
|
||||
|
||||
int AArch64TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy, CmpInst::Predicate VecPred,
|
||||
InstructionCost AArch64TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I) {
|
||||
// TODO: Handle other cost kinds.
|
||||
|
@ -1256,7 +1257,7 @@ AArch64TTIImpl::getMinMaxReductionCost(VectorType *Ty, VectorType *CondTy,
|
|||
"Both vector needs to be scalable");
|
||||
|
||||
std::pair<int, MVT> LT = TLI->getTypeLegalizationCost(DL, Ty);
|
||||
int LegalizationCost = 0;
|
||||
InstructionCost LegalizationCost = 0;
|
||||
if (LT.first > 1) {
|
||||
Type *LegalVTy = EVT(LT.second).getTypeForEVT(Ty->getContext());
|
||||
unsigned CmpOpcode =
|
||||
|
|
|
@ -167,7 +167,7 @@ public:
|
|||
|
||||
int getAddressComputationCost(Type *Ty, ScalarEvolution *SE, const SCEV *Ptr);
|
||||
|
||||
int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr);
|
||||
|
|
|
@ -830,7 +830,8 @@ int ARMTTIImpl::getVectorInstrCost(unsigned Opcode, Type *ValTy,
|
|||
return BaseT::getVectorInstrCost(Opcode, ValTy, Index);
|
||||
}
|
||||
|
||||
int ARMTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost ARMTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I) {
|
||||
|
@ -902,7 +903,7 @@ int ARMTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
|||
if (Sel != I)
|
||||
return 0;
|
||||
IntrinsicCostAttributes CostAttrs(IID, ValTy, {ValTy, ValTy});
|
||||
return *getIntrinsicInstrCost(CostAttrs, CostKind).getValue();
|
||||
return getIntrinsicInstrCost(CostAttrs, CostKind);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -206,7 +206,7 @@ public:
|
|||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr);
|
||||
|
||||
int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr);
|
||||
|
|
|
@ -44,12 +44,12 @@ public:
|
|||
return TTI::TCC_Basic;
|
||||
}
|
||||
|
||||
int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const llvm::Instruction *I = nullptr) {
|
||||
if (Opcode == Instruction::Select)
|
||||
return SCEVCheapExpansionBudget;
|
||||
return SCEVCheapExpansionBudget.getValue();
|
||||
|
||||
return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind,
|
||||
I);
|
||||
|
|
|
@ -244,7 +244,7 @@ unsigned HexagonTTIImpl::getInterleavedMemoryOpCost(
|
|||
CostKind);
|
||||
}
|
||||
|
||||
unsigned HexagonTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
InstructionCost HexagonTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
|
|
|
@ -134,8 +134,7 @@ public:
|
|||
Align Alignment, unsigned AddressSpace,
|
||||
TTI::TargetCostKind CostKind = TTI::TCK_SizeAndLatency,
|
||||
bool UseMaskForCond = false, bool UseMaskForGaps = false);
|
||||
unsigned getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
|
||||
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr);
|
||||
|
|
|
@ -1026,16 +1026,17 @@ InstructionCost PPCTTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
|
|||
return Cost;
|
||||
}
|
||||
|
||||
int PPCTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost PPCTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I) {
|
||||
int Cost =
|
||||
InstructionCost Cost =
|
||||
BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind, I);
|
||||
// TODO: Handle other cost kinds.
|
||||
if (CostKind != TTI::TCK_RecipThroughput)
|
||||
return Cost;
|
||||
return *vectorCostAdjustment(Cost, Opcode, ValTy, nullptr).getValue();
|
||||
return vectorCostAdjustment(Cost, Opcode, ValTy, nullptr);
|
||||
}
|
||||
|
||||
int PPCTTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) {
|
||||
|
|
|
@ -116,7 +116,7 @@ public:
|
|||
const Instruction *I = nullptr);
|
||||
int getCFInstrCost(unsigned Opcode, TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr);
|
||||
int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr);
|
||||
|
|
|
@ -865,8 +865,9 @@ static unsigned getOperandsExtensionCost(const Instruction *I) {
|
|||
return ExtCost;
|
||||
}
|
||||
|
||||
int SystemZTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy, CmpInst::Predicate VecPred,
|
||||
InstructionCost SystemZTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I) {
|
||||
if (CostKind != TTI::TCK_RecipThroughput)
|
||||
|
|
|
@ -97,7 +97,7 @@ public:
|
|||
TTI::CastContextHint CCH,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr);
|
||||
int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr);
|
||||
|
|
|
@ -2089,7 +2089,8 @@ InstructionCost X86TTIImpl::getCastInstrCost(unsigned Opcode, Type *Dst,
|
|||
BaseT::getCastInstrCost(Opcode, Dst, Src, CCH, CostKind, I));
|
||||
}
|
||||
|
||||
int X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost X86TTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
||||
Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I) {
|
||||
|
@ -3275,19 +3276,20 @@ int X86TTIImpl::getMaskedMemoryOpCost(unsigned Opcode, Type *SrcTy,
|
|||
!isPowerOf2_32(NumElem)) {
|
||||
// Scalarization
|
||||
APInt DemandedElts = APInt::getAllOnesValue(NumElem);
|
||||
int MaskSplitCost =
|
||||
InstructionCost MaskSplitCost =
|
||||
getScalarizationOverhead(MaskTy, DemandedElts, false, true);
|
||||
int ScalarCompareCost = getCmpSelInstrCost(
|
||||
InstructionCost ScalarCompareCost = getCmpSelInstrCost(
|
||||
Instruction::ICmp, Type::getInt8Ty(SrcVTy->getContext()), nullptr,
|
||||
CmpInst::BAD_ICMP_PREDICATE, CostKind);
|
||||
int BranchCost = getCFInstrCost(Instruction::Br, CostKind);
|
||||
int MaskCmpCost = NumElem * (BranchCost + ScalarCompareCost);
|
||||
int ValueSplitCost =
|
||||
InstructionCost BranchCost = getCFInstrCost(Instruction::Br, CostKind);
|
||||
InstructionCost MaskCmpCost = NumElem * (BranchCost + ScalarCompareCost);
|
||||
InstructionCost ValueSplitCost =
|
||||
getScalarizationOverhead(SrcVTy, DemandedElts, IsLoad, IsStore);
|
||||
int MemopCost =
|
||||
NumElem * BaseT::getMemoryOpCost(Opcode, SrcVTy->getScalarType(),
|
||||
Alignment, AddressSpace, CostKind);
|
||||
return MemopCost + ValueSplitCost + MaskSplitCost + MaskCmpCost;
|
||||
return *(MemopCost + ValueSplitCost + MaskSplitCost + MaskCmpCost)
|
||||
.getValue();
|
||||
}
|
||||
|
||||
// Legalize the type.
|
||||
|
@ -3713,10 +3715,12 @@ InstructionCost X86TTIImpl::getMinMaxCost(Type *Ty, Type *CondTy,
|
|||
|
||||
TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
|
||||
// Otherwise fall back to cmp+select.
|
||||
return getCmpSelInstrCost(CmpOpcode, Ty, CondTy, CmpInst::BAD_ICMP_PREDICATE,
|
||||
InstructionCost Result =
|
||||
getCmpSelInstrCost(CmpOpcode, Ty, CondTy, CmpInst::BAD_ICMP_PREDICATE,
|
||||
CostKind) +
|
||||
getCmpSelInstrCost(Instruction::Select, Ty, CondTy,
|
||||
CmpInst::BAD_ICMP_PREDICATE, CostKind);
|
||||
return Result;
|
||||
}
|
||||
|
||||
InstructionCost
|
||||
|
@ -4185,20 +4189,20 @@ int X86TTIImpl::getGSVectorCost(unsigned Opcode, Type *SrcVTy, const Value *Ptr,
|
|||
/// AddressSpace - pointer[s] address space.
|
||||
///
|
||||
/// FIXME: Add TargetCostKind support.
|
||||
int X86TTIImpl::getGSScalarCost(unsigned Opcode, Type *SrcVTy,
|
||||
InstructionCost X86TTIImpl::getGSScalarCost(unsigned Opcode, Type *SrcVTy,
|
||||
bool VariableMask, Align Alignment,
|
||||
unsigned AddressSpace) {
|
||||
unsigned VF = cast<FixedVectorType>(SrcVTy)->getNumElements();
|
||||
APInt DemandedElts = APInt::getAllOnesValue(VF);
|
||||
TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput;
|
||||
|
||||
int MaskUnpackCost = 0;
|
||||
InstructionCost MaskUnpackCost = 0;
|
||||
if (VariableMask) {
|
||||
auto *MaskTy =
|
||||
FixedVectorType::get(Type::getInt1Ty(SrcVTy->getContext()), VF);
|
||||
MaskUnpackCost =
|
||||
getScalarizationOverhead(MaskTy, DemandedElts, false, true);
|
||||
int ScalarCompareCost = getCmpSelInstrCost(
|
||||
InstructionCost ScalarCompareCost = getCmpSelInstrCost(
|
||||
Instruction::ICmp, Type::getInt1Ty(SrcVTy->getContext()), nullptr,
|
||||
CmpInst::BAD_ICMP_PREDICATE, CostKind);
|
||||
int BranchCost = getCFInstrCost(Instruction::Br, CostKind);
|
||||
|
|
|
@ -133,7 +133,7 @@ public:
|
|||
TTI::CastContextHint CCH,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr);
|
||||
int getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
InstructionCost getCmpSelInstrCost(unsigned Opcode, Type *ValTy, Type *CondTy,
|
||||
CmpInst::Predicate VecPred,
|
||||
TTI::TargetCostKind CostKind,
|
||||
const Instruction *I = nullptr);
|
||||
|
@ -236,8 +236,9 @@ public:
|
|||
bool enableInterleavedAccessVectorization();
|
||||
|
||||
private:
|
||||
int getGSScalarCost(unsigned Opcode, Type *DataTy, bool VariableMask,
|
||||
Align Alignment, unsigned AddressSpace);
|
||||
InstructionCost getGSScalarCost(unsigned Opcode, Type *DataTy,
|
||||
bool VariableMask, Align Alignment,
|
||||
unsigned AddressSpace);
|
||||
int getGSVectorCost(unsigned Opcode, Type *DataTy, const Value *Ptr,
|
||||
Align Alignment, unsigned AddressSpace);
|
||||
|
||||
|
|
Loading…
Reference in New Issue