diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 7da074e055a77..6ee6ec15c602c 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -20040,11 +20040,12 @@ Value *RISCVTargetLowering::emitMaskedAtomicCmpXchgIntrinsic( bool RISCVTargetLowering::shouldRemoveExtendFromGSIndex(SDValue Extend, EVT DataVT) const { - // We have indexed loads for all legal index types. Indices are always - // zero extended + // We have indexed loads for all supported EEW types. Indices are always + // zero extended. return Extend.getOpcode() == ISD::ZERO_EXTEND && - isTypeLegal(Extend.getValueType()) && - isTypeLegal(Extend.getOperand(0).getValueType()); + isTypeLegal(Extend.getValueType()) && + isTypeLegal(Extend.getOperand(0).getValueType()) && + Extend.getOperand(0).getValueType().getVectorElementType() != MVT::i1; } bool RISCVTargetLowering::shouldConvertFpToSat(unsigned Op, EVT FPVT, diff --git a/llvm/test/CodeGen/RISCV/rvv/mgather-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/mgather-sdnode.ll index 07dcddd9c6860..f3ae03af7c786 100644 --- a/llvm/test/CodeGen/RISCV/rvv/mgather-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/mgather-sdnode.ll @@ -2153,3 +2153,19 @@ define @mgather_baseidx_nxv32i8(ptr %base, %v = call @llvm.masked.gather.nxv32i8.nxv32p0( %ptrs, i32 2, %m, %passthru) ret %v } + +define @mgather_baseidx_zext_nxv1i1_nxv1i8(ptr %base, %idxs, %m, %passthru) { +; CHECK-LABEL: mgather_baseidx_zext_nxv1i1_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, mu +; CHECK-NEXT: vmv.v.i v10, 0 +; CHECK-NEXT: vmerge.vim v10, v10, 1, v0 +; CHECK-NEXT: vmv1r.v v0, v8 +; CHECK-NEXT: vluxei8.v v9, (a0), v10, v0.t +; CHECK-NEXT: vmv1r.v v8, v9 +; CHECK-NEXT: ret + %eidxs = zext %idxs to + %ptrs = getelementptr inbounds i8, ptr %base, %eidxs + %v = call @llvm.masked.gather.nxv1i8.nxv1p0( %ptrs, i32 1, %m, %passthru) + ret %v +} diff --git a/llvm/test/CodeGen/RISCV/rvv/mscatter-sdnode.ll b/llvm/test/CodeGen/RISCV/rvv/mscatter-sdnode.ll index dc67c64f3ffda..652e7a128a960 100644 --- a/llvm/test/CodeGen/RISCV/rvv/mscatter-sdnode.ll +++ b/llvm/test/CodeGen/RISCV/rvv/mscatter-sdnode.ll @@ -1831,3 +1831,18 @@ define void @mscatter_baseidx_nxv16i16_nxv16f64( %val0, %v1, %ptrs, i32 8, %m) ret void } + +define void @mscatter_baseidx_zext_nxv1i1_nxv1i8( %val, ptr %base, %idxs, %m) { +; CHECK-LABEL: mscatter_baseidx_zext_nxv1i1_nxv1i8: +; CHECK: # %bb.0: +; CHECK-NEXT: vsetvli a1, zero, e8, mf8, ta, ma +; CHECK-NEXT: vmv.v.i v10, 0 +; CHECK-NEXT: vmerge.vim v10, v10, 1, v0 +; CHECK-NEXT: vmv1r.v v0, v9 +; CHECK-NEXT: vsoxei8.v v8, (a0), v10, v0.t +; CHECK-NEXT: ret + %eidxs = zext %idxs to + %ptrs = getelementptr inbounds i8, ptr %base, %eidxs + call void @llvm.masked.scatter.nxv1i8.nxv1p0( %val, %ptrs, i32 1, %m) + ret void +}