1*f46b0e6dSSergei Barannikov // RUN: %clang_cc1 -triple spir64-unknown-unknown-sycldevice -fsycl-is-device -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s
20745b0c0SAlex Richardson // CHECK: @[[LAMBDA_KERNEL3:[^\w]+]] = private unnamed_addr addrspace(1) constant [[LAMBDA_K3_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ4mainEUlPZ4mainEUlvE_E_\00"
30745b0c0SAlex Richardson // CHECK: @[[INT1:[^\w]+]] = private unnamed_addr addrspace(1) constant [[INT_SIZE:\[[0-9]+ x i8\]]] c"_ZTSi\00"
40745b0c0SAlex Richardson // CHECK: @[[STRING:[^\w]+]] = private unnamed_addr addrspace(1) constant [[STRING_SIZE:\[[0-9]+ x i8\]]] c"_ZTSAppL_ZZ4mainE1jE_i\00",
50745b0c0SAlex Richardson // CHECK: @[[INT2:[^\w]+]] = private unnamed_addr addrspace(1) constant [[INT_SIZE]] c"_ZTSi\00"
60745b0c0SAlex Richardson // CHECK: @[[LAMBDA_X:[^\w]+]] = private unnamed_addr addrspace(1) constant [[LAMBDA_X_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE_\00"
70745b0c0SAlex Richardson // CHECK: @[[MACRO_X:[^\w]+]] = private unnamed_addr addrspace(1) constant [[MACRO_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE0_\00"
80745b0c0SAlex Richardson // CHECK: @[[MACRO_Y:[^\w]+]] = private unnamed_addr addrspace(1) constant [[MACRO_SIZE]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE1_\00"
90745b0c0SAlex Richardson // CHECK: @{{.*}} = private unnamed_addr addrspace(1) constant [32 x i8] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE2_\00", align 1
100745b0c0SAlex Richardson // CHECK: @{{.*}} = private unnamed_addr addrspace(1) constant [32 x i8] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE3_\00", align 1
110745b0c0SAlex Richardson // CHECK: @[[MACRO_MACRO_X:[^\w]+]] = private unnamed_addr addrspace(1) constant [[MACRO_MACRO_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE4_\00"
120745b0c0SAlex Richardson // CHECK: @[[MACRO_MACRO_Y:[^\w]+]] = private unnamed_addr addrspace(1) constant [[MACRO_MACRO_SIZE]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE5_\00"
130745b0c0SAlex Richardson // CHECK: @[[INT3:[^\w]+]] = private unnamed_addr addrspace(1) constant [[INT_SIZE]] c"_ZTSi\00"
140745b0c0SAlex Richardson // CHECK: @[[LAMBDA:[^\w]+]] = private unnamed_addr addrspace(1) constant [[LAMBDA_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZZ4mainENKUlvE0_clEvEUlvE_\00"
150745b0c0SAlex Richardson // CHECK: @[[LAMBDA_IN_DEP_INT:[^\w]+]] = private unnamed_addr addrspace(1) constant [[DEP_INT_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ28lambda_in_dependent_functionIiEvvEUlvE_\00",
160745b0c0SAlex Richardson // CHECK: @[[LAMBDA_IN_DEP_X:[^\w]+]] = private unnamed_addr addrspace(1) constant [[DEP_LAMBDA_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ28lambda_in_dependent_functionIZZ4mainENKUlvE0_clEvEUlvE_EvvEUlvE_\00",
170745b0c0SAlex Richardson // CHECK: @[[LAMBDA_NO_DEP:[^\w]+]] = private unnamed_addr addrspace(1) constant [[NO_DEP_LAMBDA_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ13lambda_no_depIidEvT_T0_EUlidE_\00",
180745b0c0SAlex Richardson // CHECK: @[[LAMBDA_TWO_DEP:[^\w]+]] = private unnamed_addr addrspace(1) constant [[DEP_LAMBDA1_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ14lambda_two_depIZZ4mainENKUlvE0_clEvEUliE_ZZ4mainENKS0_clEvEUldE_EvvEUlvE_\00",
190745b0c0SAlex Richardson // CHECK: @[[LAMBDA_TWO_DEP2:[^\w]+]] = private unnamed_addr addrspace(1) constant [[DEP_LAMBDA2_SIZE:\[[0-9]+ x i8\]]] c"_ZTSZ14lambda_two_depIZZ4mainENKUlvE0_clEvEUldE_ZZ4mainENKS0_clEvEUliE_EvvEUlvE_\00",
20eba69b59SErich Keane
puts(const char *)21eba69b59SErich Keane extern "C" void puts(const char *) {}
22eba69b59SErich Keane
23eba69b59SErich Keane template <typename T>
template_param()24eba69b59SErich Keane void template_param() {
25eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(T));
26eba69b59SErich Keane }
27eba69b59SErich Keane
28eba69b59SErich Keane template <typename T>
lambda_in_dependent_function()29eba69b59SErich Keane void lambda_in_dependent_function() {
30eba69b59SErich Keane auto y = [] {};
31eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(y)));
32eba69b59SErich Keane }
33eba69b59SErich Keane
34eba69b59SErich Keane template <typename Tw, typename Tz>
lambda_two_dep()35eba69b59SErich Keane void lambda_two_dep() {
36eba69b59SErich Keane auto z = [] {};
37eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(z)));
38eba69b59SErich Keane }
39eba69b59SErich Keane
40eba69b59SErich Keane template <typename Tw, typename Tz>
lambda_no_dep(Tw a,Tz b)41eba69b59SErich Keane void lambda_no_dep(Tw a, Tz b) {
42eba69b59SErich Keane auto p = [](Tw a, Tz b) { return ((Tz)a + b); };
43eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(p)));
44eba69b59SErich Keane }
45eba69b59SErich Keane
46eba69b59SErich Keane #define DEF_IN_MACRO() \
47eba69b59SErich Keane auto MACRO_X = []() {}; \
48eba69b59SErich Keane auto MACRO_Y = []() {}; \
49eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(MACRO_X))); \
50eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(MACRO_Y)));
51eba69b59SErich Keane
52eba69b59SErich Keane #define MACRO_CALLS_MACRO() \
53eba69b59SErich Keane { DEF_IN_MACRO(); } \
54eba69b59SErich Keane { DEF_IN_MACRO(); }
55eba69b59SErich Keane
56eba69b59SErich Keane template <typename Ty>
57eba69b59SErich Keane auto func() -> decltype(__builtin_sycl_unique_stable_name(decltype(Ty::str)));
58eba69b59SErich Keane
59eba69b59SErich Keane struct Derp {
60eba69b59SErich Keane static constexpr const char str[] = "derp derp derp";
61eba69b59SErich Keane };
62eba69b59SErich Keane
63eba69b59SErich Keane template <typename KernelName, typename KernelType>
kernel_single_task(KernelType kernelFunc)64eba69b59SErich Keane [[clang::sycl_kernel]] void kernel_single_task(KernelType kernelFunc) {
65eba69b59SErich Keane kernelFunc();
66eba69b59SErich Keane }
67eba69b59SErich Keane
main()68eba69b59SErich Keane int main() {
69eba69b59SErich Keane kernel_single_task<class kernel2>(func<Derp>);
70*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @_Z18kernel_single_taskIZ4mainE7kernel2PFPKcvEEvT0_(ptr noundef @_Z4funcI4DerpEDTu33__builtin_sycl_unique_stable_nameDtsrT_3strEEEv)
71eba69b59SErich Keane
72eba69b59SErich Keane auto l1 = []() { return 1; };
73eba69b59SErich Keane auto l2 = [](decltype(l1) *l = nullptr) { return 2; };
74eba69b59SErich Keane kernel_single_task<class kernel3>(l2);
75eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(l2)));
76eba69b59SErich Keane // CHECK: call spir_func void @_Z18kernel_single_taskIZ4mainE7kernel3Z4mainEUlPZ4mainEUlvE_E_EvT0_
77*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[LAMBDA_KERNEL3]] to ptr addrspace(4)))
78eba69b59SErich Keane
79eba69b59SErich Keane constexpr const char str[] = "lalala";
80eba69b59SErich Keane static_assert(__builtin_strcmp(__builtin_sycl_unique_stable_name(decltype(str)), "_ZTSA7_Kc\0") == 0, "unexpected mangling");
81eba69b59SErich Keane
82eba69b59SErich Keane int i = 0;
83eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(i++)));
84*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[INT1]] to ptr addrspace(4)))
85eba69b59SErich Keane
86eba69b59SErich Keane // FIXME: Ensure that j is incremented because VLAs are terrible.
87eba69b59SErich Keane int j = 55;
88eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(int[++j]));
89*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[STRING]] to ptr addrspace(4)))
90eba69b59SErich Keane
91eba69b59SErich Keane // CHECK: define internal spir_func void @_Z18kernel_single_taskIZ4mainE7kernel2PFPKcvEEvT0_
92*f46b0e6dSSergei Barannikov // CHECK: declare spir_func noundef ptr addrspace(4) @_Z4funcI4DerpEDTu33__builtin_sycl_unique_stable_nameDtsrT_3strEEEv
93eba69b59SErich Keane // CHECK: define internal spir_func void @_Z18kernel_single_taskIZ4mainE7kernel3Z4mainEUlPZ4mainEUlvE_E_EvT0_
94eba69b59SErich Keane // CHECK: define internal spir_func void @_Z18kernel_single_taskIZ4mainE6kernelZ4mainEUlvE0_EvT0_
95eba69b59SErich Keane
96eba69b59SErich Keane kernel_single_task<class kernel>(
97eba69b59SErich Keane []() {
98eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(int));
99*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[INT2]] to ptr addrspace(4)))
100eba69b59SErich Keane
101eba69b59SErich Keane auto x = []() {};
102eba69b59SErich Keane puts(__builtin_sycl_unique_stable_name(decltype(x)));
103*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[LAMBDA_X]] to ptr addrspace(4)))
104eba69b59SErich Keane
105eba69b59SErich Keane DEF_IN_MACRO();
106*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[MACRO_X]] to ptr addrspace(4)))
107*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[MACRO_Y]] to ptr addrspace(4)))
108eba69b59SErich Keane
109eba69b59SErich Keane MACRO_CALLS_MACRO();
110*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[MACRO_MACRO_X]] to ptr addrspace(4)))
111*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[MACRO_MACRO_Y]] to ptr addrspace(4)))
112eba69b59SErich Keane
113eba69b59SErich Keane template_param<int>();
114eba69b59SErich Keane // CHECK: call spir_func void @_Z14template_paramIiEvv
115eba69b59SErich Keane
116eba69b59SErich Keane template_param<decltype(x)>();
117eba69b59SErich Keane // CHECK: call spir_func void @_Z14template_paramIZZ4mainENKUlvE0_clEvEUlvE_Evv
118eba69b59SErich Keane
119eba69b59SErich Keane lambda_in_dependent_function<int>();
120eba69b59SErich Keane // CHECK: call spir_func void @_Z28lambda_in_dependent_functionIiEvv
121eba69b59SErich Keane
122eba69b59SErich Keane lambda_in_dependent_function<decltype(x)>();
123eba69b59SErich Keane // CHECK: call spir_func void @_Z28lambda_in_dependent_functionIZZ4mainENKUlvE0_clEvEUlvE_Evv
124eba69b59SErich Keane
125eba69b59SErich Keane lambda_no_dep<int, double>(3, 5.5);
1261b1c8d83Shyeongyu kim // CHECK: call spir_func void @_Z13lambda_no_depIidEvT_T0_(i32 noundef 3, double noundef 5.500000e+00)
127eba69b59SErich Keane
128eba69b59SErich Keane int a = 5;
129eba69b59SErich Keane double b = 10.7;
130eba69b59SErich Keane auto y = [](int a) { return a; };
131eba69b59SErich Keane auto z = [](double b) { return b; };
132eba69b59SErich Keane lambda_two_dep<decltype(y), decltype(z)>();
133eba69b59SErich Keane // CHECK: call spir_func void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUliE_ZZ4mainENKS0_clEvEUldE_Evv
134eba69b59SErich Keane
135eba69b59SErich Keane lambda_two_dep<decltype(z), decltype(y)>();
136eba69b59SErich Keane // CHECK: call spir_func void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUldE_ZZ4mainENKS0_clEvEUliE_Evv
137eba69b59SErich Keane });
138eba69b59SErich Keane }
139eba69b59SErich Keane
140eba69b59SErich Keane // CHECK: define linkonce_odr spir_func void @_Z14template_paramIiEvv
141*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[INT3]] to ptr addrspace(4)))
142eba69b59SErich Keane
143eba69b59SErich Keane // CHECK: define internal spir_func void @_Z14template_paramIZZ4mainENKUlvE0_clEvEUlvE_Evv
144*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[LAMBDA]] to ptr addrspace(4)))
145eba69b59SErich Keane
146eba69b59SErich Keane // CHECK: define linkonce_odr spir_func void @_Z28lambda_in_dependent_functionIiEvv
147*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[LAMBDA_IN_DEP_INT]] to ptr addrspace(4)))
148eba69b59SErich Keane
149eba69b59SErich Keane // CHECK: define internal spir_func void @_Z28lambda_in_dependent_functionIZZ4mainENKUlvE0_clEvEUlvE_Evv
150*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[LAMBDA_IN_DEP_X]] to ptr addrspace(4)))
151eba69b59SErich Keane
1521b1c8d83Shyeongyu kim // CHECK: define linkonce_odr spir_func void @_Z13lambda_no_depIidEvT_T0_(i32 noundef %a, double noundef %b)
153*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[LAMBDA_NO_DEP]] to ptr addrspace(4)))
154eba69b59SErich Keane
155eba69b59SErich Keane // CHECK: define internal spir_func void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUliE_ZZ4mainENKS0_clEvEUldE_Evv
156*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[LAMBDA_TWO_DEP]] to ptr addrspace(4)))
157eba69b59SErich Keane
158eba69b59SErich Keane // CHECK: define internal spir_func void @_Z14lambda_two_depIZZ4mainENKUlvE0_clEvEUldE_ZZ4mainENKS0_clEvEUliE_Evv
159*f46b0e6dSSergei Barannikov // CHECK: call spir_func void @puts(ptr addrspace(4) noundef addrspacecast (ptr addrspace(1) @[[LAMBDA_TWO_DEP2]] to ptr addrspace(4)))
160