blob: 806cc854582dba61ea3a1db33aa537ce8b221454 [file] [edit]
// REQUIRES: spirv-registered-target
// RUN: %clang_cc1 -cl-std=CL2.0 -O0 -emit-llvm -o - -triple spirv64-unknown-unknown %s | FileCheck %s
// RUN: %clang_cc1 -cl-std=CL2.0 -O0 -S -o - -triple spirv64-unknown-unknown -mllvm --spirv-ext=+SPV_INTEL_function_pointers %s | FileCheck %s --check-prefix=SPIRV
// Check that local sizes are passed as a pointer to the first array element
// and that the SPIR-V backend lowers this form.
typedef struct {int a;} ndrange_t;
kernel void test(queue_t q) {
ndrange_t nd;
// CHECK-LABEL: define {{.*}} void @__clang_ocl_kern_imp_test(
// CHECK: %[[SIZES:.*]] = alloca [2 x i64]
// CHECK: %[[ELEM:.*]] = getelementptr [2 x i64], ptr %[[SIZES]], i32 0, i32 0
// CHECK: call spir_func i32 @__enqueue_kernel_varargs({{.*}}, i32 2, ptr %[[ELEM]])
// SPIRV-DAG: %[[#INT32:]] = OpTypeInt 32 0
// SPIRV-DAG: %[[#ZERO:]] = OpConstantNull %[[#INT32]]
// SPIRV: %[[#ELEM:]] = OpPtrAccessChain %[[#]] %[[#]] %[[#ZERO]] %[[#ZERO]]
// SPIRV: %[[#SIZE0:]] = OpPtrAccessChain %[[#]] %[[#ELEM]] %[[#ZERO]]{{$}}
// SPIRV-NEXT: %[[#SIZE1:]] = OpPtrAccessChain %[[#]] %[[#ELEM]] %[[#]]{{$}}
// SPIRV-NEXT: OpEnqueueKernel {{.*}} %[[#SIZE0]] %[[#SIZE1]]{{$}}
enqueue_kernel(q, 0, nd, ^(local void *p1, local void *p2){}, 101u, 102u);
}