Skip to content

Commit 7a2b951

Browse files
committed
[SYCL][Test] Add integration test to verify SPIR kernel argument names
It validates that user specified names in kernel lambda object are saved till processing by back-ends. Signed-off-by: Mikhail Lychkov <[email protected]>
1 parent dabdbd4 commit 7a2b951

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed

sycl/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ list(APPEND SYCL_TEST_DEPS
3434
get_device_count_by_type
3535
llvm-config
3636
llvm-cxxdump
37+
llvm-dis
3738
llvm-readobj
3839
)
3940

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// RUN: %clangxx -fsycl -fsycl-device-only -c -o %t.bc %s
2+
// RUN: sycl-post-link %t.bc -spec-const=default -o %t.table
3+
// RUN: llvm-spirv -o %t_0.spv -spirv-max-version=1.3 -spirv-ext=+all %t_0.bc
4+
// RUN: llvm-spirv -o %t_0.r.bc -r %t_0.spv
5+
// RUN: llvm-dis %t_0.r.bc -o=- | FileCheck %s
6+
7+
// Test to verify that user specified names are retained in SPIR kernel argument
8+
// names. (It is a copy of clang/test/CodeGenSYCL/save-user-names.cpp with just
9+
// additional compilation steps).
10+
11+
#include <CL/sycl.hpp>
12+
13+
struct NestedSimple {
14+
int NestedSimpleField;
15+
};
16+
17+
struct NestedComplex {
18+
int NestedComplexField;
19+
cl::sycl::accessor<char, 1, cl::sycl::access::mode::read> NestedAccField;
20+
};
21+
22+
struct KernelFunctor {
23+
int IntField;
24+
cl::sycl::accessor<char, 1, cl::sycl::access::mode::read> AccField1;
25+
cl::sycl::accessor<char, 1, cl::sycl::access::mode::read> AccField2;
26+
NestedSimple NestedSimpleObj;
27+
NestedComplex NestedComplexObj;
28+
void operator()() const {}
29+
};
30+
31+
int main() {
32+
cl::sycl::queue q;
33+
34+
q.submit([&](cl::sycl::handler &cgh) {
35+
KernelFunctor FunctorObj;
36+
cgh.single_task<class Kernel1>(FunctorObj);
37+
});
38+
39+
q.submit([&](cl::sycl::handler &cgh) {
40+
int Data;
41+
NestedSimple NestedSimpleObj;
42+
NestedComplex NestedComplexObj;
43+
cl::sycl::accessor<char, 1, cl::sycl::access::mode::read> CapturedAcc1, CapturedAcc2;
44+
cgh.single_task<class Kernel2>([=]() {
45+
Data;
46+
CapturedAcc1;
47+
CapturedAcc2;
48+
NestedSimpleObj;
49+
NestedComplexObj;
50+
});
51+
});
52+
53+
return 0;
54+
}
55+
56+
// Check kernel parameters generated when kernel is defined as Functor
57+
58+
// NOTE: Accessor fields have 4 corresponding openCL kernel arguments. When
59+
// the compiler generates the openCL kernel arguments, they are generated
60+
// with the same name (i.e the user-specified name for accessor). Since LLVM
61+
// IR cannot have same names, a number is appended in IR.
62+
//
63+
// CHECK: define {{.*}}spir_kernel void @{{.*}}Kernel1
64+
// CHECK-SAME: %_arg_IntField
65+
// CHECK-SAME: %_arg_AccField1{{.*}}%_arg_AccField11{{.*}}%_arg_AccField12{{.*}}%_arg_AccField13
66+
// CHECK-SAME: %_arg_AccField2{{.*}}%_arg_AccField24{{.*}}%_arg_AccField25{{.*}}%_arg_AccField26
67+
// CHECK-SAME: %_arg_NestedSimpleObj
68+
// CHECK-SAME: %_arg_NestedComplexField
69+
// CHECK-SAME: %_arg_NestedAccField{{.*}}%_arg_NestedAccField7{{.*}}%_arg_NestedAccField8{{.*}}%_arg_NestedAccField9
70+
71+
// Check kernel parameters generated when kernel is defined as Lambda
72+
//
73+
// CHECK: define {{.*}}spir_kernel void @{{.*}}Kernel2
74+
// CHECK-SAME: %_arg_Data
75+
// CHECK-SAME: %_arg_CapturedAcc1{{.*}}%_arg_CapturedAcc11{{.*}}%_arg_CapturedAcc12{{.*}}%_arg_CapturedAcc13
76+
// CHECK-SAME: %_arg_CapturedAcc2{{.*}}%_arg_CapturedAcc24{{.*}}%_arg_CapturedAcc25{{.*}}%_arg_CapturedAcc26
77+
// CHECK-SAME: %_arg_NestedSimpleObj
78+
// CHECK-SAME: %_arg_NestedComplexField
79+
// CHECK-SAME: %_arg_NestedAccField{{.*}}%_arg_NestedAccField7{{.*}}%_arg_NestedAccField8{{.*}}%_arg_NestedAccField9

0 commit comments

Comments
 (0)