| // RUN: %clang_cc1 %s -cl-std=CL2.0 -O0 -emit-llvm -o - -triple amdgcn | FileCheck %s --check-prefix=CHECK |
| |
| typedef struct {int a;} ndrange_t; |
| |
| void callee(long id, global long *out) { |
| out[id] = id; |
| } |
| |
| // CHECK-LABEL: define amdgpu_kernel void @test |
| kernel void test(global char *a, char b, global long *c, long d) { |
| queue_t default_queue; |
| unsigned flags = 0; |
| ndrange_t ndrange; |
| |
| enqueue_kernel(default_queue, flags, ndrange, |
| ^(void) { |
| a[0] = b; |
| }); |
| |
| enqueue_kernel(default_queue, flags, ndrange, |
| ^(void) { |
| a[0] = b; |
| c[0] = d; |
| }); |
| enqueue_kernel(default_queue, flags, ndrange, |
| ^(local void *lp) { |
| a[0] = b; |
| c[0] = d; |
| ((local int*)lp)[0] = 1; |
| }, 100); |
| |
| void (^block)(void) = ^{ |
| callee(d, c); |
| }; |
| |
| enqueue_kernel(default_queue, flags, ndrange, block); |
| } |
| |
| // CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_kernel(<{ i32, i32, i8*, i8 addrspace(1)*, i8 }> %0) |
| // CHECK-SAME: #[[ATTR:[0-9]+]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}} |
| // CHECK: entry: |
| // CHECK: %1 = alloca <{ i32, i32, i8*, i8 addrspace(1)*, i8 }>, align 8, addrspace(5) |
| // CHECK: store <{ i32, i32, i8*, i8 addrspace(1)*, i8 }> %0, <{ i32, i32, i8*, i8 addrspace(1)*, i8 }> addrspace(5)* %1, align 8 |
| // CHECK: %2 = addrspacecast <{ i32, i32, i8*, i8 addrspace(1)*, i8 }> addrspace(5)* %1 to i8* |
| // CHECK: call void @__test_block_invoke(i8* %2) |
| // CHECK: ret void |
| // CHECK:} |
| |
| // CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_2_kernel(<{ i32, i32, i8*, i8 addrspace(1)*, i64 addrspace(1)*, i64, i8 }> %0) |
| // CHECK-SAME: #[[ATTR]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}} |
| |
| // 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) |
| // CHECK-SAME: #[[ATTR]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}} |
| |
| // CHECK-LABEL: define internal amdgpu_kernel void @__test_block_invoke_4_kernel(<{ i32, i32, i8*, i64, i64 addrspace(1)* }> %0) |
| // CHECK-SAME: #[[ATTR]] !kernel_arg_addr_space !{{.*}} !kernel_arg_access_qual !{{.*}} !kernel_arg_type !{{.*}} !kernel_arg_base_type !{{.*}} !kernel_arg_type_qual !{{.*}} |
| |
| // CHECK: attributes #[[ATTR]] = { nounwind "enqueued-block" } |