Skip to content

Commit 83ae1d6

Browse files
authored
[Backport to 16] Fix OpTypeBufferSurfaceINTEL translation for opaque pointers (#3076)
It should be a target extension type. Signed-off-by: Sidorov, Dmitry <[email protected]>
1 parent 1d46c5b commit 83ae1d6

File tree

2 files changed

+31
-33
lines changed

2 files changed

+31
-33
lines changed

lib/SPIRV/SPIRVReader.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -453,16 +453,21 @@ Type *SPIRVToLLVM::transType(SPIRVType *T, bool UseTPT) {
453453
VT->getDescriptor(), getAccessQualifier(VT), !UseTPT));
454454
}
455455
case OpTypeBufferSurfaceINTEL: {
456-
auto PST = static_cast<SPIRVTypeBufferSurfaceINTEL *>(T);
457-
Type *StructTy = getOrCreateOpaqueStructType(M, transVCTypeName(PST));
458-
Type *PointerTy;
459-
if (UseTPT)
460-
PointerTy = TypedPointerType::get(StructTy, SPIRAS_Global);
461-
else
462-
PointerTy = PointerType::get(StructTy, SPIRAS_Global);
463-
return mapType(T, PointerTy);
456+
auto *PST = static_cast<SPIRVTypeBufferSurfaceINTEL *>(T);
457+
Type *Ty = nullptr;
458+
if (UseTPT) {
459+
Type *StructTy = getOrCreateOpaqueStructType(M, transVCTypeName(PST));
460+
Ty = TypedPointerType::get(StructTy, SPIRAS_Global);
461+
} else {
462+
std::vector<unsigned> Params;
463+
if (PST->hasAccessQualifier()) {
464+
unsigned Access = static_cast<unsigned>(PST->getAccessQualifier());
465+
Params.push_back(Access);
466+
}
467+
Ty = TargetExtType::get(*Context, "spirv.BufferSurfaceINTEL", {}, Params);
468+
}
469+
return mapType(T, Ty);
464470
}
465-
466471
case internal::OpTypeJointMatrixINTEL: {
467472
auto *MT = static_cast<SPIRVTypeJointMatrixINTEL *>(T);
468473
auto R = static_cast<SPIRVConstant *>(MT->getRows())->getZExtIntValue();

test/extensions/INTEL/SPV_INTEL_vector_compute/buffer_surface_intel.ll

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
11
; RUN: llvm-as -opaque-pointers=0 %s -o %t.bc
22
; RUN: llvm-spirv %t.bc -opaque-pointers=0 -o %t.spv --spirv-ext=+SPV_INTEL_vector_compute --spirv-allow-unknown-intrinsics
33
; RUN: llvm-spirv %t.spv -o %t.spt --to-text
4-
; RUN: llvm-spirv -r %t.spv -o %t.bc
5-
; RUN: llvm-dis -opaque-pointers=0 %t.bc -o %t.ll
4+
; RUN: llvm-spirv -r %t.spv -o %t.bc --spirv-target-env=SPV-IR -emit-opaque-pointers
5+
; RUN: llvm-dis %t.bc -o %t.ll
66
; RUN: FileCheck %s --input-file %t.spt -check-prefix=SPV
77
; RUN: FileCheck %s --input-file %t.ll -check-prefix=LLVM
88

99
target triple = "spir"
1010

11-
; LLVM-DAG: %intel.buffer_ro_t = type opaque
12-
; LLVM-DAG: %intel.buffer_wo_t = type opaque
13-
; LLVM-DAG: %intel.buffer_rw_t = type opaque
14-
; LLVM-DAG: %opencl.image1d_rw_t = type opaque
15-
; LLVM-DAG: %opencl.image1d_buffer_wo_t = type opaque
16-
; LLVM-DAG: %opencl.image2d_wo_t = type opaque
17-
; LLVM-DAG: %opencl.image3d_ro_t = type opaque
1811
%intel.buffer_ro_t = type opaque
1912
%intel.buffer_wo_t = type opaque
2013
%intel.buffer_rw_t = type opaque
@@ -23,13 +16,13 @@ target triple = "spir"
2316
%opencl.image2d_wo_t = type opaque
2417
%opencl.image3d_ro_t = type opaque
2518

26-
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_ro_t(%intel.buffer_ro_t addrspace(1)*)
27-
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_wo_t(%intel.buffer_wo_t addrspace(1)*)
28-
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_rw_t(%intel.buffer_rw_t addrspace(1)*)
29-
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image1d_rw_t(%opencl.image1d_rw_t addrspace(1)*)
30-
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image1d_buffer_wo_t(%opencl.image1d_buffer_wo_t addrspace(1)*)
31-
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image2d_wo_t(%opencl.image2d_wo_t addrspace(1)*)
32-
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image3d_ro_t(%opencl.image3d_ro_t addrspace(1)*)
19+
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_ro_t(target("spirv.BufferSurfaceINTEL", 0))
20+
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_wo_t(target("spirv.BufferSurfaceINTEL", 1))
21+
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_rw_t(target("spirv.BufferSurfaceINTEL", 2))
22+
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image1d_rw_t(target("spirv.Image", void, 0, 0, 0, 0, 0, 0, 2))
23+
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image1d_buffer_wo_t(target("spirv.Image", void, 5, 0, 0, 0, 0, 0, 1))
24+
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image2d_wo_t(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 1))
25+
; LLVM-DAG: declare i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image3d_ro_t(target("spirv.Image", void, 2, 0, 0, 0, 0, 0, 0))
3326

