1# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass=postra-machine-sink -verify-machineinstrs  -o - %s | FileCheck %s
2
3---
4# Sink w19 to %bb.1.
5# CHECK-LABEL: name: sinkcopy1
6# CHECK-LABEL: bb.0:
7# CHECK-NOT: $w19 = COPY killed $w0
8# CHECK-LABEL: bb.1:
9# CHECK: liveins: $w0, $w1
10# CHECK: renamable $w19 = COPY killed $w0
11
12name: sinkcopy1
13tracksRegLiveness: true
14body: |
15  bb.0:
16    liveins: $w0, $w1
17    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
18    renamable  $w19 = COPY killed $w0
19    Bcc 11, %bb.1, implicit $nzcv
20    B %bb.2
21
22  bb.1:
23    liveins: $w1, $w19
24    $w0 = ADDWrr $w1, $w19
25    RET $x0
26
27  bb.2:
28    $w0 = COPY $wzr
29    RET   $x0
30...
31
32---
33# Sink w19 to %bb.2.
34# CHECK-LABEL: name: sinkcopy2
35# CHECK-LABEL: bb.0:
36# CHECK-NOT: renamable $w19 = COPY killed $w0
37# CHECK-LABEL: bb.2:
38# CHECK: liveins: $w0, $w1
39# CHECK: renamable $w19 = COPY killed $w0
40name: sinkcopy2
41tracksRegLiveness: true
42body: |
43  bb.0:
44    liveins: $w0, $w1
45    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
46    renamable $w19 = COPY killed $w0
47    Bcc 11, %bb.2, implicit $nzcv
48    B %bb.1
49
50  bb.1:
51    $w0 = COPY $wzr
52    RET $x0
53
54  bb.2:
55    liveins: $w1, $w19
56    $w0 = ADDWrr $w1, $w19
57    RET $x0
58...
59
60---
61# Sink w19 and w20 to %bb.1.
62# CHECK-LABEL: name: sinkcopy3
63# CHECK-LABEL: bb.0:
64# CHECK-NOT: renamable $w19 = COPY killed $w0
65# CHECK-LABEL: bb.1:
66# CHECK: liveins: $w0, $w1
67# CHECK: renamable $w19 = COPY killed $w0
68# CHECK: renamable $w20 = COPY killed $w1
69name: sinkcopy3
70tracksRegLiveness: true
71body: |
72  bb.0:
73    liveins: $w0, $w1
74    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
75    renamable $w19 = COPY killed $w0
76    renamable $w20 = COPY killed $w1
77
78  bb.1:
79    liveins: $w19, $w20
80    $w0 = COPY $w19
81    $w1 = COPY $w20
82    RET $x0
83...
84
85
86# Sink w19 to %bb.1 and w20 to %bb.2.
87# CHECK-LABEL: name: sinkcopy4
88# CHECK-LABEL: bb.0:
89# CHECK-NOT: renamable $w19 = COPY $w0
90# CHECK-NOT: renamable $w20 = COPY $w1
91# CHECK-LABEL: bb.1:
92# CHECK: liveins: $w0, $w1
93# CHECK: renamable $w19 = COPY $w0
94# CHECK-LABEL: bb.2:
95# CHECK: liveins: $w0, $w1
96# CHECK: renamable $w20 = COPY $w1
97name: sinkcopy4
98tracksRegLiveness: true
99body: |
100  bb.0:
101    liveins: $w0, $w1
102    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
103    renamable $w19 = COPY $w0
104    renamable $w20 = COPY $w1
105    Bcc 11, %bb.2, implicit $nzcv
106    B %bb.1
107
108  bb.1:
109    liveins: $w1, $w19
110    $w0 = ADDWrr $w1, $w19
111    RET $x0
112
113  bb.2:
114    liveins: $w0, $w20
115    $w0 = ADDWrr $w0, $w20
116    RET $x0
117...
118
119# Sink w19 to %bb.3 through %bb.2.
120# CHECK-LABEL: name: sinkcopy5
121# CHECK-LABEL: bb.0:
122# CHECK-NOT: renamable $w19 = COPY $w0
123# CHECK-LABEL: bb.2:
124# CHECK: $w1 = ADDWrr $w1, $w0
125# CHECK-LABEL: bb.3:
126# CHECK: liveins: $w0, $w1
127# CHECK: renamable $w19 = COPY killed $w0
128name: sinkcopy5
129tracksRegLiveness: true
130body: |
131  bb.0:
132    liveins: $w0, $w1
133    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
134    renamable $w19 = COPY $w0
135    Bcc 11, %bb.2, implicit $nzcv
136
137  bb.1:
138    liveins: $x0
139    $w19 = COPY $wzr
140    RET $x0
141
142  bb.2:
143    liveins: $w0, $w1, $w19
144    $w1 = ADDWrr $w1, killed $w0
145
146  bb.3:
147    liveins: $w1, $w19
148    $w0 = ADDWrr $w1, $w19
149    RET $x0
150...
151
152# Sink w19 to %bb.3, but  through %bb.2.
153# CHECK-LABEL: name: sinkcopy6
154# CHECK-LABEL: bb.0:
155# CHECK-NOT: renamable $w19 = COPY $w0
156# CHECK-NOT: renamable $w20 = COPY $w0
157# CHECK-LABEL: bb.2:
158# CHECK: liveins: $w0, $w1
159# CHECK: renamable $w19 = COPY $w0
160# CHECK: renamable $w20 = COPY $w19
161name: sinkcopy6
162tracksRegLiveness: true
163body: |
164  bb.0:
165    liveins: $w0, $w1
166    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
167    renamable $w19 = COPY $w0
168    renamable $w20 = COPY $w19
169    Bcc 11, %bb.2, implicit $nzcv
170
171  bb.1:
172    $w0 = COPY $wzr
173    RET $x0
174
175  bb.2:
176    liveins: $w1, $w20
177    $w0 = ADDWrr killed $w1, $w20
178    RET $x0
179...
180
181---
182# Sink w19 regardless of the def of wzr in bb.0.
183# CHECK-LABEL: name: sinkcopy7
184# CHECK-LABEL: bb.0:
185# CHECK-NOT: renamable $w19 = COPY $w0
186# CHECK-LABEL: bb.2:
187# CHECK: renamable $w19 = COPY $wzr
188name: sinkcopy7
189tracksRegLiveness: true
190body: |
191  bb.0:
192    liveins: $w0, $w1
193    renamable $w19 = COPY $wzr
194    $wzr = SUBSWri $w1, 1, 0, implicit-def $nzcv
195    Bcc 11, %bb.2, implicit $nzcv
196    B %bb.1
197
198  bb.1:
199    $x0 = COPY $xzr
200    RET $x0
201
202  bb.2:
203    liveins: $w0, $w19
204    $w0 = ADDWrr $w0, $w19
205    RET $x0
206...
207
208---
209# Sink w19 to %bb.3 through %bb.2.
210# CHECK-LABEL: name: sinkcopy8
211# CHECK-LABEL: bb.0:
212# CHECK-NOT: renamable $w19 = COPY $w0, implicit-def $x19
213# CHECK-LABEL: bb.2:
214# CHECK: $w1 = ADDWrr $w1, $w0, implicit $x0
215# CHECK-LABEL: bb.3:
216# CHECK: liveins: $w0, $x1
217# CHECK: renamable $w19 = COPY killed $w0, implicit-def $x19
218name: sinkcopy8
219tracksRegLiveness: true
220body: |
221  bb.0:
222    liveins: $w0, $x1
223    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
224    renamable $w19 = COPY $w0, implicit-def $x19
225    Bcc 11, %bb.2, implicit $nzcv
226
227  bb.1:
228    liveins: $x0
229    $w19 = COPY $wzr
230    RET $x0
231
232  bb.2:
233    liveins: $w0, $x1, $x19
234    $w1 = ADDWrr $w1, $w0, implicit killed $x0
235
236  bb.3:
237    liveins: $x1, $x19
238    $x0 = ADDXrr $x1, $x19
239    RET $x0
240...
241
242---
243# Don't sink w19 as w0 is defined in bb.0.
244# CHECK-LABEL: name: donotsinkcopy1
245# CHECK-LABEL: bb.0:
246# CHECK: renamable $w19 = COPY $w0
247# CHECK: $w0 = LDRWui $sp, 0
248name: donotsinkcopy1
249tracksRegLiveness: true
250body: |
251  bb.0:
252    liveins: $w0, $w1
253    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
254    renamable $w19 = COPY $w0
255    $w0 = LDRWui $sp, 0 :: (load 4)
256    Bcc 11, %bb.2, implicit $nzcv
257    B %bb.1
258
259  bb.1:
260    $x0 = COPY $xzr
261    RET $x0
262
263  bb.2:
264    liveins: $w0, $w19
265    $w0 = ADDWrr $w0, $w19
266    RET $x0
267...
268
269---
270# Don't sink w19 as w19 is used in bb.0.
271# CHECK-LABEL: name: donotsinkcopy2
272# CHECK-LABEL: bb.0:
273# CHECK: renamable $w19 = COPY $w0
274# CHECK: STRWui $w1, $x19, 0
275name: donotsinkcopy2
276tracksRegLiveness: true
277body: |
278  bb.0:
279    liveins: $w0, $w1
280    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
281    renamable $w19 = COPY $w0
282    STRWui $w1, $x19, 0 :: (store 4)
283    Bcc 11, %bb.2, implicit $nzcv
284    B %bb.1
285
286  bb.1:
287    $x0 = COPY $xzr
288    RET $x0
289
290  bb.2:
291    liveins: $w0, $w19
292    $w0 = ADDWrr $w0, $w19
293    RET $x0
294...
295
296---
297# Don't sink w19 as w19 is used in both %bb.1 and %bb.2.
298# CHECK-LABEL: name: donotsinkcopy3
299# CHECK-LABEL: bb.0:
300# CHECK: renamable $w19 = COPY $w0
301name: donotsinkcopy3
302tracksRegLiveness: true
303body: |
304  bb.0:
305    liveins: $w0, $w1
306    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
307    renamable $w19 = COPY $w0
308    Bcc 11, %bb.2, implicit $nzcv
309    B %bb.1
310
311  bb.1:
312    liveins: $w19
313    $w0 = COPY $w19
314    RET $x0
315
316  bb.2:
317    liveins: $w0, $w19
318    $w0 = ADDWrr $w0, $w19
319    RET $x0
320...
321
322---
323# Don't sink w19 as %bb.2 has multiple predecessors.
324# CHECK-LABEL: name: donotsinkcopy4
325# CHECK-LABEL: bb.0:
326# CHECK: renamable $w19 = COPY $w0
327name: donotsinkcopy4
328tracksRegLiveness: true
329body: |
330  bb.0:
331    liveins: $w0, $w1
332    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
333    renamable $w19 = COPY $w0
334    Bcc 11, %bb.2, implicit $nzcv
335    B %bb.1
336
337  bb.1:
338    liveins: $w0
339    $w19 = COPY $w0
340    B %bb.2
341
342  bb.2:
343    liveins: $w0, $w19
344    $w0 = ADDWrr $w0, $w19
345    RET $x0
346...
347
348
349# Don't sink w19 after sinking w20.
350# CHECK-LABEL: name: donotsinkcopy5
351# CHECK-LABEL: bb.0:
352# CHECK: renamable $w19 = COPY $w0
353# CHECK-LABEL: bb.2:
354# CHECK: liveins: $w0, $w19
355# CHECK: renamable $w20 = COPY $w19
356name: donotsinkcopy5
357tracksRegLiveness: true
358body: |
359  bb.0:
360    liveins: $w0, $w1
361    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
362    renamable $w19 = COPY $w0
363    renamable $w20 = COPY $w19
364    Bcc 11, %bb.2, implicit $nzcv
365
366  bb.1:
367    liveins: $w19
368    $w0 = COPY $w19
369    RET $x0
370
371  bb.2:
372    liveins: $w0, $w20
373    $w0 = ADDWrr killed $w0, $w20
374    RET $x0
375...
376
377---
378# Don't sink w19 as x19 is live-in in %bb.2.
379# CHECK-LABEL: name: donotsinkcopy6
380# CHECK-LABEL: bb.0:
381name: donotsinkcopy6
382tracksRegLiveness: true
383body: |
384  bb.0:
385    liveins: $x0, $w1
386    $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv
387    renamable $x19 = COPY $x0
388    Bcc 11, %bb.2, implicit $nzcv
389    B %bb.1
390
391  bb.1:
392    liveins: $w19
393    $w0 = COPY $w19
394    RET $x0
395
396  bb.2:
397    liveins: $x0, $x19
398    $x0 = ADDXrr $x0, $x19
399    RET $x0
400...
401