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