From dd7aabf7c041f094ef2124bb5b8fe9434490d266 Mon Sep 17 00:00:00 2001 From: LiqinWeng Date: Tue, 26 Nov 2024 10:49:24 +0800 Subject: [PATCH] [TTI][RISCV] Deduplicate type-based VP costing of vpcmp/vpcast (#117520) Refered to: https://github.com/llvm/llvm-project/pull/115983 --- llvm/include/llvm/CodeGen/BasicTTIImpl.h | 15 +++++++++ .../Target/RISCV/RISCVTargetTransformInfo.cpp | 33 ------------------- 2 files changed, 15 insertions(+), 33 deletions(-) diff --git a/llvm/include/llvm/CodeGen/BasicTTIImpl.h b/llvm/include/llvm/CodeGen/BasicTTIImpl.h index d2fc40d8ae037ec..98cbb4886642bf9 100644 --- a/llvm/include/llvm/CodeGen/BasicTTIImpl.h +++ b/llvm/include/llvm/CodeGen/BasicTTIImpl.h @@ -1632,6 +1632,21 @@ class BasicTTIImplBase : public TargetTransformInfoImplCRTPBase { return thisT()->getArithmeticInstrCost(*FOp, ICA.getReturnType(), CostKind); } + if (VPCastIntrinsic::isVPCast(ICA.getID())) { + return thisT()->getCastInstrCost( + *FOp, ICA.getReturnType(), ICA.getArgTypes()[0], + TTI::CastContextHint::None, CostKind); + } + if (VPCmpIntrinsic::isVPCmp(ICA.getID())) { + // We can only handle vp_cmp intrinsics with underlying instructions. + if (ICA.getInst()) { + assert(FOp); + auto *UI = cast(ICA.getInst()); + return thisT()->getCmpSelInstrCost(*FOp, ICA.getArgTypes()[0], + ICA.getReturnType(), + UI->getPredicate(), CostKind); + } + } } std::optional FID = diff --git a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp index 017264fbd46e01a..ee4629edc1303af 100644 --- a/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp +++ b/llvm/lib/Target/RISCV/RISCVTargetTransformInfo.cpp @@ -1115,39 +1115,6 @@ RISCVTTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA, 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); - } case Intrinsic::vp_select: { Intrinsic::ID IID = ICA.getID(); std::optional FOp = VPIntrinsic::getFunctionalOpcodeForVP(IID);