[NFC][RemoveDIs] Prefer iterators over inst-pointers in InstCombine
[llvm-project.git] / llvm / test / CodeGen / AArch64 / regcoal-physreg.mir
blobd5e4742c3ffafc32ec0d7ea924813f4819701a23
1 # RUN: llc -mtriple=aarch64-apple-ios -run-pass=register-coalescer -verify-machineinstrs %s -o - | FileCheck %s
2 --- |
3   declare void @f2()
5   define void @func0() { ret void }
6   define void @func1() { ret void }
7   define void @func2() { ret void }
8 ...
9 ---
10 # Check coalescing of COPYs from reserved physregs.
11 # CHECK-LABEL: name: func0
12 name: func0
13 body: |
14   bb.0:
15     ; We usually should not coalesce copies from allocatable physregs.
16     ; CHECK: %0:gpr32 = COPY $w7
17     ; CHECK: STRWui %0, $x1, 0
18     %0 : gpr32 = COPY $w7
19     STRWui %0, $x1, 0
21     ; It is fine to coalesce copies from reserved physregs
22     ; CHECK-NOT: COPY
23     ; CHECK: STRXui $fp, $x1, 0
24     %1 : gpr64 = COPY $fp
25     STRXui %1, $x1, 0
27     ; It is not fine to coalesce copies from reserved physregs when they are
28     ; clobbered.
29     ; CHECK: %2:gpr64 = COPY $fp
30     ; CHECK: STRXui %2, $x1, 0
31     %2 : gpr64 = COPY $fp
32     $fp = SUBXri $fp, 4, 0
33     STRXui %2, $x1, 0
35     ; Is is fine to coalesce copies from constant physregs even when they are
36     ; clobbered.
37     ; CHECK-NOT: COPY
38     ; CHECK: STRWui $wzr, $x1
39     %3 : gpr32 = COPY $wzr
40     dead $wzr = SUBSWri $w1, 0, 0, implicit-def $nzcv
41     STRWui %3, $x1, 0
43     ; Is is fine to coalesce copies from constant physregs even when they are
44     ; clobbered.
45     ; CHECK-NOT: COPY
46     ; CHECK: STRXui $xzr, $x1
47     %4 : gpr64 = COPY $xzr
48     dead $wzr = SUBSWri $w1, 0, 0, implicit-def $nzcv
49     STRXui %4, $x1, 0
51     ; Coalescing COPYs into constant physregs.
52     ; CHECK: $wzr = SUBSWri $w1, 0, 0
53     %5 : gpr32 = SUBSWri $w1, 0, 0, implicit-def $nzcv
54     $wzr = COPY %5
56     ; Only coalesce when the source register is reserved as a whole (this is
57     ; a limitation of the current code which cannot update liveness information
58     ; of the non-reserved part).
59     ; CHECK: %6:xseqpairsclass = COPY $x28_fp
60     ; CHECK: HINT 0, implicit %6
61     %6 : xseqpairsclass = COPY $x28_fp
62     HINT 0, implicit %6
64     ; It is not fine to coalesce copies from reserved physregs when they are
65     ; clobbered by the regmask on a call.
66     ; CHECK: %7:gpr64 = COPY $x18
67     ; CHECK: BL @f2, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
68     ; CHECK: STRXui %7, $x1, 0
70     ; Need a def of x18 so that it's not deduced as "constant".
71     $x18 = COPY $xzr
72     %7 : gpr64 = COPY $x18
73     BL @f2, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit-def $sp
74     STRXui %7, $x1, 0
76     ; This can be coalesced.
77     ; CHECK: $fp = SUBXri $fp, 4, 0
78     %8 : gpr64sp = SUBXri $fp, 4, 0
79     $fp = COPY %8
81     ; Cannot coalesce when there are reads of the physreg.
82     ; CHECK-NOT: $fp = SUBXri $fp, 8, 0
83     ; CHECK: %9:gpr64sp = SUBXri $fp, 8, 0
84     ; CHECK: STRXui $fp, $fp, 0
85     ; CHECK: $fp = COPY %9
86     %9 : gpr64sp = SUBXri $fp, 8, 0
87     STRXui $fp, $fp, 0
88     $fp = COPY %9
89 ...
90 ---
91 # Check coalescing of COPYs from reserved physregs.
92 # CHECK-LABEL: name: func1
93 name: func1
94 body: |
95   bb.0:
96     ; Cannot coalesce physreg because we have reads on other CFG paths (we
97     ; currently abort for any control flow)
98     ; CHECK-NOT: $fp = SUBXri
99     ; CHECK: %0:gpr64sp = SUBXri $fp, 12, 0
100     ; CHECK: CBZX undef $x0, %bb.1
101     ; CHECK: B %bb.2
102     %0 : gpr64sp = SUBXri $fp, 12, 0
103     CBZX undef $x0, %bb.1
104     B %bb.2
106   bb.1:
107     $fp = COPY %0
108     RET_ReallyLR
110   bb.2:
111     STRXui $fp, $fp, 0
112     RET_ReallyLR
115 # CHECK-LABEL: name: func2
116 name: func2
117 body: |
118   bb.0:
119     ; We can coalesce copies from physreg to vreg across multiple blocks.
120     ; CHECK-NOT: COPY
121     ; CHECK: CBZX undef $x0, %bb.1
122     ; CHECK-NEXT: B %bb.2
123     %0 : gpr64sp = COPY $fp
124     CBZX undef $x0, %bb.1
125     B %bb.2
127   bb.1:
128     ; CHECK: STRXui undef $x0, $fp, 0
129     ; CHECK-NEXT: RET_ReallyLR
130     STRXui undef $x0, %0, 0
131     RET_ReallyLR
133   bb.2:
134     RET_ReallyLR