xref: /llvm-project/clang/test/CodeGenSYCL/cuda-address-space-conversions.cpp (revision f54004475110bb0a4033261041594266c8296242)
1*f5400447Smmoadeli // RUN: %clang_cc1 -triple nvptx64-nvidia-cuda -fsycl-is-device -disable-llvm-passes -emit-llvm %s -o - | FileCheck %s
bar(int & Data)2*f5400447Smmoadeli void bar(int &Data) {}
3*f5400447Smmoadeli // CHECK: define dso_local void @[[RAW_REF:[a-zA-Z0-9_]+]](ptr noundef nonnull align 4 dereferenceable(4) %
bar2(int & Data)4*f5400447Smmoadeli void bar2(int &Data) {}
5*f5400447Smmoadeli // CHECK: define dso_local void @[[RAW_REF2:[a-zA-Z0-9_]+]](ptr noundef nonnull align 4 dereferenceable(4) %
bar(int & Data)6*f5400447Smmoadeli void bar(__attribute__((opencl_local)) int &Data) {}
7*f5400447Smmoadeli // CHECK: define dso_local void @[[LOCAL_REF:[a-zA-Z0-9_]+]](ptr addrspace(3) noundef align 4 dereferenceable(4) %
foo(int * Data)8*f5400447Smmoadeli void foo(int *Data) {}
9*f5400447Smmoadeli // CHECK: define dso_local void @[[RAW_PTR:[a-zA-Z0-9_]+]](ptr noundef %
foo2(int * Data)10*f5400447Smmoadeli void foo2(int *Data) {}
11*f5400447Smmoadeli // CHECK: define dso_local void @[[RAW_PTR2:[a-zA-Z0-9_]+]](ptr noundef %
foo(int * Data)12*f5400447Smmoadeli void foo(__attribute__((opencl_local)) int *Data) {}
13*f5400447Smmoadeli // CHECK: define dso_local void @[[LOC_PTR:[a-zA-Z0-9_]+]](ptr addrspace(3) noundef %
14*f5400447Smmoadeli 
15*f5400447Smmoadeli template <typename T>
16*f5400447Smmoadeli void tmpl(T t);
17*f5400447Smmoadeli // See Check Lines below.
18*f5400447Smmoadeli 
usages()19*f5400447Smmoadeli void usages() {
20*f5400447Smmoadeli   int *NoAS;
21*f5400447Smmoadeli   // CHECK: [[NoAS:%[a-zA-Z0-9]+]] = alloca ptr, align 8
22*f5400447Smmoadeli   __attribute__((opencl_global)) int *GLOB;
23*f5400447Smmoadeli   // CHECK: [[GLOB:%[a-zA-Z0-9]+]] = alloca ptr addrspace(1), align 8
24*f5400447Smmoadeli   __attribute__((opencl_local)) int *LOC;
25*f5400447Smmoadeli   // CHECK: [[LOC:%[a-zA-Z0-9]+]] = alloca ptr addrspace(3), align 8
26*f5400447Smmoadeli   __attribute__((opencl_private)) int *PRIV;
27*f5400447Smmoadeli   // CHECK: [[PRIV:%[a-zA-Z0-9]+]] = alloca ptr, align 8
28*f5400447Smmoadeli   __attribute__((opencl_global_device)) int *GLOBDEVICE;
29*f5400447Smmoadeli   // CHECK: [[GLOB_DEVICE:%[a-zA-Z0-9]+]] = alloca ptr addrspace(1), align 8
30*f5400447Smmoadeli   __attribute__((opencl_global_host)) int *GLOBHOST;
31*f5400447Smmoadeli   // CHECK: [[GLOB_HOST:%[a-zA-Z0-9]+]] = alloca ptr addrspace(1), align 8
32*f5400447Smmoadeli   LOC = nullptr;
33*f5400447Smmoadeli   // CHECK: store ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3)), ptr [[LOC]], align 8
34*f5400447Smmoadeli   GLOB = nullptr;
35*f5400447Smmoadeli   // CHECK: store ptr addrspace(1) null, ptr [[GLOB]], align 8
36*f5400447Smmoadeli   NoAS = (int *)GLOB;
37*f5400447Smmoadeli   // CHECK: [[GLOB_LOAD:%[a-zA-Z0-9]+]] = load ptr addrspace(1), ptr [[GLOB]], align 8
38*f5400447Smmoadeli   // CHECK: [[GLOB_CAST:%[a-zA-Z0-9]+]] = addrspacecast ptr addrspace(1) [[GLOB_LOAD]] to ptr
39*f5400447Smmoadeli   // CHECK: store ptr [[GLOB_CAST]], ptr [[NoAS]], align 8
40*f5400447Smmoadeli   NoAS = (int *)LOC;
41*f5400447Smmoadeli   // CHECK: [[LOC_LOAD:%[a-zA-Z0-9]+]] = load ptr addrspace(3), ptr [[LOC]], align 8
42*f5400447Smmoadeli   // CHECK: [[LOC_CAST:%[a-zA-Z0-9]+]] = addrspacecast ptr addrspace(3) [[LOC_LOAD]] to ptr
43*f5400447Smmoadeli   // CHECK: store ptr [[LOC_CAST]], ptr [[NoAS]], align 8
44*f5400447Smmoadeli   NoAS = (int *)PRIV;
45*f5400447Smmoadeli   // CHECK: [[LOC_LOAD:%[a-zA-Z0-9]+]] = load ptr, ptr [[PRIV]], align 8
46*f5400447Smmoadeli   // CHECK: store ptr [[LOC_LOAD]], ptr [[NoAS]], align 8
47*f5400447Smmoadeli   GLOB = (__attribute__((opencl_global)) int *)NoAS;
48*f5400447Smmoadeli   // CHECK: [[NoAS_LOAD:%[a-zA-Z0-9]+]] = load ptr, ptr [[NoAS]], align 8
49*f5400447Smmoadeli   // CHECK: [[NoAS_CAST:%[a-zA-Z0-9]+]] = addrspacecast ptr [[NoAS_LOAD]] to ptr addrspace(1)
50*f5400447Smmoadeli   // CHECK: store ptr addrspace(1) [[NoAS_CAST]], ptr [[GLOB]], align 8
51*f5400447Smmoadeli   LOC = (__attribute__((opencl_local)) int *)NoAS;
52*f5400447Smmoadeli   // CHECK: [[NoAS_LOAD:%[a-zA-Z0-9]+]] = load ptr, ptr [[NoAS]], align 8
53*f5400447Smmoadeli   // CHECK: [[NoAS_CAST:%[a-zA-Z0-9]+]] = addrspacecast ptr [[NoAS_LOAD]] to ptr addrspace(3)
54*f5400447Smmoadeli   // CHECK: store ptr addrspace(3) [[NoAS_CAST]], ptr [[LOC]], align 8
55*f5400447Smmoadeli   PRIV = (__attribute__((opencl_private)) int *)NoAS;
56*f5400447Smmoadeli   // CHECK: [[NoAS_LOAD:%[a-zA-Z0-9]+]] = load ptr, ptr [[NoAS]], align 8
57*f5400447Smmoadeli   // CHECK: store ptr [[NoAS_LOAD]], ptr [[PRIV]], align 8
58*f5400447Smmoadeli   GLOB = (__attribute__((opencl_global)) int *)GLOBDEVICE;
59*f5400447Smmoadeli   // CHECK: [[GLOBDEVICE_LOAD:%[a-zA-Z0-9]+]] = load ptr addrspace(1), ptr [[GLOB_DEVICE]], align 8
60*f5400447Smmoadeli   // CHECK: store ptr addrspace(1) [[GLOBDEVICE_LOAD]], ptr %GLOB, align 8
61*f5400447Smmoadeli   GLOB = (__attribute__((opencl_global)) int *)GLOBHOST;
62*f5400447Smmoadeli   // CHECK: [[GLOB_HOST_LOAD:%[a-zA-Z0-9]+]] = load ptr addrspace(1), ptr [[GLOB_HOST]], align 8
63*f5400447Smmoadeli   // CHECK: store ptr addrspace(1) [[GLOB_HOST_LOAD]], ptr [[GLOB]], align 8
64*f5400447Smmoadeli   bar(*GLOB);
65*f5400447Smmoadeli   // CHECK: [[GLOB_LOAD:%[a-zA-Z0-9]+]] = load ptr addrspace(1), ptr [[GLOB]], align 8
66*f5400447Smmoadeli   // CHECK: [[GLOB_CAST:%[a-zA-Z0-9]+]] = addrspacecast ptr addrspace(1) [[GLOB_LOAD]] to ptr
67*f5400447Smmoadeli   // CHECK: call void @[[RAW_REF]](ptr noundef nonnull align 4 dereferenceable(4) [[GLOB_CAST]])
68*f5400447Smmoadeli   bar2(*GLOB);
69*f5400447Smmoadeli   // CHECK: [[GLOB_LOAD:%[a-zA-Z0-9]+]] = load ptr addrspace(1), ptr [[GLOB]], align 8
70*f5400447Smmoadeli   // CHECK: [[GLOB_CAST:%[a-zA-Z0-9]+]] = addrspacecast ptr addrspace(1) [[GLOB_LOAD]] to ptr
71*f5400447Smmoadeli   // CHECK: call void @[[RAW_REF2]](ptr noundef nonnull align 4 dereferenceable(4) [[GLOB_CAST]])
72*f5400447Smmoadeli   bar(*LOC);
73*f5400447Smmoadeli   // CHECK: [[LOC_LOAD:%[a-zA-Z0-9]+]] = load ptr addrspace(3), ptr [[LOC]], align 8
74*f5400447Smmoadeli   // CHECK: call void @[[LOCAL_REF]](ptr addrspace(3) noundef align 4 dereferenceable(4) [[LOC_LOAD]])
75*f5400447Smmoadeli   bar2(*LOC);
76*f5400447Smmoadeli   // CHECK: [[LOC_LOAD2:%[a-zA-Z0-9]+]] = load ptr addrspace(3), ptr [[LOC]], align 8
77*f5400447Smmoadeli   // CHECK: [[LOC_CAST2:%[a-zA-Z0-9]+]] = addrspacecast ptr addrspace(3) [[LOC_LOAD2]] to ptr
78*f5400447Smmoadeli   // CHECK: call void @[[RAW_REF2]](ptr noundef nonnull align 4 dereferenceable(4) [[LOC_CAST2]])
79*f5400447Smmoadeli   bar(*NoAS);
80*f5400447Smmoadeli   // CHECK: [[NoAS_LOAD:%[a-zA-Z0-9]+]] = load ptr, ptr [[NoAS]], align 8
81*f5400447Smmoadeli   // CHECK: call void @[[RAW_REF]](ptr noundef nonnull align 4 dereferenceable(4) [[NoAS_LOAD]])
82*f5400447Smmoadeli   bar2(*NoAS);
83*f5400447Smmoadeli   // CHECK: [[NoAS_LOAD2:%[a-zA-Z0-9]+]] = load ptr, ptr [[NoAS]], align 8
84*f5400447Smmoadeli   // CHECK: call void @[[RAW_REF2]](ptr noundef nonnull align 4 dereferenceable(4) [[NoAS_LOAD2]])
85*f5400447Smmoadeli   foo(GLOB);
86*f5400447Smmoadeli   // CHECK: [[GLOB_LOAD3:%[a-zA-Z0-9]+]] = load ptr addrspace(1), ptr [[GLOB]], align 8
87*f5400447Smmoadeli   // CHECK: [[GLOB_CAST3:%[a-zA-Z0-9]+]] = addrspacecast ptr addrspace(1) [[GLOB_LOAD3]] to ptr
88*f5400447Smmoadeli   // CHECK: call void @[[RAW_PTR]](ptr noundef [[GLOB_CAST3]])
89*f5400447Smmoadeli   foo2(GLOB);
90*f5400447Smmoadeli   // CHECK: [[GLOB_LOAD4:%[a-zA-Z0-9]+]] = load ptr addrspace(1), ptr [[GLOB]], align 8
91*f5400447Smmoadeli   // CHECK: [[GLOB_CAST4:%[a-zA-Z0-9]+]] = addrspacecast ptr addrspace(1) [[GLOB_LOAD4]] to ptr
92*f5400447Smmoadeli   // CHECK: call void @[[RAW_PTR2]](ptr noundef [[GLOB_CAST4]])
93*f5400447Smmoadeli   foo(LOC);
94*f5400447Smmoadeli   // CHECK: [[LOC_LOAD3:%[a-zA-Z0-9]+]] = load ptr addrspace(3), ptr [[LOC]], align 8
95*f5400447Smmoadeli   // CHECK: call void @[[LOC_PTR]](ptr addrspace(3) noundef [[LOC_LOAD3]])
96*f5400447Smmoadeli   foo2(LOC);
97*f5400447Smmoadeli   // CHECK: [[LOC_LOAD4:%[a-zA-Z0-9]+]] = load ptr addrspace(3), ptr [[LOC]], align 8
98*f5400447Smmoadeli   // CHECK: [[LOC_CAST4:%[a-zA-Z0-9]+]] = addrspacecast ptr addrspace(3) [[LOC_LOAD4]] to ptr
99*f5400447Smmoadeli   // CHECK: call void @[[RAW_PTR2]](ptr noundef [[LOC_CAST4]])
100*f5400447Smmoadeli   foo(NoAS);
101*f5400447Smmoadeli   // CHECK: [[NoAS_LOAD3:%[a-zA-Z0-9]+]] = load ptr, ptr [[NoAS]], align 8
102*f5400447Smmoadeli   // CHECK: call void @[[RAW_PTR]](ptr noundef [[NoAS_LOAD3]])
103*f5400447Smmoadeli   foo2(NoAS);
104*f5400447Smmoadeli   // CHECK: [[NoAS_LOAD4:%[a-zA-Z0-9]+]] = load ptr, ptr [[NoAS]], align 8
105*f5400447Smmoadeli   // CHECK: call void @[[RAW_PTR2]](ptr noundef [[NoAS_LOAD4]])
106*f5400447Smmoadeli   tmpl(GLOB);
107*f5400447Smmoadeli   // CHECK: [[GLOB_LOAD4:%[a-zA-Z0-9]+]] = load ptr addrspace(1), ptr [[GLOB]], align 8
108*f5400447Smmoadeli   // CHECK: call void @_Z4tmplIPU3AS1iEvT_(ptr addrspace(1) noundef [[GLOB_LOAD4]])
109*f5400447Smmoadeli   tmpl(LOC);
110*f5400447Smmoadeli   // CHECK: [[LOC_LOAD5:%[a-zA-Z0-9]+]] = load ptr addrspace(3), ptr [[LOC]], align 8
111*f5400447Smmoadeli   // CHECK: call void @_Z4tmplIPU3AS3iEvT_(ptr addrspace(3) noundef [[LOC_LOAD5]])
112*f5400447Smmoadeli   tmpl(PRIV);
113*f5400447Smmoadeli   // CHECK: [[PRIV_LOAD5:%[a-zA-Z0-9]+]] = load ptr, ptr [[PRIV]], align 8
114*f5400447Smmoadeli   // CHECK: call void @_Z4tmplIPiEvT_(ptr noundef [[PRIV_LOAD5]])
115*f5400447Smmoadeli   tmpl(NoAS);
116*f5400447Smmoadeli // CHECK: %33 = load ptr, ptr %NoAS, align 8
117*f5400447Smmoadeli // CHECK: call void @_Z4tmplIPiEvT_(ptr noundef %33)
118*f5400447Smmoadeli }
119*f5400447Smmoadeli 
120*f5400447Smmoadeli // CHECK: declare void @_Z4tmplIPU3AS1iEvT_(ptr addrspace(1) noundef)
121*f5400447Smmoadeli // CHECK: declare void @_Z4tmplIPU3AS3iEvT_(ptr addrspace(3) noundef)
122*f5400447Smmoadeli // CHECK: declare void @_Z4tmplIPiEvT_(ptr noundef)
123