@@ -44,19 +44,24 @@ void kernel_single_task(KernelType kernelFunc) {
4444 kernelFunc (42 );
4545}
4646
47+ // Exercise code gen with kernel name types named with esoteric characters.
48+ struct \u03b4\u03c4\u03c7; // Delta Tau Chi (δτχ)
49+
4750int main () {
4851 single_purpose_kernel obj;
4952 single_purpose_kernel_task (obj);
5053 int capture;
5154 auto lambda = [=](auto ) { (void ) capture; };
5255 kernel_single_task<decltype (lambda)>(lambda);
56+ kernel_single_task<\u03b4\u03c4\u03c7>([](int ){});
5357}
5458
5559// Verify that SYCL kernel caller functions are not emitted during host
5660// compilation.
5761//
5862// CHECK-HOST-NOT: define {{.*}} @_ZTS26single_purpose_kernel_name
59- // CHECK-HOST-NOT: define {{.*}} @_ZTSZ4mainE18lambda_kernel_name
63+ // CHECK-HOST-NOT: define {{.*}} @_ZTSZ4mainEUlT_E_
64+ // CHECK-HOST-NOT: define {{.*}} @"_ZTS6\CE\B4\CF\84\CF\87"
6065
6166// Verify that sycl_kernel_entry_point attributed functions are not emitted
6267// during device compilation.
@@ -67,6 +72,10 @@ int main() {
6772// Verify that kernel launch code is generated for sycl_kernel_entry_point
6873// attributed functions during host compilation.
6974//
75+ // CHECK-HOST-LINUX: @.str = private unnamed_addr constant [33 x i8] c"_ZTS26single_purpose_kernel_name\00", align 1
76+ // CHECK-HOST-LINUX: @.str.1 = private unnamed_addr constant [18 x i8] c"_ZTSZ4mainEUlT_E_\00", align 1
77+ // CHECK-HOST-LINUX: @.str.2 = private unnamed_addr constant [12 x i8] c"_ZTS6\CE\B4\CF\84\CF\87\00", align 1
78+ //
7079// CHECK-HOST-LINUX: define dso_local void @_Z26single_purpose_kernel_task21single_purpose_kernel() #{{[0-9]+}} {
7180// CHECK-HOST-LINUX-NEXT: entry:
7281// CHECK-HOST-LINUX-NEXT: %kernelFunc = alloca %struct.single_purpose_kernel, align 1
@@ -83,6 +92,13 @@ int main() {
8392// CHECK-HOST-LINUX-NEXT: ret void
8493// CHECK-HOST-LINUX-NEXT: }
8594//
95+ // CHECK-HOST-LINUX: define internal void @"_Z18kernel_single_taskI6\CE\B4\CF\84\CF\87Z4mainEUliE_EvT0_"() #{{[0-9]+}} {
96+ // CHECK-HOST-LINUX-NEXT: entry:
97+ // CHECK-HOST-LINUX-NEXT: %kernelFunc = alloca %class.anon.0, align 1
98+ // CHECK-HOST-LINUX-NEXT: store ptr @.str.2, ptr @kernel_name, align 8
99+ // CHECK-HOST-LINUX-NEXT: ret void
100+ // CHECK-HOST-LINUX-NEXT: }
101+ //
86102// CHECK-HOST-WINDOWS: define dso_local void @"?single_purpose_kernel_task@@YAXUsingle_purpose_kernel@@@Z"(i8 %kernelFunc.coerce) #{{[0-9]+}} {
87103// CHECK-HOST-WINDOWS-NEXT: entry:
88104// CHECK-HOST-WINDOWS-NEXT: %kernelFunc = alloca %struct.single_purpose_kernel, align 1
@@ -100,6 +116,15 @@ int main() {
100116// CHECK-HOST-WINDOWS-NEXT: store ptr @"??_C@_0BC@NHCDOLAA@_ZTSZ4mainEUlT_E_?$AA@", ptr @"?kernel_name@?0???$kernel_single_task@V<lambda_1>@?0??main@@9@V1?0??2@9@@@YAXV<lambda_1>@?0??main@@9@@Z@3PEBDEB", align 8
101117// CHECK-HOST-WINDOWS-NEXT: ret void
102118// CHECK-HOST-WINDOWS-NEXT: }
119+ //
120+ // CHECK-HOST-WINDOWS: define internal void @"??$kernel_single_task@U\CE\B4\CF\84\CF\87@@V<lambda_2>@?0??main@@9@@@YAXV<lambda_2>@?0??main@@9@@Z"(i8 %kernelFunc.coerce) #{{[0-9]+}} {
121+ // CHECK-HOST-WINDOWS-NEXT: entry:
122+ // CHECK-HOST-WINDOWS-NEXT: %kernelFunc = alloca %class.anon.0, align 1
123+ // CHECK-HOST-WINDOWS-NEXT: %coerce.dive = getelementptr inbounds nuw %class.anon.0, ptr %kernelFunc, i32 0, i32 0
124+ // CHECK-HOST-WINDOWS-NEXT: store i8 %kernelFunc.coerce, ptr %coerce.dive, align 1
125+ // CHECK-HOST-WINDOWS-NEXT: store ptr @"??_C@_0M@BCGAEMBE@_ZTS6?N?$LE?O?$IE?O?$IH?$AA@", ptr @"?kernel_name@?0???$kernel_single_task@U\CE\B4\CF\84\CF\87@@V<lambda_2>@?0??main@@9@@@YAXV<lambda_2>@?0??main@@9@@Z@3PEBDEB", align 8
126+ // CHECK-HOST-WINDOWS-NEXT: ret void
127+ // CHECK-HOST-WINDOWS-NEXT: }
103128
104129// Verify that SYCL kernel caller functions are emitted for each device target.
105130//
@@ -182,6 +207,44 @@ int main() {
182207// CHECK-SPIR-NEXT: }
183208// CHECK-SPIR: define internal spir_func void @_ZZ4mainENKUlT_E_clIiEEDaS_
184209
210+ // IR for the SYCL kernel caller function generated for kernel_single_task with
211+ // the Delta Tau Chi type as the SYCL kernel name type.
212+ //
213+ // CHECK-AMDGCN: Function Attrs: convergent mustprogress noinline norecurse nounwind optnone
214+ // CHECK-AMDGCN-NEXT: define dso_local amdgpu_kernel void @"_ZTS6\CE\B4\CF\84\CF\87"
215+ // CHECK-AMDGCN-SAME: (ptr addrspace(4) noundef byref(%class.anon.0) align 1 %0) #[[AMDGCN_ATTR0]] {
216+ // CHECK-AMDGCN-NEXT: entry:
217+ // CHECK-AMDGCN-NEXT: %coerce = alloca %class.anon.0, align 1, addrspace(5)
218+ // CHECK-AMDGCN-NEXT: %kernelFunc = addrspacecast ptr addrspace(5) %coerce to ptr
219+ // CHECK-AMDGCN-NEXT: call void @llvm.memcpy.p0.p4.i64(ptr align 1 %kernelFunc, ptr addrspace(4) align 1 %0, i64 1, i1 false)
220+ // CHECK-AMDGCN-NEXT: call void @_ZZ4mainENKUliE_clEi
221+ // CHECK-AMDGCN-SAME: (ptr noundef nonnull align 1 dereferenceable(1) %kernelFunc, i32 noundef 42) #[[AMDGCN_ATTR1:[0-9]+]]
222+ // CHECK-AMDGCN-NEXT: ret void
223+ // CHECK-AMDGCN-NEXT: }
224+ // CHECK-AMDGCN: define internal void @_ZZ4mainENKUliE_clEi
225+ //
226+ // CHECK-NVPTX: Function Attrs: convergent mustprogress noinline norecurse nounwind optnone
227+ // CHECK-NVPTX-NEXT: define dso_local ptx_kernel void @"_ZTS6\CE\B4\CF\84\CF\87"
228+ // CHECK-NVPTX-SAME: (ptr noundef byval(%class.anon.0) align 1 %kernelFunc) #[[NVPTX_ATTR0:[0-9]+]] {
229+ // CHECK-NVPTX-NEXT: entry:
230+ // CHECK-NVPTX-NEXT: call void @_ZZ4mainENKUliE_clEi
231+ // CHECK-NVPTX-SAME: (ptr noundef nonnull align 1 dereferenceable(1) %kernelFunc, i32 noundef 42) #[[NVPTX_ATTR1:[0-9]+]]
232+ // CHECK-NVPTX-NEXT: ret void
233+ // CHECK-NVPTX-NEXT: }
234+ // CHECK-NVPTX: define internal void @_ZZ4mainENKUliE_clEi
235+ //
236+ // CHECK-SPIR: Function Attrs: convergent mustprogress noinline norecurse nounwind optnone
237+ // CHECK-SPIR-NEXT: define {{[a-z_ ]*}}spir_kernel void @"_ZTS6\CE\B4\CF\84\CF\87"
238+ // CHECK-SPIR-SAME: (ptr noundef byval(%class.anon.0) align 1 %kernelFunc) #[[SPIR_ATTR0:[0-9]+]] {
239+ // CHECK-SPIR-NEXT: entry:
240+ // CHECK-SPIR-NEXT: %kernelFunc.ascast = addrspacecast ptr %kernelFunc to ptr addrspace(4)
241+ // CHECK-SPIR-NEXT: call spir_func void @_ZZ4mainENKUliE_clEi
242+ // CHECK-SPIR-SAME: (ptr addrspace(4) noundef align 1 dereferenceable_or_null(1) %kernelFunc.ascast, i32 noundef 42) #[[SPIR_ATTR1:[0-9]+]]
243+ // CHECK-SPIR-NEXT: ret void
244+ // CHECK-SPIR-NEXT: }
245+ // CHECK-SPIR: define internal spir_func void @_ZZ4mainENKUliE_clEi
246+
247+
185248// CHECK-AMDGCN: #[[AMDGCN_ATTR0]] = { convergent mustprogress noinline norecurse nounwind optnone "no-trapping-math"="true" "stack-protector-buffer-size"="8" }
186249// CHECK-AMDGCN: #[[AMDGCN_ATTR1]] = { convergent nounwind }
187250//
0 commit comments