blob: 875c35c048dd2d1adb03b7a73340c078fd261e6f [file] [log] [blame]
Yaxun Liuc2a87a02017-10-14 12:23:50 +00001// RUN: %clang_cc1 %s -cl-std=CL2.0 -O0 -emit-llvm -o - -triple amdgcn | FileCheck %s --check-prefix=CHECK
2
3typedef struct {int a;} ndrange_t;
4
Yaxun Liufa13d012018-02-15 16:39:19 +00005void callee(long id, global long *out) {
6 out[id] = id;
7}
8
Yaxun Liuc2a87a02017-10-14 12:23:50 +00009// CHECK-LABEL: define amdgpu_kernel void @test
10kernel void test(global char *a, char b, global long *c, long d) {
11 queue_t default_queue;
12 unsigned flags = 0;
13 ndrange_t ndrange;
14
15 enqueue_kernel(default_queue, flags, ndrange,
16 ^(void) {
17 a[0] = b;
18 });
19
20 enqueue_kernel(default_queue, flags, ndrange,
21 ^(void) {
22 a[0] = b;
23 c[0] = d;
24 });
Yaxun Liuf2127d12017-10-19 15:56:13 +000025 enqueue_kernel(default_queue, flags, ndrange,
26 ^(local void *lp) {
27 a[0] = b;
28 c[0] = d;
29 ((local int*)lp)[0] = 1;
30 }, 100);
Yaxun Liufa13d012018-02-15 16:39:19 +000031
32 void (^block)(void) = ^{
33 callee(d, c);
34 };
35
36 enqueue_kernel(default_queue, flags, ndrange, block);
Yaxun Liuc2a87a02017-10-14 12:23:50 +000037}
38
Yaxun Liuf5f45e52018-02-02 16:08:24 +000039// CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_kernel(<{ i32, i32, i8*, i8 addrspace(1)*, i8 }>)
Yaxun Liuc2a87a02017-10-14 12:23:50 +000040// CHECK-SAME: #[[ATTR:[0-9]+]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}}
41// CHECK: entry:
Yaxun Liuf5f45e52018-02-02 16:08:24 +000042// CHECK: %1 = alloca <{ i32, i32, i8*, i8 addrspace(1)*, i8 }>, align 8, addrspace(5)
43// CHECK: store <{ i32, i32, i8*, i8 addrspace(1)*, i8 }> %0, <{ i32, i32, i8*, i8 addrspace(1)*, i8 }> addrspace(5)* %1, align 8
44// CHECK: %2 = addrspacecast <{ i32, i32, i8*, i8 addrspace(1)*, i8 }> addrspace(5)* %1 to i8*
45// CHECK: call void @__test_block_invoke(i8* %2)
Yaxun Liuc2a87a02017-10-14 12:23:50 +000046// CHECK: ret void
47// CHECK:}
48
Yaxun Liuf5f45e52018-02-02 16:08:24 +000049// CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_2_kernel(<{ i32, i32, i8*, i8 addrspace(1)*, i64 addrspace(1)*, i64, i8 }>)
Yaxun Liuc2a87a02017-10-14 12:23:50 +000050// CHECK-SAME: #[[ATTR]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}}
51
Yaxun Liuf5f45e52018-02-02 16:08:24 +000052// CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_3_kernel(<{ i32, i32, i8*, i8 addrspace(1)*, i64 addrspace(1)*, i64, i8 }>, i8 addrspace(3)*)
Yaxun Liuf2127d12017-10-19 15:56:13 +000053// CHECK-SAME: #[[ATTR]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}}
54
Yaxun Liufa13d012018-02-15 16:39:19 +000055// CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_4_kernel(<{ i32, i32, i8*, i64, i64 addrspace(1)* }>)
56// CHECK-SAME: #[[ATTR]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}}
57
Yaxun Liuc2a87a02017-10-14 12:23:50 +000058// CHECK: attributes #[[ATTR]] = { nounwind "enqueued-block" }