1
2# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass machine-cp  -verify-machineinstrs  -o - %s | FileCheck %s
3
4--- |
5  define i32 @copyprop1(i32 %a, i32 %b) { ret i32 %a }
6  define i32 @copyprop2(i32 %a, i32 %b) { ret i32 %a }
7  define i32 @copyprop3(i32 %a, i32 %b) { ret i32 %a }
8  define i32 @copyprop4(i32 %a, i32 %b) { ret i32 %a }
9  define i32 @copyprop5(i32 %a, i32 %b) { ret i32 %a }
10  define i32 @copyprop6(i32 %a, i32 %b) { ret i32 %a }
11  declare i32 @foo(i32)
12...
13---
14# The first copy is dead copy which is not used.
15# CHECK-LABEL: name: copyprop1
16# CHECK: bb.0:
17# CHECK-NOT: $w20 = COPY
18name: copyprop1
19body: |
20  bb.0:
21    liveins: $w0,  $w1
22    $w20 = COPY $w1
23    BL @foo, csr_aarch64_aapcs, implicit $w0, implicit-def $w0
24    RET_ReallyLR implicit $w0
25...
26---
27# The first copy is not a dead copy which is used in the second copy after the
28# call.
29# CHECK-LABEL: name: copyprop2
30# CHECK: bb.0:
31# CHECK: $w20 = COPY
32name: copyprop2
33body: |
34  bb.0:
35    liveins: $w0,  $w1
36    $w20 = COPY $w1
37    BL @foo, csr_aarch64_aapcs, implicit $w0, implicit-def $w0
38    $w0 = COPY $w20
39    RET_ReallyLR implicit $w0
40...
41---
42# Both the first and second copy are dead copies which are not used.
43# CHECK-LABEL: name: copyprop3
44# CHECK: bb.0:
45# CHECK-NOT: COPY
46name: copyprop3
47body: |
48  bb.0:
49    liveins: $w0,  $w1
50    $w20 = COPY $w1
51    BL @foo, csr_aarch64_aapcs, implicit $w0, implicit-def $w0
52    $w20 = COPY $w0
53    RET_ReallyLR implicit $w0
54...
55# The second copy is removed as a NOP copy, after then the first copy become
56# dead which should be removed as well.
57# CHECK-LABEL: name: copyprop4
58# CHECK: bb.0:
59# CHECK-NOT: COPY
60name: copyprop4
61body: |
62  bb.0:
63    liveins: $w0,  $w1
64    $w20 = COPY $w0
65    $w0 = COPY $w20
66    BL @foo, csr_aarch64_aapcs, implicit $w0, implicit-def $w0
67    RET_ReallyLR implicit $w0
68...
69
70# Don't try to erase any COPY which overlaps itself.
71# CHECK-LABEL: name: copyprop5
72# CHECK: bb.0:
73# CHECK: COPY killed $q26_q27_q28_q29
74# CHECK: COPY killed $q28_q29_q30_q31
75name: copyprop5
76body: |
77  bb.0:
78    liveins: $q26_q27_q28_q29
79    $q28_q29_q30_q31 = COPY killed $q26_q27_q28_q29
80    $q26_q27_q28_q29 = COPY killed $q28_q29_q30_q31
81    BL @foo, csr_aarch64_aapcs, implicit killed $q26_q27_q28_q29
82    RET_ReallyLR
83...
84
85# Don't try to analyze any COPY which overlaps itself.
86# CHECK-LABEL: name: copyprop6
87# CHECK: bb.0:
88# CHECK: COPY killed $q26_q27_q28_q29
89# CHECK: $q30 = COPY $q28
90name: copyprop6
91body: |
92  bb.0:
93    liveins: $q26_q27_q28_q29
94    $q28_q29_q30_q31 = COPY killed $q26_q27_q28_q29
95    $q30 = COPY $q28
96    BL @foo, csr_aarch64_aapcs, implicit killed $q28_q29_q30_q31
97    RET_ReallyLR
98...
99
100