|  | // RUN: %clang_cc1 %s -cl-std=CL1.2 -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s | 
|  | // RUN: %clang_cc1 %s -cl-std=CL1.2 -emit-llvm -triple amdgcn-unknown-unknown -o - | FileCheck -check-prefixes=AMDGCN %s | 
|  | // Test that the kernels always use the SPIR calling convention | 
|  | // to have unambiguous mapping of arguments to feasibly implement | 
|  | // clSetKernelArg(). | 
|  |  | 
|  | typedef struct int_single { | 
|  | int a; | 
|  | } int_single; | 
|  |  | 
|  | typedef struct int_pair { | 
|  | long a; | 
|  | long b; | 
|  | } int_pair; | 
|  |  | 
|  | typedef struct test_struct { | 
|  | int elementA; | 
|  | int elementB; | 
|  | long elementC; | 
|  | char elementD; | 
|  | long elementE; | 
|  | float elementF; | 
|  | short elementG; | 
|  | double elementH; | 
|  | } test_struct; | 
|  |  | 
|  | kernel void test_single(int_single input, global int* output) { | 
|  | // CHECK: spir_kernel | 
|  | // AMDGCN: define amdgpu_kernel void @test_single | 
|  | // CHECK: struct.int_single* byval nocapture | 
|  | // CHECK: i32* nocapture %output | 
|  | output[0] = input.a; | 
|  | } | 
|  |  | 
|  | kernel void test_pair(int_pair input, global int* output) { | 
|  | // CHECK: spir_kernel | 
|  | // AMDGCN: define amdgpu_kernel void @test_pair | 
|  | // CHECK: struct.int_pair* byval nocapture | 
|  | // CHECK: i32* nocapture %output | 
|  | output[0] = (int)input.a; | 
|  | output[1] = (int)input.b; | 
|  | } | 
|  |  | 
|  | kernel void test_kernel(test_struct input, global int* output) { | 
|  | // CHECK: spir_kernel | 
|  | // AMDGCN: define amdgpu_kernel void @test_kernel | 
|  | // CHECK: struct.test_struct* byval nocapture | 
|  | // CHECK: i32* nocapture %output | 
|  | output[0] = input.elementA; | 
|  | output[1] = input.elementB; | 
|  | output[2] = (int)input.elementC; | 
|  | output[3] = (int)input.elementD; | 
|  | output[4] = (int)input.elementE; | 
|  | output[5] = (int)input.elementF; | 
|  | output[6] = (int)input.elementG; | 
|  | output[7] = (int)input.elementH; | 
|  | }; | 
|  |  | 
|  | void test_function(int_pair input, global int* output) { | 
|  | // CHECK-NOT: spir_kernel | 
|  | // AMDGCN-NOT: define amdgpu_kernel void @test_function | 
|  | // CHECK: i64 %input.coerce0, i64 %input.coerce1, i32* nocapture %output | 
|  | output[0] = (int)input.a; | 
|  | output[1] = (int)input.b; | 
|  | } |