Skip to content

Commit e5ad7e0

Browse files
committed
Add image array conversion in spirv adaptors
1 parent b1db3e5 commit e5ad7e0

File tree

5 files changed

+111
-0
lines changed

5 files changed

+111
-0
lines changed

GenXIntrinsics/lib/GenXIntrinsics/AdaptorsCommon.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ static constexpr const char Buffer[] = "buffer_t";
2929
static constexpr const char SVM[] = "svmptr_t";
3030
static constexpr const char Sampler[] = "sampler_t";
3131
static constexpr const char Image1d[] = "image1d_t";
32+
static constexpr const char Image1dArray[] = "image1d_array_t";
3233
static constexpr const char Image1dBuffer[] = "image1d_buffer_t";
3334
static constexpr const char Image2d[] = "image2d_t";
35+
static constexpr const char Image2dArray[] = "image2d_array_t";
3436
static constexpr const char Image3d[] = "image3d_t";
3537
} // namespace ArgDesc
3638

@@ -41,8 +43,10 @@ enum class SPIRVType {
4143
// Surfaces + corresponding desc.
4244
Buffer,
4345
Image1d,
46+
Image1dArray,
4447
Image1dBuffer,
4548
Image2d,
49+
Image2dArray,
4650
Image3d,
4751
// Sampler + sampler_t.
4852
Sampler,
@@ -77,8 +81,10 @@ static constexpr const char TypePrefix[] = "opencl.";
7781
// Currently used image types.
7882
static constexpr const char Image[] = "image";
7983
static constexpr const char Dim1d[] = "1d";
84+
static constexpr const char Dim1dArray[] = "1d_array";
8085
static constexpr const char Dim1dBuffer[] = "1d_buffer";
8186
static constexpr const char Dim2d[] = "2d";
87+
static constexpr const char Dim2dArray[] = "2d_array";
8288
static constexpr const char Dim3d[] = "3d";
8389
// Sampler type.
8490
static constexpr const char Sampler[] = "sampler";
@@ -124,8 +130,10 @@ inline unsigned getOpaqueTypeAddressSpace(SPIRVType Ty) {
124130
return SPIRVParams::SPIRVConstantAS;
125131
case SPIRVType::Buffer:
126132
case SPIRVType::Image1d:
133+
case SPIRVType::Image1dArray:
127134
case SPIRVType::Image1dBuffer:
128135
case SPIRVType::Image2d:
136+
case SPIRVType::Image2dArray:
129137
case SPIRVType::Image3d:
130138
return SPIRVParams::SPIRVGlobalAS;
131139
default:

GenXIntrinsics/lib/GenXIntrinsics/GenXSPIRVReaderAdaptor.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,15 @@ static std::pair<SPIRVType, StringRef> parseImageDim(StringRef TyName) {
6767
if (TyName.consume_front(OCLTypes::Dim1dBuffer))
6868
return {SPIRVType::Image1dBuffer, TyName};
6969

70+
if (TyName.consume_front(OCLTypes::Dim1dArray))
71+
return {SPIRVType::Image1dArray, TyName};
72+
7073
if (TyName.consume_front(OCLTypes::Dim1d))
7174
return {SPIRVType::Image1d, TyName};
7275

76+
if (TyName.consume_front(OCLTypes::Dim2dArray))
77+
return {SPIRVType::Image2dArray, TyName};
78+
7379
if (TyName.consume_front(OCLTypes::Dim2d))
7480
return {SPIRVType::Image2d, TyName};
7581

@@ -221,8 +227,10 @@ static ArgKind mapSPIRVTypeToArgKind(SPIRVType Ty) {
221227
switch (Ty) {
222228
case SPIRVType::Buffer:
223229
case SPIRVType::Image1d:
230+
case SPIRVType::Image1dArray:
224231
case SPIRVType::Image1dBuffer:
225232
case SPIRVType::Image2d:
233+
case SPIRVType::Image2dArray:
226234
case SPIRVType::Image3d:
227235
return ArgKind::Surface;
228236
case SPIRVType::Sampler:
@@ -245,12 +253,18 @@ static std::string mapSPIRVDescToArgDesc(SPIRVArgDesc SPIRVDesc) {
245253
case SPIRVType::Image1d:
246254
Desc += ArgDesc::Image1d;
247255
break;
256+
case SPIRVType::Image1dArray:
257+
Desc += ArgDesc::Image1dArray;
258+
break;
248259
case SPIRVType::Image1dBuffer:
249260
Desc += ArgDesc::Image1dBuffer;
250261
break;
251262
case SPIRVType::Image2d:
252263
Desc += ArgDesc::Image2d;
253264
break;
265+
case SPIRVType::Image2dArray:
266+
Desc += ArgDesc::Image2dArray;
267+
break;
254268
case SPIRVType::Image3d:
255269
Desc += ArgDesc::Image3d;
256270
break;

GenXIntrinsics/lib/GenXIntrinsics/GenXSPIRVWriterAdaptor.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,12 +113,18 @@ static Type *getImageType(SPIRVArgDesc Desc, Module *M) {
113113
case SPIRVType::Image1d:
114114
Name += OCLTypes::Dim1d;
115115
break;
116+
case SPIRVType::Image1dArray:
117+
Name += OCLTypes::Dim1dArray;
118+
break;
116119
case SPIRVType::Image1dBuffer:
117120
Name += OCLTypes::Dim1dBuffer;
118121
break;
119122
case SPIRVType::Image2d:
120123
Name += OCLTypes::Dim2d;
121124
break;
125+
case SPIRVType::Image2dArray:
126+
Name += OCLTypes::Dim2dArray;
127+
break;
122128
case SPIRVType::Image3d:
123129
Name += OCLTypes::Dim3d;
124130
break;
@@ -240,8 +246,10 @@ static SPIRVArgDesc parseArgDesc(StringRef Desc) {
240246
Ty = StringSwitch<Optional<SPIRVType>>(Tok)
241247
.Case(ArgDesc::Buffer, SPIRVType::Buffer)
242248
.Case(ArgDesc::Image1d, SPIRVType::Image1d)
249+
.Case(ArgDesc::Image1dArray, SPIRVType::Image1dArray)
243250
.Case(ArgDesc::Image1dBuffer, SPIRVType::Image1dBuffer)
244251
.Case(ArgDesc::Image2d, SPIRVType::Image2d)
252+
.Case(ArgDesc::Image2dArray, SPIRVType::Image2dArray)
245253
.Case(ArgDesc::Image3d, SPIRVType::Image3d)
246254
.Case(ArgDesc::SVM, SPIRVType::Pointer)
247255
.Case(ArgDesc::Sampler, SPIRVType::Sampler)
@@ -290,8 +298,10 @@ static SPIRVArgDesc analyzeSurfaceArg(StringRef Desc) {
290298
switch (SPVDesc.Ty) {
291299
case SPIRVType::Buffer:
292300
case SPIRVType::Image1d:
301+
case SPIRVType::Image1dArray:
293302
case SPIRVType::Image1dBuffer:
294303
case SPIRVType::Image2d:
304+
case SPIRVType::Image2dArray:
295305
case SPIRVType::Image3d:
296306
return SPVDesc;
297307
// CMRT does not require to annotate arguments.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2021 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
9+
; XFAIL: llvm13,llvm14
10+
; Test reader translation of image array arguments.
11+
12+
; RUN: opt -S -GenXSPIRVReaderAdaptor < %s | FileCheck %s
13+
14+
%opencl.image1d_array_ro_t = type opaque
15+
%opencl.image2d_array_wo_t = type opaque
16+
17+
define spir_kernel void @test(%opencl.image1d_array_ro_t addrspace(1)* %im1d, %opencl.image2d_array_wo_t addrspace(1)* %im2d) #0 {
18+
; CHECK-LABEL: @test(
19+
20+
; CHECK: i32
21+
; CHECK: [[IM1D:%[^,]+]],
22+
23+
; CHECK: i32
24+
; CHECK: [[IM2D:%[^,]+]])
25+
26+
; CHECK-NEXT: entry:
27+
; CHECK-NEXT: ret void
28+
;
29+
entry:
30+
%0 = call i32 @llvm.genx.address.convert.i32.p1opencl.image1d_array_ro_t(%opencl.image1d_array_ro_t addrspace(1)* %im1d)
31+
%1 = call i32 @llvm.genx.address.convert.i32.p1opencl.image2d_array_wo_t(%opencl.image2d_array_wo_t addrspace(1)* %im2d)
32+
ret void
33+
}
34+
35+
declare i32 @llvm.genx.address.convert.i32.p1opencl.image1d_array_ro_t(%opencl.image1d_array_ro_t addrspace(1)*)
36+
declare i32 @llvm.genx.address.convert.i32.p1opencl.image2d_array_wo_t(%opencl.image2d_array_wo_t addrspace(1)*)
37+
38+
attributes #0 = { "VCFunction" }
39+
40+
; CHECK: !genx.kernels = !{[[KERNEL:![0-9]+]]}
41+
; CHECK: [[KERNEL]] = !{void (i32, i32)* @test, !"test", [[KINDS:![0-9]+]], i32 0, i32 0, !{{[0-9]+}}, [[DESCS:![0-9]+]], i32 0}
42+
; CHECK-DAG: [[KINDS]] = !{i32 2, i32 2}
43+
; CHECK-DAG: [[DESCS]] = !{!"image1d_array_t read_only", !"image2d_array_t write_only"}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2021 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
9+
; Test writer translation of image array arguments.
10+
11+
; RUN: opt -S -GenXSPIRVWriterAdaptor < %s | FileCheck %s
12+
13+
define void @test(i32 %im1darr, i32 %im2darr) {
14+
; CHECK-LABEL: @test(
15+
16+
; CHECK: %opencl.image1d_array_ro_t addrspace(1)*
17+
; CHECK: [[IM1D:%[^,]+]],
18+
19+
; CHECK: %opencl.image2d_array_wo_t addrspace(1)*
20+
; CHECK: [[IM2D:%[^)]+]])
21+
22+
; CHECK-NEXT: entry:
23+
; CHECK-NEXT: [[TMP0:%.*]] = call i32 @llvm.genx.address.convert.i32.p1opencl.image1d_array_ro_t(%opencl.image1d_array_ro_t addrspace(1)* [[IM1D]])
24+
; CHECK-NEXT: [[TMP1:%.*]] = call i32 @llvm.genx.address.convert.i32.p1opencl.image2d_array_wo_t(%opencl.image2d_array_wo_t addrspace(1)* [[IM2D]])
25+
; CHECK-NEXT: ret void
26+
;
27+
entry:
28+
ret void
29+
}
30+
31+
!genx.kernels = !{!0}
32+
33+
!0 = !{void (i32, i32)* @test, !"test", !1, i32 0, i32 0, !2, !3, i32 0, i32 0}
34+
!1 = !{i32 2, i32 2}
35+
!2 = !{i32 0, i32 0}
36+
!3 = !{!"image1d_array_t read_only", !"image2d_array_t write_only"}

0 commit comments

Comments
 (0)