Skip to content

Commit ff2f0f9

Browse files
authored
[SYCL][Test] Add integration test to verify SPIR kernel argument names (#5942)
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 4b9eef3 commit ff2f0f9

File tree

2 files changed

+81
-0
lines changed

2 files changed

+81
-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: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
// RUN: %clangxx -fsycl -fsycl-device-only -fno-sycl-early-optimizations -o %t.bc %s
2+
// RUN: sycl-post-link %t.bc -spec-const=default -o %t.table
3+
// RUN: llvm-spirv -o %t.spv -spirv-max-version=1.3 -spirv-ext=+all %t.bc
4+
// RUN: llvm-spirv -o %t.rev.bc -r %t.spv
5+
// RUN: llvm-dis %t.rev.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,
44+
CapturedAcc2;
45+
cgh.single_task<class Kernel2>([=]() {
46+
Data;
47+
CapturedAcc1;
48+
CapturedAcc2;
49+
NestedSimpleObj;
50+
NestedComplexObj;
51+
});
52+
});
53+
54+
return 0;
55+
}
56+
57+
// Check kernel parameters generated when kernel is defined as Functor
58+
59+
// NOTE: Accessor fields have 4 corresponding openCL kernel arguments. When
60+
// the compiler generates the openCL kernel arguments, they are generated
61+
// with the same name (i.e the user-specified name for accessor). Since LLVM
62+
// IR cannot have same names, a number is appended in IR.
63+
//
64+
// CHECK: define {{.*}}spir_kernel void @{{.*}}Kernel1
65+
// CHECK-SAME: %_arg_IntField
66+
// CHECK-SAME: %_arg_AccField1{{.*}}%_arg_AccField11{{.*}}%_arg_AccField12{{.*}}%_arg_AccField13
67+
// CHECK-SAME: %_arg_AccField2{{.*}}%_arg_AccField24{{.*}}%_arg_AccField25{{.*}}%_arg_AccField26
68+
// CHECK-SAME: %_arg_NestedSimpleObj
69+
// CHECK-SAME: %_arg_NestedComplexField
70+
// CHECK-SAME: %_arg_NestedAccField{{.*}}%_arg_NestedAccField7{{.*}}%_arg_NestedAccField8{{.*}}%_arg_NestedAccField9
71+
72+
// Check kernel parameters generated when kernel is defined as Lambda
73+
//
74+
// CHECK: define {{.*}}spir_kernel void @{{.*}}Kernel2
75+
// CHECK-SAME: %_arg_Data
76+
// CHECK-SAME: %_arg_CapturedAcc1{{.*}}%_arg_CapturedAcc11{{.*}}%_arg_CapturedAcc12{{.*}}%_arg_CapturedAcc13
77+
// CHECK-SAME: %_arg_CapturedAcc2{{.*}}%_arg_CapturedAcc24{{.*}}%_arg_CapturedAcc25{{.*}}%_arg_CapturedAcc26
78+
// CHECK-SAME: %_arg_NestedSimpleObj
79+
// CHECK-SAME: %_arg_NestedComplexField
80+
// CHECK-SAME: %_arg_NestedAccField{{.*}}%_arg_NestedAccField7{{.*}}%_arg_NestedAccField8{{.*}}%_arg_NestedAccField9

0 commit comments

Comments
 (0)