[TTI] Use OperandValueInfo in getArithmeticInstrCost implementation [NFC]
This change completes the process of replacing OperandValueKind and OperandValueProperties which were previously passed independently in this API with a single container class which contains both. This is the change which motivated the whole sequence which preceeded it. In an original spike version of this change, I'd noticed a nasty bug: I'd changed the signature without changing names, and as result, we silently passed additional information through a callsite which previously dropped the power-of-two fact. This might be harmless in most cases, but at least a couple clearly dependend for correctness on not passing that property through. I did my best to split off prior changes which reduced the scope of this one, and which made it possible to use compiler assistance. For instance, every parameter which changes type in this change also changes name. This was intentional to make sure that every call site possible effected must show up in the diff. This let me audit each one closely.
This commit is contained in:
parent
af29db64b2
commit
104fa367ee
|
@ -916,6 +916,10 @@ public:
|
|||
bool isPowerOf2() const {
|
||||
return Properties == OP_PowerOf2;
|
||||
}
|
||||
|
||||
OperandValueInfo getNoProps() const {
|
||||
return {Kind, OP_None};
|
||||
}
|
||||
};
|
||||
|
||||
/// \return the number of registers in the target-provided register class.
|
||||
|
@ -1729,12 +1733,7 @@ public:
|
|||
virtual unsigned getMaxInterleaveFactor(unsigned VF) = 0;
|
||||
virtual InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
OperandValueKind Opd1Info, OperandValueKind Opd2Info,
|
||||
OperandValueProperties Opd1PropInfo, OperandValueProperties Opd2PropInfo,
|
||||
ArrayRef<const Value *> Args, const Instruction *CxtI = nullptr) = 0;
|
||||
virtual InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
OperandValueInfo Op1Info, OperandValueInfo Op2Info,
|
||||
OperandValueInfo Opd1Info, OperandValueInfo Opd2Info,
|
||||
ArrayRef<const Value *> Args, const Instruction *CxtI = nullptr) = 0;
|
||||
|
||||
virtual InstructionCost getShuffleCost(ShuffleKind Kind, VectorType *Tp,
|
||||
|
@ -2282,24 +2281,12 @@ public:
|
|||
BlockFrequencyInfo *BFI) override {
|
||||
return Impl.getEstimatedNumberOfCaseClusters(SI, JTSize, PSI, BFI);
|
||||
}
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
OperandValueKind Opd1Info, OperandValueKind Opd2Info,
|
||||
OperandValueProperties Opd1PropInfo, OperandValueProperties Opd2PropInfo,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI = nullptr) override {
|
||||
return Impl.getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info, Opd2Info,
|
||||
Opd1PropInfo, Opd2PropInfo, Args, CxtI);
|
||||
}
|
||||
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
OperandValueInfo Opd1Info, OperandValueInfo Opd2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI = nullptr) override {
|
||||
return Impl.getArithmeticInstrCost(Opcode, Ty, CostKind,
|
||||
Opd1Info.Kind, Opd2Info.Kind,
|
||||
Opd1Info.Properties, Opd2Info.Properties,
|
||||
return Impl.getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info, Opd2Info,
|
||||
Args, CxtI);
|
||||
}
|
||||
|
||||
|
|
|
@ -486,9 +486,8 @@ public:
|
|||
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info, TTI::OperandValueKind Opd2Info,
|
||||
TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
TTI::OperandValueInfo Opd1Info, TTI::OperandValueInfo Opd2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI = nullptr) const {
|
||||
// FIXME: A number of transformation tests seem to require these values
|
||||
// which seems a little odd for how arbitary there are.
|
||||
|
@ -1074,18 +1073,13 @@ public:
|
|||
case Instruction::Or:
|
||||
case Instruction::Xor:
|
||||
case Instruction::FNeg: {
|
||||
const auto [Op1VK, Op1VP] = TTI::getOperandInfo(U->getOperand(0));
|
||||
TTI::OperandValueProperties Op2VP = TTI::OP_None;
|
||||
TTI::OperandValueKind Op2VK = TTI::OK_AnyValue;
|
||||
if (Opcode != Instruction::FNeg) {
|
||||
auto Info = TTI::getOperandInfo(U->getOperand(1));
|
||||
Op2VK = Info.Kind;
|
||||
Op2VP = Info.Properties;
|
||||
}
|
||||
const TTI::OperandValueInfo Op1Info = TTI::getOperandInfo(U->getOperand(0));
|
||||
TTI::OperandValueInfo Op2Info;
|
||||
if (Opcode != Instruction::FNeg)
|
||||
Op2Info = TTI::getOperandInfo(U->getOperand(1));
|
||||
SmallVector<const Value *, 2> Operands(U->operand_values());
|
||||
return TargetTTI->getArithmeticInstrCost(Opcode, Ty, CostKind,
|
||||
Op1VK, Op2VK,
|
||||
Op1VP, Op2VP, Operands, I);
|
||||
return TargetTTI->getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info, Operands, I);
|
||||
}
|
||||
case Instruction::IntToPtr:
|
||||
case Instruction::PtrToInt:
|
||||
|
@ -1140,15 +1134,15 @@ public:
|
|||
match(U, m_LogicalOr(m_Value(Op0), m_Value(Op1)))) {
|
||||
// select x, y, false --> x & y
|
||||
// select x, true, y --> x | y
|
||||
const auto [Op1VK, Op1VP] = TTI::getOperandInfo(Op0);
|
||||
const auto [Op2VK, Op2VP] = TTI::getOperandInfo(Op1);
|
||||
const auto Op1Info = TTI::getOperandInfo(Op0);
|
||||
const auto Op2Info = TTI::getOperandInfo(Op1);
|
||||
assert(Op0->getType()->getScalarSizeInBits() == 1 &&
|
||||
Op1->getType()->getScalarSizeInBits() == 1);
|
||||
|
||||
SmallVector<const Value *, 2> Operands{Op0, Op1};
|
||||
return TargetTTI->getArithmeticInstrCost(
|
||||
match(U, m_LogicalOr()) ? Instruction::Or : Instruction::And, Ty,
|
||||
CostKind, Op1VK, Op2VK, Op1VP, Op2VP, Operands, I);
|
||||
CostKind, Op1Info, Op2Info, Operands, I);
|
||||
}
|
||||
Type *CondTy = U->getOperand(0)->getType();
|
||||
return TargetTTI->getCmpSelInstrCost(Opcode, U->getType(), CondTy,
|
||||
|
|
|
@ -818,10 +818,8 @@ public:
|
|||
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Opd1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Opd2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr) {
|
||||
// Check if any of the operands are vector operands.
|
||||
|
@ -833,7 +831,6 @@ public:
|
|||
if (CostKind != TTI::TCK_RecipThroughput)
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind,
|
||||
Opd1Info, Opd2Info,
|
||||
Opd1PropInfo, Opd2PropInfo,
|
||||
Args, CxtI);
|
||||
|
||||
std::pair<InstructionCost, MVT> LT = getTypeLegalizationCost(Ty);
|
||||
|
@ -866,8 +863,7 @@ public:
|
|||
LT.second)) {
|
||||
unsigned DivOpc = IsSigned ? Instruction::SDiv : Instruction::UDiv;
|
||||
InstructionCost DivCost = thisT()->getArithmeticInstrCost(
|
||||
DivOpc, Ty, CostKind, Opd1Info, Opd2Info, Opd1PropInfo,
|
||||
Opd2PropInfo);
|
||||
DivOpc, Ty, CostKind, Opd1Info, Opd2Info);
|
||||
InstructionCost MulCost =
|
||||
thisT()->getArithmeticInstrCost(Instruction::Mul, Ty, CostKind);
|
||||
InstructionCost SubCost =
|
||||
|
@ -886,7 +882,7 @@ public:
|
|||
if (auto *VTy = dyn_cast<FixedVectorType>(Ty)) {
|
||||
InstructionCost Cost = thisT()->getArithmeticInstrCost(
|
||||
Opcode, VTy->getScalarType(), CostKind, Opd1Info, Opd2Info,
|
||||
Opd1PropInfo, Opd2PropInfo, Args, CxtI);
|
||||
Args, CxtI);
|
||||
// Return the cost of multiple scalar invocation plus the cost of
|
||||
// inserting and extracting the values.
|
||||
SmallVector<Type *> Tys(Args.size(), Ty);
|
||||
|
@ -1565,13 +1561,14 @@ public:
|
|||
const Value *X = Args[0];
|
||||
const Value *Y = Args[1];
|
||||
const Value *Z = Args[2];
|
||||
const auto [OpKindX, OpPropsX] = TTI::getOperandInfo(X);
|
||||
const auto [OpKindY, OpPropsY] = TTI::getOperandInfo(Y);
|
||||
const auto [OpKindZ, OpPropsZ] = TTI::getOperandInfo(Z);
|
||||
TTI::OperandValueKind OpKindBW = TTI::OK_UniformConstantValue;
|
||||
TTI::OperandValueProperties OpPropsBW =
|
||||
isPowerOf2_32(RetTy->getScalarSizeInBits()) ? TTI::OP_PowerOf2
|
||||
: TTI::OP_None;
|
||||
const TTI::OperandValueInfo OpInfoX = TTI::getOperandInfo(X);
|
||||
const TTI::OperandValueInfo OpInfoY = TTI::getOperandInfo(Y);
|
||||
const TTI::OperandValueInfo OpInfoZ = TTI::getOperandInfo(Z);
|
||||
const TTI::OperandValueInfo OpInfoBW =
|
||||
{TTI::OK_UniformConstantValue,
|
||||
isPowerOf2_32(RetTy->getScalarSizeInBits()) ? TTI::OP_PowerOf2
|
||||
: TTI::OP_None};
|
||||
|
||||
// fshl: (X << (Z % BW)) | (Y >> (BW - (Z % BW)))
|
||||
// fshr: (X << (BW - (Z % BW))) | (Y >> (Z % BW))
|
||||
InstructionCost Cost = 0;
|
||||
|
@ -1580,15 +1577,15 @@ public:
|
|||
Cost +=
|
||||
thisT()->getArithmeticInstrCost(BinaryOperator::Sub, RetTy, CostKind);
|
||||
Cost += thisT()->getArithmeticInstrCost(
|
||||
BinaryOperator::Shl, RetTy, CostKind, OpKindX, OpKindZ, OpPropsX);
|
||||
BinaryOperator::Shl, RetTy, CostKind, OpInfoX,
|
||||
{OpInfoZ.Kind, TTI::OP_None});
|
||||
Cost += thisT()->getArithmeticInstrCost(
|
||||
BinaryOperator::LShr, RetTy, CostKind, OpKindY, OpKindZ, OpPropsY);
|
||||
BinaryOperator::LShr, RetTy, CostKind, OpInfoY,
|
||||
{OpInfoZ.Kind, TTI::OP_None});
|
||||
// Non-constant shift amounts requires a modulo.
|
||||
if (OpKindZ != TTI::OK_UniformConstantValue &&
|
||||
OpKindZ != TTI::OK_NonUniformConstantValue)
|
||||
if (!OpInfoZ.isConstant())
|
||||
Cost += thisT()->getArithmeticInstrCost(BinaryOperator::URem, RetTy,
|
||||
CostKind, OpKindZ, OpKindBW,
|
||||
OpPropsZ, OpPropsBW);
|
||||
CostKind, OpInfoZ, OpInfoBW);
|
||||
// For non-rotates (X != Y) we must add shift-by-zero handling costs.
|
||||
if (X != Y) {
|
||||
Type *CondTy = RetTy->getWithNewBitWidth(1);
|
||||
|
@ -1855,7 +1852,7 @@ public:
|
|||
Pred, CostKind);
|
||||
// TODO: Should we add an OperandValueProperties::OP_Zero property?
|
||||
Cost += thisT()->getArithmeticInstrCost(
|
||||
BinaryOperator::Sub, RetTy, CostKind, TTI::OK_UniformConstantValue);
|
||||
BinaryOperator::Sub, RetTy, CostKind, {TTI::OK_UniformConstantValue, TTI::OP_None});
|
||||
return Cost;
|
||||
}
|
||||
case Intrinsic::smax:
|
||||
|
@ -1930,11 +1927,12 @@ public:
|
|||
Cost += 2 * thisT()->getCastInstrCost(Instruction::Trunc, RetTy, ExtTy,
|
||||
CCH, CostKind);
|
||||
Cost += thisT()->getArithmeticInstrCost(Instruction::LShr, RetTy,
|
||||
CostKind, TTI::OK_AnyValue,
|
||||
TTI::OK_UniformConstantValue);
|
||||
CostKind,
|
||||
{TTI::OK_AnyValue, TTI::OP_None},
|
||||
{TTI::OK_UniformConstantValue, TTI::OP_None});
|
||||
Cost += thisT()->getArithmeticInstrCost(Instruction::Shl, RetTy, CostKind,
|
||||
TTI::OK_AnyValue,
|
||||
TTI::OK_UniformConstantValue);
|
||||
{TTI::OK_AnyValue, TTI::OP_None},
|
||||
{TTI::OK_UniformConstantValue, TTI::OP_None});
|
||||
Cost += thisT()->getArithmeticInstrCost(Instruction::Or, RetTy, CostKind);
|
||||
return Cost;
|
||||
}
|
||||
|
@ -1995,13 +1993,15 @@ public:
|
|||
Cost += 2 * thisT()->getCastInstrCost(Instruction::Trunc, MulTy, ExtTy,
|
||||
CCH, CostKind);
|
||||
Cost += thisT()->getArithmeticInstrCost(Instruction::LShr, ExtTy,
|
||||
CostKind, TTI::OK_AnyValue,
|
||||
TTI::OK_UniformConstantValue);
|
||||
CostKind,
|
||||
{TTI::OK_AnyValue, TTI::OP_None},
|
||||
{TTI::OK_UniformConstantValue, TTI::OP_None});
|
||||
|
||||
if (IsSigned)
|
||||
Cost += thisT()->getArithmeticInstrCost(Instruction::AShr, MulTy,
|
||||
CostKind, TTI::OK_AnyValue,
|
||||
TTI::OK_UniformConstantValue);
|
||||
CostKind,
|
||||
{TTI::OK_AnyValue, TTI::OP_None},
|
||||
{TTI::OK_UniformConstantValue, TTI::OP_None});
|
||||
|
||||
Cost += thisT()->getCmpSelInstrCost(
|
||||
BinaryOperator::ICmp, MulTy, OverflowTy, CmpInst::ICMP_NE, CostKind);
|
||||
|
|
|
@ -771,8 +771,7 @@ InstructionCost TargetTransformInfo::getArithmeticInstrCost(
|
|||
ArrayRef<const Value *> Args, const Instruction *CxtI) const {
|
||||
InstructionCost Cost =
|
||||
TTIImpl->getArithmeticInstrCost(Opcode, Ty, CostKind,
|
||||
Op1Info.Kind, Op2Info.Kind,
|
||||
Op1Info.Properties, Op2Info.Properties,
|
||||
Op1Info, Op2Info,
|
||||
Args, CxtI);
|
||||
assert(Cost >= 0 && "TTI should not produce negative costs!");
|
||||
return Cost;
|
||||
|
|
|
@ -1978,18 +1978,14 @@ InstructionCost AArch64TTIImpl::getVectorInstrCost(unsigned Opcode, Type *Val,
|
|||
|
||||
InstructionCost AArch64TTIImpl::getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info, TTI::OperandValueKind Opd2Info,
|
||||
TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI) {
|
||||
|
||||
const TTI::OperandValueInfo Op2Info = {Opd2Info, Opd2PropInfo};
|
||||
|
||||
// TODO: Handle more cost kinds.
|
||||
if (CostKind != TTI::TCK_RecipThroughput)
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
|
||||
Opd2Info, Opd1PropInfo,
|
||||
Opd2PropInfo, Args, CxtI);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info, Args, CxtI);
|
||||
|
||||
// Legalize the type.
|
||||
std::pair<InstructionCost, MVT> LT = getTypeLegalizationCost(Ty);
|
||||
|
@ -1997,8 +1993,8 @@ InstructionCost AArch64TTIImpl::getArithmeticInstrCost(
|
|||
|
||||
switch (ISD) {
|
||||
default:
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
|
||||
Opd2Info, Opd1PropInfo, Opd2PropInfo);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info);
|
||||
case ISD::SDIV:
|
||||
if (Op2Info.isConstant() && Op2Info.isUniform() && Op2Info.isPowerOf2()) {
|
||||
// On AArch64, scalar signed division by constants power-of-two are
|
||||
|
@ -2006,17 +2002,15 @@ InstructionCost AArch64TTIImpl::getArithmeticInstrCost(
|
|||
// The OperandValue properties many not be same as that of previous
|
||||
// operation; conservatively assume OP_None.
|
||||
InstructionCost Cost = getArithmeticInstrCost(
|
||||
Instruction::Add, Ty, CostKind, Opd1Info, Opd2Info,
|
||||
TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
|
||||
Cost += getArithmeticInstrCost(Instruction::Sub, Ty, CostKind, Opd1Info,
|
||||
Opd2Info, TargetTransformInfo::OP_None,
|
||||
TargetTransformInfo::OP_None);
|
||||
Instruction::Add, Ty, CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
Cost += getArithmeticInstrCost(Instruction::Sub, Ty, CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
Cost += getArithmeticInstrCost(
|
||||
Instruction::Select, Ty, CostKind, Opd1Info, Opd2Info,
|
||||
TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
|
||||
Cost += getArithmeticInstrCost(Instruction::AShr, Ty, CostKind, Opd1Info,
|
||||
Opd2Info, TargetTransformInfo::OP_None,
|
||||
TargetTransformInfo::OP_None);
|
||||
Instruction::Select, Ty, CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
Cost += getArithmeticInstrCost(Instruction::AShr, Ty, CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
return Cost;
|
||||
}
|
||||
[[fallthrough]];
|
||||
|
@ -2028,29 +2022,24 @@ InstructionCost AArch64TTIImpl::getArithmeticInstrCost(
|
|||
// sequence MULHS + ADD/SUB + SRA + SRL + ADD, and unsigned division
|
||||
// to MULHS + SUB + SRL + ADD + SRL.
|
||||
InstructionCost MulCost = getArithmeticInstrCost(
|
||||
Instruction::Mul, Ty, CostKind, Opd1Info, Opd2Info,
|
||||
TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
|
||||
Instruction::Mul, Ty, CostKind, Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
InstructionCost AddCost = getArithmeticInstrCost(
|
||||
Instruction::Add, Ty, CostKind, Opd1Info, Opd2Info,
|
||||
TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
|
||||
Instruction::Add, Ty, CostKind, Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
InstructionCost ShrCost = getArithmeticInstrCost(
|
||||
Instruction::AShr, Ty, CostKind, Opd1Info, Opd2Info,
|
||||
TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
|
||||
Instruction::AShr, Ty, CostKind, Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
return MulCost * 2 + AddCost * 2 + ShrCost * 2 + 1;
|
||||
}
|
||||
}
|
||||
|
||||
InstructionCost Cost = BaseT::getArithmeticInstrCost(
|
||||
Opcode, Ty, CostKind, Opd1Info, Opd2Info, Opd1PropInfo, Opd2PropInfo);
|
||||
Opcode, Ty, CostKind, Op1Info, Op2Info);
|
||||
if (Ty->isVectorTy()) {
|
||||
// On AArch64, vector divisions are not supported natively and are
|
||||
// expanded into scalar divisions of each pair of elements.
|
||||
Cost += getArithmeticInstrCost(Instruction::ExtractElement, Ty, CostKind,
|
||||
Opd1Info, Opd2Info, Opd1PropInfo,
|
||||
Opd2PropInfo);
|
||||
Op1Info, Op2Info);
|
||||
Cost += getArithmeticInstrCost(Instruction::InsertElement, Ty, CostKind,
|
||||
Opd1Info, Opd2Info, Opd1PropInfo,
|
||||
Opd2PropInfo);
|
||||
Op1Info, Op2Info);
|
||||
// TODO: if one of the arguments is scalar, then it's not necessary to
|
||||
// double the cost of handling the vector elements.
|
||||
Cost += Cost;
|
||||
|
@ -2092,8 +2081,8 @@ InstructionCost AArch64TTIImpl::getArithmeticInstrCost(
|
|||
if (!Ty->getScalarType()->isFP128Ty())
|
||||
return 2 * LT.first;
|
||||
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
|
||||
Opd2Info, Opd1PropInfo, Opd2PropInfo);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -189,10 +189,8 @@ public:
|
|||
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
|
||||
|
|
|
@ -512,9 +512,8 @@ bool GCNTTIImpl::getTgtMemIntrinsic(IntrinsicInst *Inst,
|
|||
|
||||
InstructionCost GCNTTIImpl::getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info, TTI::OperandValueKind Opd2Info,
|
||||
TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI) {
|
||||
|
||||
// Legalize the type.
|
||||
|
@ -657,8 +656,8 @@ InstructionCost GCNTTIImpl::getArithmeticInstrCost(
|
|||
break;
|
||||
}
|
||||
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info, Opd2Info,
|
||||
Opd1PropInfo, Opd2PropInfo, Args, CxtI);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info, Op2Info,
|
||||
Args, CxtI);
|
||||
}
|
||||
|
||||
// Return true if there's a potential benefit from using v2f16/v2i16
|
||||
|
|
|
@ -148,10 +148,8 @@ public:
|
|||
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
|
||||
|
|
|
@ -1308,9 +1308,8 @@ InstructionCost ARMTTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
|
|||
|
||||
InstructionCost ARMTTIImpl::getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Op1Info, TTI::OperandValueKind Op2Info,
|
||||
TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI) {
|
||||
int ISDOpcode = TLI->InstructionOpcodeToISD(Opcode);
|
||||
if (ST->isThumb() && CostKind == TTI::TCK_CodeSize && Ty->isIntegerTy(1)) {
|
||||
|
@ -1378,7 +1377,7 @@ InstructionCost ARMTTIImpl::getArithmeticInstrCost(
|
|||
return LT.first * Entry->Cost;
|
||||
|
||||
InstructionCost Cost = BaseT::getArithmeticInstrCost(
|
||||
Opcode, Ty, CostKind, Op1Info, Op2Info, Opd1PropInfo, Opd2PropInfo);
|
||||
Opcode, Ty, CostKind, Op1Info, Op2Info);
|
||||
|
||||
// This is somewhat of a hack. The problem that we are facing is that SROA
|
||||
// creates a sequence of shift, and, or instructions to construct values.
|
||||
|
@ -1388,7 +1387,7 @@ InstructionCost ARMTTIImpl::getArithmeticInstrCost(
|
|||
// To work around this we increase the cost of v2i64 operations to make them
|
||||
// seem less beneficial.
|
||||
if (LT.second == MVT::v2i64 &&
|
||||
Op2Info == TargetTransformInfo::OK_UniformConstantValue)
|
||||
Op2Info.Kind == TargetTransformInfo::OK_UniformConstantValue)
|
||||
Cost += 4;
|
||||
|
||||
return Cost;
|
||||
|
@ -1402,7 +1401,7 @@ InstructionCost ARMTTIImpl::getArithmeticInstrCost(
|
|||
|
||||
if (!CxtI || !CxtI->hasOneUse() || !CxtI->isShift())
|
||||
return false;
|
||||
if (Op2Info != TargetTransformInfo::OK_UniformConstantValue)
|
||||
if (Op2Info.Kind != TargetTransformInfo::OK_UniformConstantValue)
|
||||
return false;
|
||||
|
||||
// Folded into a ADC/ADD/AND/BIC/CMP/EOR/MVN/ORR/ORN/RSB/SBC/SUB
|
||||
|
|
|
@ -247,10 +247,8 @@ public:
|
|||
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Op1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Op2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
|
||||
|
|
|
@ -57,19 +57,16 @@ public:
|
|||
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr) {
|
||||
int ISD = TLI->InstructionOpcodeToISD(Opcode);
|
||||
if (ISD == ISD::ADD && CostKind == TTI::TCK_RecipThroughput)
|
||||
return SCEVCheapExpansionBudget.getValue() + 1;
|
||||
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
|
||||
Opd2Info, Opd1PropInfo,
|
||||
Opd2PropInfo);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info);
|
||||
}
|
||||
|
||||
TTI::MemCmpExpansionOptions enableMemCmpExpansion(bool OptSize,
|
||||
|
|
|
@ -265,23 +265,21 @@ InstructionCost HexagonTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
|
|||
|
||||
InstructionCost HexagonTTIImpl::getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info, TTI::OperandValueKind Opd2Info,
|
||||
TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI) {
|
||||
// TODO: Handle more cost kinds.
|
||||
if (CostKind != TTI::TCK_RecipThroughput)
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
|
||||
Opd2Info, Opd1PropInfo,
|
||||
Opd2PropInfo, Args, CxtI);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info, Args, CxtI);
|
||||
|
||||
if (Ty->isVectorTy()) {
|
||||
std::pair<InstructionCost, MVT> LT = getTypeLegalizationCost(Ty);
|
||||
if (LT.second.isFloatingPoint())
|
||||
return LT.first + FloatFactor * getTypeNumElements(Ty);
|
||||
}
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info, Opd2Info,
|
||||
Opd1PropInfo, Opd2PropInfo, Args, CxtI);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info, Op2Info,
|
||||
Args, CxtI);
|
||||
}
|
||||
|
||||
InstructionCost HexagonTTIImpl::getCastInstrCost(unsigned Opcode, Type *DstTy,
|
||||
|
|
|
@ -144,10 +144,8 @@ public:
|
|||
const Instruction *I = nullptr);
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
InstructionCost getCastInstrCost(unsigned Opcode, Type *Dst, Type *Src,
|
||||
|
|
|
@ -92,19 +92,16 @@ public:
|
|||
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr) {
|
||||
int ISD = TLI->InstructionOpcodeToISD(Opcode);
|
||||
|
||||
switch (ISD) {
|
||||
default:
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
|
||||
Opd2Info,
|
||||
Opd1PropInfo, Opd2PropInfo);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info);
|
||||
case ISD::MUL:
|
||||
case ISD::SDIV:
|
||||
case ISD::UDIV:
|
||||
|
@ -114,9 +111,8 @@ public:
|
|||
// instruction cost was arbitrarily chosen to reduce the desirability
|
||||
// of emitting arithmetic instructions that are emulated in software.
|
||||
// TODO: Investigate the performance impact given specialized lowerings.
|
||||
return 64 * BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
|
||||
Opd2Info,
|
||||
Opd1PropInfo, Opd2PropInfo);
|
||||
return 64 * BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
|
|
@ -423,9 +423,8 @@ NVPTXTTIImpl::instCombineIntrinsic(InstCombiner &IC, IntrinsicInst &II) const {
|
|||
|
||||
InstructionCost NVPTXTTIImpl::getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info, TTI::OperandValueKind Opd2Info,
|
||||
TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI) {
|
||||
// Legalize the type.
|
||||
std::pair<InstructionCost, MVT> LT = getTypeLegalizationCost(Ty);
|
||||
|
@ -434,9 +433,8 @@ InstructionCost NVPTXTTIImpl::getArithmeticInstrCost(
|
|||
|
||||
switch (ISD) {
|
||||
default:
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
|
||||
Opd2Info,
|
||||
Opd1PropInfo, Opd2PropInfo);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info);
|
||||
case ISD::ADD:
|
||||
case ISD::MUL:
|
||||
case ISD::XOR:
|
||||
|
@ -448,9 +446,8 @@ InstructionCost NVPTXTTIImpl::getArithmeticInstrCost(
|
|||
if (LT.second.SimpleTy == MVT::i64)
|
||||
return 2 * LT.first;
|
||||
// Delegate other cases to the basic TTI.
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Opd1Info,
|
||||
Opd2Info,
|
||||
Opd1PropInfo, Opd2PropInfo);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -95,10 +95,8 @@ public:
|
|||
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
|
||||
|
|
|
@ -980,9 +980,8 @@ InstructionCost PPCTTIImpl::vectorCostAdjustmentFactor(unsigned Opcode,
|
|||
|
||||
InstructionCost PPCTTIImpl::getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Op1Info, TTI::OperandValueKind Op2Info,
|
||||
TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI) {
|
||||
assert(TLI->InstructionOpcodeToISD(Opcode) && "Invalid opcode");
|
||||
|
||||
|
@ -993,12 +992,11 @@ InstructionCost PPCTTIImpl::getArithmeticInstrCost(
|
|||
// TODO: Handle more cost kinds.
|
||||
if (CostKind != TTI::TCK_RecipThroughput)
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info, Opd1PropInfo,
|
||||
Opd2PropInfo, Args, CxtI);
|
||||
Op2Info, Args, CxtI);
|
||||
|
||||
// Fallback to the default implementation.
|
||||
InstructionCost Cost = BaseT::getArithmeticInstrCost(
|
||||
Opcode, Ty, CostKind, Op1Info, Op2Info, Opd1PropInfo, Opd2PropInfo);
|
||||
Opcode, Ty, CostKind, Op1Info, Op2Info);
|
||||
return Cost * CostFactor;
|
||||
}
|
||||
|
||||
|
|
|
@ -105,10 +105,8 @@ public:
|
|||
Type *Ty2);
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, Type *Tp,
|
||||
|
|
|
@ -419,16 +419,14 @@ static unsigned getNumVectorRegs(Type *Ty) {
|
|||
|
||||
InstructionCost SystemZTTIImpl::getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Op1Info, TTI::OperandValueKind Op2Info,
|
||||
TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI) {
|
||||
|
||||
// TODO: Handle more cost kinds.
|
||||
if (CostKind != TTI::TCK_RecipThroughput)
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info,
|
||||
Op2Info, Opd1PropInfo,
|
||||
Opd2PropInfo, Args, CxtI);
|
||||
Op2Info, Args, CxtI);
|
||||
|
||||
// TODO: return a good value for BB-VECTORIZER that includes the
|
||||
// immediate loads, which we do not want to count for the loop
|
||||
|
@ -589,7 +587,7 @@ InstructionCost SystemZTTIImpl::getArithmeticInstrCost(
|
|||
|
||||
// Fallback to the default implementation.
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info, Op2Info,
|
||||
Opd1PropInfo, Opd2PropInfo, Args, CxtI);
|
||||
Args, CxtI);
|
||||
}
|
||||
|
||||
InstructionCost SystemZTTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
|
||||
|
|
|
@ -85,10 +85,8 @@ public:
|
|||
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
|
|
|
@ -52,16 +52,13 @@ TypeSize WebAssemblyTTIImpl::getRegisterBitWidth(
|
|||
|
||||
InstructionCost WebAssemblyTTIImpl::getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info, TTI::OperandValueKind Opd2Info,
|
||||
TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI) {
|
||||
|
||||
const TTI::OperandValueInfo Op2Info = {Opd2Info, Opd2PropInfo};
|
||||
|
||||
InstructionCost Cost =
|
||||
BasicTTIImplBase<WebAssemblyTTIImpl>::getArithmeticInstrCost(
|
||||
Opcode, Ty, CostKind, Opd1Info, Opd2Info, Opd1PropInfo, Opd2PropInfo);
|
||||
Opcode, Ty, CostKind, Op1Info, Op2Info);
|
||||
|
||||
if (auto *VTy = dyn_cast<VectorType>(Ty)) {
|
||||
switch (Opcode) {
|
||||
|
|
|
@ -61,10 +61,8 @@ public:
|
|||
TypeSize getRegisterBitWidth(TargetTransformInfo::RegisterKind K) const;
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
using BaseT::getVectorInstrCost;
|
||||
|
|
|
@ -176,13 +176,10 @@ unsigned X86TTIImpl::getMaxInterleaveFactor(unsigned VF) {
|
|||
|
||||
InstructionCost X86TTIImpl::getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Op1Kind, TTI::OperandValueKind Op2Kind,
|
||||
TTI::OperandValueProperties Opd1PropInfo,
|
||||
TTI::OperandValueProperties Opd2PropInfo, ArrayRef<const Value *> Args,
|
||||
TTI::OperandValueInfo Op1Info, TTI::OperandValueInfo Op2Info,
|
||||
ArrayRef<const Value *> Args,
|
||||
const Instruction *CxtI) {
|
||||
|
||||
const TTI::OperandValueInfo Op2Info = {Op2Kind, Opd2PropInfo};
|
||||
|
||||
// vXi8 multiplications are always promoted to vXi16.
|
||||
if (Opcode == Instruction::Mul && Ty->isVectorTy() &&
|
||||
Ty->getScalarSizeInBits() == 8) {
|
||||
|
@ -194,8 +191,7 @@ InstructionCost X86TTIImpl::getArithmeticInstrCost(
|
|||
getCastInstrCost(Instruction::Trunc, Ty, WideVecTy,
|
||||
TargetTransformInfo::CastContextHint::None,
|
||||
CostKind) +
|
||||
getArithmeticInstrCost(Opcode, WideVecTy, CostKind, Op1Kind, Op2Kind,
|
||||
Opd1PropInfo, Opd2PropInfo);
|
||||
getArithmeticInstrCost(Opcode, WideVecTy, CostKind, Op1Info, Op2Info);
|
||||
}
|
||||
|
||||
// Legalize the type.
|
||||
|
@ -236,9 +232,8 @@ InstructionCost X86TTIImpl::getArithmeticInstrCost(
|
|||
|
||||
// Vector multiply by pow2 will be simplified to shifts.
|
||||
if (ISD == ISD::MUL && Op2Info.isConstant() && Op2Info.isPowerOf2())
|
||||
return getArithmeticInstrCost(Instruction::Shl, Ty, CostKind, Op1Kind,
|
||||
Op2Kind, TargetTransformInfo::OP_None,
|
||||
TargetTransformInfo::OP_None);
|
||||
return getArithmeticInstrCost(Instruction::Shl, Ty, CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
|
||||
// On X86, vector signed division by constants power-of-two are
|
||||
// normally expanded to the sequence SRA + SRL + ADD + SRA.
|
||||
|
@ -247,22 +242,19 @@ InstructionCost X86TTIImpl::getArithmeticInstrCost(
|
|||
if ((ISD == ISD::SDIV || ISD == ISD::SREM) &&
|
||||
Op2Info.isConstant() && Op2Info.isPowerOf2()) {
|
||||
InstructionCost Cost =
|
||||
2 * getArithmeticInstrCost(Instruction::AShr, Ty, CostKind, Op1Kind,
|
||||
Op2Kind, TargetTransformInfo::OP_None,
|
||||
TargetTransformInfo::OP_None);
|
||||
Cost += getArithmeticInstrCost(Instruction::LShr, Ty, CostKind, Op1Kind,
|
||||
Op2Kind, TargetTransformInfo::OP_None,
|
||||
TargetTransformInfo::OP_None);
|
||||
Cost += getArithmeticInstrCost(Instruction::Add, Ty, CostKind, Op1Kind,
|
||||
Op2Kind, TargetTransformInfo::OP_None,
|
||||
TargetTransformInfo::OP_None);
|
||||
2 * getArithmeticInstrCost(Instruction::AShr, Ty, CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
Cost += getArithmeticInstrCost(Instruction::LShr, Ty, CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
Cost += getArithmeticInstrCost(Instruction::Add, Ty, CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
|
||||
if (ISD == ISD::SREM) {
|
||||
// For SREM: (X % C) is the equivalent of (X - (X/C)*C)
|
||||
Cost += getArithmeticInstrCost(Instruction::Mul, Ty, CostKind, Op1Kind,
|
||||
Op2Kind);
|
||||
Cost += getArithmeticInstrCost(Instruction::Sub, Ty, CostKind, Op1Kind,
|
||||
Op2Kind);
|
||||
Cost += getArithmeticInstrCost(Instruction::Mul, Ty, CostKind, Op1Info.getNoProps(),
|
||||
Op2Info.getNoProps());
|
||||
Cost += getArithmeticInstrCost(Instruction::Sub, Ty, CostKind, Op1Info.getNoProps(),
|
||||
Op2Info.getNoProps());
|
||||
}
|
||||
|
||||
return Cost;
|
||||
|
@ -272,13 +264,11 @@ InstructionCost X86TTIImpl::getArithmeticInstrCost(
|
|||
if ((ISD == ISD::UDIV || ISD == ISD::UREM) &&
|
||||
Op2Info.isConstant() && Op2Info.isPowerOf2()) {
|
||||
if (ISD == ISD::UDIV)
|
||||
return getArithmeticInstrCost(Instruction::LShr, Ty, CostKind, Op1Kind,
|
||||
Op2Kind, TargetTransformInfo::OP_None,
|
||||
TargetTransformInfo::OP_None);
|
||||
return getArithmeticInstrCost(Instruction::LShr, Ty, CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
// UREM
|
||||
return getArithmeticInstrCost(Instruction::And, Ty, CostKind, Op1Kind,
|
||||
Op2Kind, TargetTransformInfo::OP_None,
|
||||
TargetTransformInfo::OP_None);
|
||||
return getArithmeticInstrCost(Instruction::And, Ty, CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
}
|
||||
|
||||
// TODO: Handle more cost kinds.
|
||||
|
@ -294,8 +284,8 @@ InstructionCost X86TTIImpl::getArithmeticInstrCost(
|
|||
}
|
||||
}
|
||||
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Kind, Op2Kind,
|
||||
Opd1PropInfo, Opd2PropInfo, Args,
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind,
|
||||
Op1Info, Op2Info, Args,
|
||||
CxtI);
|
||||
}
|
||||
|
||||
|
@ -702,9 +692,7 @@ InstructionCost X86TTIImpl::getArithmeticInstrCost(
|
|||
// On AVX512, a packed v32i16 shift left by a constant build_vector
|
||||
// is lowered into a vector multiply (vpmullw).
|
||||
return getArithmeticInstrCost(Instruction::Mul, Ty, CostKind,
|
||||
Op1Kind, Op2Kind,
|
||||
TargetTransformInfo::OP_None,
|
||||
TargetTransformInfo::OP_None);
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
}
|
||||
|
||||
// Look for AVX2 lowering tricks (XOP is always better at v4i32 shifts).
|
||||
|
@ -714,9 +702,7 @@ InstructionCost X86TTIImpl::getArithmeticInstrCost(
|
|||
// On AVX2, a packed v16i16 shift left by a constant build_vector
|
||||
// is lowered into a vector multiply (vpmullw).
|
||||
return getArithmeticInstrCost(Instruction::Mul, Ty, CostKind,
|
||||
Op1Kind, Op2Kind,
|
||||
TargetTransformInfo::OP_None,
|
||||
TargetTransformInfo::OP_None);
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
|
||||
if (const auto *Entry = CostTableLookup(AVX2ShiftCostTable, ISD, LT.second))
|
||||
return LT.first * Entry->Cost;
|
||||
|
@ -791,7 +777,7 @@ InstructionCost X86TTIImpl::getArithmeticInstrCost(
|
|||
}
|
||||
|
||||
if (ISD == ISD::SHL &&
|
||||
Op2Kind == TargetTransformInfo::OK_NonUniformConstantValue) {
|
||||
Op2Info.Kind == TargetTransformInfo::OK_NonUniformConstantValue) {
|
||||
MVT VT = LT.second;
|
||||
// Vector shift left by non uniform constant can be lowered
|
||||
// into vector multiply.
|
||||
|
@ -1059,14 +1045,14 @@ InstructionCost X86TTIImpl::getArithmeticInstrCost(
|
|||
if (LT.second.isVector() && (ISD == ISD::SDIV || ISD == ISD::SREM ||
|
||||
ISD == ISD::UDIV || ISD == ISD::UREM)) {
|
||||
InstructionCost ScalarCost = getArithmeticInstrCost(
|
||||
Opcode, Ty->getScalarType(), CostKind, Op1Kind, Op2Kind,
|
||||
TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
|
||||
Opcode, Ty->getScalarType(), CostKind,
|
||||
Op1Info.getNoProps(), Op2Info.getNoProps());
|
||||
return 20 * LT.first * LT.second.getVectorNumElements() * ScalarCost;
|
||||
}
|
||||
|
||||
// Fallback to the default implementation.
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Kind, Op2Kind,
|
||||
Opd1PropInfo, Opd2PropInfo, Args, CxtI);
|
||||
return BaseT::getArithmeticInstrCost(Opcode, Ty, CostKind, Op1Info, Op2Info,
|
||||
Args, CxtI);
|
||||
}
|
||||
|
||||
InstructionCost X86TTIImpl::getShuffleCost(TTI::ShuffleKind Kind,
|
||||
|
@ -4529,9 +4515,8 @@ X86TTIImpl::getArithmeticReductionCost(unsigned Opcode, VectorType *ValTy,
|
|||
Type::getIntNTy(ValVTy->getContext(), Size), 128 / Size);
|
||||
ReductionCost += getArithmeticInstrCost(
|
||||
Instruction::LShr, ShiftTy, CostKind,
|
||||
TargetTransformInfo::OK_AnyValue,
|
||||
TargetTransformInfo::OK_UniformConstantValue,
|
||||
TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
|
||||
{TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
|
||||
{TargetTransformInfo::OK_UniformConstantValue, TargetTransformInfo::OP_None});
|
||||
}
|
||||
|
||||
// Add the arithmetic op for this level.
|
||||
|
@ -4828,9 +4813,8 @@ X86TTIImpl::getMinMaxReductionCost(VectorType *ValTy, VectorType *CondTy,
|
|||
Type::getIntNTy(ValTy->getContext(), Size), 128 / Size);
|
||||
MinMaxCost += getArithmeticInstrCost(
|
||||
Instruction::LShr, ShiftTy, TTI::TCK_RecipThroughput,
|
||||
TargetTransformInfo::OK_AnyValue,
|
||||
TargetTransformInfo::OK_UniformConstantValue,
|
||||
TargetTransformInfo::OP_None, TargetTransformInfo::OP_None);
|
||||
{TargetTransformInfo::OK_AnyValue, TargetTransformInfo::OP_None},
|
||||
{TargetTransformInfo::OK_UniformConstantValue, TargetTransformInfo::OP_None});
|
||||
}
|
||||
|
||||
// Add the arithmetic op for this level.
|
||||
|
|
|
@ -128,10 +128,8 @@ public:
|
|||
unsigned getMaxInterleaveFactor(unsigned VF);
|
||||
InstructionCost getArithmeticInstrCost(
|
||||
unsigned Opcode, Type *Ty, TTI::TargetCostKind CostKind,
|
||||
TTI::OperandValueKind Opd1Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueKind Opd2Info = TTI::OK_AnyValue,
|
||||
TTI::OperandValueProperties Opd1PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueProperties Opd2PropInfo = TTI::OP_None,
|
||||
TTI::OperandValueInfo Op1Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
TTI::OperandValueInfo Op2Info = {TTI::OK_AnyValue, TTI::OP_None},
|
||||
ArrayRef<const Value *> Args = ArrayRef<const Value *>(),
|
||||
const Instruction *CxtI = nullptr);
|
||||
InstructionCost getShuffleCost(TTI::ShuffleKind Kind, VectorType *Tp,
|
||||
|
|
Loading…
Reference in New Issue