mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 12:12:47 +01:00
[TTI] NFC: Change getShuffleCost 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/D100314
This commit is contained in:
parent
2dfc199700
commit
40eaded9c5
@ -1052,9 +1052,9 @@ public:
|
||||
/// extraction shuffle kinds to show the insert/extract point and the type of
|
||||
/// the subvector being inserted/extracted.
|
||||
/// NOTE: For subvector extractions Tp represents the source type.
|
||||
int getShuffleCost(ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask = None, int Index = 0,
|
||||
VectorType *SubTp = nullptr) const;
|
||||
InstructionCost getShuffleCost(ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask = None, int Index = 0,
|
||||
VectorType *SubTp = nullptr) const;
|
||||
|
||||
/// Represents a hint about the context in which a cast is used.
|
||||
///
|
||||
@ -1574,9 +1574,9 @@ public:
|
||||
OperandValueKind Opd2Info, OperandValueProperties Opd1PropInfo,
|
||||
OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI = nullptr) = 0;
|
||||
virtual int getShuffleCost(ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) = 0;
|
||||
virtual InstructionCost getShuffleCost(ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) = 0;
|
||||
virtual InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst,
|
||||
Type *Src, CastContextHint CCH,
|
||||
TTI::TargetCostKind CostKind,
|
||||
@ -2047,8 +2047,9 @@ public:
|
||||
return Impl.getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info, Opd2Info,
|
||||
Opd1PropInfo, Opd2PropInfo, Args, CxtI);
|
||||
}
|
||||
int getShuffleCost(ShuffleKind Kind, VectorType *Tp, ArrayRef<int> Mask,
|
||||
int Index, VectorType *SubTp) override {
|
||||
InstructionCost getShuffleCost(ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) override {
|
||||
return Impl.getShuffleCost(Kind, Tp, Mask, Index, SubTp);
|
||||
}
|
||||
InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
|
||||
|
@ -466,9 +466,9 @@ public:
|
||||
return 1;
|
||||
}
|
||||
|
||||
unsigned getShuffleCost(TTI::ShuffleKind Kind, VectorType *Ty,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) const {
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Ty,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) const {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -738,8 +738,9 @@ public:
|
||||
return OpCost;
|
||||
}
|
||||
|
||||
unsigned getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index, VectorType *SubTp) {
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) {
|
||||
|
||||
switch (Kind) {
|
||||
case TTI::SK_Broadcast:
|
||||
@ -1955,8 +1956,8 @@ public:
|
||||
CmpInst::BAD_ICMP_PREDICATE, CostKind);
|
||||
}
|
||||
unsigned NumReduxLevels = Log2_32(NumVecElts);
|
||||
unsigned ArithCost = 0;
|
||||
unsigned ShuffleCost = 0;
|
||||
InstructionCost ArithCost = 0;
|
||||
InstructionCost ShuffleCost = 0;
|
||||
std::pair<unsigned, MVT> LT =
|
||||
thisT()->getTLI()->getTypeLegalizationCost(DL, Ty);
|
||||
unsigned LongVectorCount = 0;
|
||||
@ -2012,7 +2013,7 @@ public:
|
||||
CmpOpcode = Instruction::ICmp;
|
||||
}
|
||||
InstructionCost MinMaxCost = 0;
|
||||
unsigned ShuffleCost = 0;
|
||||
InstructionCost ShuffleCost = 0;
|
||||
std::pair<unsigned, MVT> LT =
|
||||
thisT()->getTLI()->getTypeLegalizationCost(DL, Ty);
|
||||
unsigned LongVectorCount = 0;
|
||||
|
@ -716,10 +716,12 @@ int TargetTransformInfo::getArithmeticInstrCost(
|
||||
return Cost;
|
||||
}
|
||||
|
||||
int TargetTransformInfo::getShuffleCost(ShuffleKind Kind, VectorType *Ty,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) const {
|
||||
int Cost = TTIImpl->getShuffleCost(Kind, Ty, Mask, Index, SubTp);
|
||||
InstructionCost TargetTransformInfo::getShuffleCost(ShuffleKind Kind,
|
||||
VectorType *Ty,
|
||||
ArrayRef<int> Mask,
|
||||
int Index,
|
||||
VectorType *SubTp) const {
|
||||
InstructionCost Cost = TTIImpl->getShuffleCost(Kind, Ty, Mask, Index, SubTp);
|
||||
assert(Cost >= 0 && "TTI should not produce negative costs!");
|
||||
return Cost;
|
||||
}
|
||||
|
@ -1337,9 +1337,10 @@ AArch64TTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *ValTy,
|
||||
CostKind);
|
||||
}
|
||||
|
||||
int AArch64TTIImpl::getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) {
|
||||
InstructionCost AArch64TTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
|
||||
VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) {
|
||||
if (Kind == TTI::SK_Broadcast || Kind == TTI::SK_Transpose ||
|
||||
Kind == TTI::SK_Select || Kind == TTI::SK_PermuteSingleSrc ||
|
||||
Kind == TTI::SK_Reverse) {
|
||||
|
@ -283,8 +283,9 @@ public:
|
||||
unsigned Opcode, VectorType *Ty, bool IsPairwiseForm,
|
||||
TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput);
|
||||
|
||||
int getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp, ArrayRef<int> Mask,
|
||||
int Index, VectorType *SubTp);
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp);
|
||||
/// @}
|
||||
};
|
||||
|
||||
|
@ -1137,9 +1137,9 @@ Value *GCNTTIImpl::rewriteIntrinsicWithAddressSpace(IntrinsicInst *II,
|
||||
}
|
||||
}
|
||||
|
||||
unsigned GCNTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, VectorType *VT,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) {
|
||||
InstructionCost GCNTTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
|
||||
VectorType *VT, ArrayRef<int> Mask,
|
||||
int Index, VectorType *SubTp) {
|
||||
if (ST->hasVOP3PInsts()) {
|
||||
if (cast<FixedVectorType>(VT)->getNumElements() == 2 &&
|
||||
DL.getTypeSizeInBits(VT->getElementType()) == 16) {
|
||||
|
@ -198,8 +198,9 @@ public:
|
||||
|
||||
unsigned getVectorSplitCost() { return 0; }
|
||||
|
||||
unsigned getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index, VectorType *SubTp);
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp);
|
||||
|
||||
bool areInlineCompatible(const Function *Caller,
|
||||
const Function *Callee) const;
|
||||
|
@ -1134,9 +1134,9 @@ int ARMTTIImpl::getMemcpyCost(const Instruction *I) {
|
||||
return NumOps;
|
||||
}
|
||||
|
||||
int ARMTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) {
|
||||
InstructionCost ARMTTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
|
||||
VectorType *Tp, ArrayRef<int> Mask,
|
||||
int Index, VectorType *SubTp) {
|
||||
if (ST->hasNEON()) {
|
||||
if (Kind == TTI::SK_Broadcast) {
|
||||
static const CostTblEntry NEONDupTbl[] = {
|
||||
|
@ -187,8 +187,9 @@ public:
|
||||
|
||||
int getNumMemOps(const IntrinsicInst *I) const;
|
||||
|
||||
int getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp, ArrayRef<int> Mask,
|
||||
int Index, VectorType *SubTp);
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp);
|
||||
|
||||
bool preferInLoopReduction(unsigned Opcode, Type *Ty,
|
||||
TTI::ReductionFlags Flags) const;
|
||||
|
@ -219,9 +219,9 @@ HexagonTTIImpl::getMaskedMemoryOpCost(unsigned Opcode, Type *Src,
|
||||
CostKind);
|
||||
}
|
||||
|
||||
unsigned HexagonTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
Type *SubTp) {
|
||||
InstructionCost HexagonTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
Type *SubTp) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -123,8 +123,8 @@ public:
|
||||
getMaskedMemoryOpCost(unsigned Opcode, Type *Src, Align Alignment,
|
||||
unsigned AddressSpace,
|
||||
TTI::TargetCostKind CostKind = TTI::TCK_SizeAndLatency);
|
||||
unsigned getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, ArrayRef<int> Mask,
|
||||
int Index, Type *SubTp);
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, Type *Tp,
|
||||
ArrayRef<int> Mask, int Index, Type *SubTp);
|
||||
InstructionCost getGatherScatterOpCost(unsigned Opcode, Type *DataTy,
|
||||
const Value *Ptr, bool VariableMask,
|
||||
Align Alignment,
|
||||
|
@ -987,8 +987,9 @@ int PPCTTIImpl::getArithmeticInstrCost(unsigned Opcode, Type *Ty,
|
||||
return *vectorCostAdjustment(Cost, Opcode, Ty, nullptr).getValue();
|
||||
}
|
||||
|
||||
int PPCTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp,
|
||||
ArrayRef<int> Mask, int Index, Type *SubTp) {
|
||||
InstructionCost PPCTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
Type *SubTp) {
|
||||
// Legalize the type.
|
||||
std::pair<int, MVT> LT = TLI->getTypeLegalizationCost(DL, Tp);
|
||||
|
||||
@ -997,9 +998,8 @@ int PPCTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, Type *Tp,
|
||||
// instruction). We need one such shuffle instruction for each actual
|
||||
// register (this is not true for arbitrary shuffles, but is true for the
|
||||
// structured types of shuffles covered by TTI::ShuffleKind).
|
||||
return *vectorCostAdjustment(LT.first, Instruction::ShuffleVector, Tp,
|
||||
nullptr)
|
||||
.getValue();
|
||||
return vectorCostAdjustment(LT.first, Instruction::ShuffleVector, Tp,
|
||||
nullptr);
|
||||
}
|
||||
|
||||
InstructionCost PPCTTIImpl::getCFInstrCost(unsigned Opcode,
|
||||
|
@ -108,8 +108,8 @@ public:
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
int getShuffleCost(TTI::ShuffleKind Kind, Type *Tp, ArrayRef<int> Mask,
|
||||
int Index, Type *SubTp);
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, Type *Tp,
|
||||
ArrayRef<int> Mask, int Index, Type *SubTp);
|
||||
InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
|
||||
TTI::CastContextHint CCH,
|
||||
TTI::TargetCostKind CostKind,
|
||||
|
@ -554,9 +554,10 @@ int SystemZTTIImpl::getArithmeticInstrCost(
|
||||
Opd1PropInfo, Opd2PropInfo, Args, CxtI);
|
||||
}
|
||||
|
||||
int SystemZTTIImpl::getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) {
|
||||
InstructionCost SystemZTTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
|
||||
VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) {
|
||||
if (ST->hasVector()) {
|
||||
unsigned NumVectors = getNumVectorRegs(Tp);
|
||||
|
||||
|
@ -87,8 +87,9 @@ public:
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
int getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp, ArrayRef<int> Mask,
|
||||
int Index, VectorType *SubTp);
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp);
|
||||
unsigned getVectorTruncCost(Type *SrcTy, Type *DstTy);
|
||||
unsigned getVectorBitmaskConversionCost(Type *SrcTy, Type *DstTy);
|
||||
unsigned getBoolVecToIntConversionCost(unsigned Opcode, Type *Dst,
|
||||
|
@ -963,9 +963,10 @@ int X86TTIImpl::getArithmeticInstrCost(unsigned Opcode, Type *Ty,
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info, Op2Info);
|
||||
}
|
||||
|
||||
int X86TTIImpl::getShuffleCost(TTI::ShuffleKind Kind, VectorType *BaseTp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) {
|
||||
InstructionCost X86TTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
|
||||
VectorType *BaseTp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp) {
|
||||
// 64-bit packed float vectors (v2f32) are widened to type v4f32.
|
||||
// 64-bit packed integer vectors (v2i32) are widened to type v4i32.
|
||||
std::pair<int, MVT> LT = TLI->getTypeLegalizationCost(DL, BaseTp);
|
||||
@ -1011,8 +1012,8 @@ int X86TTIImpl::getShuffleCost(TTI::ShuffleKind Kind, VectorType *BaseTp,
|
||||
auto *SubTy = FixedVectorType::get(BaseTp->getElementType(),
|
||||
SubLT.second.getVectorNumElements());
|
||||
int ExtractIndex = alignDown((Index % NumElts), NumSubElts);
|
||||
int ExtractCost = getShuffleCost(TTI::SK_ExtractSubvector, VecTy, None,
|
||||
ExtractIndex, SubTy);
|
||||
InstructionCost ExtractCost = getShuffleCost(
|
||||
TTI::SK_ExtractSubvector, VecTy, None, ExtractIndex, SubTy);
|
||||
|
||||
// If the original size is 32-bits or more, we can use pshufd. Otherwise
|
||||
// if we have SSSE3 we can use pshufb.
|
||||
@ -3088,7 +3089,7 @@ int X86TTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) {
|
||||
// subvector move(s).
|
||||
// If the vector type is already less than 128-bits then don't reduce it.
|
||||
// TODO: Under what circumstances should we shuffle using the full width?
|
||||
int ShuffleCost = 1;
|
||||
InstructionCost ShuffleCost = 1;
|
||||
if (Opcode == Instruction::InsertElement) {
|
||||
auto *SubTy = cast<VectorType>(Val);
|
||||
EVT VT = TLI->getValueType(DL, Val);
|
||||
@ -3098,7 +3099,7 @@ int X86TTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val, unsigned Index) {
|
||||
getShuffleCost(TTI::SK_PermuteTwoSrc, SubTy, None, 0, SubTy);
|
||||
}
|
||||
int IntOrFpCost = ScalarType->isFloatingPointTy() ? 0 : 1;
|
||||
return ShuffleCost + IntOrFpCost + RegisterFileMoveCost;
|
||||
return *ShuffleCost.getValue() + IntOrFpCost + RegisterFileMoveCost;
|
||||
}
|
||||
|
||||
// Add to the base cost if we know that the extracted element of a vector is
|
||||
@ -3296,7 +3297,7 @@ X86TTIImpl::getMaskedMemoryOpCost(unsigned Opcode, Type *SrcTy, Align Alignment,
|
||||
// Legalize the type.
|
||||
std::pair<int, MVT> LT = TLI->getTypeLegalizationCost(DL, SrcVTy);
|
||||
auto VT = TLI->getValueType(DL, SrcVTy);
|
||||
int Cost = 0;
|
||||
InstructionCost Cost = 0;
|
||||
if (VT.isSimple() && LT.second != VT.getSimpleVT() &&
|
||||
LT.second.getVectorNumElements() == NumElem)
|
||||
// Promotion requires expand/truncate for data and a shuffle for mask.
|
||||
@ -3530,7 +3531,7 @@ X86TTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *ValTy,
|
||||
return BaseT::getArithmeticReductionCost(Opcode, ValVTy, IsPairwise,
|
||||
CostKind);
|
||||
|
||||
unsigned ReductionCost = 0;
|
||||
InstructionCost ReductionCost = 0;
|
||||
|
||||
auto *Ty = ValVTy;
|
||||
if (LT.first != 1 && MTy.isVector() &&
|
||||
@ -4692,7 +4693,7 @@ InstructionCost X86TTIImpl::getInterleavedMemoryOpCostAVX512(
|
||||
TTI::ShuffleKind ShuffleKind =
|
||||
(NumOfMemOps > 1) ? TTI::SK_PermuteTwoSrc : TTI::SK_PermuteSingleSrc;
|
||||
|
||||
unsigned ShuffleCost =
|
||||
InstructionCost ShuffleCost =
|
||||
getShuffleCost(ShuffleKind, SingleMemOpTy, None, 0, nullptr);
|
||||
|
||||
unsigned NumOfLoadsInInterleaveGrp =
|
||||
@ -4748,7 +4749,7 @@ InstructionCost X86TTIImpl::getInterleavedMemoryOpCostAVX512(
|
||||
// There is no strided stores meanwhile. And store can't be folded in
|
||||
// shuffle.
|
||||
unsigned NumOfSources = Factor; // The number of values to be merged.
|
||||
unsigned ShuffleCost =
|
||||
InstructionCost ShuffleCost =
|
||||
getShuffleCost(TTI::SK_PermuteTwoSrc, SingleMemOpTy, None, 0, nullptr);
|
||||
unsigned NumOfShufflesPerStore = NumOfSources - 1;
|
||||
|
||||
|
@ -127,8 +127,9 @@ public:
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
int getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp, ArrayRef<int> Mask,
|
||||
int Index, VectorType *SubTp);
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
ArrayRef<int> Mask, int Index,
|
||||
VectorType *SubTp);
|
||||
InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
|
||||
TTI::CastContextHint CCH,
|
||||
TTI::TargetCostKind CostKind,
|
||||
|
Loading…
Reference in New Issue
Block a user