xref: /llvm-project/llvm/test/CodeGen/AArch64/machine-copy-remove.mir (revision fc712eb7aa00aabcdafda54776038efdc486d570)
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
6name:            test1
7tracksRegLiveness: true
8body:             |
9  bb.0:
10    liveins: $x0, $x1
11
12    $x0 = COPY $x1
13    CBNZX $x1, %bb.2
14
15  bb.1:
16    $x0 = COPY $xzr
17    B %bb.3
18
19  bb.2:
20    liveins: $x1
21
22    $x0 = LDRXui $x1, 0
23
24  bb.3:
25    liveins: $x0
26
27    RET_ReallyLR implicit $x0
28
29...
30# Similar to test1, but with reversed COPY.
31# CHECK-LABEL: name: test2
32# CHECK-NOT: COPY $xzr
33name:            test2
34tracksRegLiveness: true
35body:             |
36  bb.0:
37    liveins: $x0, $x1
38
39    $x1 = COPY $x0
40    CBNZX $x1, %bb.2
41
42  bb.1:
43    $x0 = COPY $xzr
44    B %bb.3
45
46  bb.2:
47    liveins: $x1
48
49    $x0 = LDRXui $x1, 0
50
51  bb.3:
52    liveins: $x0
53
54    RET_ReallyLR implicit $x0
55
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
60name:            test3
61tracksRegLiveness: true
62body:             |
63  bb.0:
64    liveins: $x0, $x1, $x2
65
66    $x0 = COPY $x1
67    $x1 = LDRXui $x1, 0
68    CBNZX $x1, %bb.2
69
70  bb.1:
71    $x0 = COPY $xzr
72    B %bb.3
73
74  bb.2:
75    liveins: $x1
76
77    $x0 = LDRXui $x1, 0
78
79  bb.3:
80    liveins: $x0
81
82    RET_ReallyLR implicit $x0
83
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
88name:            test4
89tracksRegLiveness: true
90body:             |
91  bb.0:
92    liveins: $x0, $x1, $x2
93
94    $x1 = COPY $x0
95    $x1 = LDRXui $x1, 0
96    CBNZX $x1, %bb.2
97
98  bb.1:
99    $x0 = COPY $xzr
100    B %bb.3
101
102  bb.2:
103    liveins: $x1
104
105    $x0 = LDRXui $x1, 0
106
107  bb.3:
108    liveins: $x0
109
110    RET_ReallyLR implicit $x0
111
112...
113# Similar to test2, but with a clobber that prevents removal of the XZR COPY.
114# CHECK-LABEL: name: test5
115# CHECK: COPY $xzr
116name:            test5
117tracksRegLiveness: true
118body:             |
119  bb.0:
120    liveins: $x0, $x1, $x2
121
122    $x1 = COPY $x0
123    $x0 = LDRXui $x1, 0
124    CBNZX $x1, %bb.2
125
126  bb.1:
127    $x0 = COPY $xzr
128    B %bb.3
129
130  bb.2:
131    liveins: $x1
132
133    $x0 = LDRXui $x1, 0
134
135  bb.3:
136    liveins: $x0
137
138    RET_ReallyLR implicit $x0
139
140...
141# Similar to test1, but with two levels of COPYs.
142# CHECK-LABEL: name: test6
143# CHECK-NOT: COPY $xzr
144name:            test6
145tracksRegLiveness: true
146body:             |
147  bb.0:
148    liveins: $x0, $x1, $x2
149
150    $x2 = COPY $x0
151    $x1 = COPY $x2
152    CBNZX $x1, %bb.2
153
154  bb.1:
155    $x0 = COPY $xzr
156    B %bb.3
157
158  bb.2:
159    liveins: $x1
160
161    $x0 = LDRXui $x1, 0
162
163  bb.3:
164    liveins: $x0
165
166    RET_ReallyLR implicit $x0
167
168...
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
172name:            test7
173tracksRegLiveness: true
174body:             |
175  bb.0:
176    liveins: $x0, $x1, $x2
177
178    $x2 = COPY $x0
179    $x0 = LDRXui $x1, 0
180    $x1 = COPY $x2
181    CBNZX $x1, %bb.2
182
183  bb.1:
184    $x0 = COPY $xzr
185    B %bb.3
186
187  bb.2:
188    liveins: $x1
189
190    $x0 = LDRXui $x1, 0
191
192  bb.3:
193    liveins: $x0
194
195    RET_ReallyLR implicit $x0
196
197...
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
203name:            test8
204tracksRegLiveness: true
205body:             |
206  bb.0:
207    liveins: $x0, $x1, $x2
208
209    $x1 = COPY $x0
210    CBNZX $x1, %bb.2
211
212  bb.1:
213    liveins: $x0, $x2
214
215    $x0, $x1 = LDPXi $x2, 0
216    $x0 = COPY $xzr
217    $x1 = COPY $xzr
218    B %bb.3
219
220  bb.2:
221    liveins: $x1
222
223    $x0 = LDRXui $x1, 0
224
225  bb.3:
226    liveins: $x0
227
228    RET_ReallyLR implicit $x0
229
230...
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
235name:            test9
236tracksRegLiveness: true
237body:             |
238  bb.0:
239    liveins: $x0, $x1
240
241    CBNZX $x0, %bb.2
242
243  bb.1:
244    liveins: $x0
245
246    $x0 = COPY $xzr
247    B %bb.3
248
249  bb.2:
250    liveins: $x1
251
252    $x0 = LDRXui $x1, 0
253
254    CBNZX $x1, %bb.1
255
256  bb.3:
257    liveins: $x0
258
259    RET_ReallyLR implicit $x0
260
261...
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
269name:            test10
270tracksRegLiveness: true
271body:             |
272  bb.0.entry:
273    liveins: $w0, $x1
274
275    dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv
276    Bcc 1, %bb.2, implicit killed $nzcv
277    B %bb.1
278
279  bb.1:
280    liveins: $x1
281
282    $w0 = MOVi32imm 7
283    STRWui killed $w0, killed $x1, 0
284
285  bb.2:
286    RET_ReallyLR
287...
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
295name:            test11
296tracksRegLiveness: true
297body:             |
298  bb.0.entry:
299    liveins: $x0, $x1
300
301    dead $xzr = SUBSXri killed $x0, 7, 0, implicit-def $nzcv
302    Bcc 1, %bb.2, implicit killed $nzcv
303    B %bb.1
304
305  bb.1:
306    liveins: $x1
307
308    $w0 = MOVi32imm 7, implicit-def $x0
309    STRXui killed $x0, killed $x1, 0
310
311  bb.2:
312    RET_ReallyLR
313...
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
321name:            test12
322tracksRegLiveness: true
323body:             |
324  bb.0.entry:
325    liveins: $x0, $x1
326
327    dead $xzr = SUBSXri killed $x0, 7, 0, implicit-def $nzcv
328    Bcc 1, %bb.2, implicit killed $nzcv
329    B %bb.1
330
331  bb.1:
332    liveins: $x1
333
334    $w0 = MOVi32imm 7
335    STRWui killed $w0, killed $x1, 0
336
337  bb.2:
338    RET_ReallyLR
339...
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
347name:            test13
348tracksRegLiveness: true
349body:             |
350  bb.0.entry:
351    liveins: $w0, $x1
352
353    dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv
354    Bcc 1, %bb.2, implicit killed $nzcv
355    B %bb.1
356
357  bb.1:
358    liveins: $x1
359
360    $w0 = MOVi32imm 7, implicit-def $x0
361    STRXui killed $x0, killed $x1, 0
362
363  bb.2:
364    RET_ReallyLR
365...
366# We can't eliminate the MOVi32imm because of the clobbering LDRWui.
367# CHECK-LABEL: name: test14
368# CHECK: bb.1:
369# CHECK: MOVi32imm
370name:            test14
371tracksRegLiveness: true
372body:             |
373  bb.0.entry:
374    liveins: $w0, $x1, $x2
375
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
381
382  bb.1:
383    liveins: $x1
384
385    $w0 = MOVi32imm 7
386    STRWui killed $w0, killed $x1, 0
387
388  bb.2:
389    RET_ReallyLR
390...
391# We can't eliminate the MOVi32imm because of the clobbering LDRWui.
392# CHECK-LABEL: name: test15
393# CHECK: bb.1:
394# CHECK: MOVi32imm
395name:            test15
396tracksRegLiveness: true
397body:             |
398  bb.0.entry:
399    liveins: $w0, $x1, $x2
400
401    dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv
402    Bcc 1, %bb.2, implicit killed $nzcv
403    B %bb.1
404
405  bb.1:
406    liveins: $x1, $x2
407
408    $w0 = LDRWui $x1, 0
409    STRWui killed $w0, killed $x2, 0
410    $w0 = MOVi32imm 7
411    STRWui killed $w0, killed $x1, 0
412
413  bb.2:
414    RET_ReallyLR
415...
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
420name:            test16
421tracksRegLiveness: true
422body:             |
423  bb.0.entry:
424    liveins: $w0, $x1
425
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
430
431  bb.1:
432    liveins: $x1
433
434    $w2 = MOVi32imm 7
435    STRWui killed $w2, killed $x1, 0
436
437  bb.2:
438    RET_ReallyLR
439...
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
444name:            test17
445tracksRegLiveness: true
446body:             |
447  bb.0.entry:
448    liveins: $w0, $x1
449
450    dead $w0 = SUBSWri killed $w0, 7, 0, implicit-def $nzcv
451    Bcc 1, %bb.2, implicit killed $nzcv
452    B %bb.1
453
454  bb.1:
455    liveins: $x1
456
457    $w0 = MOVi32imm 7
458    STRWui killed $w0, killed $x1, 0
459
460  bb.2:
461    RET_ReallyLR
462...
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
469name:            test18
470tracksRegLiveness: true
471body:             |
472  bb.0.entry:
473    liveins: $x0, $x1
474
475    CBNZX killed $x0, %bb.2
476    B %bb.1
477
478  bb.1:
479    liveins: $x1
480
481    $x0 = MOVi64imm 4252017623040
482    STRXui killed $x0, killed $x1, 0
483
484  bb.2:
485    RET_ReallyLR
486...
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
494name:            test19
495tracksRegLiveness: true
496body:             |
497  bb.0.entry:
498    liveins: $w0, $x1
499
500    dead $wzr = ADDSWri killed $w0, 1, 0, implicit-def $nzcv
501    Bcc 1, %bb.2, implicit killed $nzcv
502    B %bb.1
503
504  bb.1:
505    liveins: $x1
506
507    $w0 = MOVi32imm -1
508    STRWui killed $w0, killed $x1, 0
509
510  bb.2:
511    RET_ReallyLR
512...
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
520name:            test20
521tracksRegLiveness: true
522body:             |
523  bb.0:
524    liveins: $x0, $x1
525
526    dead $xzr = ADDSXri killed $x0, 1, 0, implicit-def $nzcv
527    Bcc 1, %bb.2, implicit killed $nzcv
528    B %bb.1
529
530  bb.1:
531    liveins: $x1
532
533    $x0 = MOVi64imm -1
534    STRXui killed $x0, killed $x1, 0
535
536  bb.2:
537    RET_ReallyLR
538...
539# Don't eliminate redundant MOVi32imm -1 in bb.1: the upper bits are nonzero.
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 killed $x0, 1, 0, implicit-def $nzcv
544# CHECK: bb.1:
545# CHECK: MOVi32imm
546name:            test21
547tracksRegLiveness: true
548body:             |
549  bb.0.entry:
550    liveins: $x0, $x1
551
552    dead $xzr = ADDSXri killed $x0, 1, 0, implicit-def $nzcv
553    Bcc 1, %bb.2, implicit killed $nzcv
554    B %bb.1
555
556  bb.1:
557    liveins: $x1
558
559    $w0 = MOVi32imm -1
560    STRWui killed $w0, killed $x1, 0
561
562  bb.2:
563    RET_ReallyLR
564...
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
570name:            test22
571tracksRegLiveness: true
572body:             |
573  bb.0.entry:
574    liveins: $w0, $x1
575
576    dead $wzr = ADDSWri killed $w0, 1, 0, implicit-def $nzcv
577    Bcc 1, %bb.2, implicit killed $nzcv
578    B %bb.1
579
580  bb.1:
581    liveins: $x1
582
583    $x0 = MOVi64imm -1
584    STRXui killed $x0, killed $x1, 0
585
586  bb.2:
587    RET_ReallyLR
588...
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
593name:            test23
594tracksRegLiveness: true
595body:             |
596  bb.0.entry:
597    liveins: $w0, $x1
598
599    dead $wzr = SUBSWri killed $w0, 1, 12, implicit-def $nzcv
600    Bcc 1, %bb.2, implicit killed $nzcv
601    B %bb.1
602
603  bb.1:
604    liveins: $x1
605
606    $w0 = MOVi32imm 4096
607    STRWui killed $w0, killed $x1, 0
608
609  bb.2:
610    RET_ReallyLR
611