diff --git a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp index 134d82d84b237..62122453a27c6 100644 --- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp @@ -23350,6 +23350,11 @@ bool RISCVTargetLowering::isLegalInterleavedAccessType( MVT ContainerVT = VT.getSimpleVT(); + // The intrinsics are not (yet) overloaded on pointer type and can only handle + // the default address space. + if (AddrSpace) + return false; + if (auto *FVTy = dyn_cast(VTy)) { if (!Subtarget.useRVVForFixedLengthVectors()) return false; @@ -23359,11 +23364,6 @@ bool RISCVTargetLowering::isLegalInterleavedAccessType( return false; ContainerVT = getContainerForFixedLengthVector(VT.getSimpleVT()); - } else { - // The intrinsics for scalable vectors are not overloaded on pointer type - // and can only handle the default address space. - if (AddrSpace) - return false; } // Need to make sure that EMUL * NFIELDS ≤ 8 diff --git a/llvm/test/Transforms/InterleavedAccess/RISCV/addrspace.ll b/llvm/test/Transforms/InterleavedAccess/RISCV/addrspace.ll new file mode 100644 index 0000000000000..d971892a479b6 --- /dev/null +++ b/llvm/test/Transforms/InterleavedAccess/RISCV/addrspace.ll @@ -0,0 +1,34 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 +; RUN: opt < %s -mtriple=riscv64 -mattr=+v -p interleaved-access -S | FileCheck %s + +; Ensure we don't crash with non-zero address spaces. + +define void @load_factor2(ptr addrspace(1) %ptr) { +; CHECK-LABEL: define void @load_factor2( +; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0:[0-9]+]] { +; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = load <16 x i32>, ptr addrspace(1) [[PTR]], align 64 +; CHECK-NEXT: [[V0:%.*]] = shufflevector <16 x i32> [[INTERLEAVED_VEC]], <16 x i32> poison, <8 x i32> +; CHECK-NEXT: [[V1:%.*]] = shufflevector <16 x i32> [[INTERLEAVED_VEC]], <16 x i32> poison, <8 x i32> +; CHECK-NEXT: ret void +; + %interleaved.vec = load <16 x i32>, ptr addrspace(1) %ptr + %v0 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <8 x i32> + %v1 = shufflevector <16 x i32> %interleaved.vec, <16 x i32> poison, <8 x i32> + ret void +} + +define void @load_factor2_vscale(ptr addrspace(1) %ptr) { +; CHECK-LABEL: define void @load_factor2_vscale( +; CHECK-SAME: ptr addrspace(1) [[PTR:%.*]]) #[[ATTR0]] { +; CHECK-NEXT: [[INTERLEAVED_VEC:%.*]] = load , ptr addrspace(1) [[PTR]], align 64 +; CHECK-NEXT: [[V:%.*]] = call { , } @llvm.vector.deinterleave2.nxv16i32( [[INTERLEAVED_VEC]]) +; CHECK-NEXT: [[T0:%.*]] = extractvalue { , } [[V]], 0 +; CHECK-NEXT: [[T1:%.*]] = extractvalue { , } [[V]], 1 +; CHECK-NEXT: ret void +; + %interleaved.vec = load , ptr addrspace(1) %ptr + %v = call { , } @llvm.vector.deinterleave2.nxv16i32( %interleaved.vec) + %t0 = extractvalue { , } %v, 0 + %t1 = extractvalue { , } %v, 1 + ret void +}