Skip to content

Commit 1465e23

Browse files
authored
[RISCV][llvm] Handle ptr element type in lowerDeinterleaveIntrinsicToLoad and lowerInterleaveIntrinsicToStore (#107079)
Resolve #106970 currently it returns 0 fixed size for `ptr` element type. The `ptr` element size should depend on `XLen` which is 64 in riscv64 and 32 in riscv32 respectively.
1 parent abbcfff commit 1465e23

File tree

3 files changed

+45
-10
lines changed

3 files changed

+45
-10
lines changed

llvm/lib/Target/RISCV/RISCVISelLowering.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21980,10 +21980,10 @@ bool RISCVTargetLowering::lowerDeinterleaveIntrinsicToLoad(
2198021980

2198121981
VectorType *VTy = cast<VectorType>(DI->getOperand(0)->getType());
2198221982
VectorType *ResVTy = cast<VectorType>(DI->getType()->getContainedType(0));
21983+
const DataLayout &DL = LI->getDataLayout();
2198321984

2198421985
if (!isLegalInterleavedAccessType(ResVTy, Factor, LI->getAlign(),
21985-
LI->getPointerAddressSpace(),
21986-
LI->getDataLayout()))
21986+
LI->getPointerAddressSpace(), DL))
2198721987
return false;
2198821988

2198921989
Function *VlsegNFunc;
@@ -22005,7 +22005,7 @@ bool RISCVTargetLowering::lowerDeinterleaveIntrinsicToLoad(
2200522005
Intrinsic::riscv_vlseg6, Intrinsic::riscv_vlseg7,
2200622006
Intrinsic::riscv_vlseg8};
2200722007

22008-
unsigned SEW = ResVTy->getElementType()->getScalarSizeInBits();
22008+
unsigned SEW = DL.getTypeSizeInBits(ResVTy->getElementType());
2200922009
unsigned NumElts = ResVTy->getElementCount().getKnownMinValue();
2201022010
Type *VecTupTy = TargetExtType::get(
2201122011
LI->getContext(), "riscv.vector.tuple",
@@ -22051,10 +22051,10 @@ bool RISCVTargetLowering::lowerInterleaveIntrinsicToStore(
2205122051

2205222052
VectorType *VTy = cast<VectorType>(II->getType());
2205322053
VectorType *InVTy = cast<VectorType>(II->getOperand(0)->getType());
22054+
const DataLayout &DL = SI->getDataLayout();
2205422055

2205522056
if (!isLegalInterleavedAccessType(InVTy, Factor, SI->getAlign(),
22056-
SI->getPointerAddressSpace(),
22057-
SI->getDataLayout()))
22057+
SI->getPointerAddressSpace(), DL))
2205822058
return false;
2205922059

2206022060
Function *VssegNFunc;
@@ -22075,7 +22075,7 @@ bool RISCVTargetLowering::lowerInterleaveIntrinsicToStore(
2207522075
Intrinsic::riscv_vsseg6, Intrinsic::riscv_vsseg7,
2207622076
Intrinsic::riscv_vsseg8};
2207722077

22078-
unsigned SEW = InVTy->getElementType()->getScalarSizeInBits();
22078+
unsigned SEW = DL.getTypeSizeInBits(InVTy->getElementType());
2207922079
unsigned NumElts = InVTy->getElementCount().getKnownMinValue();
2208022080
Type *VecTupTy = TargetExtType::get(
2208122081
SI->getContext(), "riscv.vector.tuple",

llvm/test/CodeGen/RISCV/rvv/vector-deinterleave-load.ll

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zfh,+zvfh,+m | FileCheck %s
3-
; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zfh,+zvfh,+m | FileCheck %s
2+
; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zfh,+zvfh,+m | FileCheck --check-prefixes=CHECK,RV32 %s
3+
; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zfh,+zvfh,+m | FileCheck --check-prefixes=CHECK,RV64 %s
44

55
; Integers
66

@@ -263,9 +263,27 @@ define {<vscale x 2 x double>, <vscale x 2 x double>} @vector_deinterleave_load_
263263
ret {<vscale x 2 x double>, <vscale x 2 x double>} %retval
264264
}
265265

