[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / andorbrcompare.ll
blob951a5cdb9571ca7009c037463f15dbd1d0987f84
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=aarch64-none-elf -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,SDISEL
3 ; RUN: llc -mtriple=aarch64-none-elf -global-isel -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=CHECK,GISEL
5 declare void @dummy()
7 define i32 @and_eq_ne_ult(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, ptr %p) {
8 ; SDISEL-LABEL: and_eq_ne_ult:
9 ; SDISEL:       // %bb.0: // %entry
10 ; SDISEL-NEXT:    cmp w2, w3
11 ; SDISEL-NEXT:    ccmp w0, w1, #0, ne
12 ; SDISEL-NEXT:    b.eq .LBB0_3
13 ; SDISEL-NEXT:  // %bb.1: // %entry
14 ; SDISEL-NEXT:    cmp w4, w5
15 ; SDISEL-NEXT:    b.lo .LBB0_3
16 ; SDISEL-NEXT:  // %bb.2:
17 ; SDISEL-NEXT:    mov w0, wzr
18 ; SDISEL-NEXT:    ret
19 ; SDISEL-NEXT:  .LBB0_3: // %if
20 ; SDISEL-NEXT:    mov w0, #1 // =0x1
21 ; SDISEL-NEXT:    str w0, [x6]
22 ; SDISEL-NEXT:    ret
24 ; GISEL-LABEL: and_eq_ne_ult:
25 ; GISEL:       // %bb.0: // %entry
26 ; GISEL-NEXT:    cmp w0, w1
27 ; GISEL-NEXT:    cset w8, eq
28 ; GISEL-NEXT:    cmp w2, w3
29 ; GISEL-NEXT:    cset w9, ne
30 ; GISEL-NEXT:    and w8, w8, w9
31 ; GISEL-NEXT:    tbnz w8, #0, .LBB0_3
32 ; GISEL-NEXT:  // %bb.1: // %entry
33 ; GISEL-NEXT:    cmp w4, w5
34 ; GISEL-NEXT:    mov w0, wzr
35 ; GISEL-NEXT:    b.lo .LBB0_3
36 ; GISEL-NEXT:  // %bb.2: // %common.ret
37 ; GISEL-NEXT:    ret
38 ; GISEL-NEXT:  .LBB0_3: // %if
39 ; GISEL-NEXT:    mov w0, #1 // =0x1
40 ; GISEL-NEXT:    str w0, [x6]
41 ; GISEL-NEXT:    ret
42 entry:
43   %c0 = icmp eq i32 %s0, %s1
44   %c1 = icmp ne i32 %s2, %s3
45   %a = and i1 %c0, %c1
46   %c2 = icmp ult i32 %s4, %s5
47   %o = or i1 %a, %c2
48   br i1 %o, label %if, label %else
50 if:
51   store i32 1, ptr %p
52   ret i32 1
54 else:
55   ret i32 0
58 define i32 @and_ne_ult_ule(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, ptr %p) {
59 ; SDISEL-LABEL: and_ne_ult_ule:
60 ; SDISEL:       // %bb.0: // %entry
61 ; SDISEL-NEXT:    cmp w2, w3
62 ; SDISEL-NEXT:    ccmp w0, w1, #4, lo
63 ; SDISEL-NEXT:    b.ne .LBB1_3
64 ; SDISEL-NEXT:  // %bb.1: // %entry
65 ; SDISEL-NEXT:    cmp w4, w5
66 ; SDISEL-NEXT:    b.ls .LBB1_3
67 ; SDISEL-NEXT:  // %bb.2:
68 ; SDISEL-NEXT:    mov w0, wzr
69 ; SDISEL-NEXT:    ret
70 ; SDISEL-NEXT:  .LBB1_3: // %if
71 ; SDISEL-NEXT:    mov w0, #1 // =0x1
72 ; SDISEL-NEXT:    str w0, [x6]
73 ; SDISEL-NEXT:    ret
75 ; GISEL-LABEL: and_ne_ult_ule:
76 ; GISEL:       // %bb.0: // %entry
77 ; GISEL-NEXT:    cmp w0, w1
78 ; GISEL-NEXT:    cset w8, ne
79 ; GISEL-NEXT:    cmp w2, w3
80 ; GISEL-NEXT:    cset w9, lo
81 ; GISEL-NEXT:    and w8, w8, w9
82 ; GISEL-NEXT:    tbnz w8, #0, .LBB1_3
83 ; GISEL-NEXT:  // %bb.1: // %entry
84 ; GISEL-NEXT:    cmp w4, w5
85 ; GISEL-NEXT:    mov w0, wzr
86 ; GISEL-NEXT:    b.ls .LBB1_3
87 ; GISEL-NEXT:  // %bb.2: // %common.ret
88 ; GISEL-NEXT:    ret
89 ; GISEL-NEXT:  .LBB1_3: // %if
90 ; GISEL-NEXT:    mov w0, #1 // =0x1
91 ; GISEL-NEXT:    str w0, [x6]
92 ; GISEL-NEXT:    ret
93 entry:
94   %c0 = icmp ne i32 %s0, %s1
95   %c1 = icmp ult i32 %s2, %s3
96   %a = and i1 %c0, %c1
97   %c2 = icmp ule i32 %s4, %s5
98   %o = or i1 %a, %c2
99   br i1 %o, label %if, label %else
102   store i32 1, ptr %p
103   ret i32 1
105 else:
106   ret i32 0
109 define i32 @and_ult_ule_ugt(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, ptr %p) {
110 ; SDISEL-LABEL: and_ult_ule_ugt:
111 ; SDISEL:       // %bb.0: // %entry
112 ; SDISEL-NEXT:    cmp w2, w3
113 ; SDISEL-NEXT:    ccmp w0, w1, #2, ls
114 ; SDISEL-NEXT:    b.lo .LBB2_3
115 ; SDISEL-NEXT:  // %bb.1: // %entry
116 ; SDISEL-NEXT:    cmp w4, w5
117 ; SDISEL-NEXT:    b.hi .LBB2_3
118 ; SDISEL-NEXT:  // %bb.2:
119 ; SDISEL-NEXT:    mov w0, wzr
120 ; SDISEL-NEXT:    ret
121 ; SDISEL-NEXT:  .LBB2_3: // %if
122 ; SDISEL-NEXT:    mov w0, #1 // =0x1
123 ; SDISEL-NEXT:    str w0, [x6]
124 ; SDISEL-NEXT:    ret
126 ; GISEL-LABEL: and_ult_ule_ugt:
127 ; GISEL:       // %bb.0: // %entry
128 ; GISEL-NEXT:    cmp w0, w1
129 ; GISEL-NEXT:    cset w8, lo
130 ; GISEL-NEXT:    cmp w2, w3
131 ; GISEL-NEXT:    cset w9, ls
132 ; GISEL-NEXT:    and w8, w8, w9
133 ; GISEL-NEXT:    tbnz w8, #0, .LBB2_3
134 ; GISEL-NEXT:  // %bb.1: // %entry
135 ; GISEL-NEXT:    cmp w4, w5
136 ; GISEL-NEXT:    mov w0, wzr
137 ; GISEL-NEXT:    b.hi .LBB2_3
138 ; GISEL-NEXT:  // %bb.2: // %common.ret
139 ; GISEL-NEXT:    ret
140 ; GISEL-NEXT:  .LBB2_3: // %if
141 ; GISEL-NEXT:    mov w0, #1 // =0x1
142 ; GISEL-NEXT:    str w0, [x6]
143 ; GISEL-NEXT:    ret
144 entry:
145   %c0 = icmp ult i32 %s0, %s1
146   %c1 = icmp ule i32 %s2, %s3
147   %a = and i1 %c0, %c1
148   %c2 = icmp ugt i32 %s4, %s5
149   %o = or i1 %a, %c2
150   br i1 %o, label %if, label %else
153   store i32 1, ptr %p
154   ret i32 1
156 else:
157   ret i32 0
160 define i32 @and_ule_ugt_uge(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, ptr %p) {
161 ; SDISEL-LABEL: and_ule_ugt_uge:
162 ; SDISEL:       // %bb.0: // %entry
163 ; SDISEL-NEXT:    cmp w2, w3
164 ; SDISEL-NEXT:    ccmp w0, w1, #2, hi
165 ; SDISEL-NEXT:    b.ls .LBB3_3
166 ; SDISEL-NEXT:  // %bb.1: // %entry
167 ; SDISEL-NEXT:    cmp w4, w5
168 ; SDISEL-NEXT:    b.hs .LBB3_3
169 ; SDISEL-NEXT:  // %bb.2:
170 ; SDISEL-NEXT:    mov w0, wzr
171 ; SDISEL-NEXT:    ret
172 ; SDISEL-NEXT:  .LBB3_3: // %if
173 ; SDISEL-NEXT:    mov w0, #1 // =0x1
174 ; SDISEL-NEXT:    str w0, [x6]
175 ; SDISEL-NEXT:    ret
177 ; GISEL-LABEL: and_ule_ugt_uge:
178 ; GISEL:       // %bb.0: // %entry
179 ; GISEL-NEXT:    cmp w0, w1
180 ; GISEL-NEXT:    cset w8, ls
181 ; GISEL-NEXT:    cmp w2, w3
182 ; GISEL-NEXT:    cset w9, hi
183 ; GISEL-NEXT:    and w8, w8, w9
184 ; GISEL-NEXT:    tbnz w8, #0, .LBB3_3
185 ; GISEL-NEXT:  // %bb.1: // %entry
186 ; GISEL-NEXT:    cmp w4, w5
187 ; GISEL-NEXT:    mov w0, wzr
188 ; GISEL-NEXT:    b.hs .LBB3_3
189 ; GISEL-NEXT:  // %bb.2: // %common.ret
190 ; GISEL-NEXT:    ret
191 ; GISEL-NEXT:  .LBB3_3: // %if
192 ; GISEL-NEXT:    mov w0, #1 // =0x1
193 ; GISEL-NEXT:    str w0, [x6]
194 ; GISEL-NEXT:    ret
195 entry:
196   %c0 = icmp ule i32 %s0, %s1
197   %c1 = icmp ugt i32 %s2, %s3
198   %a = and i1 %c0, %c1
199   %c2 = icmp uge i32 %s4, %s5
200   %o = or i1 %a, %c2
201   br i1 %o, label %if, label %else
204   store i32 1, ptr %p
205   ret i32 1
207 else:
208   ret i32 0
211 define i32 @and_ugt_uge_slt(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, ptr %p) {
212 ; SDISEL-LABEL: and_ugt_uge_slt:
213 ; SDISEL:       // %bb.0: // %entry
214 ; SDISEL-NEXT:    cmp w2, w3
215 ; SDISEL-NEXT:    ccmp w0, w1, #0, hs
216 ; SDISEL-NEXT:    b.hi .LBB4_3
217 ; SDISEL-NEXT:  // %bb.1: // %entry
218 ; SDISEL-NEXT:    cmp w4, w5
219 ; SDISEL-NEXT:    b.lt .LBB4_3
220 ; SDISEL-NEXT:  // %bb.2:
221 ; SDISEL-NEXT:    mov w0, wzr
222 ; SDISEL-NEXT:    ret
223 ; SDISEL-NEXT:  .LBB4_3: // %if
224 ; SDISEL-NEXT:    mov w0, #1 // =0x1
225 ; SDISEL-NEXT:    str w0, [x6]
226 ; SDISEL-NEXT:    ret
228 ; GISEL-LABEL: and_ugt_uge_slt:
229 ; GISEL:       // %bb.0: // %entry
230 ; GISEL-NEXT:    cmp w0, w1
231 ; GISEL-NEXT:    cset w8, hi
232 ; GISEL-NEXT:    cmp w2, w3
233 ; GISEL-NEXT:    cset w9, hs
234 ; GISEL-NEXT:    and w8, w8, w9
235 ; GISEL-NEXT:    tbnz w8, #0, .LBB4_3
236 ; GISEL-NEXT:  // %bb.1: // %entry
237 ; GISEL-NEXT:    cmp w4, w5
238 ; GISEL-NEXT:    mov w0, wzr
239 ; GISEL-NEXT:    b.lt .LBB4_3
240 ; GISEL-NEXT:  // %bb.2: // %common.ret
241 ; GISEL-NEXT:    ret
242 ; GISEL-NEXT:  .LBB4_3: // %if
243 ; GISEL-NEXT:    mov w0, #1 // =0x1
244 ; GISEL-NEXT:    str w0, [x6]
245 ; GISEL-NEXT:    ret
246 entry:
247   %c0 = icmp ugt i32 %s0, %s1
248   %c1 = icmp uge i32 %s2, %s3
249   %a = and i1 %c0, %c1
250   %c2 = icmp slt i32 %s4, %s5
251   %o = or i1 %a, %c2
252   br i1 %o, label %if, label %else
255   store i32 1, ptr %p
256   ret i32 1
258 else:
259   ret i32 0
262 define i32 @and_uge_slt_sle(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, ptr %p) {
263 ; SDISEL-LABEL: and_uge_slt_sle:
264 ; SDISEL:       // %bb.0: // %entry
265 ; SDISEL-NEXT:    cmp w2, w3
266 ; SDISEL-NEXT:    ccmp w0, w1, #0, lt
267 ; SDISEL-NEXT:    b.hs .LBB5_3
268 ; SDISEL-NEXT:  // %bb.1: // %entry
269 ; SDISEL-NEXT:    cmp w4, w5
270 ; SDISEL-NEXT:    b.le .LBB5_3
271 ; SDISEL-NEXT:  // %bb.2:
272 ; SDISEL-NEXT:    mov w0, wzr
273 ; SDISEL-NEXT:    ret
274 ; SDISEL-NEXT:  .LBB5_3: // %if
275 ; SDISEL-NEXT:    mov w0, #1 // =0x1
276 ; SDISEL-NEXT:    str w0, [x6]
277 ; SDISEL-NEXT:    ret
279 ; GISEL-LABEL: and_uge_slt_sle:
280 ; GISEL:       // %bb.0: // %entry
281 ; GISEL-NEXT:    cmp w0, w1
282 ; GISEL-NEXT:    cset w8, hs
283 ; GISEL-NEXT:    cmp w2, w3
284 ; GISEL-NEXT:    cset w9, lt
285 ; GISEL-NEXT:    and w8, w8, w9
286 ; GISEL-NEXT:    tbnz w8, #0, .LBB5_3
287 ; GISEL-NEXT:  // %bb.1: // %entry
288 ; GISEL-NEXT:    cmp w4, w5
289 ; GISEL-NEXT:    mov w0, wzr
290 ; GISEL-NEXT:    b.le .LBB5_3
291 ; GISEL-NEXT:  // %bb.2: // %common.ret
292 ; GISEL-NEXT:    ret
293 ; GISEL-NEXT:  .LBB5_3: // %if
294 ; GISEL-NEXT:    mov w0, #1 // =0x1
295 ; GISEL-NEXT:    str w0, [x6]
296 ; GISEL-NEXT:    ret
297 entry:
298   %c0 = icmp uge i32 %s0, %s1
299   %c1 = icmp slt i32 %s2, %s3
300   %a = and i1 %c0, %c1
301   %c2 = icmp sle i32 %s4, %s5
302   %o = or i1 %a, %c2
303   br i1 %o, label %if, label %else
306   store i32 1, ptr %p
307   ret i32 1
309 else:
310   ret i32 0
313 define i32 @and_slt_sle_sgt(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, ptr %p) {
314 ; SDISEL-LABEL: and_slt_sle_sgt:
315 ; SDISEL:       // %bb.0: // %entry
316 ; SDISEL-NEXT:    cmp w2, w3
317 ; SDISEL-NEXT:    ccmp w0, w1, #0, le
318 ; SDISEL-NEXT:    b.lt .LBB6_3
319 ; SDISEL-NEXT:  // %bb.1: // %entry
320 ; SDISEL-NEXT:    cmp w4, w5
321 ; SDISEL-NEXT:    b.gt .LBB6_3
322 ; SDISEL-NEXT:  // %bb.2:
323 ; SDISEL-NEXT:    mov w0, wzr
324 ; SDISEL-NEXT:    ret
325 ; SDISEL-NEXT:  .LBB6_3: // %if
326 ; SDISEL-NEXT:    mov w0, #1 // =0x1
327 ; SDISEL-NEXT:    str w0, [x6]
328 ; SDISEL-NEXT:    ret
330 ; GISEL-LABEL: and_slt_sle_sgt:
331 ; GISEL:       // %bb.0: // %entry
332 ; GISEL-NEXT:    cmp w0, w1
333 ; GISEL-NEXT:    cset w8, lt
334 ; GISEL-NEXT:    cmp w2, w3
335 ; GISEL-NEXT:    cset w9, le
336 ; GISEL-NEXT:    and w8, w8, w9
337 ; GISEL-NEXT:    tbnz w8, #0, .LBB6_3
338 ; GISEL-NEXT:  // %bb.1: // %entry
339 ; GISEL-NEXT:    cmp w4, w5
340 ; GISEL-NEXT:    mov w0, wzr
341 ; GISEL-NEXT:    b.gt .LBB6_3
342 ; GISEL-NEXT:  // %bb.2: // %common.ret
343 ; GISEL-NEXT:    ret
344 ; GISEL-NEXT:  .LBB6_3: // %if
345 ; GISEL-NEXT:    mov w0, #1 // =0x1
346 ; GISEL-NEXT:    str w0, [x6]
347 ; GISEL-NEXT:    ret
348 entry:
349   %c0 = icmp slt i32 %s0, %s1
350   %c1 = icmp sle i32 %s2, %s3
351   %a = and i1 %c0, %c1
352   %c2 = icmp sgt i32 %s4, %s5
353   %o = or i1 %a, %c2
354   br i1 %o, label %if, label %else
357   store i32 1, ptr %p
358   ret i32 1
360 else:
361   ret i32 0
364 define i32 @and_sle_sgt_sge(i32 %s0, i32 %s1, i32 %s2, i32 %s3, i32 %s4, i32 %s5, ptr %p) {
365 ; SDISEL-LABEL: and_sle_sgt_sge:
366 ; SDISEL:       // %bb.0: // %entry
367 ; SDISEL-NEXT:    cmp w2, w3
368 ; SDISEL-NEXT:    ccmp w0, w1, #0, gt
369 ; SDISEL-NEXT:    b.le .LBB7_3
370 ; SDISEL-NEXT:  // %bb.1: // %entry
371 ; SDISEL-NEXT:    cmp w4, w5
372 ; SDISEL-NEXT:    b.ge .LBB7_3
373 ; SDISEL-NEXT:  // %bb.2:
374 ; SDISEL-NEXT:    mov w0, wzr
375 ; SDISEL-NEXT:    ret
376 ; SDISEL-NEXT:  .LBB7_3: // %if
377 ; SDISEL-NEXT:    mov w0, #1 // =0x1
378 ; SDISEL-NEXT:    str w0, [x6]
379 ; SDISEL-NEXT:    ret
381 ; GISEL-LABEL: and_sle_sgt_sge:
382 ; GISEL:       // %bb.0: // %entry
383 ; GISEL-NEXT:    cmp w0, w1
384 ; GISEL-NEXT:    cset w8, le
385 ; GISEL-NEXT:    cmp w2, w3
386 ; GISEL-NEXT:    cset w9, gt
387 ; GISEL-NEXT:    and w8, w8, w9
388 ; GISEL-NEXT:    tbnz w8, #0, .LBB7_3
389 ; GISEL-NEXT:  // %bb.1: // %entry
390 ; GISEL-NEXT:    cmp w4, w5
391 ; GISEL-NEXT:    mov w0, wzr
392 ; GISEL-NEXT:    b.ge .LBB7_3
393 ; GISEL-NEXT:  // %bb.2: // %common.ret
394 ; GISEL-NEXT:    ret
395 ; GISEL-NEXT:  .LBB7_3: // %if
396 ; GISEL-NEXT:    mov w0, #1 // =0x1
397 ; GISEL-NEXT:    str w0, [x6]
398 ; GISEL-NEXT:    ret
399 entry:
400   %c0 = icmp sle i32 %s0, %s1
401   %c1 = icmp sgt i32 %s2, %s3
402   %a = and i1 %c0, %c1
403   %c2 = icmp sge i32 %s4, %s5
404   %o = or i1 %a, %c2
405   br i1 %o, label %if, label %else
408   store i32 1, ptr %p
409   ret i32 1
411 else:
412   ret i32 0
414 ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
415 ; CHECK: {{.*}}