[llvm] [AArch64] Use dupq (SVE2.1) for segmented lane splats (PR #144482)

Paul Walker via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 17 08:33:00 PDT 2025


================
@@ -30013,6 +30037,19 @@ SDValue AArch64TargetLowering::LowerFixedLengthVECTOR_SHUFFLEToSVE(
       return convertFromScalableVector(
           DAG, VT, DAG.getNode(Opc, DL, ContainerVT, Op1, Op1));
     }
+
+    if (Subtarget->hasSVE2p1()) {
+      if (std::optional<unsigned> Lane = isDUPQMask(ShuffleMask, VT)) {
+        SDValue IID =
+            DAG.getConstant(Intrinsic::aarch64_sve_dup_laneq, DL, MVT::i64);
+        return convertFromScalableVector(
+            DAG, VT,
+            DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, {ContainerVT, MVT::i64},
+                        {IID, Op1,
+                         DAG.getConstant(*Lane, DL, MVT::i64,
+                                         /*isTarget=*/true)}));
----------------
paulwalker-arm wrote:

`getNode()`'s third parameter is the result type? Does `aarch64_sve_dup_laneq` return two results?

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


More information about the llvm-commits mailing list