[llvm] [AArch64][CostModel] Model sve costs for ctpop (PR #192428)

David Green via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 17 00:56:32 PDT 2026


================
@@ -807,14 +807,37 @@ AArch64TTIImpl::getIntrinsicInstrCost(const IntrinsicCostAttributes &ICA,
         {ISD::CTPOP, MVT::v4i32, 3},
         {ISD::CTPOP, MVT::v8i16, 2},
         {ISD::CTPOP, MVT::v16i8, 1},
-        {ISD::CTPOP, MVT::i64,   4},
+        {ISD::CTPOP, MVT::i64, 4},
         {ISD::CTPOP, MVT::v2i32, 3},
         {ISD::CTPOP, MVT::v4i16, 2},
-        {ISD::CTPOP, MVT::v8i8,  1},
-        {ISD::CTPOP, MVT::i32,   5},
+        {ISD::CTPOP, MVT::v8i8, 1},
+        {ISD::CTPOP, MVT::i32, 5},
+        // SVE types (For targets that override NEON for fixed length vectors)
+        {ISD::CTPOP, MVT::nxv2i64, 2},
+        {ISD::CTPOP, MVT::nxv4i32, 2},
+        {ISD::CTPOP, MVT::nxv8i16, 1},
+        {ISD::CTPOP, MVT::nxv16i8, 1},
+        {ISD::CTPOP, MVT::nxv2i32, 2},
+        {ISD::CTPOP, MVT::nxv4i16, 2},
+        {ISD::CTPOP, MVT::nxv8i8, 1},
     };
     auto LT = getTypeLegalizationCost(RetTy);
     MVT MTy = LT.second;
+
+    // When SVE is available, fixed-length vector ctpop is lowered using SVE
+    // (useSVEForFixedLengthVectorVT with OverrideNEON=true), so look up the
+    // scalable equivalent type for accurate costing.
+    if (ST->isSVEorStreamingSVEAvailable() && MTy.isFixedLengthVector()) {
+      EVT ScalableVT = MVT::getScalableVectorVT(
+          MTy.getVectorElementType(),
+          MTy.is128BitVector()
+              ? 128 / MTy.getVectorElementType().getSizeInBits()
+              : 64 / MTy.getVectorElementType().getSizeInBits());
----------------
davemgreen wrote:

Why does this need to change the number of elements?

https://github.com/llvm/llvm-project/pull/192428


More information about the llvm-commits mailing list