diff --git a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp index 6344bc4664d3b..fdf362e8ec686 100644 --- a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp @@ -1104,65 +1104,6 @@ RISCVTTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, return Cost * LT.first; break; } - // vp integer arithmetic ops. - case Intrinsic::vp_add: - case Intrinsic::vp_and: - case Intrinsic::vp_ashr: - case Intrinsic::vp_lshr: - case Intrinsic::vp_mul: - case Intrinsic::vp_or: - case Intrinsic::vp_sdiv: - case Intrinsic::vp_shl: - case Intrinsic::vp_srem: - case Intrinsic::vp_sub: - case Intrinsic::vp_udiv: - case Intrinsic::vp_urem: - case Intrinsic::vp_xor: - // vp float arithmetic ops. - case Intrinsic::vp_fadd: - case Intrinsic::vp_fsub: - case Intrinsic::vp_fmul: - case Intrinsic::vp_fdiv: - case Intrinsic::vp_frem: { - std::optional FOp = - VPIntrinsic::getFunctionalOpcodeForVP(ICA.getID()); - assert(FOp.has_value()); - return getArithmeticInstrCost(*FOp, ICA.getReturnType(), CostKind); - break; - } - // vp int cast ops. - case Intrinsic::vp_trunc: - case Intrinsic::vp_zext: - case Intrinsic::vp_sext: - // vp float cast ops. - case Intrinsic::vp_fptoui: - case Intrinsic::vp_fptosi: - case Intrinsic::vp_uitofp: - case Intrinsic::vp_sitofp: - case Intrinsic::vp_fptrunc: - case Intrinsic::vp_fpext: { - std::optional FOp = - VPIntrinsic::getFunctionalOpcodeForVP(ICA.getID()); - assert(FOp.has_value() && !ICA.getArgTypes().empty()); - return getCastInstrCost(*FOp, RetTy, ICA.getArgTypes()[0], - TTI::CastContextHint::None, CostKind); - break; - } - - // vp compare - case Intrinsic::vp_icmp: - case Intrinsic::vp_fcmp: { - Intrinsic::ID IID = ICA.getID(); - std::optional FOp = VPIntrinsic::getFunctionalOpcodeForVP(IID); - // We can only handle vp_cmp intrinsics with underlying instructions. - if (!ICA.getInst()) - break; - - assert(FOp); - auto *UI = cast(ICA.getInst()); - return getCmpSelInstrCost(*FOp, ICA.getArgTypes()[0], ICA.getReturnType(), - UI->getPredicate(), CostKind); - } // vp load/store case Intrinsic::vp_load: case Intrinsic::vp_store: { @@ -1193,6 +1134,35 @@ RISCVTTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, CostKind); } + if (VPBinOpIntrinsic::isVPBinOp(ICA.getID())) { + std::optional FOp = + VPIntrinsic::getFunctionalOpcodeForVP(ICA.getID()); + assert(FOp.has_value()); + return getArithmeticInstrCost(*FOp, ICA.getReturnType(), CostKind); + } + + // vp cmp ops + if (VPCmpIntrinsic::isVPCmp(ICA.getID())) { + Intrinsic::ID IID = ICA.getID(); + std::optional FOp = VPIntrinsic::getFunctionalOpcodeForVP(IID); + // We can only handle vp_cmp intrinsics with underlying instructions. + if (ICA.getInst()) { + assert(FOp); + auto *UI = cast(ICA.getInst()); + return getCmpSelInstrCost(*FOp, ICA.getArgTypes()[0], ICA.getReturnType(), + UI->getPredicate(), CostKind); + } + } + + // vp cast ops + if (VPCastIntrinsic::isVPCast(ICA.getID())) { + std::optional FOp = + VPIntrinsic::getFunctionalOpcodeForVP(ICA.getID()); + assert(FOp.has_value() && !ICA.getArgTypes().empty()); + return getCastInstrCost(*FOp, RetTy, ICA.getArgTypes()[0], + TTI::CastContextHint::None, CostKind); + } + if (ST->hasVInstructions() && RetTy->isVectorTy()) { if (auto LT = getTypeLegalizationCost(RetTy); LT.second.isVector()) {