diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -4871,24 +4871,38 @@ PassThru = MLoad->getPassThru(); } + bool IsUnmasked = ISD::isConstantSplatVectorAllOnes(Mask.getNode()); + MVT XLenVT = Subtarget.getXLenVT(); MVT ContainerVT = VT; if (VT.isFixedLengthVector()) { ContainerVT = getContainerForFixedLengthVector(VT); - MVT MaskVT = MVT::getVectorVT(MVT::i1, ContainerVT.getVectorElementCount()); - - Mask = convertToScalableVector(MaskVT, Mask, DAG, Subtarget); PassThru = convertToScalableVector(ContainerVT, PassThru, DAG, Subtarget); + if (!IsUnmasked) { + MVT MaskVT = + MVT::getVectorVT(MVT::i1, ContainerVT.getVectorElementCount()); + Mask = convertToScalableVector(MaskVT, Mask, DAG, Subtarget); + } } if (!VL) VL = getDefaultVLOps(VT, ContainerVT, DL, DAG, Subtarget).second; + unsigned IntID = + IsUnmasked ? Intrinsic::riscv_vle : Intrinsic::riscv_vle_mask; + SmallVector Ops{Chain, DAG.getTargetConstant(IntID, DL, XLenVT)}; + if (!IsUnmasked) + Ops.push_back(PassThru); + Ops.push_back(BasePtr); + if (!IsUnmasked) + Ops.push_back(Mask); + Ops.push_back(VL); + if (!IsUnmasked) + Ops.push_back(DAG.getTargetConstant(RISCVII::TAIL_AGNOSTIC, DL, XLenVT)); + SDVTList VTs = DAG.getVTList({ContainerVT, MVT::Other}); - SDValue IntID = DAG.getTargetConstant(Intrinsic::riscv_vle_mask, DL, XLenVT); - SDValue Policy = DAG.getTargetConstant(RISCVII::TAIL_AGNOSTIC, DL, XLenVT); - SDValue Ops[] = {Chain, IntID, PassThru, BasePtr, Mask, VL, Policy}; + SDValue Result = DAG.getMemIntrinsicNode(ISD::INTRINSIC_W_CHAIN, DL, VTs, Ops, MemVT, MMO); Chain = Result.getValue(1); diff --git a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vpload.ll b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vpload.ll --- a/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vpload.ll +++ b/llvm/test/CodeGen/RISCV/rvv/fixed-vectors-vpload.ll @@ -31,10 +31,8 @@ define <4 x i8> @vpload_v4i8_allones_mask(<4 x i8>* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_v4i8_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e8, mf4, ta, mu -; CHECK-NEXT: vle8.v v8, (a0), v0.t +; CHECK-NEXT: vle8.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement <4 x i1> undef, i1 true, i32 0 %b = shufflevector <4 x i1> %a, <4 x i1> poison, <4 x i32> zeroinitializer @@ -93,10 +91,8 @@ define <8 x i16> @vpload_v8i16_allones_mask(<8 x i16>* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_v8i16_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e16, m1, ta, mu -; CHECK-NEXT: vle16.v v8, (a0), v0.t +; CHECK-NEXT: vle16.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement <8 x i1> undef, i1 true, i32 0 %b = shufflevector <8 x i1> %a, <8 x i1> poison, <8 x i32> zeroinitializer @@ -143,10 +139,8 @@ define <8 x i32> @vpload_v8i32_allones_mask(<8 x i32>* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_v8i32_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, mu -; CHECK-NEXT: vle32.v v8, (a0), v0.t +; CHECK-NEXT: vle32.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement <8 x i1> undef, i1 true, i32 0 %b = shufflevector <8 x i1> %a, <8 x i1> poison, <8 x i32> zeroinitializer @@ -181,10 +175,8 @@ define <4 x i64> @vpload_v4i64_allones_mask(<4 x i64>* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_v4i64_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e64, m2, ta, mu -; CHECK-NEXT: vle64.v v8, (a0), v0.t +; CHECK-NEXT: vle64.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement <4 x i1> undef, i1 true, i32 0 %b = shufflevector <4 x i1> %a, <4 x i1> poison, <4 x i32> zeroinitializer @@ -219,10 +211,8 @@ define <2 x half> @vpload_v2f16_allones_mask(<2 x half>* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_v2f16_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetivli zero, 2, e8, mf8, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e16, mf4, ta, mu -; CHECK-NEXT: vle16.v v8, (a0), v0.t +; CHECK-NEXT: vle16.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement <2 x i1> undef, i1 true, i32 0 %b = shufflevector <2 x i1> %a, <2 x i1> poison, <2 x i32> zeroinitializer @@ -293,10 +283,8 @@ define <8 x float> @vpload_v8f32_allones_mask(<8 x float>* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_v8f32_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetivli zero, 8, e8, mf2, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, mu -; CHECK-NEXT: vle32.v v8, (a0), v0.t +; CHECK-NEXT: vle32.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement <8 x i1> undef, i1 true, i32 0 %b = shufflevector <8 x i1> %a, <8 x i1> poison, <8 x i32> zeroinitializer @@ -331,10 +319,8 @@ define <4 x double> @vpload_v4f64_allones_mask(<4 x double>* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_v4f64_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetivli zero, 4, e8, mf4, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e64, m2, ta, mu -; CHECK-NEXT: vle64.v v8, (a0), v0.t +; CHECK-NEXT: vle64.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement <4 x i1> undef, i1 true, i32 0 %b = shufflevector <4 x i1> %a, <4 x i1> poison, <4 x i32> zeroinitializer diff --git a/llvm/test/CodeGen/RISCV/rvv/vpload.ll b/llvm/test/CodeGen/RISCV/rvv/vpload.ll --- a/llvm/test/CodeGen/RISCV/rvv/vpload.ll +++ b/llvm/test/CodeGen/RISCV/rvv/vpload.ll @@ -19,10 +19,8 @@ define @vpload_nxv1i8_allones_mask(* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_nxv1i8_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a2, zero, e8, mf8, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e8, mf8, ta, mu -; CHECK-NEXT: vle8.v v8, (a0), v0.t +; CHECK-NEXT: vle8.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement undef, i1 true, i32 0 %b = shufflevector %a, poison, zeroinitializer @@ -69,10 +67,8 @@ define @vpload_nxv8i8_allones_mask(* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_nxv8i8_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a2, zero, e8, m1, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e8, m1, ta, mu -; CHECK-NEXT: vle8.v v8, (a0), v0.t +; CHECK-NEXT: vle8.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement undef, i1 true, i32 0 %b = shufflevector %a, poison, zeroinitializer @@ -107,10 +103,8 @@ define @vpload_nxv2i16_allones_mask(* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_nxv2i16_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a2, zero, e8, mf4, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, mu -; CHECK-NEXT: vle16.v v8, (a0), v0.t +; CHECK-NEXT: vle16.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement undef, i1 true, i32 0 %b = shufflevector %a, poison, zeroinitializer @@ -181,10 +175,8 @@ define @vpload_nxv4i32_allones_mask(* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_nxv4i32_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a2, zero, e8, mf2, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e32, m2, ta, mu -; CHECK-NEXT: vle32.v v8, (a0), v0.t +; CHECK-NEXT: vle32.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement undef, i1 true, i32 0 %b = shufflevector %a, poison, zeroinitializer @@ -219,10 +211,8 @@ define @vpload_nxv1i64_allones_mask(* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_nxv1i64_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a2, zero, e8, mf8, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e64, m1, ta, mu -; CHECK-NEXT: vle64.v v8, (a0), v0.t +; CHECK-NEXT: vle64.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement undef, i1 true, i32 0 %b = shufflevector %a, poison, zeroinitializer @@ -293,10 +283,8 @@ define @vpload_nxv2f16_allones_mask(* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_nxv2f16_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a2, zero, e8, mf4, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e16, mf2, ta, mu -; CHECK-NEXT: vle16.v v8, (a0), v0.t +; CHECK-NEXT: vle16.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement undef, i1 true, i32 0 %b = shufflevector %a, poison, zeroinitializer @@ -379,10 +367,8 @@ define @vpload_nxv8f32_allones_mask(* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_nxv8f32_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a2, zero, e8, m1, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e32, m4, ta, mu -; CHECK-NEXT: vle32.v v8, (a0), v0.t +; CHECK-NEXT: vle32.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement undef, i1 true, i32 0 %b = shufflevector %a, poison, zeroinitializer @@ -429,10 +415,8 @@ define @vpload_nxv4f64_allones_mask(* %ptr, i32 zeroext %evl) { ; CHECK-LABEL: vpload_nxv4f64_allones_mask: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli a2, zero, e8, mf2, ta, mu -; CHECK-NEXT: vmset.m v0 ; CHECK-NEXT: vsetvli zero, a1, e64, m4, ta, mu -; CHECK-NEXT: vle64.v v8, (a0), v0.t +; CHECK-NEXT: vle64.v v8, (a0) ; CHECK-NEXT: ret %a = insertelement undef, i1 true, i32 0 %b = shufflevector %a, poison, zeroinitializer