[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / sve-ptest-removal-cmpeq.mir
blob81318aa5c2a58da84c29221bbb44f08096d9c0ee
1 # NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 # RUN: llc -mtriple=aarch64--linux-gnu -mattr=+sve -run-pass=peephole-opt -verify-machineinstrs %s -o - | FileCheck %s
4 # Test instruction sequences where PTEST is redundant and thus gets removed.
5 ---
6 name:            cmpeq_nxv16i8
7 alignment:       2
8 tracksRegLiveness: true
9 registers:
10   - { id: 0, class: ppr_3b }
11   - { id: 1, class: zpr }
12   - { id: 2, class: zpr }
13   - { id: 3, class: ppr }
14   - { id: 4, class: gpr32 }
15   - { id: 5, class: gpr32 }
16 liveins:
17   - { reg: '$p0', virtual-reg: '%0' }
18   - { reg: '$z0', virtual-reg: '%1' }
19   - { reg: '$z1', virtual-reg: '%2' }
20 frameInfo:
21   maxCallFrameSize: 0
22 body:             |
23   bb.0:
24     liveins: $p0, $z0, $z1
26     ; Here we check the expected sequence with subsequent tests
27     ; just asserting there is no PTEST instruction.
28     ;
29     ; CHECK-LABEL: name: cmpeq_nxv16i8
30     ; CHECK: %3:ppr = CMPEQ_PPzZZ_B %0, %1, %2, implicit-def $nzcv
31     ; CHECK-NEXT: %4:gpr32 = COPY $wzr
32     ; CHECK-NEXT: %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
33     %2:zpr = COPY $z1
34     %1:zpr = COPY $z0
35     %0:ppr_3b = COPY $p0
36     %3:ppr = CMPEQ_PPzZZ_B %0, %1, %2, implicit-def dead $nzcv
37     PTEST_PP %0, killed %3, implicit-def $nzcv
38     %4:gpr32 = COPY $wzr
39     %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
40     $w0 = COPY %5
41     RET_ReallyLR implicit $w0
43 ...
44 ---
45 name:            cmpeq_nxv8i16
46 alignment:       2
47 tracksRegLiveness: true
48 registers:
49   - { id: 0, class: ppr_3b }
50   - { id: 1, class: zpr }
51   - { id: 2, class: zpr }
52   - { id: 3, class: ppr_3b }
53   - { id: 4, class: ppr }
54   - { id: 5, class: ppr }
55   - { id: 6, class: gpr32 }
56   - { id: 7, class: gpr32 }
57 liveins:
58   - { reg: '$p0', virtual-reg: '%0' }
59   - { reg: '$z0', virtual-reg: '%1' }
60   - { reg: '$z1', virtual-reg: '%2' }
61 frameInfo:
62   maxCallFrameSize: 0
63 body:             |
64   bb.0:
65     liveins: $p0, $z0, $z1
67     ; CHECK-LABEL: name: cmpeq_nxv8i16
68     ; CHECK: PTEST
69     %2:zpr = COPY $z1
70     %1:zpr = COPY $z0
71     %0:ppr_3b = COPY $p0
72     %4:ppr = CMPEQ_PPzZZ_H %0, %1, %2, implicit-def dead $nzcv
73     PTEST_PP %0, %4, implicit-def $nzcv
74     %6:gpr32 = COPY $wzr
75     %7:gpr32 = CSINCWr %6, $wzr, 0, implicit $nzcv
76     $w0 = COPY %7
77     RET_ReallyLR implicit $w0
79 ...
80 ---
81 name:            cmpeq_nxv4i32
82 alignment:       2
83 tracksRegLiveness: true
84 registers:
85   - { id: 0, class: ppr_3b }
86   - { id: 1, class: zpr }
87   - { id: 2, class: zpr }
88   - { id: 3, class: ppr_3b }
89   - { id: 4, class: ppr }
90   - { id: 5, class: ppr }
91   - { id: 6, class: gpr32 }
92   - { id: 7, class: gpr32 }
93 liveins:
94   - { reg: '$p0', virtual-reg: '%0' }
95   - { reg: '$z0', virtual-reg: '%1' }
96   - { reg: '$z1', virtual-reg: '%2' }
97 frameInfo:
98   maxCallFrameSize: 0
99 body:             |
100   bb.0:
101     liveins: $p0, $z0, $z1
103     ; CHECK-LABEL: name: cmpeq_nxv4i32
104     ; CHECK: PTEST
105     %2:zpr = COPY $z1
106     %1:zpr = COPY $z0
107     %0:ppr_3b = COPY $p0
108     %4:ppr = CMPEQ_PPzZZ_S %0, %1, %2, implicit-def dead $nzcv
109     PTEST_PP %0, %4, implicit-def $nzcv
110     %6:gpr32 = COPY $wzr
111     %7:gpr32 = CSINCWr %6, $wzr, 0, implicit $nzcv
112     $w0 = COPY %7
113     RET_ReallyLR implicit $w0
117 name:            cmpeq_nxv2i64
118 alignment:       2
119 tracksRegLiveness: true
120 registers:
121   - { id: 0, class: ppr_3b }
122   - { id: 1, class: zpr }
123   - { id: 2, class: zpr }
124   - { id: 3, class: ppr_3b }
125   - { id: 4, class: ppr }
126   - { id: 5, class: ppr }
127   - { id: 6, class: gpr32 }
128   - { id: 7, class: gpr32 }
129 liveins:
130   - { reg: '$p0', virtual-reg: '%0' }
131   - { reg: '$z0', virtual-reg: '%1' }
132   - { reg: '$z1', virtual-reg: '%2' }
133 frameInfo:
134   maxCallFrameSize: 0
135 body:             |
136   bb.0:
137     liveins: $p0, $z0, $z1
139     ; CHECK-LABEL: name: cmpeq_nxv2i64
140     ; CHECK: PTEST
141     %2:zpr = COPY $z1
142     %1:zpr = COPY $z0
143     %0:ppr_3b = COPY $p0
144     %4:ppr = CMPEQ_PPzZZ_D %0, %1, %2, implicit-def dead $nzcv
145     PTEST_PP %0, %4, implicit-def $nzcv
146     %6:gpr32 = COPY $wzr
147     %7:gpr32 = CSINCWr %6, $wzr, 0, implicit $nzcv
148     $w0 = COPY %7
149     RET_ReallyLR implicit $w0
153 name:            cmpeq_imm_nxv16i8
154 alignment:       2
155 tracksRegLiveness: true
156 registers:
157   - { id: 0, class: ppr_3b }
158   - { id: 1, class: zpr }
159   - { id: 2, class: ppr }
160   - { id: 3, class: ppr }
161   - { id: 4, class: gpr32 }
162   - { id: 5, class: gpr32 }
163 liveins:
164   - { reg: '$p0', virtual-reg: '%0' }
165   - { reg: '$z0', virtual-reg: '%1' }
166 frameInfo:
167   maxCallFrameSize: 0
168 body:             |
169   bb.0:
170     liveins: $p0, $z0
172     ; CHECK-LABEL: name: cmpeq_imm_nxv16i8
173     ; CHECK: PTEST
174     %1:zpr = COPY $z0
175     %0:ppr_3b = COPY $p0
176     %2:ppr = CMPEQ_PPzZI_B %0, %1, 0, implicit-def dead $nzcv
177     %3:ppr = PTRUE_B 31
178     PTEST_PP killed %3, killed %2, implicit-def $nzcv
179     %4:gpr32 = COPY $wzr
180     %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
181     $w0 = COPY %5
182     RET_ReallyLR implicit $w0
186 name:            cmpeq_imm_nxv8i16
187 alignment:       2
188 tracksRegLiveness: true
189 registers:
190   - { id: 0, class: ppr_3b }
191   - { id: 1, class: zpr }
192   - { id: 2, class: ppr }
193   - { id: 3, class: ppr }
194   - { id: 4, class: ppr }
195   - { id: 5, class: gpr32 }
196   - { id: 6, class: gpr32 }
197 liveins:
198   - { reg: '$p0', virtual-reg: '%0' }
199   - { reg: '$z0', virtual-reg: '%1' }
200 frameInfo:
201   maxCallFrameSize: 0
202 body:             |
203   bb.0:
204     liveins: $p0, $z0
206     ; CHECK-LABEL: name: cmpeq_imm_nxv8i16
207     ; CHECK: PTEST
208     %1:zpr = COPY $z0
209     %0:ppr_3b = COPY $p0
210     %2:ppr = CMPEQ_PPzZI_H %0, %1, 0, implicit-def dead $nzcv
211     PTEST_PP %0, %2, implicit-def $nzcv
212     %5:gpr32 = COPY $wzr
213     %6:gpr32 = CSINCWr %5, $wzr, 0, implicit $nzcv
214     $w0 = COPY %6
215     RET_ReallyLR implicit $w0
219 name:            cmpeq_imm_nxv4i32
220 alignment:       2
221 tracksRegLiveness: true
222 registers:
223   - { id: 0, class: ppr_3b }
224   - { id: 1, class: zpr }
225   - { id: 2, class: ppr }
226   - { id: 3, class: ppr }
227   - { id: 4, class: ppr }
228   - { id: 5, class: gpr32 }
229   - { id: 6, class: gpr32 }
230 liveins:
231   - { reg: '$p0', virtual-reg: '%0' }
232   - { reg: '$z0', virtual-reg: '%1' }
233 frameInfo:
234   maxCallFrameSize: 0
235 body:             |
236   bb.0:
237     liveins: $p0, $z0
239     ; CHECK-LABEL: name: cmpeq_imm_nxv4i32
240     ; CHECK: PTEST
241     %1:zpr = COPY $z0
242     %0:ppr_3b = COPY $p0
243     %2:ppr = CMPEQ_PPzZI_S %0, %1, 0, implicit-def dead $nzcv
244     PTEST_PP %0, %2, implicit-def $nzcv
245     %5:gpr32 = COPY $wzr
246     %6:gpr32 = CSINCWr %5, $wzr, 0, implicit $nzcv
247     $w0 = COPY %6
248     RET_ReallyLR implicit $w0
252 name:            cmpeq_imm_nxv2i64
253 alignment:       2
254 tracksRegLiveness: true
255 registers:
256   - { id: 0, class: ppr_3b }
257   - { id: 1, class: zpr }
258   - { id: 2, class: ppr }
259   - { id: 3, class: ppr }
260   - { id: 4, class: ppr }
261   - { id: 5, class: gpr32 }
262   - { id: 6, class: gpr32 }
263 liveins:
264   - { reg: '$p0', virtual-reg: '%0' }
265   - { reg: '$z0', virtual-reg: '%1' }
266 frameInfo:
267   maxCallFrameSize: 0
268 body:             |
269   bb.0:
270     liveins: $p0, $z0
272     ; CHECK-LABEL: name: cmpeq_imm_nxv2i64
273     ; CHECK: PTEST
274     %1:zpr = COPY $z0
275     %0:ppr_3b = COPY $p0
276     %2:ppr = CMPEQ_PPzZI_D %0, %1, 0, implicit-def dead $nzcv
277     PTEST_PP %0, %2, implicit-def $nzcv
278     %5:gpr32 = COPY $wzr
279     %6:gpr32 = CSINCWr %5, $wzr, 0, implicit $nzcv
280     $w0 = COPY %6
281     RET_ReallyLR implicit $w0
285 name:            cmpeq_wide_nxv16i8
286 alignment:       2
287 tracksRegLiveness: true
288 registers:
289   - { id: 0, class: ppr_3b }
290   - { id: 1, class: zpr }
291   - { id: 2, class: zpr }
292   - { id: 3, class: ppr }
293   - { id: 4, class: gpr32 }
294   - { id: 5, class: gpr32 }
295 liveins:
296   - { reg: '$p0', virtual-reg: '%0' }
297   - { reg: '$z0', virtual-reg: '%1' }
298   - { reg: '$z1', virtual-reg: '%2' }
299 frameInfo:
300   maxCallFrameSize: 0
301 body:             |
302   bb.0:
303     liveins: $p0, $z0, $z1
305     ; CHECK-LABEL: name: cmpeq_wide_nxv16i8
306     ; CHECK-NOT: PTEST
307     %2:zpr = COPY $z1
308     %1:zpr = COPY $z0
309     %0:ppr_3b = COPY $p0
310     %3:ppr = CMPEQ_WIDE_PPzZZ_B %0, %1, %2, implicit-def dead $nzcv
311     PTEST_PP %0, killed %3, implicit-def $nzcv
312     %4:gpr32 = COPY $wzr
313     %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
314     $w0 = COPY %5
315     RET_ReallyLR implicit $w0
319 name:            cmpeq_wide_nxv8i16
320 alignment:       2
321 tracksRegLiveness: true
322 registers:
323   - { id: 0, class: ppr_3b }
324   - { id: 1, class: zpr }
325   - { id: 2, class: zpr }
326   - { id: 3, class: ppr_3b }
327   - { id: 4, class: ppr }
328   - { id: 5, class: ppr }
329   - { id: 6, class: gpr32 }
330   - { id: 7, class: gpr32 }
331 liveins:
332   - { reg: '$p0', virtual-reg: '%0' }
333   - { reg: '$z0', virtual-reg: '%1' }
334   - { reg: '$z1', virtual-reg: '%2' }
335 frameInfo:
336   maxCallFrameSize: 0
337 body:             |
338   bb.0:
339     liveins: $p0, $z0, $z1
341     ; CHECK-LABEL: name: cmpeq_wide_nxv8i16
342     ; CHECK: PTEST
343     %2:zpr = COPY $z1
344     %1:zpr = COPY $z0
345     %0:ppr_3b = COPY $p0
346     %4:ppr = CMPEQ_WIDE_PPzZZ_H %0, %1, %2, implicit-def dead $nzcv
347     PTEST_PP %0, %4, implicit-def $nzcv
348     %6:gpr32 = COPY $wzr
349     %7:gpr32 = CSINCWr %6, $wzr, 0, implicit $nzcv
350     $w0 = COPY %7
351     RET_ReallyLR implicit $w0
355 name:            cmpeq_wide_nxv4i32
356 alignment:       2
357 tracksRegLiveness: true
358 registers:
359   - { id: 0, class: ppr_3b }
360   - { id: 1, class: zpr }
361   - { id: 2, class: zpr }
362   - { id: 3, class: ppr_3b }
363   - { id: 4, class: ppr }
364   - { id: 5, class: ppr }
365   - { id: 6, class: gpr32 }
366   - { id: 7, class: gpr32 }
367 liveins:
368   - { reg: '$p0', virtual-reg: '%0' }
369   - { reg: '$z0', virtual-reg: '%1' }
370   - { reg: '$z1', virtual-reg: '%2' }
371 frameInfo:
372   maxCallFrameSize: 0
373 body:             |
374   bb.0:
375     liveins: $p0, $z0, $z1
377     ; CHECK-LABEL: name: cmpeq_wide_nxv4i32
378     ; CHECK: PTEST
379     %2:zpr = COPY $z1
380     %1:zpr = COPY $z0
381     %0:ppr_3b = COPY $p0
382     %4:ppr = CMPEQ_WIDE_PPzZZ_S %0, %1, %2, implicit-def dead $nzcv
383     PTEST_PP %0, %4, implicit-def $nzcv
384     %6:gpr32 = COPY $wzr
385     %7:gpr32 = CSINCWr %6, $wzr, 0, implicit $nzcv
386     $w0 = COPY %7
387     RET_ReallyLR implicit $w0
391 name:            cmpeq_imm_nxv16i8_ptest_not_all_active
392 alignment:       2
393 tracksRegLiveness: true
394 registers:
395   - { id: 0, class: ppr_3b }
396   - { id: 1, class: zpr }
397   - { id: 2, class: ppr }
398   - { id: 3, class: ppr }
399   - { id: 4, class: gpr32 }
400   - { id: 5, class: gpr32 }
401 liveins:
402   - { reg: '$p0', virtual-reg: '%0' }
403   - { reg: '$z0', virtual-reg: '%1' }
404 frameInfo:
405   maxCallFrameSize: 0
406 body:             |
407   bb.0:
408     liveins: $p0, $z0
410     ; CHECK-LABEL: name: cmpeq_imm_nxv16i8_ptest_not_all_active
411     ; CHECK: %2:ppr = CMPEQ_PPzZI_B %0, %1, 0, implicit-def dead $nzcv
412     ; CHECK-NEXT: %3:ppr = PTRUE_B 0
413     ; CHECK-NEXT: PTEST_PP killed %3, killed %2, implicit-def $nzcv
414     ; CHECK-NEXT: %4:gpr32 = COPY $wzr
415     ; CHECK-NEXT: %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
416     %1:zpr = COPY $z0
417     %0:ppr_3b = COPY $p0
418     %2:ppr = CMPEQ_PPzZI_B %0, %1, 0, implicit-def dead $nzcv
419     %3:ppr = PTRUE_B 0
420     PTEST_PP killed %3, killed %2, implicit-def $nzcv
421     %4:gpr32 = COPY $wzr
422     %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
423     $w0 = COPY %5
424     RET_ReallyLR implicit $w0
428 name:            cmpeq_imm_nxv16i8_ptest_of_halfs
429 alignment:       2
430 tracksRegLiveness: true
431 registers:
432   - { id: 0, class: ppr_3b }
433   - { id: 1, class: zpr }
434   - { id: 2, class: ppr }
435   - { id: 3, class: ppr }
436   - { id: 4, class: gpr32 }
437   - { id: 5, class: gpr32 }
438 liveins:
439   - { reg: '$p0', virtual-reg: '%0' }
440   - { reg: '$z0', virtual-reg: '%1' }
441 frameInfo:
442   maxCallFrameSize: 0
443 body:             |
444   bb.0:
445     liveins: $p0, $z0
447     ; CHECK-LABEL: name: cmpeq_imm_nxv16i8_ptest_of_halfs
448     ; CHECK: %2:ppr = CMPEQ_PPzZI_B %0, %1, 0, implicit-def dead $nzcv
449     ; CHECK-NEXT: %3:ppr = PTRUE_H 31
450     ; CHECK-NEXT: PTEST_PP killed %3, killed %2, implicit-def $nzcv
451     ; CHECK-NEXT: %4:gpr32 = COPY $wzr
452     ; CHECK-NEXT: %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
453     %1:zpr = COPY $z0
454     %0:ppr_3b = COPY $p0
455     %2:ppr = CMPEQ_PPzZI_B %0, %1, 0, implicit-def dead $nzcv
456     %3:ppr = PTRUE_H 31
457     PTEST_PP killed %3, killed %2, implicit-def $nzcv
458     %4:gpr32 = COPY $wzr
459     %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
460     $w0 = COPY %5
461     RET_ReallyLR implicit $w0
465 name:            cmpeq_imm_nxv16i8_ptest_with_unique_pg
466 alignment:       2
467 tracksRegLiveness: true
468 registers:
469   - { id: 0, class: ppr_3b }
470   - { id: 1, class: zpr }
471   - { id: 2, class: ppr }
472   - { id: 3, class: ppr }
473   - { id: 4, class: gpr32 }
474   - { id: 5, class: gpr32 }
475 liveins:
476   - { reg: '$p0', virtual-reg: '%0' }
477   - { reg: '$p1', virtual-reg: '%3' }
478   - { reg: '$z0', virtual-reg: '%1' }
479 frameInfo:
480   maxCallFrameSize: 0
481 body:             |
482   bb.0:
483     liveins: $p0, $p1, $z0
485     ; CHECK-LABEL: name: cmpeq_imm_nxv16i8_ptest_with_unique_pg
486     ; CHECK: %2:ppr = CMPEQ_PPzZI_B %0, %1, 0, implicit-def dead $nzcv
487     ; CHECK-NEXT: %3:ppr = COPY $p1
488     ; CHECK-NEXT: PTEST_PP killed %3, killed %2, implicit-def $nzcv
489     ; CHECK-NEXT: %4:gpr32 = COPY $wzr
490     ; CHECK-NEXT: %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
491     %1:zpr = COPY $z0
492     %0:ppr_3b = COPY $p0
493     %2:ppr = CMPEQ_PPzZI_B %0, %1, 0, implicit-def dead $nzcv
494     %3:ppr = COPY $p1
495     PTEST_PP killed %3, killed %2, implicit-def $nzcv
496     %4:gpr32 = COPY $wzr
497     %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
498     $w0 = COPY %5
499     RET_ReallyLR implicit $w0
503 name:            cmpeq_nxv16i8_ptest_with_matching_operands
504 alignment:       2
505 tracksRegLiveness: true
506 registers:
507   - { id: 0, class: ppr_3b }
508   - { id: 1, class: zpr }
509   - { id: 2, class: zpr }
510   - { id: 3, class: ppr }
511   - { id: 4, class: gpr32 }
512   - { id: 5, class: gpr32 }
513 liveins:
514   - { reg: '$p0', virtual-reg: '%0' }
515   - { reg: '$z0', virtual-reg: '%1' }
516   - { reg: '$z1', virtual-reg: '%2' }
517 frameInfo:
518   maxCallFrameSize: 0
519 body:             |
520   bb.0:
521     liveins: $p0, $z0, $z1
523     ; CHECK-LABEL: name: cmpeq_nxv16i8_ptest_with_matching_operands
524     ; CHECK-NOT: PTEST
525     %2:zpr = COPY $z1
526     %1:zpr = COPY $z0
527     %0:ppr_3b = COPY $p0
528     %3:ppr = CMPEQ_PPzZZ_B %0, %1, %2, implicit-def dead $nzcv
529     PTEST_PP %3, killed %3, implicit-def $nzcv
530     %4:gpr32 = COPY $wzr
531     %5:gpr32 = CSINCWr %4, $wzr, 0, implicit $nzcv
532     $w0 = COPY %5
533     RET_ReallyLR implicit $w0
536 ## NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
537 # CHECK: {{.*}}