blob: 8d77c18e7a550cc301827d6ec58bfbc0a5e8961a [file] [log] [blame]
Anastasia Stulova0df4ac32016-11-14 17:39:58 +00001// RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map -O0 -emit-llvm -o - -triple "spir-unknown-unknown" | FileCheck %s --check-prefix=COMMON --check-prefix=B32
2// RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map -O0 -emit-llvm -o - -triple "spir64-unknown-unknown" | FileCheck %s --check-prefix=COMMON --check-prefix=B64
Scott Linderf8b3df42018-08-07 15:52:49 +00003// RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map -O1 -emit-llvm -o - -triple "spir64-unknown-unknown" | FileCheck %s --check-prefix=CHECK-LIFETIMES
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +00004
Joey Gouly84ae3362017-07-31 15:15:59 +00005#pragma OPENCL EXTENSION cl_khr_subgroups : enable
6
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +00007typedef void (^bl_t)(local void *);
Anastasia Stulova58984e72017-02-16 12:27:47 +00008typedef struct {int a;} ndrange_t;
9
Sven van Haastregtda3b6322018-10-02 13:02:24 +000010// COMMON: %struct.__opencl_block_literal_generic = type { i32, i32, i8 addrspace(4)* }
11
Yaxun Liuc2a87a02017-10-14 12:23:50 +000012// For a block global variable, first emit the block literal as a global variable, then emit the block variable itself.
Sven van Haastregtda3b6322018-10-02 13:02:24 +000013// COMMON: [[BL_GLOBAL:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* [[INV_G:@[^ ]+]] to i8*) to i8 addrspace(4)*) }
Alexey Bader24fa0c12019-02-19 15:19:06 +000014// COMMON: @block_G = addrspace(1) constant %struct.__opencl_block_literal_generic addrspace(4)* addrspacecast (%struct.__opencl_block_literal_generic addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BL_GLOBAL]] to %struct.__opencl_block_literal_generic addrspace(1)*) to %struct.__opencl_block_literal_generic addrspace(4)*)
Yaxun Liuc2a87a02017-10-14 12:23:50 +000015
16// For anonymous blocks without captures, emit block literals as global variable.
Sven van Haastregtda3b6322018-10-02 13:02:24 +000017// COMMON: [[BLG1:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* {{@[^ ]+}} to i8*) to i8 addrspace(4)*) }
18// COMMON: [[BLG2:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* {{@[^ ]+}} to i8*) to i8 addrspace(4)*) }
19// COMMON: [[BLG3:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* {{@[^ ]+}} to i8*) to i8 addrspace(4)*) }
20// COMMON: [[BLG4:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* {{@[^ ]+}} to i8*) to i8 addrspace(4)*) }
21// COMMON: [[BLG5:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* {{@[^ ]+}} to i8*) to i8 addrspace(4)*) }
22// COMMON: [[BLG6:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*, i8 addrspace(3)*, i8 addrspace(3)*)* {{@[^ ]+}} to i8*) to i8 addrspace(4)*) }
23// COMMON: [[BLG7:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* {{@[^ ]+}} to i8*) to i8 addrspace(4)*) }
24// COMMON: [[BLG8:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* [[INVG8:@[^ ]+]] to i8*) to i8 addrspace(4)*) }
25// COMMON: [[BLG9:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*, i8 addrspace(3)*)* [[INVG9:@[^ ]+]] to i8*) to i8 addrspace(4)*) }
26// COMMON: [[BLG10:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* {{@[^ ]+}} to i8*) to i8 addrspace(4)*) }
27// COMMON: [[BLG11:@__block_literal_global[^ ]*]] = internal addrspace(1) constant { i32, i32, i8 addrspace(4)* } { i32 {{[0-9]+}}, i32 {{[0-9]+}}, i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* {{@[^ ]+}} to i8*) to i8 addrspace(4)*) }
Yaxun Liuc2a87a02017-10-14 12:23:50 +000028
29// Emits block literal [[BL_GLOBAL]], invoke function [[INV_G]] and global block variable @block_G
Sven van Haastregtda3b6322018-10-02 13:02:24 +000030// COMMON: define internal spir_func void [[INV_G]](i8 addrspace(4)* %{{.*}}, i8 addrspace(3)* %{{.*}})
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +000031const bl_t block_G = (bl_t) ^ (local void *a) {};
32
Yaxun Liufa13d012018-02-15 16:39:19 +000033void callee(int id, __global int *out) {
34 out[id] = id;
35}
36
Yaxun Liuc2a87a02017-10-14 12:23:50 +000037// COMMON-LABEL: define spir_kernel void @device_side_enqueue(i32 addrspace(1)* %{{.*}}, i32 addrspace(1)* %b, i32 %i)
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +000038kernel void device_side_enqueue(global int *a, global int *b, int i) {
Anastasia Stulova0df4ac32016-11-14 17:39:58 +000039 // COMMON: %default_queue = alloca %opencl.queue_t*
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +000040 queue_t default_queue;
Anastasia Stulova0df4ac32016-11-14 17:39:58 +000041 // COMMON: %flags = alloca i32
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +000042 unsigned flags = 0;
Anastasia Stulova58984e72017-02-16 12:27:47 +000043 // COMMON: %ndrange = alloca %struct.ndrange_t
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +000044 ndrange_t ndrange;
Anastasia Stulova0df4ac32016-11-14 17:39:58 +000045 // COMMON: %clk_event = alloca %opencl.clk_event_t*
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +000046 clk_event_t clk_event;
Anastasia Stulova0df4ac32016-11-14 17:39:58 +000047 // COMMON: %event_wait_list = alloca %opencl.clk_event_t*
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +000048 clk_event_t event_wait_list;
Anastasia Stulova0df4ac32016-11-14 17:39:58 +000049 // COMMON: %event_wait_list2 = alloca [1 x %opencl.clk_event_t*]
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +000050 clk_event_t event_wait_list2[] = {clk_event};
51
Vlad Tsyrklevichc7d3d342018-08-03 17:47:58 +000052 // COMMON: [[NDR:%[a-z0-9]+]] = alloca %struct.ndrange_t, align 4
Scott Linderf8b3df42018-08-07 15:52:49 +000053
54 // B32: %[[BLOCK_SIZES1:.*]] = alloca [1 x i32]
55 // B64: %[[BLOCK_SIZES1:.*]] = alloca [1 x i64]
56 // CHECK-LIFETIMES: %[[BLOCK_SIZES1:.*]] = alloca [1 x i64]
57 // B32: %[[BLOCK_SIZES2:.*]] = alloca [1 x i32]
58 // B64: %[[BLOCK_SIZES2:.*]] = alloca [1 x i64]
59 // CHECK-LIFETIMES: %[[BLOCK_SIZES2:.*]] = alloca [1 x i64]
60 // B32: %[[BLOCK_SIZES3:.*]] = alloca [1 x i32]
61 // B64: %[[BLOCK_SIZES3:.*]] = alloca [1 x i64]
62 // CHECK-LIFETIMES: %[[BLOCK_SIZES3:.*]] = alloca [1 x i64]
63 // B32: %[[BLOCK_SIZES4:.*]] = alloca [1 x i32]
64 // B64: %[[BLOCK_SIZES4:.*]] = alloca [1 x i64]
65 // CHECK-LIFETIMES: %[[BLOCK_SIZES4:.*]] = alloca [1 x i64]
66 // B32: %[[BLOCK_SIZES5:.*]] = alloca [1 x i32]
67 // B64: %[[BLOCK_SIZES5:.*]] = alloca [1 x i64]
68 // CHECK-LIFETIMES: %[[BLOCK_SIZES5:.*]] = alloca [1 x i64]
69 // B32: %[[BLOCK_SIZES6:.*]] = alloca [3 x i32]
70 // B64: %[[BLOCK_SIZES6:.*]] = alloca [3 x i64]
71 // CHECK-LIFETIMES: %[[BLOCK_SIZES6:.*]] = alloca [3 x i64]
72 // B32: %[[BLOCK_SIZES7:.*]] = alloca [1 x i32]
73 // B64: %[[BLOCK_SIZES7:.*]] = alloca [1 x i64]
74 // CHECK-LIFETIMES: %[[BLOCK_SIZES7:.*]] = alloca [1 x i64]
75
76 // Emits block literal on stack and block kernel [[INVLK1]].
Anastasia Stulova0df4ac32016-11-14 17:39:58 +000077 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
78 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
Sven van Haastregtda3b6322018-10-02 13:02:24 +000079 // COMMON: store i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* [[INVL1:@__device_side_enqueue_block_invoke[^ ]*]] to i8*) to i8 addrspace(4)*), i8 addrspace(4)** %block.invoke
Alexey Bader24fa0c12019-02-19 15:19:06 +000080 // B32: [[BL:%[0-9]+]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32, i32 addrspace(1)* }>* %block to %struct.__opencl_block_literal_generic*
81 // B64: [[BL:%[0-9]+]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32 addrspace(1)*, i32 addrspace(1)*, i32 }>* %block to %struct.__opencl_block_literal_generic*
82 // COMMON: [[BL_I8:%[0-9]+]] = addrspacecast %struct.__opencl_block_literal_generic* [[BL]] to i8 addrspace(4)*
Yaxun Liuc2a87a02017-10-14 12:23:50 +000083 // COMMON-LABEL: call i32 @__enqueue_kernel_basic(
84 // COMMON-SAME: %opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* byval [[NDR]]{{([0-9]+)?}},
85 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVLK1:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
86 // COMMON-SAME: i8 addrspace(4)* [[BL_I8]])
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +000087 enqueue_kernel(default_queue, flags, ndrange,
88 ^(void) {
89 a[i] = b[i];
90 });
91
Yaxun Liuc2a87a02017-10-14 12:23:50 +000092 // Emits block literal on stack and block kernel [[INVLK2]].
Anastasia Stulova0df4ac32016-11-14 17:39:58 +000093 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
94 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
Anastasia Stulova0df4ac32016-11-14 17:39:58 +000095 // COMMON: [[WAIT_EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** %event_wait_list to %opencl.clk_event_t{{.*}}* addrspace(4)*
96 // COMMON: [[EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** %clk_event to %opencl.clk_event_t{{.*}}* addrspace(4)*
Sven van Haastregtda3b6322018-10-02 13:02:24 +000097 // COMMON: store i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* [[INVL2:@__device_side_enqueue_block_invoke[^ ]*]] to i8*) to i8 addrspace(4)*), i8 addrspace(4)** %block.invoke
Alexey Bader24fa0c12019-02-19 15:19:06 +000098 // COMMON: [[BL:%[0-9]+]] = bitcast <{ i32, i32, i8 addrspace(4)*, i32{{.*}}, i32{{.*}}, i32{{.*}} }>* %block3 to %struct.__opencl_block_literal_generic*
99 // COMMON: [[BL_I8:%[0-9]+]] = addrspacecast %struct.__opencl_block_literal_generic* [[BL]] to i8 addrspace(4)*
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000100 // COMMON-LABEL: call i32 @__enqueue_kernel_basic_events
101 // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}* addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}* addrspace(4)* [[EVNT]],
102 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVLK2:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
103 // COMMON-SAME: i8 addrspace(4)* [[BL_I8]])
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000104 enqueue_kernel(default_queue, flags, ndrange, 2, &event_wait_list, &clk_event,
105 ^(void) {
106 a[i] = b[i];
107 });
108
Alexey Sotkin692f12b2018-11-14 09:40:05 +0000109 // COMMON-LABEL: call i32 @__enqueue_kernel_basic_events
Alexey Sotkin1b01f972019-04-11 06:18:17 +0000110 // COMMON-SAME: (%opencl.queue_t{{.*}}* {{%[0-9]+}}, i32 {{%[0-9]+}}, %struct.ndrange_t* {{.*}}, i32 1, %opencl.clk_event_t{{.*}}* addrspace(4)* null, %opencl.clk_event_t{{.*}}* addrspace(4)* null,
111 enqueue_kernel(default_queue, flags, ndrange, 1, 0, 0,
Alexey Sotkin692f12b2018-11-14 09:40:05 +0000112 ^(void) {
113 return;
114 });
115
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000116 // Emits global block literal [[BLG1]] and block kernel [[INVGK1]].
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000117 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
118 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
Scott Linderf8b3df42018-08-07 15:52:49 +0000119 // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]* %[[BLOCK_SIZES1]] to i8*
120 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
121 // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x i64]* %[[BLOCK_SIZES1]], i64 0, i64 0
122 // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_varargs(
123 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
124 // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]* %[[BLOCK_SIZES1]], i32 0, i32 0
125 // B32: store i32 256, i32* %[[TMP]], align 4
126 // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]* %[[BLOCK_SIZES1]], i32 0, i32 0
127 // B64: store i64 256, i64* %[[TMP]], align 8
Yaxun Liu3cab24a2018-05-09 17:07:06 +0000128 // COMMON-LABEL: call i32 @__enqueue_kernel_varargs(
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000129 // COMMON-SAME: %opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{([0-9]+)?}},
130 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK1:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000131 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG1]] to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1,
Scott Linderf8b3df42018-08-07 15:52:49 +0000132 // B32-SAME: i32* %[[TMP]])
133 // B64-SAME: i64* %[[TMP]])
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000134 enqueue_kernel(default_queue, flags, ndrange,
135 ^(local void *p) {
136 return;
137 },
138 256);
Scott Linderf8b3df42018-08-07 15:52:49 +0000139
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000140 char c;
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000141 // Emits global block literal [[BLG2]] and block kernel [[INVGK2]].
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000142 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
143 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
Scott Linderf8b3df42018-08-07 15:52:49 +0000144 // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]* %[[BLOCK_SIZES2]] to i8*
145 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
146 // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x i64]* %[[BLOCK_SIZES2]], i64 0, i64 0
147 // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_varargs(
148 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
149 // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]* %[[BLOCK_SIZES2]], i32 0, i32 0
150 // B32: store i32 %{{.*}}, i32* %[[TMP]], align 4
151 // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]* %[[BLOCK_SIZES2]], i32 0, i32 0
152 // B64: store i64 %{{.*}}, i64* %[[TMP]], align 8
Yaxun Liu3cab24a2018-05-09 17:07:06 +0000153 // COMMON-LABEL: call i32 @__enqueue_kernel_varargs(
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000154 // COMMON-SAME: %opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{([0-9]+)?}},
155 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK2:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000156 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG2]] to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1,
Scott Linderf8b3df42018-08-07 15:52:49 +0000157 // B32-SAME: i32* %[[TMP]])
158 // B64-SAME: i64* %[[TMP]])
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000159 enqueue_kernel(default_queue, flags, ndrange,
160 ^(local void *p) {
161 return;
162 },
163 c);
164
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000165 // Emits global block literal [[BLG3]] and block kernel [[INVGK3]].
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000166 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
167 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
James Y Knightf5f1b0e2019-02-08 15:34:12 +0000168 // COMMON: [[AD:%arraydecay[0-9]*]] = getelementptr inbounds [1 x %opencl.clk_event_t*], [1 x %opencl.clk_event_t*]* %event_wait_list2, i{{32|64}} 0, i{{32|64}} 0
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000169 // COMMON: [[WAIT_EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** [[AD]] to %opencl.clk_event_t{{.*}}* addrspace(4)*
170 // COMMON: [[EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** %clk_event to %opencl.clk_event_t{{.*}}* addrspace(4)*
Scott Linderf8b3df42018-08-07 15:52:49 +0000171 // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]* %[[BLOCK_SIZES3]] to i8*
172 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
173 // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x i64]* %[[BLOCK_SIZES3]], i64 0, i64 0
174 // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_events_varargs(
175 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
176 // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]* %[[BLOCK_SIZES3]], i32 0, i32 0
177 // B32: store i32 256, i32* %[[TMP]], align 4
178 // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]* %[[BLOCK_SIZES3]], i32 0, i32 0
179 // B64: store i64 256, i64* %[[TMP]], align 8
Yaxun Liu3cab24a2018-05-09 17:07:06 +0000180 // COMMON-LABEL: call i32 @__enqueue_kernel_events_varargs
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000181 // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}} [[WAIT_EVNT]], %opencl.clk_event_t{{.*}} [[EVNT]],
182 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK3:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000183 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG3]] to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1,
Scott Linderf8b3df42018-08-07 15:52:49 +0000184 // B32-SAME: i32* %[[TMP]])
185 // B64-SAME: i64* %[[TMP]])
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000186 enqueue_kernel(default_queue, flags, ndrange, 2, event_wait_list2, &clk_event,
187 ^(local void *p) {
188 return;
189 },
190 256);
191
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000192 // Emits global block literal [[BLG4]] and block kernel [[INVGK4]].
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000193 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
194 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
James Y Knightf5f1b0e2019-02-08 15:34:12 +0000195 // COMMON: [[AD:%arraydecay[0-9]*]] = getelementptr inbounds [1 x %opencl.clk_event_t*], [1 x %opencl.clk_event_t*]* %event_wait_list2, i{{32|64}} 0, i{{32|64}} 0
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000196 // COMMON: [[WAIT_EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** [[AD]] to %opencl.clk_event_t{{.*}}* addrspace(4)*
197 // COMMON: [[EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** %clk_event to %opencl.clk_event_t{{.*}}* addrspace(4)*
Scott Linderf8b3df42018-08-07 15:52:49 +0000198 // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]* %[[BLOCK_SIZES4]] to i8*
199 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
200 // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x i64]* %[[BLOCK_SIZES4]], i64 0, i64 0
201 // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_events_varargs(
202 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
203 // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]* %[[BLOCK_SIZES4]], i32 0, i32 0
204 // B32: store i32 %{{.*}}, i32* %[[TMP]], align 4
205 // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]* %[[BLOCK_SIZES4]], i32 0, i32 0
206 // B64: store i64 %{{.*}}, i64* %[[TMP]], align 8
Yaxun Liu3cab24a2018-05-09 17:07:06 +0000207 // COMMON-LABEL: call i32 @__enqueue_kernel_events_varargs
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000208 // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}* addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}* addrspace(4)* [[EVNT]],
209 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK4:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000210 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG4]] to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1,
Scott Linderf8b3df42018-08-07 15:52:49 +0000211 // B32-SAME: i32* %[[TMP]])
212 // B64-SAME: i64* %[[TMP]])
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000213 enqueue_kernel(default_queue, flags, ndrange, 2, event_wait_list2, &clk_event,
214 ^(local void *p) {
215 return;
216 },
217 c);
218
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000219 long l;
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000220 // Emits global block literal [[BLG5]] and block kernel [[INVGK5]].
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000221 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
222 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
Scott Linderf8b3df42018-08-07 15:52:49 +0000223 // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]* %[[BLOCK_SIZES5]] to i8*
224 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
225 // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x i64]* %[[BLOCK_SIZES5]], i64 0, i64 0
226 // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_varargs(
227 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
228 // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]* %[[BLOCK_SIZES5]], i32 0, i32 0
229 // B32: store i32 %{{.*}}, i32* %[[TMP]], align 4
230 // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]* %[[BLOCK_SIZES5]], i32 0, i32 0
231 // B64: store i64 %{{.*}}, i64* %[[TMP]], align 8
Yaxun Liu3cab24a2018-05-09 17:07:06 +0000232 // COMMON-LABEL: call i32 @__enqueue_kernel_varargs
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000233 // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{([0-9]+)?}},
234 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK5:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000235 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG5]] to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1,
Scott Linderf8b3df42018-08-07 15:52:49 +0000236 // B32-SAME: i32* %[[TMP]])
237 // B64-SAME: i64* %[[TMP]])
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000238 enqueue_kernel(default_queue, flags, ndrange,
239 ^(local void *p) {
240 return;
241 },
242 l);
243
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000244 // Emits global block literal [[BLG6]] and block kernel [[INVGK6]].
Yaxun Liu29a5ee32017-09-03 13:52:24 +0000245 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
246 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
Scott Linderf8b3df42018-08-07 15:52:49 +0000247 // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [3 x i64]* %[[BLOCK_SIZES6]] to i8*
248 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64 24, i8* nonnull [[LIFETIME_PTR]])
249 // CHECK-LIFETIMES-NEXT: getelementptr inbounds [3 x i64], [3 x i64]* %[[BLOCK_SIZES6]], i64 0, i64 0
250 // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_varargs(
251 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 24, i8* nonnull [[LIFETIME_PTR]])
252 // B32: %[[TMP:.*]] = getelementptr [3 x i32], [3 x i32]* %[[BLOCK_SIZES6]], i32 0, i32 0
253 // B32: store i32 1, i32* %[[TMP]], align 4
254 // B32: %[[BLOCK_SIZES62:.*]] = getelementptr [3 x i32], [3 x i32]* %[[BLOCK_SIZES6]], i32 0, i32 1
255 // B32: store i32 2, i32* %[[BLOCK_SIZES62]], align 4
256 // B32: %[[BLOCK_SIZES63:.*]] = getelementptr [3 x i32], [3 x i32]* %[[BLOCK_SIZES6]], i32 0, i32 2
257 // B32: store i32 4, i32* %[[BLOCK_SIZES63]], align 4
258 // B64: %[[TMP:.*]] = getelementptr [3 x i64], [3 x i64]* %[[BLOCK_SIZES6]], i32 0, i32 0
259 // B64: store i64 1, i64* %[[TMP]], align 8
260 // B64: %[[BLOCK_SIZES62:.*]] = getelementptr [3 x i64], [3 x i64]* %[[BLOCK_SIZES6]], i32 0, i32 1
261 // B64: store i64 2, i64* %[[BLOCK_SIZES62]], align 8
262 // B64: %[[BLOCK_SIZES63:.*]] = getelementptr [3 x i64], [3 x i64]* %[[BLOCK_SIZES6]], i32 0, i32 2
263 // B64: store i64 4, i64* %[[BLOCK_SIZES63]], align 8
Yaxun Liu3cab24a2018-05-09 17:07:06 +0000264 // COMMON-LABEL: call i32 @__enqueue_kernel_varargs
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000265 // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{([0-9]+)?}},
266 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK6:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000267 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG6]] to i8 addrspace(1)*) to i8 addrspace(4)*), i32 3,
Scott Linderf8b3df42018-08-07 15:52:49 +0000268 // B32-SAME: i32* %[[TMP]])
269 // B64-SAME: i64* %[[TMP]])
Yaxun Liu29a5ee32017-09-03 13:52:24 +0000270 enqueue_kernel(default_queue, flags, ndrange,
271 ^(local void *p1, local void *p2, local void *p3) {
272 return;
273 },
274 1, 2, 4);
275
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000276 // Emits global block literal [[BLG7]] and block kernel [[INVGK7]].
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000277 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t*, %opencl.queue_t** %default_queue
278 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
Scott Linderf8b3df42018-08-07 15:52:49 +0000279 // CHECK-LIFETIMES: [[LIFETIME_PTR:%[0-9]+]] = bitcast [1 x i64]* %[[BLOCK_SIZES7]] to i8*
280 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.start.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
281 // CHECK-LIFETIMES-NEXT: getelementptr inbounds [1 x i64], [1 x i64]* %[[BLOCK_SIZES7]], i64 0, i64 0
282 // CHECK-LIFETIMES-LABEL: call i32 @__enqueue_kernel_varargs(
283 // CHECK-LIFETIMES-NEXT: call void @llvm.lifetime.end.p0i8(i64 8, i8* nonnull [[LIFETIME_PTR]])
284 // B32: %[[TMP:.*]] = getelementptr [1 x i32], [1 x i32]* %[[BLOCK_SIZES7]], i32 0, i32 0
285 // B32: store i32 0, i32* %[[TMP]], align 4
286 // B64: %[[TMP:.*]] = getelementptr [1 x i64], [1 x i64]* %[[BLOCK_SIZES7]], i32 0, i32 0
287 // B64: store i64 4294967296, i64* %[[TMP]], align 8
Yaxun Liu3cab24a2018-05-09 17:07:06 +0000288 // COMMON-LABEL: call i32 @__enqueue_kernel_varargs
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000289 // COMMON-SAME: (%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{([0-9]+)?}},
290 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK7:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000291 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG7]] to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1,
Scott Linderf8b3df42018-08-07 15:52:49 +0000292 // B32-SAME: i32* %[[TMP]])
293 // B64-SAME: i64* %[[TMP]])
Anastasia Stulova0df4ac32016-11-14 17:39:58 +0000294 enqueue_kernel(default_queue, flags, ndrange,
295 ^(local void *p) {
296 return;
297 },
298 4294967296L);
299
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000300 // Emits global block literal [[BLG8]] and invoke function [[INVG8]].
George Burgess IVe3763372016-12-22 02:50:20 +0000301 // The full type of these expressions are long (and repeated elsewhere), so we
302 // capture it as part of the regex for convenience and clarity.
Alexey Bader24fa0c12019-02-19 15:19:06 +0000303 // COMMON: store %struct.__opencl_block_literal_generic addrspace(4)* addrspacecast (%struct.__opencl_block_literal_generic addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG8]] to %struct.__opencl_block_literal_generic addrspace(1)*) to %struct.__opencl_block_literal_generic addrspace(4)*), %struct.__opencl_block_literal_generic addrspace(4)** %block_A
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000304 void (^const block_A)(void) = ^{
305 return;
306 };
George Burgess IVe3763372016-12-22 02:50:20 +0000307
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000308 // Emits global block literal [[BLG9]] and invoke function [[INVG9]].
Alexey Bader24fa0c12019-02-19 15:19:06 +0000309 // COMMON: store %struct.__opencl_block_literal_generic addrspace(4)* addrspacecast (%struct.__opencl_block_literal_generic addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG9]] to %struct.__opencl_block_literal_generic addrspace(1)*) to %struct.__opencl_block_literal_generic addrspace(4)*), %struct.__opencl_block_literal_generic addrspace(4)** %block_B
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000310 void (^const block_B)(local void *) = ^(local void *a) {
311 return;
312 };
313
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000314 // Uses global block literal [[BLG8]] and invoke function [[INVG8]].
Andrew Savonichev43fceb22019-02-21 11:02:10 +0000315 // COMMON: call spir_func void @__device_side_enqueue_block_invoke_11(i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG8]] to i8 addrspace(1)*) to i8 addrspace(4)*))
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000316 block_A();
317
318 // Emits global block literal [[BLG8]] and block kernel [[INVGK8]]. [[INVGK8]] calls [[INVG8]].
319 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
320 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
321 // COMMON-LABEL: call i32 @__enqueue_kernel_basic(
322 // COMMON-SAME: %opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* byval [[NDR]]{{([0-9]+)?}},
323 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK8:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000324 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG8]] to i8 addrspace(1)*) to i8 addrspace(4)*))
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000325 enqueue_kernel(default_queue, flags, ndrange, block_A);
326
327 // Uses block kernel [[INVGK8]] and global block literal [[BLG8]].
328 // COMMON: call i32 @__get_kernel_work_group_size_impl(
329 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK8]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000330 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG8]] to i8 addrspace(1)*) to i8 addrspace(4)*))
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000331 unsigned size = get_kernel_work_group_size(block_A);
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000332
333 // Uses global block literal [[BLG8]] and invoke function [[INVG8]]. Make sure no redundant block literal and invoke functions are emitted.
Andrew Savonichev43fceb22019-02-21 11:02:10 +0000334 // COMMON: call spir_func void @__device_side_enqueue_block_invoke_11(i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG8]] to i8 addrspace(1)*) to i8 addrspace(4)*))
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000335 block_A();
336
Andrew Savonichev43fceb22019-02-21 11:02:10 +0000337 // Make sure that block invoke function is resolved correctly after sequence of assignements.
338 // COMMON: store %struct.__opencl_block_literal_generic addrspace(4)*
339 // COMMON-SAME: addrspacecast (%struct.__opencl_block_literal_generic addrspace(1)*
340 // COMMON-SAME: bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BL_GLOBAL]] to %struct.__opencl_block_literal_generic addrspace(1)*)
341 // COMMON-SAME: to %struct.__opencl_block_literal_generic addrspace(4)*),
342 // COMMON-SAME: %struct.__opencl_block_literal_generic addrspace(4)** %b1,
343 bl_t b1 = block_G;
344 // COMMON: store %struct.__opencl_block_literal_generic addrspace(4)*
345 // COMMON-SAME: addrspacecast (%struct.__opencl_block_literal_generic addrspace(1)*
346 // COMMON-SAME: bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BL_GLOBAL]] to %struct.__opencl_block_literal_generic addrspace(1)*)
347 // COMMON-SAME: to %struct.__opencl_block_literal_generic addrspace(4)*),
348 // COMMON-SAME: %struct.__opencl_block_literal_generic addrspace(4)** %b2,
349 bl_t b2 = b1;
350 // COMMON: call spir_func void @block_G_block_invoke(i8 addrspace(4)* addrspacecast (i8 addrspace(1)*
351 // COMMON-SAME: bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BL_GLOBAL]] to i8 addrspace(1)*)
352 // COOMON-SAME: to i8 addrspace(4)*), i8 addrspace(3)* null)
353 b2(0);
354 // Uses global block literal [[BL_GLOBAL]] and block kernel [[INV_G_K]]. [[INV_G_K]] calls [[INV_G]].
355 // COMMON: call i32 @__get_kernel_preferred_work_group_size_multiple_impl(
356 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INV_G_K:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
357 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BL_GLOBAL]] to i8 addrspace(1)*) to i8 addrspace(4)*))
358 size = get_kernel_preferred_work_group_size_multiple(b2);
359
Yaxun Liufa13d012018-02-15 16:39:19 +0000360 void (^block_C)(void) = ^{
361 callee(i, a);
362 };
Yaxun Liufa13d012018-02-15 16:39:19 +0000363 // Emits block literal on stack and block kernel [[INVLK3]].
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000364 // COMMON: store i8 addrspace(4)* addrspacecast (i8* bitcast (void (i8 addrspace(4)*)* [[INVL3:@__device_side_enqueue_block_invoke[^ ]*]] to i8*) to i8 addrspace(4)*), i8 addrspace(4)** %block.invoke
Yaxun Liufa13d012018-02-15 16:39:19 +0000365 // COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
366 // COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
Alexey Bader24fa0c12019-02-19 15:19:06 +0000367 // COMMON: [[BL_I8:%[0-9]+]] = addrspacecast %struct.__opencl_block_literal_generic* {{.*}} to i8 addrspace(4)*
Yaxun Liufa13d012018-02-15 16:39:19 +0000368 // COMMON-LABEL: call i32 @__enqueue_kernel_basic(
369 // COMMON-SAME: %opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* byval [[NDR]]{{([0-9]+)?}},
370 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVLK3:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
371 // COMMON-SAME: i8 addrspace(4)* [[BL_I8]])
372 enqueue_kernel(default_queue, flags, ndrange, block_C);
373
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000374 // Emits global block literal [[BLG9]] and block kernel [[INVGK9]]. [[INVGK9]] calls [[INV9]].
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000375 // COMMON: call i32 @__get_kernel_work_group_size_impl(
376 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK9:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000377 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG9]] to i8 addrspace(1)*) to i8 addrspace(4)*))
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000378 size = get_kernel_work_group_size(block_B);
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000379
380 // Uses global block literal [[BLG8]] and block kernel [[INVGK8]]. Make sure no redundant block literal ind invoke functions are emitted.
Yaxun Liu3cab24a2018-05-09 17:07:06 +0000381 // COMMON: call i32 @__get_kernel_preferred_work_group_size_multiple_impl(
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000382 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK8]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000383 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG8]] to i8 addrspace(1)*) to i8 addrspace(4)*))
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000384 size = get_kernel_preferred_work_group_size_multiple(block_A);
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000385
386 // Uses global block literal [[BL_GLOBAL]] and block kernel [[INV_G_K]]. [[INV_G_K]] calls [[INV_G]].
Yaxun Liu3cab24a2018-05-09 17:07:06 +0000387 // COMMON: call i32 @__get_kernel_preferred_work_group_size_multiple_impl(
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000388 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INV_G_K:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000389 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BL_GLOBAL]] to i8 addrspace(1)*) to i8 addrspace(4)*))
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000390 size = get_kernel_preferred_work_group_size_multiple(block_G);
Joey Goulyfa76b492017-08-01 13:27:09 +0000391
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000392 // Emits global block literal [[BLG10]] and block kernel [[INVGK10]].
393 // COMMON: call i32 @__get_kernel_max_sub_group_size_for_ndrange_impl(%struct.ndrange_t* {{[^,]+}},
394 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK10:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000395 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG10]] to i8 addrspace(1)*) to i8 addrspace(4)*))
Joey Goulyfa76b492017-08-01 13:27:09 +0000396 size = get_kernel_max_sub_group_size_for_ndrange(ndrange, ^(){});
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000397
398 // Emits global block literal [[BLG11]] and block kernel [[INVGK11]].
399 // COMMON: call i32 @__get_kernel_sub_group_count_for_ndrange_impl(%struct.ndrange_t* {{[^,]+}},
400 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8* bitcast ({{.*}} [[INVGK11:[^ ]+_kernel]] to i8*) to i8 addrspace(4)*),
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000401 // COMMON-SAME: i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i32, i32, i8 addrspace(4)* } addrspace(1)* [[BLG11]] to i8 addrspace(1)*) to i8 addrspace(4)*))
Joey Goulyfa76b492017-08-01 13:27:09 +0000402 size = get_kernel_sub_group_count_for_ndrange(ndrange, ^(){});
Anastasia Stulovadb7a31c2016-07-05 11:31:24 +0000403}
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000404
405// COMMON: define internal spir_kernel void [[INVLK1]](i8 addrspace(4)*) #{{[0-9]+}} {
406// COMMON: entry:
407// COMMON: call void @__device_side_enqueue_block_invoke(i8 addrspace(4)* %0)
408// COMMON: ret void
409// COMMON: }
410// COMMON: define internal spir_kernel void [[INVLK2]](i8 addrspace(4)*{{.*}})
411// COMMON: define internal spir_kernel void [[INVGK1]](i8 addrspace(4)*{{.*}}, i8 addrspace(3)*{{.*}})
412// COMMON: define internal spir_kernel void [[INVGK2]](i8 addrspace(4)*{{.*}}, i8 addrspace(3)*{{.*}})
413// COMMON: define internal spir_kernel void [[INVGK3]](i8 addrspace(4)*{{.*}}, i8 addrspace(3)*{{.*}})
414// COMMON: define internal spir_kernel void [[INVGK4]](i8 addrspace(4)*{{.*}}, i8 addrspace(3)*{{.*}})
415// COMMON: define internal spir_kernel void [[INVGK5]](i8 addrspace(4)*{{.*}}, i8 addrspace(3)*{{.*}})
416// COMMON: define internal spir_kernel void [[INVGK6]](i8 addrspace(4)*, i8 addrspace(3)*, i8 addrspace(3)*, i8 addrspace(3)*) #{{[0-9]+}} {
417// COMMON: entry:
Alexey Sotkin692f12b2018-11-14 09:40:05 +0000418// COMMON: call void @__device_side_enqueue_block_invoke_9(i8 addrspace(4)* %0, i8 addrspace(3)* %1, i8 addrspace(3)* %2, i8 addrspace(3)* %3)
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000419// COMMON: ret void
420// COMMON: }
421// COMMON: define internal spir_kernel void [[INVGK7]](i8 addrspace(4)*{{.*}}, i8 addrspace(3)*{{.*}})
422// COMMON: define internal spir_func void [[INVG8]](i8 addrspace(4)*{{.*}})
Sven van Haastregtda3b6322018-10-02 13:02:24 +0000423// COMMON: define internal spir_func void [[INVG9]](i8 addrspace(4)*{{.*}}, i8 addrspace(3)* %{{.*}})
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000424// COMMON: define internal spir_kernel void [[INVGK8]](i8 addrspace(4)*{{.*}})
Andrew Savonichev43fceb22019-02-21 11:02:10 +0000425// COMMON: define internal spir_kernel void [[INV_G_K]](i8 addrspace(4)*{{.*}}, i8 addrspace(3)*{{.*}})
Yaxun Liufa13d012018-02-15 16:39:19 +0000426// COMMON: define internal spir_kernel void [[INVLK3]](i8 addrspace(4)*{{.*}})
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000427// COMMON: define internal spir_kernel void [[INVGK9]](i8 addrspace(4)*{{.*}}, i8 addrspace(3)*{{.*}})
Yaxun Liuc2a87a02017-10-14 12:23:50 +0000428// COMMON: define internal spir_kernel void [[INVGK10]](i8 addrspace(4)*{{.*}})
429// COMMON: define internal spir_kernel void [[INVGK11]](i8 addrspace(4)*{{.*}})