[AArch64][NFC] NFC for const vector as Instruction operand (#116790)
[llvm-project.git] / llvm / test / Transforms / InstCombine / NVPTX / isspacep.ll
blobdedd85e1a8cda8e3e4a14e9d6dbfac96eab21911
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
42   ptr addrspace(1) %gp,
43   ptr addrspace(3) %sp,
44   ptr addrspace(4) %cp,
45   ptr addrspace(5) %lp) local_unnamed_addr {
46 entry:
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
86   ret void
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 {
109 entry:
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
149   ret void
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 {
172 entry:
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
212   ret void
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 {
235 entry:
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
275   ret void