1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
2 ; RUN: opt < %s -passes=instcombine -mtriple=nvptx64-nvidia-cuda -S | FileCheck %s
3 target datalayout = "e-i64:64-i128:128-v16:16-v32:32-n16:32:64"
4 target triple = "nvptx64-nvidia-cuda"
6 ; Source data in different AS.
7 @shared_data = dso_local addrspace(3) global i32 undef, align 4
8 @global_data = dso_local addrspace(1) externally_initialized global i32 0, align 4
9 @const_data = dso_local addrspace(4) externally_initialized constant i32 3, align 4
11 ; Results get stored here.
12 @gen = dso_local addrspace(1) externally_initialized global i8 0, align 1
13 @g1 = dso_local addrspace(1) externally_initialized global i8 0, align 1
14 @g2 = dso_local addrspace(1) externally_initialized global i8 0, align 1
15 @s1 = dso_local addrspace(1) externally_initialized global i8 0, align 1
16 @s2 = dso_local addrspace(1) externally_initialized global i8 0, align 1
17 @c1 = dso_local addrspace(1) externally_initialized global i8 0, align 1
18 @c2 = dso_local addrspace(1) externally_initialized global i8 0, align 1
19 @l = dso_local addrspace(1) externally_initialized global i8 0, align 1
21 declare i1 @llvm.nvvm.isspacep.global(ptr nocapture)
22 declare i1 @llvm.nvvm.isspacep.shared(ptr nocapture)
23 declare i1 @llvm.nvvm.isspacep.const(ptr nocapture)
24 declare i1 @llvm.nvvm.isspacep.local(ptr nocapture)
26 define dso_local void @check_global(ptr nocapture noundef readnone %out, ptr nocapture noundef readnone %genp,
27 ; CHECK-LABEL: define dso_local void @check_global(
28 ; CHECK-SAME: ptr nocapture noundef readnone [[OUT:%.*]], ptr nocapture noundef readnone [[GENP:%.*]], ptr addrspace(1) [[GP:%.*]], ptr addrspace(3) [[SP:%.*]], ptr addrspace(4) [[CP:%.*]], ptr addrspace(5) [[LP:%.*]]) local_unnamed_addr {
29 ; CHECK-NEXT: [[ENTRY:.*:]]
30 ; CHECK-NEXT: [[GEN0:%.*]] = tail call i1 @llvm.nvvm.isspacep.global(ptr [[GENP]])
31 ; CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[GEN0]] to i8
32 ; CHECK-NEXT: store i8 [[STOREDV]], ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1
33 ; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1
34 ; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1
35 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1
36 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1
37 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1
38 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1
39 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1
40 ; CHECK-NEXT: ret void
45 ptr addrspace(5) %lp) local_unnamed_addr {
47 ; No constant folding for generic pointers of unknown origin.
48 %gen0 = tail call i1 @llvm.nvvm.isspacep.global(ptr %genp)
49 %storedv = zext i1 %gen0 to i8
50 store i8 %storedv, ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1
52 %isg1 = tail call i1 @llvm.nvvm.isspacep.global(ptr addrspacecast (ptr addrspace(1) @global_data to ptr))
53 %isg18 = zext i1 %isg1 to i8
54 store i8 %isg18, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1
56 %gp_asc = addrspacecast ptr addrspace(1) %gp to ptr
57 %isg2 = tail call i1 @llvm.nvvm.isspacep.global(ptr %gp_asc)
58 %isg28 = zext i1 %isg2 to i8
59 store i8 %isg28, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1
61 %iss1 = tail call i1 @llvm.nvvm.isspacep.global(ptr addrspacecast (ptr addrspace(3) @shared_data to ptr))
62 %iss18 = zext i1 %iss1 to i8
63 store i8 %iss18, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1
65 %sp_asc = addrspacecast ptr addrspace(3) %sp to ptr
66 %iss2 = tail call i1 @llvm.nvvm.isspacep.global(ptr %sp_asc)
67 %iss28 = zext i1 %iss2 to i8
68 store i8 %iss28, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1
70 %isc1 = tail call i1 @llvm.nvvm.isspacep.global(ptr addrspacecast (ptr addrspace(4) @const_data to ptr))
71 %isc18 = zext i1 %isc1 to i8
72 store i8 %isc18, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1
74 %cp_asc = addrspacecast ptr addrspace(4) %cp to ptr
75 %isc2 = tail call i1 @llvm.nvvm.isspacep.global(ptr %cp_asc)
76 %isc28 = zext i1 %isc2 to i8
77 store i8 %isc28, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1
79 ; Local data can't ihave a constant address, so we can't have a constant ASC expression
80 ; We can only use an ASC instruction.
81 %lp_asc = addrspacecast ptr addrspace(5) %lp to ptr
82 %isl = call i1 @llvm.nvvm.isspacep.global(ptr nonnull %lp_asc)
83 %isl8 = zext i1 %isl to i8
84 store i8 %isl8, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1
89 define dso_local void @check_shared(ptr nocapture noundef readnone %out, ptr nocapture noundef readnone %genp,
90 ; CHECK-LABEL: define dso_local void @check_shared(
91 ; CHECK-SAME: ptr nocapture noundef readnone [[OUT:%.*]], ptr nocapture noundef readnone [[GENP:%.*]], ptr addrspace(1) [[GP:%.*]], ptr addrspace(3) [[SP:%.*]], ptr addrspace(4) [[CP:%.*]], ptr addrspace(5) [[LP:%.*]]) local_unnamed_addr {
92 ; CHECK-NEXT: [[ENTRY:.*:]]
93 ; CHECK-NEXT: [[GEN0:%.*]] = tail call i1 @llvm.nvvm.isspacep.shared(ptr [[GENP]])
94 ; CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[GEN0]] to i8
95 ; CHECK-NEXT: store i8 [[STOREDV]], ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1
96 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1
97 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1
98 ; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1
99 ; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1
100 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1
101 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1
102 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1
103 ; CHECK-NEXT: ret void
105 ptr addrspace(1) %gp,
106 ptr addrspace(3) %sp,
107 ptr addrspace(4) %cp,
108 ptr addrspace(5) %lp) local_unnamed_addr {
110 ; No constant folding for generic pointers of unknown origin.
111 %gen0 = tail call i1 @llvm.nvvm.isspacep.shared(ptr %genp)
112 %storedv = zext i1 %gen0 to i8
113 store i8 %storedv, ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1
115 %isg1 = tail call i1 @llvm.nvvm.isspacep.shared(ptr addrspacecast (ptr addrspace(1) @global_data to ptr))
116 %isg18 = zext i1 %isg1 to i8
117 store i8 %isg18, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1
119 %gp_asc = addrspacecast ptr addrspace(1) %gp to ptr
120 %isg2 = tail call i1 @llvm.nvvm.isspacep.shared(ptr %gp_asc)
121 %isg28 = zext i1 %isg2 to i8
122 store i8 %isg28, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1
124 %iss1 = tail call i1 @llvm.nvvm.isspacep.shared(ptr addrspacecast (ptr addrspace(3) @shared_data to ptr))
125 %iss18 = zext i1 %iss1 to i8
126 store i8 %iss18, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1
128 %sp_asc = addrspacecast ptr addrspace(3) %sp to ptr
129 %iss2 = tail call i1 @llvm.nvvm.isspacep.shared(ptr %sp_asc)
130 %iss28 = zext i1 %iss2 to i8
131 store i8 %iss28, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1
133 %isc1 = tail call i1 @llvm.nvvm.isspacep.shared(ptr addrspacecast (ptr addrspace(4) @const_data to ptr))
134 %isc18 = zext i1 %isc1 to i8
135 store i8 %isc18, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1
137 %cp_asc = addrspacecast ptr addrspace(4) %cp to ptr
138 %isc2 = tail call i1 @llvm.nvvm.isspacep.shared(ptr %cp_asc)
139 %isc28 = zext i1 %isc2 to i8
140 store i8 %isc28, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1
142 ; Local data can't have a constant address, so we can't have a constant ASC expression
143 ; We can only use an ASC instruction.
144 %lp_asc = addrspacecast ptr addrspace(5) %lp to ptr
145 %isl = call i1 @llvm.nvvm.isspacep.shared(ptr nonnull %lp_asc)
146 %isl8 = zext i1 %isl to i8
147 store i8 %isl8, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1
152 define dso_local void @check_const(ptr nocapture noundef readnone %out, ptr nocapture noundef readnone %genp,
153 ; CHECK-LABEL: define dso_local void @check_const(
154 ; CHECK-SAME: ptr nocapture noundef readnone [[OUT:%.*]], ptr nocapture noundef readnone [[GENP:%.*]], ptr addrspace(1) [[GP:%.*]], ptr addrspace(3) [[SP:%.*]], ptr addrspace(4) [[CP:%.*]], ptr addrspace(5) [[LP:%.*]]) local_unnamed_addr {
155 ; CHECK-NEXT: [[ENTRY:.*:]]
156 ; CHECK-NEXT: [[GEN0:%.*]] = tail call i1 @llvm.nvvm.isspacep.const(ptr [[GENP]])
157 ; CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[GEN0]] to i8
158 ; CHECK-NEXT: store i8 [[STOREDV]], ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1
159 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1
160 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1
161 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1
162 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1
163 ; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1
164 ; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1
165 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1
166 ; CHECK-NEXT: ret void
168 ptr addrspace(1) %gp,
169 ptr addrspace(3) %sp,
170 ptr addrspace(4) %cp,
171 ptr addrspace(5) %lp) local_unnamed_addr {
173 ; No constant folding for generic pointers of unknown origin.
174 %gen0 = tail call i1 @llvm.nvvm.isspacep.const(ptr %genp)
175 %storedv = zext i1 %gen0 to i8
176 store i8 %storedv, ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1
178 %isg1 = tail call i1 @llvm.nvvm.isspacep.const(ptr addrspacecast (ptr addrspace(1) @global_data to ptr))
179 %isg18 = zext i1 %isg1 to i8
180 store i8 %isg18, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1
182 %gp_asc = addrspacecast ptr addrspace(1) %gp to ptr
183 %isg2 = tail call i1 @llvm.nvvm.isspacep.const(ptr %gp_asc)
184 %isg28 = zext i1 %isg2 to i8
185 store i8 %isg28, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1
187 %iss1 = tail call i1 @llvm.nvvm.isspacep.const(ptr addrspacecast (ptr addrspace(3) @shared_data to ptr))
188 %iss18 = zext i1 %iss1 to i8
189 store i8 %iss18, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1
191 %sp_asc = addrspacecast ptr addrspace(3) %sp to ptr
192 %iss2 = tail call i1 @llvm.nvvm.isspacep.const(ptr %sp_asc)
193 %iss28 = zext i1 %iss2 to i8
194 store i8 %iss28, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1
196 %isc1 = tail call i1 @llvm.nvvm.isspacep.const(ptr addrspacecast (ptr addrspace(4) @const_data to ptr))
197 %isc18 = zext i1 %isc1 to i8
198 store i8 %isc18, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1
200 %cp_asc = addrspacecast ptr addrspace(4) %cp to ptr
201 %isc2 = tail call i1 @llvm.nvvm.isspacep.const(ptr %cp_asc)
202 %isc28 = zext i1 %isc2 to i8
203 store i8 %isc28, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1
205 ; Local data can't have a constant address, so we can't have a constant ASC expression
206 ; We can only use an ASC instruction.
207 %lp_asc = addrspacecast ptr addrspace(5) %lp to ptr
208 %isl = call i1 @llvm.nvvm.isspacep.const(ptr nonnull %lp_asc)
209 %isl8 = zext i1 %isl to i8
210 store i8 %isl8, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1
215 define dso_local void @check_local(ptr nocapture noundef readnone %out, ptr nocapture noundef readnone %genp,
216 ; CHECK-LABEL: define dso_local void @check_local(
217 ; CHECK-SAME: ptr nocapture noundef readnone [[OUT:%.*]], ptr nocapture noundef readnone [[GENP:%.*]], ptr addrspace(1) [[GP:%.*]], ptr addrspace(3) [[SP:%.*]], ptr addrspace(4) [[CP:%.*]], ptr addrspace(5) [[LP:%.*]]) local_unnamed_addr {
218 ; CHECK-NEXT: [[ENTRY:.*:]]
219 ; CHECK-NEXT: [[GEN0:%.*]] = tail call i1 @llvm.nvvm.isspacep.local(ptr [[GENP]])
220 ; CHECK-NEXT: [[STOREDV:%.*]] = zext i1 [[GEN0]] to i8
221 ; CHECK-NEXT: store i8 [[STOREDV]], ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1
222 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1
223 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1
224 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1
225 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1
226 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1
227 ; CHECK-NEXT: store i8 0, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1
228 ; CHECK-NEXT: store i8 1, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1
229 ; CHECK-NEXT: ret void
231 ptr addrspace(1) %gp,
232 ptr addrspace(3) %sp,
233 ptr addrspace(4) %cp,
234 ptr addrspace(5) %lp) local_unnamed_addr {
236 ; No constant folding for generic pointers of unknown origin.
237 %gen0 = tail call i1 @llvm.nvvm.isspacep.local(ptr %genp)
238 %storedv = zext i1 %gen0 to i8
239 store i8 %storedv, ptr addrspacecast (ptr addrspace(1) @gen to ptr), align 1
241 %isg1 = tail call i1 @llvm.nvvm.isspacep.local(ptr addrspacecast (ptr addrspace(1) @global_data to ptr))
242 %isg18 = zext i1 %isg1 to i8
243 store i8 %isg18, ptr addrspacecast (ptr addrspace(1) @g1 to ptr), align 1
245 %gp_asc = addrspacecast ptr addrspace(1) %gp to ptr
246 %isg2 = tail call i1 @llvm.nvvm.isspacep.local(ptr %gp_asc)
247 %isg28 = zext i1 %isg2 to i8
248 store i8 %isg28, ptr addrspacecast (ptr addrspace(1) @g2 to ptr), align 1
250 %iss1 = tail call i1 @llvm.nvvm.isspacep.local(ptr addrspacecast (ptr addrspace(3) @shared_data to ptr))
251 %iss18 = zext i1 %iss1 to i8
252 store i8 %iss18, ptr addrspacecast (ptr addrspace(1) @s1 to ptr), align 1
254 %sp_asc = addrspacecast ptr addrspace(3) %sp to ptr
255 %iss2 = tail call i1 @llvm.nvvm.isspacep.local(ptr %sp_asc)
256 %iss28 = zext i1 %iss2 to i8
257 store i8 %iss28, ptr addrspacecast (ptr addrspace(1) @s2 to ptr), align 1
259 %isc1 = tail call i1 @llvm.nvvm.isspacep.local(ptr addrspacecast (ptr addrspace(4) @const_data to ptr))
260 %isc18 = zext i1 %isc1 to i8
261 store i8 %isc18, ptr addrspacecast (ptr addrspace(1) @c1 to ptr), align 1
263 %cp_asc = addrspacecast ptr addrspace(4) %cp to ptr
264 %isc2 = tail call i1 @llvm.nvvm.isspacep.local(ptr %cp_asc)
265 %isc28 = zext i1 %isc2 to i8
266 store i8 %isc28, ptr addrspacecast (ptr addrspace(1) @c2 to ptr), align 1
268 ; Local data can't have a constant address, so we can't have a constant ASC expression
269 ; We can only use an ASC instruction.
270 %lp_asc = addrspacecast ptr addrspace(5) %lp to ptr
271 %isl = call i1 @llvm.nvvm.isspacep.local(ptr nonnull %lp_asc)
272 %isl8 = zext i1 %isl to i8
273 store i8 %isl8, ptr addrspacecast (ptr addrspace(1) @l to ptr), align 1