[ARM] More MVE compare vector splat combines for ANDs
[llvm-complete.git] / test / CodeGen / AArch64 / machine-copy-remove.mir
blob843481d67922d7264770137e5f484f1ba9486532
1 # RUN: llc -mtriple=aarch64--linux-gnu -run-pass=aarch64-copyelim %s -verify-machineinstrs -o - | FileCheck %s
2 ---
3 # Check that bb.0 COPY is seen through to allow the bb.1 COPY of XZR to be removed.
4 # CHECK-LABEL: name: test1
5 # CHECK-NOT: COPY $xzr
6 name:            test1
7 tracksRegLiveness: true
8 body:             |
9   bb.0:
10     liveins: $x0, $x1
12     $x0 = COPY $x1
13     CBNZX $x1, %bb.2
15   bb.1:
16     $x0 = COPY $xzr
17     B %bb.3
19   bb.2:
20     liveins: $x1
22     $x0 = LDRXui $x1, 0
24   bb.3:
25     liveins: $x0
27     RET_ReallyLR implicit $x0
29 ...
30 # Similar to test1, but with reversed COPY.
31 # CHECK-LABEL: name: test2
32 # CHECK-NOT: COPY $xzr
33 name:            test2
34 tracksRegLiveness: true
35 body:             |
36   bb.0:
37     liveins: $x0, $x1
39     $x1 = COPY $x0
40     CBNZX $x1, %bb.2
42   bb.1:
43     $x0 = COPY $xzr
44     B %bb.3
46   bb.2:
47     liveins: $x1
49     $x0 = LDRXui $x1, 0
51   bb.3:
52     liveins: $x0
54     RET_ReallyLR implicit $x0
56 ...
57 # Similar to test1, but with a clobber that prevents removal of the XZR COPY.
58 # CHECK-LABEL: name: test3
59 # CHECK: COPY $xzr
60 name:            test3
61 tracksRegLiveness: true
62 body:             |
63   bb.0:
64     liveins: $x0, $x1, $x2
66     $x0 = COPY $x1
67     $x1 = LDRXui $x1, 0
68     CBNZX $x1, %bb.2
70   bb.1:
71     $x0 = COPY $xzr
72     B %bb.3
74   bb.2:
75     liveins: $x1
77     $x0 = LDRXui $x1, 0
79   bb.3:
80     liveins: $x0
82     RET_ReallyLR implicit $x0
84 ...
85 # Similar to test2, but with a clobber that prevents removal of the XZR COPY.
86 # CHECK-LABEL: name: test4
87 # CHECK: COPY $xzr
88 name:            test4
89 tracksRegLiveness: true
90 body:             |
91   bb.0:
92     liveins: $x0, $x1, $x2
94     $x1 = COPY $x0
95     $x1 = LDRXui $x1, 0
96     CBNZX $x1, %bb.2
98   bb.1:
99     $x0 = COPY $xzr
100     B %bb.3
102   bb.2:
103     liveins: $x1
105     $x0 = LDRXui $x1, 0
107   bb.3:
108     liveins: $x0
110     RET_ReallyLR implicit $x0
113 # Similar to test2, but with a clobber that prevents removal of the XZR COPY.
114 # CHECK-LABEL: name: test5
115 # CHECK: COPY $xzr
116 name:            test5
117 tracksRegLiveness: true
118 body:             |
119   bb.0:
120     liveins: $x0, $x1, $x2
122     $x1 = COPY $x0
123     $x0 = LDRXui $x1, 0
124     CBNZX $x1, %bb.2
126   bb.1:
127     $x0 = COPY $xzr
128     B %bb.3
130   bb.2:
131     liveins: $x1
133     $x0 = LDRXui $x1, 0
135   bb.3:
136     liveins: $x0
138     RET_ReallyLR implicit $x0
141 # Similar to test1, but with two levels of COPYs.
142 # CHECK-LABEL: name: test6
143 # CHECK-NOT: COPY $xzr
144 name:            test6
145 tracksRegLiveness: true
146 body:             |
147   bb.0:
148     liveins: $x0, $x1, $x2
150     $x2 = COPY $x0
151     $x1 = COPY $x2
152     CBNZX $x1, %bb.2
154   bb.1:
155     $x0 = COPY $xzr
156     B %bb.3
158   bb.2:
159     liveins: $x1
161     $x0 = LDRXui $x1, 0
163   bb.3:
164     liveins: $x0
166     RET_ReallyLR implicit $x0
169 # Similar to test1, but with two levels of COPYs and a clobber preventing COPY of XZR removal.
170 # CHECK-LABEL: name: test7
171 # CHECK: COPY $xzr
172 name:            test7
173 tracksRegLiveness: true
174 body:             |
175   bb.0:
176     liveins: $x0, $x1, $x2
178     $x2 = COPY $x0
179     $x0 = LDRXui $x1, 0
180     $x1 = COPY $x2
181     CBNZX $x1, %bb.2
183   bb.1:
184     $x0 = COPY $xzr
185     B %bb.3
187   bb.2:
188     liveins: $x1
190     $x0 = LDRXui $x1, 0
192   bb.3:
193     liveins: $x0
195     RET_ReallyLR implicit $x0
198 # Check that the TargetRegs vector clobber update loop in
199 #  AArch64RedundantCopyElimination::optimizeCopy works correctly.
200 # CHECK-LABEL: name: test8
201 # CHECK: x0 = COPY $xzr
202 # CHECK: x1 = COPY $xzr
203 name:            test8
204 tracksRegLiveness: true
205 body:             |
206   bb.0:
207     liveins: $x0, $x1
209     $x1 = COPY $x0
210     CBNZX $x1, %bb.2
212   bb.1:
213     liveins: $x0, $x2
215     $x0, $x1 = LDPXi $x2, 0
216     $x0 = COPY $xzr
217     $x1 = COPY $xzr
218     B %bb.3
220   bb.2:
221     liveins: $x1
223     $x0 = LDRXui $x1, 0
225   bb.3:
226     liveins: $x0
228     RET_ReallyLR implicit $x0
231 # Check that copy isn't removed from a block with multiple predecessors.
232 # CHECK-LABEL: name: test9
233 # CHECK: x0 = COPY $xzr
234 # CHECK-NEXT: B %bb.3
235 name:            test9
236 tracksRegLiveness: true
237 body:             |
238   bb.0:
239     liveins: $x0, $x1
241     CBNZX $x0, %bb.2
243   bb.1:
244     liveins: $x0, $x2
246     $x0 = COPY $xzr
247     B %bb.3
249   bb.2:
250     liveins: $x1
252     $x0 = LDRXui $x1, 0
254     CBNZX $x1, %bb.1
256   bb.3:
257     liveins: $x0
259     RET_ReallyLR implicit $x0
262 # Eliminate redundant MOVi32imm 7 in bb.1
263 # Note: 32-bit compare/32-bit move imm
264 # Kill marker should be removed from compare.
265 # CHECK-LABEL: name: test10
266 # CHECK: SUBSWri $w0, 7, 0, implicit-def $nzcv
267 # CHECK: bb.1:
268 # CHECK-NOT: MOVi32imm
269 name:            test10
270 tracksRegLiveness: true
271 body:             |
272   bb.0.entry:
273     liveins: $w0, $x1
275     dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv
276     Bcc 1, %bb.2, implicit killed $nzcv
277     B %bb.1
279   bb.1:
280     liveins: $x1
282     $w0 = MOVi32imm 7
283     STRWui killed $w0, killed $x1, 0
285   bb.2:
286     RET_ReallyLR
288 # Eliminate redundant MOVi32imm 7 in bb.1
289 # Note: 64-bit compare/32-bit move imm w/implicit def
290 # Kill marker should be removed from compare.
291 # CHECK-LABEL: name: test11
292 # CHECK: SUBSXri $x0, 7, 0, implicit-def $nzcv
293 # CHECK: bb.1:
294 # CHECK-NOT: MOVi32imm
295 name:            test11
296 tracksRegLiveness: true
297 body:             |
298   bb.0.entry:
299     liveins: $x0, $x1
301     dead $xzr = SUBSXri killed $x0, 7, 0, implicit-def $nzcv
302     Bcc 1, %bb.2, implicit killed $nzcv
303     B %bb.1
305   bb.1:
306     liveins: $x1
308     $w0 = MOVi32imm 7, implicit-def $x0
309     STRXui killed $x0, killed $x1, 0
311   bb.2:
312     RET_ReallyLR
314 # Eliminate redundant MOVi32imm 7 in bb.1
315 # Note: 64-bit compare/32-bit move imm
316 # Kill marker should be removed from compare.
317 # CHECK-LABEL: name: test12
318 # CHECK: SUBSXri $x0, 7, 0, implicit-def $nzcv
319 # CHECK: bb.1:
320 # CHECK-NOT: MOVi32imm
321 name:            test12
322 tracksRegLiveness: true
323 body:             |
324   bb.0.entry:
325     liveins: $x0, $x1
327     dead $xzr = SUBSXri killed $x0, 7, 0, implicit-def $nzcv
328     Bcc 1, %bb.2, implicit killed $nzcv
329     B %bb.1
331   bb.1:
332     liveins: $x1
334     $w0 = MOVi32imm 7
335     STRWui killed $w0, killed $x1, 0
337   bb.2:
338     RET_ReallyLR
340 # Don't eliminate MOVi32imm 7 in bb.1 as we don't necessarily know the upper 32-bits.
341 # Note: 32-bit compare/32-bit move imm w/implicit def
342 # Kill marker should remain on compare.
343 # CHECK-LABEL: name: test13
344 # CHECK: SUBSWri killed $w0, 7, 0, implicit-def $nzcv
345 # CHECK: bb.1:
346 # CHECK: MOVi32imm
347 name:            test13
348 tracksRegLiveness: true
349 body:             |
350   bb.0.entry:
351     liveins: $w0, $x1
353     dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv
354     Bcc 1, %bb.2, implicit killed $nzcv
355     B %bb.1
357   bb.1:
358     liveins: $x1
360     $w0 = MOVi32imm 7, implicit-def $x0
361     STRXui killed $x0, killed $x1, 0
363   bb.2:
364     RET_ReallyLR
366 # We can't eliminate the MOVi32imm because of the clobbering LDRWui.
367 # CHECK-LABEL: name: test14
368 # CHECK: bb.1:
369 # CHECK: MOVi32imm
370 name:            test14
371 tracksRegLiveness: true
372 body:             |
373   bb.0.entry:
374     liveins: $w0, $x1, $x2
376     dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv
377     $w0 = LDRWui $x1, 0
378     STRWui killed $w0, killed $x2, 0
379     Bcc 1, %bb.2, implicit killed $nzcv
380     B %bb.1
382   bb.1:
383     liveins: $x1
385     $w0 = MOVi32imm 7
386     STRWui killed $w0, killed $x1, 0
388   bb.2:
389     RET_ReallyLR
391 # We can't eliminate the MOVi32imm because of the clobbering LDRWui.
392 # CHECK-LABEL: name: test15
393 # CHECK: bb.1:
394 # CHECK: MOVi32imm
395 name:            test15
396 tracksRegLiveness: true
397 body:             |
398   bb.0.entry:
399     liveins: $w0, $x1, $x2
401     dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv
402     Bcc 1, %bb.2, implicit killed $nzcv
403     B %bb.1
405   bb.1:
406     liveins: $x1, $x2
408     $w0 = LDRWui $x1, 0
409     STRWui killed $w0, killed $x2, 0
410     $w0 = MOVi32imm 7
411     STRWui killed $w0, killed $x1, 0
413   bb.2:
414     RET_ReallyLR
416 # Check that bb.0 COPY is seen through to allow the bb.1 MOVi32imm to be removed.
417 # CHECK-LABEL: name: test16
418 # CHECK: bb.1:
419 # CHECK-NOT: MOVi32imm
420 name:            test16
421 tracksRegLiveness: true
422 body:             |
423   bb.0.entry:
424     liveins: $w0, $x1
426     dead $wzr = SUBSWri $w0, 7, 0, implicit-def $nzcv
427     $w2 = COPY $w0
428     Bcc 1, %bb.2, implicit killed $nzcv
429     B %bb.1
431   bb.1:
432     liveins: $x1
434     $w2 = MOVi32imm 7
435     STRWui killed $w2, killed $x1, 0
437   bb.2:
438     RET_ReallyLR
440 # Check that bb.1 MOVi32imm is not removed due to self clobbering compare.
441 # CHECK-LABEL: name: test17
442 # CHECK: bb.1:
443 # CHECK: MOVi32imm
444 name:            test17
445 tracksRegLiveness: true
446 body:             |
447   bb.0.entry:
448     liveins: $w0, $x1
450     dead $w0 = SUBSWri killed $w0, 7, 0, implicit-def $nzcv
451     Bcc 1, %bb.2, implicit killed $nzcv
452     B %bb.1
454   bb.1:
455     liveins: $x1
457     $w0 = MOVi32imm 7
458     STRWui killed $w0, killed $x1, 0
460   bb.2:
461     RET_ReallyLR
463 # Make sure the MOVi64imm is not removed.  In one version of this patch the
464 # MOVi64imm immediate was truncated to 32 bits and incorrectly matched because
465 # the low 32 bits of 4252017623040 are all zero.
466 # CHECK-LABEL: name: test18
467 # CHECK: bb.1:
468 # CHECK: MOVi64imm
469 name:            test18
470 tracksRegLiveness: true
471 body:             |
472   bb.0.entry:
473     liveins: $x0, $x1
475     CBNZX killed $x0, %bb.2
476     B %bb.1
478   bb.1:
479     liveins: $x1
481     $x0 = MOVi64imm 4252017623040
482     STRXui killed $x0, killed $x1, 0
484   bb.2:
485     RET_ReallyLR
487 # Eliminate redundant MOVi32imm -1 in bb.1
488 # Note: 32-bit compare/32-bit move imm
489 # Kill marker should be removed from compare.
490 # CHECK-LABEL: name: test19
491 # CHECK: ADDSWri $w0, 1, 0, implicit-def $nzcv
492 # CHECK: bb.1:
493 # CHECK-NOT: MOVi32imm
494 name:            test19
495 tracksRegLiveness: true
496 body:             |
497   bb.0.entry:
498     liveins: $w0, $x1
500     dead $wzr = ADDSWri killed $w0, 1, 0, implicit-def $nzcv
501     Bcc 1, %bb.2, implicit killed $nzcv
502     B %bb.1
504   bb.1:
505     liveins: $x1
507     $w0 = MOVi32imm -1
508     STRWui killed $w0, killed $x1, 0
510   bb.2:
511     RET_ReallyLR
513 # Eliminate redundant MOVi64imm -1 in bb.1
514 # Note: 64-bit compare/64-bit move imm
515 # Kill marker should be removed from compare.
516 # CHECK-LABEL: name: test20
517 # CHECK: ADDSXri $x0, 1, 0, implicit-def $nzcv
518 # CHECK: bb.1:
519 # CHECK-NOT: MOVi64imm
520 name:            test20
521 tracksRegLiveness: true
522 body:             |
523   bb.0:
524     liveins: $x0, $x1
526     dead $xzr = ADDSXri killed $x0, 1, 0, implicit-def $nzcv
527     Bcc 1, %bb.2, implicit killed $nzcv
528     B %bb.1
530   bb.1:
531     liveins: $x1
533     $x0 = MOVi64imm -1
534     STRXui killed $x0, killed $x1, 0
536   bb.2:
537     RET_ReallyLR
539 # Eliminate redundant MOVi32imm -1 in bb.1
540 # Note: 64-bit compare/32-bit move imm
541 # Kill marker should be removed from compare.
542 # CHECK-LABEL: name: test21
543 # CHECK: ADDSXri $x0, 1, 0, implicit-def $nzcv
544 # CHECK: bb.1:
545 # CHECK-NOT: MOVi32imm
546 name:            test21
547 tracksRegLiveness: true
548 body:             |
549   bb.0.entry:
550     liveins: $x0, $x1
552     dead $xzr = ADDSXri killed $x0, 1, 0, implicit-def $nzcv
553     Bcc 1, %bb.2, implicit killed $nzcv
554     B %bb.1
556   bb.1:
557     liveins: $x1
559     $w0 = MOVi32imm -1
560     STRWui killed $w0, killed $x1, 0
562   bb.2:
563     RET_ReallyLR
565 # Don't eliminate MOVi64imm -1 in bb.1 as we don't necessarily know the upper 32-bits.
566 # Note: 32-bit compare/64-bit move imm
567 # CHECK-LABEL: name: test22
568 # CHECK: bb.1:
569 # CHECK: MOVi64imm
570 name:            test22
571 tracksRegLiveness: true
572 body:             |
573   bb.0.entry:
574     liveins: $w0, $x1
576     dead $wzr = ADDSWri killed $w0, 1, 0, implicit-def $nzcv
577     Bcc 1, %bb.2, implicit killed $nzcv
578     B %bb.1
580   bb.1:
581     liveins: $x1
583     $x0 = MOVi64imm -1
584     STRXui killed $x0, killed $x1, 0
586   bb.2:
587     RET_ReallyLR
589 # Eliminate redundant MOVi32imm 4096 in bb.1 when the compare has a shifted immediate.
590 # CHECK-LABEL: name: test23
591 # CHECK: bb.1:
592 # CHECK-NOT: MOVi32imm
593 name:            test23
594 tracksRegLiveness: true
595 body:             |
596   bb.0.entry:
597     liveins: $w0, $x1
599     dead $wzr = SUBSWri killed $w0, 1, 12, implicit-def $nzcv
600     Bcc 1, %bb.2, implicit killed $nzcv
601     B %bb.1
603   bb.1:
604     liveins: $x1
606     $w0 = MOVi32imm 4096
607     STRWui killed $w0, killed $x1, 0
609   bb.2:
610     RET_ReallyLR