xref: /llvm-project/llvm/test/CodeGen/SPIRV/transcoding/enqueue_kernel.ll (revision 0a443f13b49b3f392461a0bb60b0146cfc4607c7)
1ec7baca1SMichal Paszkowski; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefix=CHECK-SPIRV
2*0a443f13SVyacheslav Levytskyy; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv32-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3748922b3SIlia Diachkov
4f8a21dffSNatalie Chouinard; TODO(#60133): Requires updates following opaque pointer migration.
5f8a21dffSNatalie Chouinard; XFAIL: *
6f8a21dffSNatalie Chouinard
7748922b3SIlia Diachkov; CHECK-SPIRV: OpEntryPoint Kernel %[[#BlockKer1:]] "__device_side_enqueue_block_invoke_kernel"
8748922b3SIlia Diachkov; CHECK-SPIRV: OpEntryPoint Kernel %[[#BlockKer2:]] "__device_side_enqueue_block_invoke_2_kernel"
9748922b3SIlia Diachkov; CHECK-SPIRV: OpEntryPoint Kernel %[[#BlockKer3:]] "__device_side_enqueue_block_invoke_3_kernel"
10748922b3SIlia Diachkov; CHECK-SPIRV: OpEntryPoint Kernel %[[#BlockKer4:]] "__device_side_enqueue_block_invoke_4_kernel"
11748922b3SIlia Diachkov; CHECK-SPIRV: OpEntryPoint Kernel %[[#BlockKer5:]] "__device_side_enqueue_block_invoke_5_kernel"
12748922b3SIlia Diachkov; CHECK-SPIRV: OpName %[[#BlockGlb1:]] "__block_literal_global"
13748922b3SIlia Diachkov; CHECK-SPIRV: OpName %[[#BlockGlb2:]] "__block_literal_global.1"
14748922b3SIlia Diachkov
15748922b3SIlia Diachkov; CHECK-SPIRV: %[[#Int32Ty:]] = OpTypeInt 32
16748922b3SIlia Diachkov; CHECK-SPIRV: %[[#Int8Ty:]] = OpTypeInt 8
17748922b3SIlia Diachkov; CHECK-SPIRV: %[[#VoidTy:]] = OpTypeVoid
18748922b3SIlia Diachkov; CHECK-SPIRV: %[[#Int8PtrGenTy:]] = OpTypePointer Generic %[[#Int8Ty]]
19748922b3SIlia Diachkov; CHECK-SPIRV: %[[#EventTy:]] = OpTypeDeviceEvent
20748922b3SIlia Diachkov; CHECK-SPIRV: %[[#EventPtrTy:]] = OpTypePointer Generic %[[#EventTy]]
21748922b3SIlia Diachkov; CHECK-SPIRV: %[[#Int32LocPtrTy:]] = OpTypePointer Function %[[#Int32Ty]]
22748922b3SIlia Diachkov; CHECK-SPIRV: %[[#BlockStructTy:]] = OpTypeStruct
23748922b3SIlia Diachkov; CHECK-SPIRV: %[[#BlockStructLocPtrTy:]] = OpTypePointer Function %[[#BlockStructTy]]
24748922b3SIlia Diachkov; CHECK-SPIRV: %[[#BlockTy1:]] = OpTypeFunction %[[#VoidTy]] %[[#Int8PtrGenTy]]
25748922b3SIlia Diachkov; CHECK-SPIRV: %[[#BlockTy2:]] = OpTypeFunction %[[#VoidTy]] %[[#Int8PtrGenTy]]
26748922b3SIlia Diachkov; CHECK-SPIRV: %[[#BlockTy3:]] = OpTypeFunction %[[#VoidTy]] %[[#Int8PtrGenTy]]
27748922b3SIlia Diachkov
28748922b3SIlia Diachkov; CHECK-SPIRV: %[[#ConstInt0:]] = OpConstant %[[#Int32Ty]] 0
29748922b3SIlia Diachkov; CHECK-SPIRV: %[[#EventNull:]] = OpConstantNull %[[#EventPtrTy]]
30748922b3SIlia Diachkov; CHECK-SPIRV: %[[#ConstInt21:]] = OpConstant %[[#Int32Ty]] 21
31748922b3SIlia Diachkov; CHECK-SPIRV: %[[#ConstInt8:]] = OpConstant %[[#Int32Ty]] 8
32748922b3SIlia Diachkov; CHECK-SPIRV: %[[#ConstInt24:]] = OpConstant %[[#Int32Ty]] 24
33748922b3SIlia Diachkov; CHECK-SPIRV: %[[#ConstInt12:]] = OpConstant %[[#Int32Ty]] 12
34748922b3SIlia Diachkov; CHECK-SPIRV: %[[#ConstInt2:]] = OpConstant %[[#Int32Ty]] 2
35748922b3SIlia Diachkov
36748922b3SIlia Diachkov;; typedef struct {int a;} ndrange_t;
37748922b3SIlia Diachkov;; #define NULL ((void*)0)
38748922b3SIlia Diachkov
39748922b3SIlia Diachkov;; kernel void device_side_enqueue(global int *a, global int *b, int i, char c0) {
40748922b3SIlia Diachkov;;   queue_t default_queue;
41748922b3SIlia Diachkov;;   unsigned flags = 0;
42748922b3SIlia Diachkov;;   ndrange_t ndrange;
43748922b3SIlia Diachkov;;   clk_event_t clk_event;
44748922b3SIlia Diachkov;;   clk_event_t event_wait_list;
45748922b3SIlia Diachkov;;   clk_event_t event_wait_list2[] = {clk_event};
46748922b3SIlia Diachkov
47748922b3SIlia Diachkov;; Emits block literal on stack and block kernel.
48748922b3SIlia Diachkov
49748922b3SIlia Diachkov; CHECK-SPIRV:      %[[#BlockLitPtr1:]] = OpBitcast %[[#BlockStructLocPtrTy]]
50748922b3SIlia Diachkov; CHECK-SPIRV-NEXT: %[[#BlockLit1:]] = OpPtrCastToGeneric %[[#Int8PtrGenTy]] %[[#BlockLitPtr1]]
51748922b3SIlia Diachkov; CHECK-SPIRV-NEXT: %[[#]] = OpEnqueueKernel %[[#Int32Ty]] %[[#]] %[[#]] %[[#]] %[[#ConstInt0]] %[[#EventNull]] %[[#EventNull]] %[[#BlockKer1]] %[[#BlockLit1]] %[[#ConstInt21]] %[[#ConstInt8]]
52748922b3SIlia Diachkov
53748922b3SIlia Diachkov;;   enqueue_kernel(default_queue, flags, ndrange,
54748922b3SIlia Diachkov;;                  ^(void) {
55748922b3SIlia Diachkov;;                    a[i] = c0;
56748922b3SIlia Diachkov;;                  });
57748922b3SIlia Diachkov
58748922b3SIlia Diachkov;; Emits block literal on stack and block kernel.
59748922b3SIlia Diachkov
60748922b3SIlia Diachkov; CHECK-SPIRV:      %[[#Event1:]] = OpPtrCastToGeneric %[[#EventPtrTy]]
61748922b3SIlia Diachkov; CHECK-SPIRV:      %[[#Event2:]] = OpPtrCastToGeneric %[[#EventPtrTy]]
62748922b3SIlia Diachkov; CHECK-SPIRV:      %[[#BlockLitPtr2:]] = OpBitcast %[[#BlockStructLocPtrTy]]
63748922b3SIlia Diachkov; CHECK-SPIRV-NEXT: %[[#BlockLit2:]] = OpPtrCastToGeneric %[[#Int8PtrGenTy]] %[[#BlockLitPtr2]]
64748922b3SIlia Diachkov; CHECK-SPIRV-NEXT: %[[#]] = OpEnqueueKernel %[[#Int32Ty]] %[[#]] %[[#]] %[[#]] %[[#ConstInt2]] %[[#Event1]] %[[#Event2]] %[[#BlockKer2]] %[[#BlockLit2]] %[[#ConstInt24]] %[[#ConstInt8]]
65748922b3SIlia Diachkov
66748922b3SIlia Diachkov;;   enqueue_kernel(default_queue, flags, ndrange, 2, &event_wait_list, &clk_event,
67748922b3SIlia Diachkov;;                  ^(void) {
68748922b3SIlia Diachkov;;                    a[i] = b[i];
69748922b3SIlia Diachkov;;                  });
70748922b3SIlia Diachkov
71748922b3SIlia Diachkov;;   char c;
72748922b3SIlia Diachkov;; Emits global block literal and block kernel.
73748922b3SIlia Diachkov
74748922b3SIlia Diachkov; CHECK-SPIRV: %[[#Event1:]] = OpPtrCastToGeneric %[[#EventPtrTy]]
75748922b3SIlia Diachkov; CHECK-SPIRV: %[[#Event2:]] = OpPtrCastToGeneric %[[#EventPtrTy]]
76748922b3SIlia Diachkov; CHECK-SPIRV: %[[#BlockLit3Tmp:]] = OpBitcast %[[#]] %[[#BlockGlb1]]
77748922b3SIlia Diachkov; CHECK-SPIRV: %[[#BlockLit3:]] = OpPtrCastToGeneric %[[#Int8PtrGenTy]] %[[#BlockLit3Tmp]]
78748922b3SIlia Diachkov; CHECK-SPIRV: %[[#LocalBuf31:]] = OpPtrAccessChain %[[#Int32LocPtrTy]]
79748922b3SIlia Diachkov; CHECK-SPIRV: %[[#]] = OpEnqueueKernel %[[#Int32Ty]] %[[#]] %[[#]] %[[#]] %[[#ConstInt2]] %[[#Event1]] %[[#Event2]] %[[#BlockKer3]] %[[#BlockLit3]] %[[#ConstInt12]] %[[#ConstInt8]] %[[#LocalBuf31]]
80748922b3SIlia Diachkov
81748922b3SIlia Diachkov;;   enqueue_kernel(default_queue, flags, ndrange, 2, event_wait_list2, &clk_event,
82748922b3SIlia Diachkov;;                  ^(local void *p) {
83748922b3SIlia Diachkov;;                    return;
84748922b3SIlia Diachkov;;                  },
85748922b3SIlia Diachkov;;                  c);
86748922b3SIlia Diachkov
87748922b3SIlia Diachkov;; Emits global block literal and block kernel.
88748922b3SIlia Diachkov
89748922b3SIlia Diachkov; CHECK-SPIRV:      %[[#BlockLit4Tmp:]] = OpBitcast %[[#]] %[[#BlockGlb2]]
90748922b3SIlia Diachkov; CHECK-SPIRV:      %[[#BlockLit4:]] = OpPtrCastToGeneric %[[#Int8PtrGenTy]] %[[#BlockLit4Tmp]]
91748922b3SIlia Diachkov; CHECK-SPIRV:      %[[#LocalBuf41:]] = OpPtrAccessChain %[[#Int32LocPtrTy]]
92748922b3SIlia Diachkov; CHECK-SPIRV-NEXT: %[[#LocalBuf42:]] = OpPtrAccessChain %[[#Int32LocPtrTy]]
93748922b3SIlia Diachkov; CHECK-SPIRV-NEXT: %[[#LocalBuf43:]] = OpPtrAccessChain %[[#Int32LocPtrTy]]
94748922b3SIlia Diachkov; CHECK-SPIRV-NEXT: %[[#]] = OpEnqueueKernel %[[#Int32Ty]] %[[#]] %[[#]] %[[#]] %[[#ConstInt0]] %[[#EventNull]] %[[#EventNull]] %[[#BlockKer4]] %[[#BlockLit4]] %[[#ConstInt12]] %[[#ConstInt8]] %[[#LocalBuf41]] %[[#LocalBuf42]] %[[#LocalBuf43]]
95748922b3SIlia Diachkov
96748922b3SIlia Diachkov;;   enqueue_kernel(default_queue, flags, ndrange,
97748922b3SIlia Diachkov;;                  ^(local void *p1, local void *p2, local void *p3) {
98748922b3SIlia Diachkov;;                    return;
99748922b3SIlia Diachkov;;                  },
100748922b3SIlia Diachkov;;                  1, 2, 4);
101748922b3SIlia Diachkov
102748922b3SIlia Diachkov;; Emits block literal on stack and block kernel.
103748922b3SIlia Diachkov
104748922b3SIlia Diachkov; CHECK-SPIRV:      %[[#Event1:]] = OpPtrCastToGeneric %[[#EventPtrTy]]
105748922b3SIlia Diachkov; CHECK-SPIRV:      %[[#BlockLit5Tmp:]] = OpBitcast %[[#BlockStructLocPtrTy]]
106748922b3SIlia Diachkov; CHECK-SPIRV-NEXT: %[[#BlockLit5:]] = OpPtrCastToGeneric %[[#Int8PtrGenTy]] %[[#BlockLit5Tmp]]
107748922b3SIlia Diachkov; CHECK-SPIRV-NEXT: %[[#]] = OpEnqueueKernel %[[#Int32Ty]] %[[#]] %[[#]] %[[#]] %[[#ConstInt0]] %[[#EventNull]] %[[#Event1]] %[[#BlockKer5]] %[[#BlockLit5]] %[[#ConstInt24]] %[[#ConstInt8]]
108748922b3SIlia Diachkov
109748922b3SIlia Diachkov;;   enqueue_kernel(default_queue, flags, ndrange, 0, NULL, &clk_event,
110748922b3SIlia Diachkov;;                  ^(void) {
111748922b3SIlia Diachkov;;                    a[i] = b[i];
112748922b3SIlia Diachkov;;                  });
113748922b3SIlia Diachkov;; }
114748922b3SIlia Diachkov
115748922b3SIlia Diachkov; CHECK-SPIRV-DAG: %[[#BlockKer1]] = OpFunction %[[#VoidTy]] None %[[#BlockTy1]]
116748922b3SIlia Diachkov; CHECK-SPIRV-DAG: %[[#BlockKer2]] = OpFunction %[[#VoidTy]] None %[[#BlockTy1]]
117748922b3SIlia Diachkov; CHECK-SPIRV-DAG: %[[#BlockKer3]] = OpFunction %[[#VoidTy]] None %[[#BlockTy3]]
118748922b3SIlia Diachkov; CHECK-SPIRV-DAG: %[[#BlockKer4]] = OpFunction %[[#VoidTy]] None %[[#BlockTy2]]
119748922b3SIlia Diachkov; CHECK-SPIRV-DAG: %[[#BlockKer5]] = OpFunction %[[#VoidTy]] None %[[#BlockTy1]]
120748922b3SIlia Diachkov
121748922b3SIlia Diachkov%opencl.queue_t = type opaque
122748922b3SIlia Diachkov%struct.ndrange_t = type { i32 }
123748922b3SIlia Diachkov%opencl.clk_event_t = type opaque
124748922b3SIlia Diachkov%struct.__opencl_block_literal_generic = type { i32, i32, i8 addrspace(4)* }
125748922b3SIlia Diachkov
126748922b3SIlia Diachkov@__block_literal_global = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 12, i32 4, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* @__device_side_enqueue_block_invoke_3 to i8*) to i8 addrspace(4)*) }, align 4
127748922b3SIlia Diachkov@__block_literal_global.1 = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 12, i32 4, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*, i8 addrspace(3)*, i8 addrspace(3)*)* @__device_side_enqueue_block_invoke_4 to i8*) to i8 addrspace(4)*) }, align 4
128748922b3SIlia Diachkov
129748922b3SIlia Diachkovdefine dso_local spir_kernel void @device_side_enqueue(i32 addrspace(1)* noundef %a, i32 addrspace(1)* noundef %b, i32 noundef %i, i8 noundef signext %c0) {
130748922b3SIlia Diachkoventry:
131748922b3SIlia Diachkov  %a.addr = alloca i32 addrspace(1)*, align 4
132748922b3SIlia Diachkov  %b.addr = alloca i32 addrspace(1)*, align 4
133748922b3SIlia Diachkov  %i.addr = alloca i32, align 4
134748922b3SIlia Diachkov  %c0.addr = alloca i8, align 1
135748922b3SIlia Diachkov  %default_queue = alloca %opencl.queue_t*, align 4
136748922b3SIlia Diachkov  %flags = alloca i32, align 4
137748922b3SIlia Diachkov  %ndrange = alloca %struct.ndrange_t, align 4
138748922b3SIlia Diachkov  %clk_event = alloca %opencl.clk_event_t*, align 4
139748922b3SIlia Diachkov  %event_wait_list = alloca %opencl.clk_event_t*, align 4
140748922b3SIlia Diachkov  %event_wait_list2 = alloca [1 x %opencl.clk_event_t*], align 4
141748922b3SIlia Diachkov  %tmp = alloca %struct.ndrange_t, align 4
142748922b3SIlia Diachkov  %block = alloca <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>, align 4
143748922b3SIlia Diachkov  %tmp3 = alloca %struct.ndrange_t, align 4
144748922b3SIlia Diachkov  %block4 = alloca <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, align 4
145748922b3SIlia Diachkov  %c = alloca i8, align 1
146748922b3SIlia Diachkov  %tmp11 = alloca %struct.ndrange_t, align 4
147748922b3SIlia Diachkov  %block_sizes = alloca [1 x i32], align 4
148748922b3SIlia Diachkov  %tmp12 = alloca %struct.ndrange_t, align 4
149748922b3SIlia Diachkov  %block_sizes13 = alloca [3 x i32], align 4
150748922b3SIlia Diachkov  %tmp14 = alloca %struct.ndrange_t, align 4
151748922b3SIlia Diachkov  %block15 = alloca <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, align 4
152748922b3SIlia Diachkov  store i32 addrspace(1)* %a, i32 addrspace(1)** %a.addr, align 4
153748922b3SIlia Diachkov  store i32 addrspace(1)* %b, i32 addrspace(1)** %b.addr, align 4
154748922b3SIlia Diachkov  store i32 %i, i32* %i.addr, align 4
155748922b3SIlia Diachkov  store i8 %c0, i8* %c0.addr, align 1
156748922b3SIlia Diachkov  store i32 0, i32* %flags, align 4
157748922b3SIlia Diachkov  %arrayinit.begin = getelementptr inbounds [1 x %opencl.clk_event_t*], [1 x %opencl.clk_event_t*]* %event_wait_list2, i32 0, i32 0
158748922b3SIlia Diachkov  %0 = load %opencl.clk_event_t*, %opencl.clk_event_t** %clk_event, align 4
159748922b3SIlia Diachkov  store %opencl.clk_event_t* %0, %opencl.clk_event_t** %arrayinit.begin, align 4
160748922b3SIlia Diachkov  %1 = load %opencl.queue_t*, %opencl.queue_t** %default_queue, align 4
161748922b3SIlia Diachkov  %2 = load i32, i32* %flags, align 4
162748922b3SIlia Diachkov  %3 = bitcast %struct.ndrange_t* %tmp to i8*
163748922b3SIlia Diachkov  %4 = bitcast %struct.ndrange_t* %ndrange to i8*
164748922b3SIlia Diachkov  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %3, i8* align 4 %4, i32 4, i1 false)
165748922b3SIlia Diachkov  %block.size = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>* %block, i32 0, i32 0
166748922b3SIlia Diachkov  store i32 21, i32* %block.size, align 4
167748922b3SIlia Diachkov  %block.align = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>* %block, i32 0, i32 1
168748922b3SIlia Diachkov  store i32 4, i32* %block.align, align 4
169748922b3SIlia Diachkov  %block.invoke = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>* %block, i32 0, i32 2
170748922b3SIlia Diachkov  store i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* @__device_side_enqueue_block_invoke to i8*) to i8 addrspace(4)*), i8 addrspace(4)** %block.invoke, align 4
171748922b3SIlia Diachkov  %block.captured = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>* %block, i32 0, i32 3
172748922b3SIlia Diachkov  %5 = load i32 addrspace(1)*, i32 addrspace(1)** %a.addr, align 4
173748922b3SIlia Diachkov  store i32 addrspace(1)* %5, i32 addrspace(1)** %block.captured, align 4
174748922b3SIlia Diachkov  %block.captured1 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>* %block, i32 0, i32 4
175748922b3SIlia Diachkov  %6 = load i32, i32* %i.addr, align 4
176748922b3SIlia Diachkov  store i32 %6, i32* %block.captured1, align 4
177748922b3SIlia Diachkov  %block.captured2 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>* %block, i32 0, i32 5
178748922b3SIlia Diachkov  %7 = load i8, i8* %c0.addr, align 1
179748922b3SIlia Diachkov  store i8 %7, i8* %block.captured2, align 4
180748922b3SIlia Diachkov  %8 = bitcast <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>* %block to %struct.__opencl_block_literal_generic*
181748922b3SIlia Diachkov  %9 = addrspacecast %struct.__opencl_block_literal_generic* %8 to i8 addrspace(4)*
182748922b3SIlia Diachkov  %10 = call spir_func i32 @__enqueue_kernel_basic(%opencl.queue_t* %1, i32 %2, %struct.ndrange_t* byval(%struct.ndrange_t) %tmp, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* @__device_side_enqueue_block_invoke_kernel to i8*) to i8 addrspace(4)*), i8 addrspace(4)* %9)
183748922b3SIlia Diachkov  %11 = load %opencl.queue_t*, %opencl.queue_t** %default_queue, align 4
184748922b3SIlia Diachkov  %12 = load i32, i32* %flags, align 4
185748922b3SIlia Diachkov  %13 = bitcast %struct.ndrange_t* %tmp3 to i8*
186748922b3SIlia Diachkov  %14 = bitcast %struct.ndrange_t* %ndrange to i8*
187748922b3SIlia Diachkov  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %13, i8* align 4 %14, i32 4, i1 false)
188748922b3SIlia Diachkov  %15 = addrspacecast %opencl.clk_event_t** %event_wait_list to %opencl.clk_event_t* addrspace(4)*
189748922b3SIlia Diachkov  %16 = addrspacecast %opencl.clk_event_t** %clk_event to %opencl.clk_event_t* addrspace(4)*
190748922b3SIlia Diachkov  %block.size5 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block4, i32 0, i32 0
191748922b3SIlia Diachkov  store i32 24, i32* %block.size5, align 4
192748922b3SIlia Diachkov  %block.align6 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block4, i32 0, i32 1
193748922b3SIlia Diachkov  store i32 4, i32* %block.align6, align 4
194748922b3SIlia Diachkov  %block.invoke7 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block4, i32 0, i32 2
195748922b3SIlia Diachkov  store i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* @__device_side_enqueue_block_invoke_2 to i8*) to i8 addrspace(4)*), i8 addrspace(4)** %block.invoke7, align 4
196748922b3SIlia Diachkov  %block.captured8 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block4, i32 0, i32 3
197748922b3SIlia Diachkov  %17 = load i32 addrspace(1)*, i32 addrspace(1)** %a.addr, align 4
198748922b3SIlia Diachkov  store i32 addrspace(1)* %17, i32 addrspace(1)** %block.captured8, align 4
199748922b3SIlia Diachkov  %block.captured9 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block4, i32 0, i32 4
200748922b3SIlia Diachkov  %18 = load i32, i32* %i.addr, align 4
201748922b3SIlia Diachkov  store i32 %18, i32* %block.captured9, align 4
202748922b3SIlia Diachkov  %block.captured10 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block4, i32 0, i32 5
203748922b3SIlia Diachkov  %19 = load i32 addrspace(1)*, i32 addrspace(1)** %b.addr, align 4
204748922b3SIlia Diachkov  store i32 addrspace(1)* %19, i32 addrspace(1)** %block.captured10, align 4
205748922b3SIlia Diachkov  %20 = bitcast <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block4 to %struct.__opencl_block_literal_generic*
206748922b3SIlia Diachkov  %21 = addrspacecast %struct.__opencl_block_literal_generic* %20 to i8 addrspace(4)*
207748922b3SIlia Diachkov  %22 = call spir_func i32 @__enqueue_kernel_basic_events(%opencl.queue_t* %11, i32 %12, %struct.ndrange_t* %tmp3, i32 2, %opencl.clk_event_t* addrspace(4)* %15, %opencl.clk_event_t* addrspace(4)* %16, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* @__device_side_enqueue_block_invoke_2_kernel to i8*) to i8 addrspace(4)*), i8 addrspace(4)* %21)
208748922b3SIlia Diachkov  %23 = load %opencl.queue_t*, %opencl.queue_t** %default_queue, align 4
209748922b3SIlia Diachkov  %24 = load i32, i32* %flags, align 4
210748922b3SIlia Diachkov  %25 = bitcast %struct.ndrange_t* %tmp11 to i8*
211748922b3SIlia Diachkov  %26 = bitcast %struct.ndrange_t* %ndrange to i8*
212748922b3SIlia Diachkov  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %25, i8* align 4 %26, i32 4, i1 false)
213748922b3SIlia Diachkov  %arraydecay = getelementptr inbounds [1 x %opencl.clk_event_t*], [1 x %opencl.clk_event_t*]* %event_wait_list2, i32 0, i32 0
214748922b3SIlia Diachkov  %27 = addrspacecast %opencl.clk_event_t** %arraydecay to %opencl.clk_event_t* addrspace(4)*
215748922b3SIlia Diachkov  %28 = addrspacecast %opencl.clk_event_t** %clk_event to %opencl.clk_event_t* addrspace(4)*
216748922b3SIlia Diachkov  %29 = getelementptr [1 x i32], [1 x i32]* %block_sizes, i32 0, i32 0
217748922b3SIlia Diachkov  %30 = load i8, i8* %c, align 1
218748922b3SIlia Diachkov  %31 = zext i8 %30 to i32
219748922b3SIlia Diachkov  store i32 %31, i32* %29, align 4
220748922b3SIlia Diachkov  %32 = call spir_func i32 @__enqueue_kernel_events_varargs(%opencl.queue_t* %23, i32 %24, %struct.ndrange_t* %tmp11, i32 2, %opencl.clk_event_t* addrspace(4)* %27, %opencl.clk_event_t* addrspace(4)* %28, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* @__device_side_enqueue_block_invoke_3_kernel to i8*) to i8 addrspace(4)*), i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* @__block_literal_global to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32* %29)
221748922b3SIlia Diachkov  %33 = load %opencl.queue_t*, %opencl.queue_t** %default_queue, align 4
222748922b3SIlia Diachkov  %34 = load i32, i32* %flags, align 4
223748922b3SIlia Diachkov  %35 = bitcast %struct.ndrange_t* %tmp12 to i8*
224748922b3SIlia Diachkov  %36 = bitcast %struct.ndrange_t* %ndrange to i8*
225748922b3SIlia Diachkov  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %35, i8* align 4 %36, i32 4, i1 false)
226748922b3SIlia Diachkov  %37 = getelementptr [3 x i32], [3 x i32]* %block_sizes13, i32 0, i32 0
227748922b3SIlia Diachkov  store i32 1, i32* %37, align 4
228748922b3SIlia Diachkov  %38 = getelementptr [3 x i32], [3 x i32]* %block_sizes13, i32 0, i32 1
229748922b3SIlia Diachkov  store i32 2, i32* %38, align 4
230748922b3SIlia Diachkov  %39 = getelementptr [3 x i32], [3 x i32]* %block_sizes13, i32 0, i32 2
231748922b3SIlia Diachkov  store i32 4, i32* %39, align 4
232748922b3SIlia Diachkov  %40 = call spir_func i32 @__enqueue_kernel_varargs(%opencl.queue_t* %33, i32 %34, %struct.ndrange_t* %tmp12, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*, i8 addrspace(3)*, i8 addrspace(3)*)* @__device_side_enqueue_block_invoke_4_kernel to i8*) to i8 addrspace(4)*), i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* @__block_literal_global.1 to i8 addrspace(1)*) to i8 addrspace(4)*), i32 3, i32* %37)
233748922b3SIlia Diachkov  %41 = load %opencl.queue_t*, %opencl.queue_t** %default_queue, align 4
234748922b3SIlia Diachkov  %42 = load i32, i32* %flags, align 4
235748922b3SIlia Diachkov  %43 = bitcast %struct.ndrange_t* %tmp14 to i8*
236748922b3SIlia Diachkov  %44 = bitcast %struct.ndrange_t* %ndrange to i8*
237748922b3SIlia Diachkov  call void @llvm.memcpy.p0i8.p0i8.i32(i8* align 4 %43, i8* align 4 %44, i32 4, i1 false)
238748922b3SIlia Diachkov  %45 = addrspacecast %opencl.clk_event_t** %clk_event to %opencl.clk_event_t* addrspace(4)*
239748922b3SIlia Diachkov  %block.size16 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block15, i32 0, i32 0
240748922b3SIlia Diachkov  store i32 24, i32* %block.size16, align 4
241748922b3SIlia Diachkov  %block.align17 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block15, i32 0, i32 1
242748922b3SIlia Diachkov  store i32 4, i32* %block.align17, align 4
243748922b3SIlia Diachkov  %block.invoke18 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block15, i32 0, i32 2
244748922b3SIlia Diachkov  store i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* @__device_side_enqueue_block_invoke_5 to i8*) to i8 addrspace(4)*), i8 addrspace(4)** %block.invoke18, align 4
245748922b3SIlia Diachkov  %block.captured19 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block15, i32 0, i32 3
246748922b3SIlia Diachkov  %46 = load i32 addrspace(1)*, i32 addrspace(1)** %a.addr, align 4
247748922b3SIlia Diachkov  store i32 addrspace(1)* %46, i32 addrspace(1)** %block.captured19, align 4
248748922b3SIlia Diachkov  %block.captured20 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block15, i32 0, i32 4
249748922b3SIlia Diachkov  %47 = load i32, i32* %i.addr, align 4
250748922b3SIlia Diachkov  store i32 %47, i32* %block.captured20, align 4
251748922b3SIlia Diachkov  %block.captured21 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block15, i32 0, i32 5
252748922b3SIlia Diachkov  %48 = load i32 addrspace(1)*, i32 addrspace(1)** %b.addr, align 4
253748922b3SIlia Diachkov  store i32 addrspace(1)* %48, i32 addrspace(1)** %block.captured21, align 4
254748922b3SIlia Diachkov  %49 = bitcast <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block15 to %struct.__opencl_block_literal_generic*
255748922b3SIlia Diachkov  %50 = addrspacecast %struct.__opencl_block_literal_generic* %49 to i8 addrspace(4)*
256748922b3SIlia Diachkov  %51 = call spir_func i32 @__enqueue_kernel_basic_events(%opencl.queue_t* %41, i32 %42, %struct.ndrange_t* %tmp14, i32 0, %opencl.clk_event_t* addrspace(4)* null, %opencl.clk_event_t* addrspace(4)* %45, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* @__device_side_enqueue_block_invoke_5_kernel to i8*) to i8 addrspace(4)*), i8 addrspace(4)* %50)
257748922b3SIlia Diachkov  ret void
258748922b3SIlia Diachkov}
259748922b3SIlia Diachkov
260748922b3SIlia Diachkovdeclare void @llvm.memcpy.p0i8.p0i8.i32(i8* noalias nocapture writeonly, i8* noalias nocapture readonly, i32, i1 immarg)
261748922b3SIlia Diachkov
262748922b3SIlia Diachkovdefine internal spir_func void @__device_side_enqueue_block_invoke(i8 addrspace(4)* noundef %.block_descriptor) {
263748922b3SIlia Diachkoventry:
264748922b3SIlia Diachkov  %.block_descriptor.addr = alloca i8 addrspace(4)*, align 4
265748922b3SIlia Diachkov  %block.addr = alloca <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }> addrspace(4)*, align 4
266748922b3SIlia Diachkov  store i8 addrspace(4)* %.block_descriptor, i8 addrspace(4)** %.block_descriptor.addr, align 4
267748922b3SIlia Diachkov  %block = bitcast i8 addrspace(4)* %.block_descriptor to <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }> addrspace(4)*
268748922b3SIlia Diachkov  store <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }> addrspace(4)* %block, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }> addrspace(4)** %block.addr, align 4
269748922b3SIlia Diachkov  %block.capture.addr = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }> addrspace(4)* %block, i32 0, i32 5
270748922b3SIlia Diachkov  %0 = load i8, i8 addrspace(4)* %block.capture.addr, align 4
271748922b3SIlia Diachkov  %conv = sext i8 %0 to i32
272748922b3SIlia Diachkov  %block.capture.addr1 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }> addrspace(4)* %block, i32 0, i32 3
273748922b3SIlia Diachkov  %1 = load i32 addrspace(1)*, i32 addrspace(1)* addrspace(4)* %block.capture.addr1, align 4
274748922b3SIlia Diachkov  %block.capture.addr2 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i8 }> addrspace(4)* %block, i32 0, i32 4
275748922b3SIlia Diachkov  %2 = load i32, i32 addrspace(4)* %block.capture.addr2, align 4
276748922b3SIlia Diachkov  %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %1, i32 %2
277748922b3SIlia Diachkov  store i32 %conv, i32 addrspace(1)* %arrayidx, align 4
278748922b3SIlia Diachkov  ret void
279748922b3SIlia Diachkov}
280748922b3SIlia Diachkov
281748922b3SIlia Diachkovdefine spir_kernel void @__device_side_enqueue_block_invoke_kernel(i8 addrspace(4)* %0) {
282748922b3SIlia Diachkoventry:
283748922b3SIlia Diachkov  call spir_func void @__device_side_enqueue_block_invoke(i8 addrspace(4)* %0)
284748922b3SIlia Diachkov  ret void
285748922b3SIlia Diachkov}
286748922b3SIlia Diachkov
287748922b3SIlia Diachkovdeclare spir_func i32 @__enqueue_kernel_basic(%opencl.queue_t*, i32, %struct.ndrange_t*, i8 addrspace(4)*, i8 addrspace(4)*)
288748922b3SIlia Diachkov
289748922b3SIlia Diachkovdefine internal spir_func void @__device_side_enqueue_block_invoke_2(i8 addrspace(4)* noundef %.block_descriptor) {
290748922b3SIlia Diachkoventry:
291748922b3SIlia Diachkov  %.block_descriptor.addr = alloca i8 addrspace(4)*, align 4
292748922b3SIlia Diachkov  %block.addr = alloca <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)*, align 4
293748922b3SIlia Diachkov  store i8 addrspace(4)* %.block_descriptor, i8 addrspace(4)** %.block_descriptor.addr, align 4
294748922b3SIlia Diachkov  %block = bitcast i8 addrspace(4)* %.block_descriptor to <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)*
295748922b3SIlia Diachkov  store <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)* %block, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)** %block.addr, align 4
296748922b3SIlia Diachkov  %block.capture.addr = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)* %block, i32 0, i32 5
297748922b3SIlia Diachkov  %0 = load i32 addrspace(1)*, i32 addrspace(1)* addrspace(4)* %block.capture.addr, align 4
298748922b3SIlia Diachkov  %block.capture.addr1 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)* %block, i32 0, i32 4
299748922b3SIlia Diachkov  %1 = load i32, i32 addrspace(4)* %block.capture.addr1, align 4
300748922b3SIlia Diachkov  %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %0, i32 %1
301748922b3SIlia Diachkov  %2 = load i32, i32 addrspace(1)* %arrayidx, align 4
302748922b3SIlia Diachkov  %block.capture.addr2 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)* %block, i32 0, i32 3
303748922b3SIlia Diachkov  %3 = load i32 addrspace(1)*, i32 addrspace(1)* addrspace(4)* %block.capture.addr2, align 4
304748922b3SIlia Diachkov  %block.capture.addr3 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)* %block, i32 0, i32 4
305748922b3SIlia Diachkov  %4 = load i32, i32 addrspace(4)* %block.capture.addr3, align 4
306748922b3SIlia Diachkov  %arrayidx4 = getelementptr inbounds i32, i32 addrspace(1)* %3, i32 %4
307748922b3SIlia Diachkov  store i32 %2, i32 addrspace(1)* %arrayidx4, align 4
308748922b3SIlia Diachkov  ret void
309748922b3SIlia Diachkov}
310748922b3SIlia Diachkov
311748922b3SIlia Diachkovdefine spir_kernel void @__device_side_enqueue_block_invoke_2_kernel(i8 addrspace(4)* %0) {
312748922b3SIlia Diachkoventry:
313748922b3SIlia Diachkov  call spir_func void @__device_side_enqueue_block_invoke_2(i8 addrspace(4)* %0)
314748922b3SIlia Diachkov  ret void
315748922b3SIlia Diachkov}
316748922b3SIlia Diachkov
317748922b3SIlia Diachkovdeclare spir_func i32 @__enqueue_kernel_basic_events(%opencl.queue_t*, i32, %struct.ndrange_t*, i32, %opencl.clk_event_t* addrspace(4)*, %opencl.clk_event_t* addrspace(4)*, i8 addrspace(4)*, i8 addrspace(4)*)
318748922b3SIlia Diachkov
319748922b3SIlia Diachkovdefine internal spir_func void @__device_side_enqueue_block_invoke_3(i8 addrspace(4)* noundef %.block_descriptor, i8 addrspace(3)* noundef %p) {
320748922b3SIlia Diachkoventry:
321748922b3SIlia Diachkov  %.block_descriptor.addr = alloca i8 addrspace(4)*, align 4
322748922b3SIlia Diachkov  %p.addr = alloca i8 addrspace(3)*, align 4
323748922b3SIlia Diachkov  %block.addr = alloca <{ i32, i32, i8 addrspace(4)* }> addrspace(4)*, align 4
324748922b3SIlia Diachkov  store i8 addrspace(4)* %.block_descriptor, i8 addrspace(4)** %.block_descriptor.addr, align 4
325748922b3SIlia Diachkov  %block = bitcast i8 addrspace(4)* %.block_descriptor to <{ i32, i32, i8 addrspace(4)* }> addrspace(4)*
326748922b3SIlia Diachkov  store i8 addrspace(3)* %p, i8 addrspace(3)** %p.addr, align 4
327748922b3SIlia Diachkov  store <{ i32, i32, i8 addrspace(4)* }> addrspace(4)* %block, <{ i32, i32, i8 addrspace(4)* }> addrspace(4)** %block.addr, align 4
328748922b3SIlia Diachkov  ret void
329748922b3SIlia Diachkov}
330748922b3SIlia Diachkov
331748922b3SIlia Diachkovdefine spir_kernel void @__device_side_enqueue_block_invoke_3_kernel(i8 addrspace(4)* %0, i8 addrspace(3)* %1) {
332748922b3SIlia Diachkoventry:
333748922b3SIlia Diachkov  call spir_func void @__device_side_enqueue_block_invoke_3(i8 addrspace(4)* %0, i8 addrspace(3)* %1)
334748922b3SIlia Diachkov  ret void
335748922b3SIlia Diachkov}
336748922b3SIlia Diachkov
337748922b3SIlia Diachkovdeclare spir_func i32 @__enqueue_kernel_events_varargs(%opencl.queue_t*, i32, %struct.ndrange_t*, i32, %opencl.clk_event_t* addrspace(4)*, %opencl.clk_event_t* addrspace(4)*, i8 addrspace(4)*, i8 addrspace(4)*, i32, i32*)
338748922b3SIlia Diachkov
339748922b3SIlia Diachkovdefine internal spir_func void @__device_side_enqueue_block_invoke_4(i8 addrspace(4)* noundef %.block_descriptor, i8 addrspace(3)* noundef %p1, i8 addrspace(3)* noundef %p2, i8 addrspace(3)* noundef %p3) {
340748922b3SIlia Diachkoventry:
341748922b3SIlia Diachkov  %.block_descriptor.addr = alloca i8 addrspace(4)*, align 4
342748922b3SIlia Diachkov  %p1.addr = alloca i8 addrspace(3)*, align 4
343748922b3SIlia Diachkov  %p2.addr = alloca i8 addrspace(3)*, align 4
344748922b3SIlia Diachkov  %p3.addr = alloca i8 addrspace(3)*, align 4
345748922b3SIlia Diachkov  %block.addr = alloca <{ i32, i32, i8 addrspace(4)* }> addrspace(4)*, align 4
346748922b3SIlia Diachkov  store i8 addrspace(4)* %.block_descriptor, i8 addrspace(4)** %.block_descriptor.addr, align 4
347748922b3SIlia Diachkov  %block = bitcast i8 addrspace(4)* %.block_descriptor to <{ i32, i32, i8 addrspace(4)* }> addrspace(4)*
348748922b3SIlia Diachkov  store i8 addrspace(3)* %p1, i8 addrspace(3)** %p1.addr, align 4
349748922b3SIlia Diachkov  store i8 addrspace(3)* %p2, i8 addrspace(3)** %p2.addr, align 4
350748922b3SIlia Diachkov  store i8 addrspace(3)* %p3, i8 addrspace(3)** %p3.addr, align 4
351748922b3SIlia Diachkov  store <{ i32, i32, i8 addrspace(4)* }> addrspace(4)* %block, <{ i32, i32, i8 addrspace(4)* }> addrspace(4)** %block.addr, align 4
352748922b3SIlia Diachkov  ret void
353748922b3SIlia Diachkov}
354748922b3SIlia Diachkov
355748922b3SIlia Diachkovdefine spir_kernel void @__device_side_enqueue_block_invoke_4_kernel(i8 addrspace(4)* %0, i8 addrspace(3)* %1, i8 addrspace(3)* %2, i8 addrspace(3)* %3) {
356748922b3SIlia Diachkoventry:
357748922b3SIlia Diachkov  call spir_func void @__device_side_enqueue_block_invoke_4(i8 addrspace(4)* %0, i8 addrspace(3)* %1, i8 addrspace(3)* %2, i8 addrspace(3)* %3)
358748922b3SIlia Diachkov  ret void
359748922b3SIlia Diachkov}
360748922b3SIlia Diachkov
361748922b3SIlia Diachkovdeclare spir_func i32 @__enqueue_kernel_varargs(%opencl.queue_t*, i32, %struct.ndrange_t*, i8 addrspace(4)*, i8 addrspace(4)*, i32, i32*)
362748922b3SIlia Diachkov
363748922b3SIlia Diachkovdefine internal spir_func void @__device_side_enqueue_block_invoke_5(i8 addrspace(4)* noundef %.block_descriptor) {
364748922b3SIlia Diachkoventry:
365748922b3SIlia Diachkov  %.block_descriptor.addr = alloca i8 addrspace(4)*, align 4
366748922b3SIlia Diachkov  %block.addr = alloca <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)*, align 4
367748922b3SIlia Diachkov  store i8 addrspace(4)* %.block_descriptor, i8 addrspace(4)** %.block_descriptor.addr, align 4
368748922b3SIlia Diachkov  %block = bitcast i8 addrspace(4)* %.block_descriptor to <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)*
369748922b3SIlia Diachkov  store <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)* %block, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)** %block.addr, align 4
370748922b3SIlia Diachkov  %block.capture.addr = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)* %block, i32 0, i32 5
371748922b3SIlia Diachkov  %0 = load i32 addrspace(1)*, i32 addrspace(1)* addrspace(4)* %block.capture.addr, align 4
372748922b3SIlia Diachkov  %block.capture.addr1 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)* %block, i32 0, i32 4
373748922b3SIlia Diachkov  %1 = load i32, i32 addrspace(4)* %block.capture.addr1, align 4
374748922b3SIlia Diachkov  %arrayidx = getelementptr inbounds i32, i32 addrspace(1)* %0, i32 %1
375748922b3SIlia Diachkov  %2 = load i32, i32 addrspace(1)* %arrayidx, align 4
376748922b3SIlia Diachkov  %block.capture.addr2 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)* %block, i32 0, i32 3
377748922b3SIlia Diachkov  %3 = load i32 addrspace(1)*, i32 addrspace(1)* addrspace(4)* %block.capture.addr2, align 4
378748922b3SIlia Diachkov  %block.capture.addr3 = getelementptr inbounds <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>, <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }> addrspace(4)* %block, i32 0, i32 4
379748922b3SIlia Diachkov  %4 = load i32, i32 addrspace(4)* %block.capture.addr3, align 4
380748922b3SIlia Diachkov  %arrayidx4 = getelementptr inbounds i32, i32 addrspace(1)* %3, i32 %4
381748922b3SIlia Diachkov  store i32 %2, i32 addrspace(1)* %arrayidx4, align 4
382748922b3SIlia Diachkov  ret void
383748922b3SIlia Diachkov}
384748922b3SIlia Diachkov
385748922b3SIlia Diachkovdefine spir_kernel void @__device_side_enqueue_block_invoke_5_kernel(i8 addrspace(4)* %0) {
386748922b3SIlia Diachkoventry:
387748922b3SIlia Diachkov  call spir_func void @__device_side_enqueue_block_invoke_5(i8 addrspace(4)* %0)
388748922b3SIlia Diachkov  ret void
389748922b3SIlia Diachkov}
390