266+
define {<vscale x 2 x ptr>, <vscale x 2 x ptr>} @vector_deinterleave_load_nxv2p0_nxv4p0(ptr %p) {
267+
; RV32-LABEL: vector_deinterleave_load_nxv2p0_nxv4p0:
268+
; RV32: # %bb.0:
269+
; RV32-NEXT: vsetvli a1, zero, e32, m1, ta, ma
270+
; RV32-NEXT: vlseg2e32.v v8, (a0)
271+
; RV32-NEXT: ret
272+
;
273+
; RV64-LABEL: vector_deinterleave_load_nxv2p0_nxv4p0:
274+
; RV64: # %bb.0:
275+
; RV64-NEXT: vsetvli a1, zero, e64, m2, ta, ma
276+
; RV64-NEXT: vlseg2e64.v v8, (a0)
277+
; RV64-NEXT: ret
278+
%vec = load <vscale x 4 x ptr>, ptr %p
279+
%retval = call {<vscale x 2 x ptr>, <vscale x 2 x ptr>} @llvm.vector.deinterleave2.nxv4p0(<vscale x 4 x ptr> %vec)
280+
ret {<vscale x 2 x ptr>, <vscale x 2 x ptr>} %retval
281+
}
282+
266283
declare {<vscale x 2 x half>,<vscale x 2 x half>} @llvm.vector.deinterleave2.nxv4f16(<vscale x 4 x half>)
267284
declare {<vscale x 4 x half>, <vscale x 4 x half>} @llvm.vector.deinterleave2.nxv8f16(<vscale x 8 x half>)
268285
declare {<vscale x 2 x float>, <vscale x 2 x float>} @llvm.vector.deinterleave2.nxv4f32(<vscale x 4 x float>)
269286
declare {<vscale x 8 x half>, <vscale x 8 x half>} @llvm.vector.deinterleave2.nxv16f16(<vscale x 16 x half>)
270287
declare {<vscale x 4 x float>, <vscale x 4 x float>} @llvm.vector.deinterleave2.nxv8f32(<vscale x 8 x float>)
271288
declare {<vscale x 2 x double>, <vscale x 2 x double>} @llvm.vector.deinterleave2.nxv4f64(<vscale x 4 x double>)
289+
declare {<vscale x 2 x ptr>, <vscale x 2 x ptr>} @llvm.vector.deinterleave2.nxv4p0(<vscale x 4 x ptr>)

llvm/test/CodeGen/RISCV/rvv/vector-interleave-store.ll

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2-
; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zfh,+zvfh | FileCheck %s
3-
; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zfh,+zvfh | FileCheck %s
2+
; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+zfh,+zvfh | FileCheck --check-prefixes=CHECK,RV32 %s
3+
; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zfh,+zvfh | FileCheck --check-prefixes=CHECK,RV64 %s
44

55
; Integers
66

@@ -218,10 +218,27 @@ define void @vector_interleave_store_nxv4f64_nxv2f64(<vscale x 2 x double> %a, <
218218
ret void
219219
}
220220

221+
define void @vector_interleave_store_nxv4p0_nxv2p0(<vscale x 2 x ptr> %a, <vscale x 2 x ptr> %b, ptr %p) {
222+
; RV32-LABEL: vector_interleave_store_nxv4p0_nxv2p0:
223+
; RV32: # %bb.0:
224+
; RV32-NEXT: vsetvli a1, zero, e32, m1, ta, ma
225+
; RV32-NEXT: vsseg2e32.v v8, (a0)
226+
; RV32-NEXT: ret
227+
;
228+
; RV64-LABEL: vector_interleave_store_nxv4p0_nxv2p0:
229+
; RV64: # %bb.0:
230+
; RV64-NEXT: vsetvli a1, zero, e64, m2, ta, ma
231+
; RV64-NEXT: vsseg2e64.v v8, (a0)
232+
; RV64-NEXT: ret
233+
%res = call <vscale x 4 x ptr> @llvm.vector.interleave2.nxv4p0(<vscale x 2 x ptr> %a, <vscale x 2 x ptr> %b)
234+
store <vscale x 4 x ptr> %res, ptr %p
235+
ret void
236+
}
221237

222238
declare <vscale x 4 x half> @llvm.vector.interleave2.nxv4f16(<vscale x 2 x half>, <vscale x 2 x half>)
223239
declare <vscale x 8 x half> @llvm.vector.interleave2.nxv8f16(<vscale x 4 x half>, <vscale x 4 x half>)
224240
declare <vscale x 4 x float> @llvm.vector.interleave2.nxv4f32(<vscale x 2 x float>, <vscale x 2 x float>)
225241
declare <vscale x 16 x half> @llvm.vector.interleave2.nxv16f16(<vscale x 8 x half>, <vscale x 8 x half>)
226242
declare <vscale x 8 x float> @llvm.vector.interleave2.nxv8f32(<vscale x 4 x float>, <vscale x 4 x float>)
227243
declare <vscale x 4 x double> @llvm.vector.interleave2.nxv4f64(<vscale x 2 x double>, <vscale x 2 x double>)
244+
declare <vscale x 4 x ptr> @llvm.vector.interleave2.nxv4p0(<vscale x 2 x ptr>, <vscale x 2 x ptr>)

0 commit comments

Comments
 (0)