forked from OSchip/llvm-project
[NFCI][CostModel] Unify FNeg cost
Enable TTIImpl::getUserCost to handle FNeg so that getInstructionThroughput can call that instead. This means we can remove the code in the AMDGPU backend too. Differential Revision: https://reviews.llvm.org/D81635
This commit is contained in:
parent
7cac7e0cfc
commit
321ebfd175
|
@ -861,11 +861,14 @@ public:
|
|||
case Instruction::AShr:
|
||||
case Instruction::And:
|
||||
case Instruction::Or:
|
||||
case Instruction::Xor: {
|
||||
TargetTransformInfo::OperandValueKind Op1VK, Op2VK;
|
||||
TargetTransformInfo::OperandValueProperties Op1VP, Op2VP;
|
||||
Op1VK = TTI::getOperandInfo(U->getOperand(0), Op1VP);
|
||||
Op2VK = TTI::getOperandInfo(U->getOperand(1), Op2VP);
|
||||
case Instruction::Xor:
|
||||
case Instruction::FNeg: {
|
||||
TTI::OperandValueProperties Op1VP = TTI::OP_None;
|
||||
TTI::OperandValueProperties Op2VP = TTI::OP_None;
|
||||
TTI::OperandValueKind Op1VK =
|
||||
TTI::getOperandInfo(U->getOperand(0), Op1VP);
|
||||
TTI::OperandValueKind Op2VK = Opcode != Instruction::FNeg ?
|
||||
TTI::getOperandInfo(U->getOperand(1), Op2VP) : TTI::OK_AnyValue;
|
||||
SmallVector<const Value *, 2> Operands(U->operand_values());
|
||||
return TargetTTI->getArithmeticInstrCost(Opcode, Ty, CostKind,
|
||||
Op1VK, Op2VK,
|
||||
|
|
|
@ -1250,18 +1250,8 @@ int TargetTransformInfo::getInstructionThroughput(const Instruction *I) const {
|
|||
case Instruction::And:
|
||||
case Instruction::Or:
|
||||
case Instruction::Xor:
|
||||
case Instruction::FNeg:
|
||||
return getUserCost(I, CostKind);
|
||||
case Instruction::FNeg: {
|
||||
TargetTransformInfo::OperandValueKind Op1VK, Op2VK;
|
||||
TargetTransformInfo::OperandValueProperties Op1VP, Op2VP;
|
||||
Op1VK = getOperandInfo(I->getOperand(0), Op1VP);
|
||||
Op2VK = OK_AnyValue;
|
||||
Op2VP = OP_None;
|
||||
SmallVector<const Value *, 2> Operands(I->operand_values());
|
||||
return getArithmeticInstrCost(I->getOpcode(), I->getType(), CostKind,
|
||||
Op1VK, Op2VK,
|
||||
Op1VP, Op2VP, Operands, I);
|
||||
}
|
||||
case Instruction::Select:
|
||||
case Instruction::ICmp:
|
||||
case Instruction::FCmp:
|
||||
|
|
|
@ -983,26 +983,6 @@ void GCNTTIImpl::getUnrollingPreferences(Loop *L, ScalarEvolution &SE,
|
|||
CommonTTI.getUnrollingPreferences(L, SE, UP);
|
||||
}
|
||||
|
||||
unsigned
|
||||
GCNTTIImpl::getUserCost(const User *U, ArrayRef<const Value *> Operands,
|
||||
TTI::TargetCostKind CostKind) {
|
||||
const Instruction *I = dyn_cast<Instruction>(U);
|
||||
if (!I)
|
||||
return BaseT::getUserCost(U, Operands, CostKind);
|
||||
|
||||
// Estimate different operations to be optimized out
|
||||
switch (I->getOpcode()) {
|
||||
case Instruction::FNeg:
|
||||
return getArithmeticInstrCost(I->getOpcode(), I->getType(), CostKind,
|
||||
TTI::OK_AnyValue, TTI::OK_AnyValue,
|
||||
TTI::OP_None, TTI::OP_None, Operands, I);
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return BaseT::getUserCost(U, Operands, CostKind);
|
||||
}
|
||||
|
||||
unsigned R600TTIImpl::getHardwareNumberOfRegisters(bool Vec) const {
|
||||
return 4 * 128; // XXX - 4 channels. Should these count as vector instead?
|
||||
}
|
||||
|
|
|
@ -237,9 +237,6 @@ public:
|
|||
int getMinMaxReductionCost(
|
||||
VectorType *Ty, VectorType *CondTy, bool IsPairwiseForm, bool IsUnsigned,
|
||||
TTI::TargetCostKind CostKind = TTI::TCK_RecipThroughput);
|
||||
|
||||
unsigned getUserCost(const User *U, ArrayRef<const Value *> Operands,
|
||||
TTI::TargetCostKind CostKind);
|
||||
};
|
||||
|
||||
class R600TTIImpl final : public BasicTTIImplBase<R600TTIImpl> {
|
||||
|
|
Loading…
Reference in New Issue