3427
declare i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_ro_t(%intel.buffer_ro_t addrspace(1)*)
3528
declare i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_wo_t(%intel.buffer_wo_t addrspace(1)*)
@@ -57,16 +50,16 @@ declare i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image3d_ro_t(%opencl.image
5750
; SPV-DAG: TypeFunction {{[0-9]+}} [[INT]] [[IMAGE3D_RO]]{{(^|[^0-9])}}
5851
; SPV-DAG: TypeFunction {{[0-9]+}} [[VOID]] [[BUFRO]] [[BUFWO]] [[BUFRW]] [[IMAGE1D_RW]] [[IMAGE1D_BUF_WO]] [[IMAGE2D_WO]] [[IMAGE3D_RO]]{{(^|[^0-9])}}
5952

60-
; LLVM-DAG: define spir_kernel void @test(%intel.buffer_ro_t addrspace(1)* %buf_ro, %intel.buffer_wo_t addrspace(1)* %buf_wo, %intel.buffer_rw_t addrspace(1)* %buf_rw, %opencl.image1d_rw_t addrspace(1)* %im1d, %opencl.image1d_buffer_wo_t addrspace(1)* %im1db, %opencl.image2d_wo_t addrspace(1)* %im2d, %opencl.image3d_ro_t addrspace(1)* %im3d)
53+
; LLVM-DAG: define spir_kernel void @test(target("spirv.BufferSurfaceINTEL", 0) %buf_ro, target("spirv.BufferSurfaceINTEL", 1) %buf_wo, target("spirv.BufferSurfaceINTEL", 2) %buf_rw, target("spirv.Image", void, 0, 0, 0, 0, 0, 0, 2) %im1d, target("spirv.Image", void, 5, 0, 0, 0, 0, 0, 1) %im1db, target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 1) %im2d, target("spirv.Image", void, 2, 0, 0, 0, 0, 0, 0) %im3d)
6154
define spir_kernel void @test(%intel.buffer_ro_t addrspace(1)* %buf_ro, %intel.buffer_wo_t addrspace(1)* %buf_wo, %intel.buffer_rw_t addrspace(1)* %buf_rw, %opencl.image1d_rw_t addrspace(1)* %im1d, %opencl.image1d_buffer_wo_t addrspace(1)* %im1db, %opencl.image2d_wo_t addrspace(1)* %im2d, %opencl.image3d_ro_t addrspace(1)* %im3d) #0 {
6255
entry:
63-
; LLVM: %0 = call i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_ro_t(%intel.buffer_ro_t addrspace(1)* %buf_ro)
64-
; LLVM: %1 = call i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_wo_t(%intel.buffer_wo_t addrspace(1)* %buf_wo)
65-
; LLVM: %2 = call i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_rw_t(%intel.buffer_rw_t addrspace(1)* %buf_rw)
66-
; LLVM: %3 = call i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image1d_rw_t(%opencl.image1d_rw_t addrspace(1)* %im1d)
67-
; LLVM: %4 = call i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image1d_buffer_wo_t(%opencl.image1d_buffer_wo_t addrspace(1)* %im1db)
68-
; LLVM: %5 = call i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image2d_wo_t(%opencl.image2d_wo_t addrspace(1)* %im2d)
69-
; LLVM: %6 = call i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image3d_ro_t(%opencl.image3d_ro_t addrspace(1)* %im3d)
56+
; LLVM: %0 = call i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_ro_t(target("spirv.BufferSurfaceINTEL", 0) %buf_ro)
57+
; LLVM: %1 = call i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_wo_t(target("spirv.BufferSurfaceINTEL", 1) %buf_wo)
58+
; LLVM: %2 = call i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_rw_t(target("spirv.BufferSurfaceINTEL", 2) %buf_rw)
59+
; LLVM: %3 = call i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image1d_rw_t(target("spirv.Image", void, 0, 0, 0, 0, 0, 0, 2) %im1d)
60+
; LLVM: %4 = call i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image1d_buffer_wo_t(target("spirv.Image", void, 5, 0, 0, 0, 0, 0, 1) %im1db)
61+
; LLVM: %5 = call i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image2d_wo_t(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 1) %im2d)
62+
; LLVM: %6 = call i32 @llvm.some.unknown.intrinsic.i32.p1opencl.image3d_ro_t(target("spirv.Image", void, 2, 0, 0, 0, 0, 0, 0) %im3d)
7063
; LLVM: ret void
7164
%0 = call i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_ro_t(%intel.buffer_ro_t addrspace(1)* %buf_ro)
7265
%1 = call i32 @llvm.some.unknown.intrinsic.i32.p1intel.buffer_wo_t(%intel.buffer_wo_t addrspace(1)* %buf_wo)

0 commit comments

Comments
 (0)