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