[llvm] [RISCV][TTI] Refine the cost of FCmp (PR #88833)
Shih-Po Hung via llvm-commits
llvm-commits at lists.llvm.org
Tue Apr 16 01:44:50 PDT 2024
================
@@ -1383,28 +1385,69 @@ InstructionCost RISCVTTIImpl::getCmpSelInstrCost(unsigned Opcode, Type *ValTy,
getRISCVInstructionCost(RISCV::VMSLT_VV, LT.second, CostKind);
}
- if ((Opcode == Instruction::FCmp) && ValTy->isVectorTy()) {
+ if ((Opcode == Instruction::FCmp) && ValTy->isVectorTy() &&
+ CmpInst::isFPPredicate(VecPred)) {
+
+ // Use VMXOR_MM and VMXNOR_MM to generate all true/false mask
+ if ((VecPred == CmpInst::FCMP_FALSE) || (VecPred == CmpInst::FCMP_TRUE))
+ return getRISCVInstructionCost(RISCV::VMXOR_MM, LT.second, CostKind);
+
// If we do not support the input floating point vector type, use the base
// one which will calculate as:
// ScalarizeCost + Num * Cost for fixed vector,
// InvalidCost for scalable vector.
- if ((ValTy->getScalarSizeInBits() == 16 && !ST->hasVInstructionsF16()) ||
+ if ((ValTy->getScalarSizeInBits() == 16 && !ST->hasVInstructionsF16() &&
+ !ST->hasVInstructionsF16Minimal()) ||
(ValTy->getScalarSizeInBits() == 32 && !ST->hasVInstructionsF32()) ||
(ValTy->getScalarSizeInBits() == 64 && !ST->hasVInstructionsF64()))
return BaseT::getCmpSelInstrCost(Opcode, ValTy, CondTy, VecPred, CostKind,
I);
+
+ if ((ValTy->getScalarSizeInBits() == 16) && !ST->hasVInstructionsF16()) {
+ // pre-widening Op1 and Op2 to f32 before comparison
+ VectorType *VecF32Ty =
+ VectorType::get(Type::getDoubleTy(ValTy->getContext()),
----------------
arcbbb wrote:
Fixed. Thanks!
https://github.com/llvm/llvm-project/pull/88833
More information about the llvm-commits
mailing list