[llvm] [AArch64] Improve scalar and Neon popcount with SVE CNT. (PR #143870)
Paul Walker via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 25 09:33:44 PDT 2025
================
@@ -10630,6 +10630,34 @@ SDValue AArch64TargetLowering::LowerCTPOP_PARITY(SDValue Op,
if (VT == MVT::i32 && IsParity)
return SDValue();
+ if (Subtarget->isSVEorStreamingSVEAvailable()) {
+ assert((VT == MVT::i32 || VT == MVT::i64 || VT == MVT::i128) &&
+ "Unexpected type for custom ctpop lowering.");
+ if (VT == MVT::i32 || VT == MVT::i64) {
+ EVT ContainerVT = VT == MVT::i32 ? MVT::nxv4i32 : MVT::nxv2i64;
+ Val = DAG.getNode(ISD::INSERT_VECTOR_ELT, DL, ContainerVT,
+ DAG.getUNDEF(ContainerVT), Val,
+ DAG.getVectorIdxConstant(0, DL));
+ Val = DAG.getNode(ISD::CTPOP, DL, ContainerVT, Val);
+ Val = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, DL, VT, Val,
+ DAG.getVectorIdxConstant(0, DL));
+ } else if (VT == MVT::i128) {
+ Val = DAG.getNode(ISD::BITCAST, DL, MVT::v2i64, Val);
+ Val = convertToScalableVector(DAG, MVT::nxv2i64, Val);
+ Val = DAG.getNode(ISD::CTPOP, DL, MVT::nxv2i64, Val);
+ Val = convertFromScalableVector(DAG, MVT::v2i64, Val);
+ Val = DAG.getNode(ISD::VECREDUCE_ADD, DL, MVT::i64, Val);
+ Val = DAG.getZExtOrTrunc(Val, DL, VT);
+ } else
+ llvm_unreachable("Unexpected type!");
----------------
paulwalker-arm wrote:
Works for me.
https://github.com/llvm/llvm-project/pull/143870
More information about the llvm-commits
mailing list