[llvm] [LLVM][CodeGen][SVE] Lower to multivector stores (PR #207397)
Benjamin Maxwell via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 15 04:28:31 PDT 2026
================
@@ -31366,91 +31509,10 @@ void AArch64TargetLowering::ReplaceNodeResults(
return;
}
- LSBaseSDNode *LSNode = dyn_cast<LSBaseSDNode>(N);
- if (LSNode && LSNode->isSimple() && LSNode->isUnindexed() &&
- LSNode->getValueType(0).isScalableVector() &&
- N->getValueType(0).isSimple() && N->getValueType(0) == MemVT) {
- MVT VT = N->getValueType(0).getSimpleVT();
-
- unsigned IntID;
- switch (VT.SimpleTy) {
- default:
- return;
- case MVT::nxv32i8:
- case MVT::nxv16i16:
- case MVT::nxv8i32:
- case MVT::nxv4i64:
- case MVT::nxv16f16:
- case MVT::nxv8f32:
- case MVT::nxv4f64:
- case MVT::nxv16bf16:
- IntID = Intrinsic::aarch64_sve_ld1_pn_x2;
- break;
- case MVT::nxv64i8:
- case MVT::nxv32i16:
- case MVT::nxv16i32:
- case MVT::nxv8i64:
- case MVT::nxv32f16:
- case MVT::nxv16f32:
- case MVT::nxv8f64:
- case MVT::nxv32bf16:
- IntID = Intrinsic::aarch64_sve_ld1_pn_x4;
- break;
- }
-
- unsigned PredIntID;
- switch (VT.getScalarSizeInBits()) {
- default:
- llvm_unreachable("covered by previous switch");
- case 8:
- PredIntID = Intrinsic::aarch64_sve_ptrue_c8;
- break;
- case 16:
- PredIntID = Intrinsic::aarch64_sve_ptrue_c16;
- break;
- case 32:
- PredIntID = Intrinsic::aarch64_sve_ptrue_c32;
- break;
- case 64:
- PredIntID = Intrinsic::aarch64_sve_ptrue_c64;
- break;
- }
-
- SDValue Chain = LSNode->getChain();
- SDValue Addr = LSNode->getBasePtr();
-
- if (!LSNode->getOffset().isUndef())
- return;
-
- SDLoc DL(N);
- SDValue PNg =
- DAG.getNode(ISD::INTRINSIC_WO_CHAIN, DL, MVT::aarch64svcount,
- DAG.getConstant(PredIntID, DL, MVT::i64));
-
- if (IntID == Intrinsic::aarch64_sve_ld1_pn_x2) {
- MVT RegVT = VT.getHalfNumVectorElementsVT();
- SDValue NewLoad = DAG.getNode(
- ISD::INTRINSIC_W_CHAIN, DL, {RegVT, RegVT, MVT::Other},
- {Chain, DAG.getConstant(IntID, DL, MVT::i64), PNg, Addr});
- Results.push_back(
- DAG.getNode(ISD::CONCAT_VECTORS, DL, VT,
- {NewLoad.getValue(0), NewLoad.getValue(1)}));
- Results.push_back(NewLoad.getValue(2) /* Chain */);
- return;
- }
-
- assert(IntID == Intrinsic::aarch64_sve_ld1_pn_x4);
- MVT RegVT = VT.getHalfNumVectorElementsVT().getHalfNumVectorElementsVT();
- SDValue NewLoad = DAG.getNode(
- ISD::INTRINSIC_W_CHAIN, DL, {RegVT, RegVT, RegVT, RegVT, MVT::Other},
- {Chain, DAG.getConstant(IntID, DL, MVT::i64), PNg, Addr});
- Results.push_back(
- DAG.getNode(ISD::CONCAT_VECTORS, DL, VT,
- {NewLoad.getValue(0), NewLoad.getValue(1),
- NewLoad.getValue(2), NewLoad.getValue(3)}));
- Results.push_back(NewLoad.getValue(4) /* Chain */);
- return;
- }
+ if (auto *Load = dyn_cast<LoadSDNode>(N))
+ if (EnableSveMultiVectorLowering)
----------------
MacDue wrote:
I don't think it makes sense to generally disable the multi-vector load/stores by default. I don't think there's any issues with the loads. For the stores there's only an issue with +sme2 as that adds the strided form, otherwise those are fine too.
https://github.com/llvm/llvm-project/pull/207397
More information about the llvm-commits
mailing list