1*532dc62bSNikita Popov// RUN: %clang_cc1 -no-opaque-pointers %s -cl-std=CL2.0 -O0 -emit-llvm -o - -triple amdgcn | FileCheck %s --check-prefix=CHECK
2c2a87a05SYaxun Liu
3c2a87a05SYaxun Liutypedef struct {int a;} ndrange_t;
4c2a87a05SYaxun Liu
5fa13d015SYaxun Liuvoid callee(long id, global long *out) {
6fa13d015SYaxun Liu  out[id] = id;
7fa13d015SYaxun Liu}
8fa13d015SYaxun Liu
9fd739804SFangrui Song// CHECK-LABEL: define{{.*}} amdgpu_kernel void @test
10c2a87a05SYaxun Liukernel void test(global char *a, char b, global long *c, long d) {
11c2a87a05SYaxun Liu  queue_t default_queue;
12c2a87a05SYaxun Liu  unsigned flags = 0;
13c2a87a05SYaxun Liu  ndrange_t ndrange;
14c2a87a05SYaxun Liu
15c2a87a05SYaxun Liu  enqueue_kernel(default_queue, flags, ndrange,
16c2a87a05SYaxun Liu                 ^(void) {
17c2a87a05SYaxun Liu                 a[0] = b;
18c2a87a05SYaxun Liu                 });
19c2a87a05SYaxun Liu
20c2a87a05SYaxun Liu  enqueue_kernel(default_queue, flags, ndrange,
21c2a87a05SYaxun Liu                 ^(void) {
22c2a87a05SYaxun Liu                 a[0] = b;
23c2a87a05SYaxun Liu                 c[0] = d;
24c2a87a05SYaxun Liu                 });
25f2127d17SYaxun Liu  enqueue_kernel(default_queue, flags, ndrange,
26f2127d17SYaxun Liu                 ^(local void *lp) {
27f2127d17SYaxun Liu                 a[0] = b;
28f2127d17SYaxun Liu                 c[0] = d;
29f2127d17SYaxun Liu                 ((local int*)lp)[0] = 1;
30f2127d17SYaxun Liu                 }, 100);
31fa13d015SYaxun Liu
32fa13d015SYaxun Liu  void (^block)(void) = ^{
33fa13d015SYaxun Liu    callee(d, c);
34fa13d015SYaxun Liu  };
35fa13d015SYaxun Liu
36fa13d015SYaxun Liu  enqueue_kernel(default_queue, flags, ndrange, block);
37c2a87a05SYaxun Liu}
38c2a87a05SYaxun Liu
39a009a60aSTim Northover// CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_kernel(<{ i32, i32, i8*, i8 addrspace(1)*, i8 }> %0)
40c2a87a05SYaxun Liu// CHECK-SAME: #[[ATTR:[0-9]+]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}}
41c2a87a05SYaxun Liu// CHECK: entry:
42da3b6320SSven van Haastregt// CHECK:  %1 = alloca <{ i32, i32, i8*, i8 addrspace(1)*, i8 }>, align 8, addrspace(5)
43da3b6320SSven van Haastregt// CHECK:  store <{ i32, i32, i8*, i8 addrspace(1)*, i8 }> %0, <{ i32, i32, i8*, i8 addrspace(1)*, i8 }> addrspace(5)* %1, align 8
44fd739804SFangrui Song// CHECK:  %2 ={{.*}} addrspacecast <{ i32, i32, i8*, i8 addrspace(1)*, i8 }> addrspace(5)* %1 to i8*
45f5f45e5eSYaxun Liu// CHECK:  call void @__test_block_invoke(i8* %2)
46c2a87a05SYaxun Liu// CHECK:  ret void
47c2a87a05SYaxun Liu// CHECK:}
48c2a87a05SYaxun Liu
49a009a60aSTim Northover// CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_2_kernel(<{ i32, i32, i8*, i8 addrspace(1)*, i64 addrspace(1)*, i64, i8 }> %0)
50c2a87a05SYaxun Liu// CHECK-SAME: #[[ATTR]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}}
51c2a87a05SYaxun Liu
52a009a60aSTim Northover// CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_3_kernel(<{ i32, i32, i8*, i8 addrspace(1)*, i64 addrspace(1)*, i64, i8 }> %0, i8 addrspace(3)* %1)
53f2127d17SYaxun Liu// CHECK-SAME: #[[ATTR]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}}
54f2127d17SYaxun Liu
55a009a60aSTim Northover// CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_4_kernel(<{ i32, i32, i8*, i64, i64 addrspace(1)* }> %0)
56fa13d015SYaxun Liu// CHECK-SAME: #[[ATTR]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}}
57fa13d015SYaxun Liu
58c2a87a05SYaxun Liu// CHECK: attributes #[[ATTR]] = { nounwind "enqueued-block" }
59