xref: /llvm-project/llvm/test/Assembler/flags.ll (revision 9efb07f261b2cd673c0a5abf2ed2546ad288ab48)
1; RUN: llvm-as < %s | llvm-dis | FileCheck %s
2; RUN: verify-uselistorder %s
3
4@addr = external global i64
5@addr_as1 = external addrspace(1) global i64
6
7define i64 @add_unsigned(i64 %x, i64 %y) {
8; CHECK: %z = add nuw i64 %x, %y
9	%z = add nuw i64 %x, %y
10	ret i64 %z
11}
12
13define i64 @sub_unsigned(i64 %x, i64 %y) {
14; CHECK: %z = sub nuw i64 %x, %y
15	%z = sub nuw i64 %x, %y
16	ret i64 %z
17}
18
19define i64 @mul_unsigned(i64 %x, i64 %y) {
20; CHECK: %z = mul nuw i64 %x, %y
21	%z = mul nuw i64 %x, %y
22	ret i64 %z
23}
24
25define i64 @add_signed(i64 %x, i64 %y) {
26; CHECK: %z = add nsw i64 %x, %y
27	%z = add nsw i64 %x, %y
28	ret i64 %z
29}
30
31define i64 @sub_signed(i64 %x, i64 %y) {
32; CHECK: %z = sub nsw i64 %x, %y
33	%z = sub nsw i64 %x, %y
34	ret i64 %z
35}
36
37define i64 @mul_signed(i64 %x, i64 %y) {
38; CHECK: %z = mul nsw i64 %x, %y
39	%z = mul nsw i64 %x, %y
40	ret i64 %z
41}
42
43define i64 @add_plain(i64 %x, i64 %y) {
44; CHECK: %z = add i64 %x, %y
45	%z = add i64 %x, %y
46	ret i64 %z
47}
48
49define i64 @sub_plain(i64 %x, i64 %y) {
50; CHECK: %z = sub i64 %x, %y
51	%z = sub i64 %x, %y
52	ret i64 %z
53}
54
55define i64 @mul_plain(i64 %x, i64 %y) {
56; CHECK: %z = mul i64 %x, %y
57	%z = mul i64 %x, %y
58	ret i64 %z
59}
60
61define i64 @add_both(i64 %x, i64 %y) {
62; CHECK: %z = add nuw nsw i64 %x, %y
63	%z = add nuw nsw i64 %x, %y
64	ret i64 %z
65}
66
67define i64 @sub_both(i64 %x, i64 %y) {
68; CHECK: %z = sub nuw nsw i64 %x, %y
69	%z = sub nuw nsw i64 %x, %y
70	ret i64 %z
71}
72
73define i64 @mul_both(i64 %x, i64 %y) {
74; CHECK: %z = mul nuw nsw i64 %x, %y
75	%z = mul nuw nsw i64 %x, %y
76	ret i64 %z
77}
78
79define i64 @add_both_reversed(i64 %x, i64 %y) {
80; CHECK: %z = add nuw nsw i64 %x, %y
81	%z = add nsw nuw i64 %x, %y
82	ret i64 %z
83}
84
85define i64 @sub_both_reversed(i64 %x, i64 %y) {
86; CHECK: %z = sub nuw nsw i64 %x, %y
87	%z = sub nsw nuw i64 %x, %y
88	ret i64 %z
89}
90
91define i64 @mul_both_reversed(i64 %x, i64 %y) {
92; CHECK: %z = mul nuw nsw i64 %x, %y
93	%z = mul nsw nuw i64 %x, %y
94	ret i64 %z
95}
96
97define i64 @shl_both(i64 %x, i64 %y) {
98; CHECK: %z = shl nuw nsw i64 %x, %y
99	%z = shl nuw nsw i64 %x, %y
100	ret i64 %z
101}
102
103define i64 @sdiv_exact(i64 %x, i64 %y) {
104; CHECK: %z = sdiv exact i64 %x, %y
105	%z = sdiv exact i64 %x, %y
106	ret i64 %z
107}
108
109define i64 @sdiv_plain(i64 %x, i64 %y) {
110; CHECK: %z = sdiv i64 %x, %y
111	%z = sdiv i64 %x, %y
112	ret i64 %z
113}
114
115define i64 @udiv_exact(i64 %x, i64 %y) {
116; CHECK: %z = udiv exact i64 %x, %y
117	%z = udiv exact i64 %x, %y
118	ret i64 %z
119}
120
121define i64 @udiv_plain(i64 %x, i64 %y) {
122; CHECK: %z = udiv i64 %x, %y
123	%z = udiv i64 %x, %y
124	ret i64 %z
125}
126
127define i64 @ashr_plain(i64 %x, i64 %y) {
128; CHECK: %z = ashr i64 %x, %y
129	%z = ashr i64 %x, %y
130	ret i64 %z
131}
132
133define i64 @ashr_exact(i64 %x, i64 %y) {
134; CHECK: %z = ashr exact i64 %x, %y
135	%z = ashr exact i64 %x, %y
136	ret i64 %z
137}
138
139define i64 @lshr_plain(i64 %x, i64 %y) {
140; CHECK: %z = lshr i64 %x, %y
141	%z = lshr i64 %x, %y
142	ret i64 %z
143}
144
145define i64 @lshr_exact(i64 %x, i64 %y) {
146; CHECK: %z = lshr exact i64 %x, %y
147	%z = lshr exact i64 %x, %y
148	ret i64 %z
149}
150
151define ptr @gep_nw(ptr %p, i64 %x) {
152; CHECK: %z = getelementptr inbounds i64, ptr %p, i64 %x
153	%z = getelementptr inbounds i64, ptr %p, i64 %x
154        ret ptr %z
155}
156
157define ptr @gep_plain(ptr %p, i64 %x) {
158; CHECK: %z = getelementptr i64, ptr %p, i64 %x
159	%z = getelementptr i64, ptr %p, i64 %x
160        ret ptr %z
161}
162
163define i64 @add_both_ce() {
164; CHECK: ret i64 add nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
165	ret i64 add nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
166}
167
168define i64 @sub_both_ce() {
169; CHECK: ret i64 sub nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
170	ret i64 sub nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
171}
172
173define i64 @mul_both_ce() {
174; CHECK: ret i64 mul nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
175	ret i64 mul nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
176}
177
178define ptr @gep_nw_ce() {
179; CHECK: ret ptr getelementptr inbounds (i64, ptr @addr, i64 171)
180        ret ptr getelementptr inbounds (i64, ptr @addr, i64 171)
181}
182
183define i64 @add_plain_ce() {
184; CHECK: ret i64 add (i64 ptrtoint (ptr @addr to i64), i64 91)
185	ret i64 add (i64 ptrtoint (ptr @addr to i64), i64 91)
186}
187
188define i64 @sub_plain_ce() {
189; CHECK: ret i64 sub (i64 ptrtoint (ptr @addr to i64), i64 91)
190	ret i64 sub (i64 ptrtoint (ptr @addr to i64), i64 91)
191}
192
193define i64 @mul_plain_ce() {
194; CHECK: ret i64 mul (i64 ptrtoint (ptr @addr to i64), i64 91)
195	ret i64 mul (i64 ptrtoint (ptr @addr to i64), i64 91)
196}
197
198define ptr @gep_plain_ce() {
199; CHECK: ret ptr getelementptr (i64, ptr @addr, i64 171)
200        ret ptr getelementptr (i64, ptr @addr, i64 171)
201}
202
203define i64 @add_both_reversed_ce() {
204; CHECK: ret i64 add nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
205	ret i64 add nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
206}
207
208define i64 @sub_both_reversed_ce() {
209; CHECK: ret i64 sub nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
210	ret i64 sub nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
211}
212
213define i64 @mul_both_reversed_ce() {
214; CHECK: ret i64 mul nuw nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
215	ret i64 mul nsw nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
216}
217
218define i64 @add_signed_ce() {
219; CHECK: ret i64 add nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
220	ret i64 add nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
221}
222
223define i64 @sub_signed_ce() {
224; CHECK: ret i64 sub nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
225	ret i64 sub nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
226}
227
228define i64 @mul_signed_ce() {
229; CHECK: ret i64 mul nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
230	ret i64 mul nsw (i64 ptrtoint (ptr @addr to i64), i64 91)
231}
232
233define i64 @add_unsigned_ce() {
234; CHECK: ret i64 add nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
235	ret i64 add nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
236}
237
238define i64 @sub_unsigned_ce() {
239; CHECK: ret i64 sub nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
240	ret i64 sub nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
241}
242
243define i64 @mul_unsigned_ce() {
244; CHECK: ret i64 mul nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
245	ret i64 mul nuw (i64 ptrtoint (ptr @addr to i64), i64 91)
246}
247
248define i64 @test_zext(i32 %a) {
249; CHECK: %res = zext nneg i32 %a to i64
250  %res = zext nneg i32 %a to i64
251  ret i64 %res
252}
253
254define float @test_uitofp(i32 %a) {
255; CHECK: %res = uitofp nneg i32 %a to float
256  %res = uitofp nneg i32 %a to float
257  ret float %res
258}
259
260
261define i64 @test_or(i64 %a, i64 %b) {
262; CHECK: %res = or disjoint i64 %a, %b
263  %res = or disjoint i64 %a, %b
264  ret i64 %res
265}
266
267define i32 @test_trunc_signed(i64 %a) {
268; CHECK: %res = trunc nsw i64 %a to i32
269  %res = trunc nsw i64 %a to i32
270  ret i32 %res
271}
272
273define i32 @test_trunc_unsigned(i64 %a) {
274; CHECK: %res = trunc nuw i64 %a to i32
275  %res = trunc nuw i64 %a to i32
276  ret i32 %res
277}
278
279define i32 @test_trunc_both(i64 %a) {
280; CHECK: %res = trunc nuw nsw i64 %a to i32
281  %res = trunc nuw nsw i64 %a to i32
282  ret i32 %res
283}
284
285define i32 @test_trunc_both_reversed(i64 %a) {
286; CHECK: %res = trunc nuw nsw i64 %a to i32
287  %res = trunc nsw nuw i64 %a to i32
288  ret i32 %res
289}
290
291define <2 x i32> @test_trunc_signed_vector(<2 x i64> %a) {
292; CHECK: %res = trunc nsw <2 x i64> %a to <2 x i32>
293  %res = trunc nsw <2 x i64> %a to <2 x i32>
294  ret <2 x i32> %res
295}
296
297define <2 x i32> @test_trunc_unsigned_vector(<2 x i64> %a) {
298; CHECK: %res = trunc nuw <2 x i64> %a to <2 x i32>
299  %res = trunc nuw <2 x i64> %a to <2 x i32>
300  ret <2 x i32> %res
301}
302
303define <2 x i32> @test_trunc_both_vector(<2 x i64> %a) {
304; CHECK: %res = trunc nuw nsw <2 x i64> %a to <2 x i32>
305  %res = trunc nuw nsw <2 x i64> %a to <2 x i32>
306  ret <2 x i32> %res
307}
308
309define <2 x i32> @test_trunc_both_reversed_vector(<2 x i64> %a) {
310; CHECK: %res = trunc nuw nsw <2 x i64> %a to <2 x i32>
311  %res = trunc nsw nuw <2 x i64> %a to <2 x i32>
312  ret <2 x i32> %res
313}
314
315define i1 @test_icmp_samesign(i32 %a, i32 %b) {
316  ; CHECK: %res = icmp samesign ult i32 %a, %b
317  %res = icmp samesign ult i32 %a, %b
318  ret i1 %res
319}
320
321define <2 x i1> @test_icmp_samesign2(<2 x i32> %a, <2 x i32> %b) {
322  ; CHECK: %res = icmp samesign ult <2 x i32> %a, %b
323  %res = icmp samesign ult <2 x i32> %a, %b
324  ret <2 x i1> %res
325}
326
327define ptr @gep_nuw(ptr %p, i64 %idx) {
328; CHECK: %gep = getelementptr nuw i8, ptr %p, i64 %idx
329  %gep = getelementptr nuw i8, ptr %p, i64 %idx
330  ret ptr %gep
331}
332
333define ptr @gep_inbounds_nuw(ptr %p, i64 %idx) {
334; CHECK: %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx
335  %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx
336  ret ptr %gep
337}
338
339define ptr @gep_nusw(ptr %p, i64 %idx) {
340; CHECK: %gep = getelementptr nusw i8, ptr %p, i64 %idx
341  %gep = getelementptr nusw i8, ptr %p, i64 %idx
342  ret ptr %gep
343}
344
345; inbounds implies nusw, so the flag is not printed back.
346define ptr @gep_inbounds_nusw(ptr %p, i64 %idx) {
347; CHECK: %gep = getelementptr inbounds i8, ptr %p, i64 %idx
348  %gep = getelementptr inbounds nusw i8, ptr %p, i64 %idx
349  ret ptr %gep
350}
351
352define ptr @gep_nusw_nuw(ptr %p, i64 %idx) {
353; CHECK: %gep = getelementptr nusw nuw i8, ptr %p, i64 %idx
354  %gep = getelementptr nusw nuw i8, ptr %p, i64 %idx
355  ret ptr %gep
356}
357
358define ptr @gep_inbounds_nusw_nuw(ptr %p, i64 %idx) {
359; CHECK: %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx
360  %gep = getelementptr inbounds nusw nuw i8, ptr %p, i64 %idx
361  ret ptr %gep
362}
363
364define ptr @gep_nuw_nusw_inbounds(ptr %p, i64 %idx) {
365; CHECK: %gep = getelementptr inbounds nuw i8, ptr %p, i64 %idx
366  %gep = getelementptr nuw nusw inbounds i8, ptr %p, i64 %idx
367  ret ptr %gep
368}
369
370define ptr addrspace(1) @gep_nusw_nuw_as1(ptr addrspace(1) %p, i64 %idx) {
371; CHECK: %gep = getelementptr nusw nuw i8, ptr addrspace(1) %p, i64 %idx
372  %gep = getelementptr nusw nuw i8, ptr addrspace(1) %p, i64 %idx
373  ret ptr addrspace(1) %gep
374}
375
376define <2 x ptr> @gep_nusw_nuw_vec(<2 x ptr> %p, i64 %idx) {
377; CHECK: %gep = getelementptr nusw nuw i8, <2 x ptr> %p, i64 %idx
378  %gep = getelementptr nusw nuw i8, <2 x ptr> %p, i64 %idx
379  ret <2 x ptr> %gep
380}
381
382define ptr @const_gep_nuw() {
383; CHECK: ret ptr getelementptr nuw (i8, ptr @addr, i64 100)
384  ret ptr getelementptr nuw (i8, ptr @addr, i64 100)
385}
386
387define ptr @const_gep_inbounds_nuw() {
388; CHECK: ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100)
389  ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100)
390}
391
392define ptr @const_gep_nusw() {
393; CHECK: ret ptr getelementptr nusw (i8, ptr @addr, i64 100)
394  ret ptr getelementptr nusw (i8, ptr @addr, i64 100)
395}
396
397; inbounds implies nusw, so the flag is not printed back.
398define ptr @const_gep_inbounds_nusw() {
399; CHECK: ret ptr getelementptr inbounds (i8, ptr @addr, i64 100)
400  ret ptr getelementptr inbounds nusw (i8, ptr @addr, i64 100)
401}
402
403define ptr @const_gep_nusw_nuw() {
404; CHECK: ret ptr getelementptr nusw nuw (i8, ptr @addr, i64 100)
405  ret ptr getelementptr nusw nuw (i8, ptr @addr, i64 100)
406}
407
408define ptr @const_gep_inbounds_nusw_nuw() {
409; CHECK: ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100)
410  ret ptr getelementptr inbounds nusw nuw (i8, ptr @addr, i64 100)
411}
412
413define ptr @const_gep_nuw_nusw_inbounds() {
414; CHECK: ret ptr getelementptr inbounds nuw (i8, ptr @addr, i64 100)
415  ret ptr getelementptr nuw nusw inbounds (i8, ptr @addr, i64 100)
416}
417
418define ptr @const_gep_nuw_inrange() {
419; CHECK: ret ptr getelementptr nuw inrange(-8, 16) (i8, ptr @addr, i64 100)
420  ret ptr getelementptr nuw inrange(-8, 16) (i8, ptr @addr, i64 100)
421}
422
423define ptr addrspace(1) @const_gep_nusw_nuw_as1() {
424; CHECK: ret ptr addrspace(1) getelementptr nusw nuw (i8, ptr addrspace(1) @addr_as1, i64 100)
425  ret ptr addrspace(1) getelementptr nusw nuw (i8, ptr addrspace(1) @addr_as1, i64 100)
426}
427