1# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass si-shrink-instructions -verify-machineinstrs %s -o - | FileCheck -check-prefix=GCN %s
2
3# GCN-LABEL: name: swap_phys_condensed
4# GCN: bb.0:
5# GCN-NEXT: $vgpr0, $vgpr1 = V_SWAP_B32 $vgpr1, $vgpr0, implicit $exec
6# GCN-NEXT: S_SETPC_B64_return
7---
8name:            swap_phys_condensed
9body:             |
10  bb.0:
11    liveins: $vgpr0, $vgpr1, $sgpr30_sgpr31
12    $vgpr2 = V_MOV_B32_e32 killed $vgpr0, implicit $exec
13    $vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
14    $vgpr1 = V_MOV_B32_e32 killed $vgpr2, implicit $exec
15    S_SETPC_B64_return $sgpr30_sgpr31, implicit $vgpr0, implicit $vgpr1
16...
17
18# GCN-LABEL: name: swap_phys_sparse
19# GCN: bb.0:
20# GCN-NEXT: $vgpr3 = V_MOV_B32_e32 killed $vgpr4, implicit $exec
21# GCN-NEXT: $vgpr0, $vgpr1 = V_SWAP_B32 $vgpr1, $vgpr0, implicit $exec
22# GCN-NEXT: $vgpr5 = V_MOV_B32_e32 killed $vgpr6, implicit $exec
23# GCN-NEXT: S_SETPC_B64_return
24---
25name:            swap_phys_sparse
26body:             |
27  bb.0:
28    liveins: $vgpr0, $vgpr1, $sgpr30_sgpr31
29    $vgpr2 = V_MOV_B32_e32 killed $vgpr0, implicit $exec
30    $vgpr3 = V_MOV_B32_e32 killed $vgpr4, implicit $exec
31    $vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
32    $vgpr5 = V_MOV_B32_e32 killed $vgpr6, implicit $exec
33    $vgpr1 = V_MOV_B32_e32 killed $vgpr2, implicit $exec
34    S_SETPC_B64_return $sgpr30_sgpr31, implicit $vgpr0, implicit $vgpr1
35...
36
37# GCN-LABEL: name: swap_phys_liveout
38# GCN: bb.0:
39# GCN-NEXT: $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
40# GCN-NEXT: $vgpr0, $vgpr1 = V_SWAP_B32 $vgpr1, $vgpr0, implicit $exec
41# GCN-NEXT: S_SETPC_B64_return
42---
43name:            swap_phys_liveout
44body:             |
45  bb.0:
46    liveins: $vgpr0, $vgpr1, $sgpr30_sgpr31
47    $vgpr2 = V_MOV_B32_e32 killed $vgpr0, implicit $exec
48    $vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
49    $vgpr1 = V_MOV_B32_e32 killed $vgpr2, implicit $exec
50    S_SETPC_B64_return $sgpr30_sgpr31, implicit $vgpr0, implicit $vgpr2, implicit $vgpr1
51...
52
53# GCN-LABEL: name: swap_phys_b64
54# GCN: bb.0:
55# GCN-NEXT: $vgpr0, $vgpr2 = V_SWAP_B32 $vgpr2, $vgpr0, implicit $exec
56# GCN-NEXT: $vgpr1, $vgpr3 = V_SWAP_B32 $vgpr3, $vgpr1, implicit $exec
57---
58name:            swap_phys_b64
59body:             |
60  bb.0:
61    $vgpr4_vgpr5 = COPY killed $vgpr0_vgpr1
62    $vgpr0_vgpr1 = COPY killed $vgpr2_vgpr3
63    $vgpr2_vgpr3 = COPY killed $vgpr4_vgpr5
64...
65
66# GCN-LABEL: name: swap_phys_overlap_x
67# GCN: bb.0:
68# GCN-NEXT: $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
69# GCN-NEXT: $vgpr3_vgpr4 = V_ADD_F64 0, $vgpr0_vgpr1, 0, $vgpr3_vgpr4, 0, 0, implicit $exec
70# GCN-NEXT: $vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
71# GCN-NEXT: $vgpr1 = V_MOV_B32_e32 killed $vgpr2, implicit $exec
72---
73name:            swap_phys_overlap_x
74body:             |
75  bb.0:
76    $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
77    $vgpr3_vgpr4 = V_ADD_F64 0, $vgpr0_vgpr1, 0, $vgpr3_vgpr4, 0, 0, implicit $exec
78    $vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
79    $vgpr1 = V_MOV_B32_e32 killed $vgpr2, implicit $exec
80...
81
82# GCN-LABEL: name: swap_phys_clobber_y
83# GCN: bb.0:
84# GCN-NEXT: $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
85# GCN-NEXT: $vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
86# GCN-NEXT: $vgpr1 = V_MOV_B32_e32 0, implicit $exec
87# GCN-NEXT: $vgpr1 = V_MOV_B32_e32 killed $vgpr2, implicit $exec
88---
89name:            swap_phys_clobber_y
90body:             |
91  bb.0:
92    $vgpr2 = V_MOV_B32_e32 $vgpr0, implicit $exec
93    $vgpr0 = V_MOV_B32_e32 killed $vgpr1, implicit $exec
94    $vgpr1 = V_MOV_B32_e32 0, implicit $exec
95    $vgpr1 = V_MOV_B32_e32 killed $vgpr2, implicit $exec
96    S_ENDPGM
97...
98
99# GCN-LABEL: name: swap_virt_copy_condense
100# GCN: %0:vgpr_32, %1:vgpr_32 = V_SWAP_B32 %1, %0, implicit $exec
101---
102name:            swap_virt_copy_condense
103registers:
104  - { id: 0, class: vgpr_32 }
105  - { id: 1, class: vgpr_32 }
106  - { id: 2, class: vgpr_32 }
107body:             |
108  bb.0:
109    %0 = IMPLICIT_DEF
110    %1 = IMPLICIT_DEF
111    %2 = COPY %0
112    %0 = COPY %1
113    %1 = COPY %2
114...
115
116# GCN-LABEL: name: swap_virt_copy_sparse
117# GCN: %0:vgpr_32, %1:vgpr_32 = V_SWAP_B32 %1, %0, implicit $exec
118---
119name:            swap_virt_copy_sparse
120registers:
121  - { id: 0, class: vgpr_32 }
122  - { id: 1, class: vgpr_32 }
123  - { id: 2, class: vgpr_32 }
124body:             |
125  bb.0:
126    %0 = IMPLICIT_DEF
127    %1 = IMPLICIT_DEF
128    %2 = COPY %0
129    S_NOP 0
130    %0 = COPY %1
131    S_NOP 0
132    %1 = COPY %2
133...
134
135# GCN-LABEL: name: swap_virt_copy_subreg
136# GCN: %0.sub0:vreg_64, %1.sub0:vreg_64 = V_SWAP_B32 %1.sub0, %0.sub0, implicit $exec
137---
138name:            swap_virt_copy_subreg
139registers:
140  - { id: 0, class: vreg_64 }
141  - { id: 1, class: vreg_64 }
142  - { id: 2, class: vreg_64 }
143body:             |
144  bb.0:
145    %0 = IMPLICIT_DEF
146    %1 = IMPLICIT_DEF
147    %2.sub0 = COPY %0.sub0
148    %2.sub1 = COPY %0.sub1
149    %0.sub0 = COPY %1.sub0
150    %0.sub1 = COPY %1.sub1
151    %1.sub0 = COPY %2.sub0
152...
153
154# GCN-LABEL: name: swap_virt_mov
155# GCN: %0:vgpr_32, %1:vgpr_32 = V_SWAP_B32 %1, %0, implicit $exec
156---
157name:            swap_virt_mov
158registers:
159  - { id: 0, class: vgpr_32 }
160  - { id: 1, class: vgpr_32 }
161  - { id: 2, class: vgpr_32 }
162body:             |
163  bb.0:
164    %0 = IMPLICIT_DEF
165    %1 = IMPLICIT_DEF
166    %2 = V_MOV_B32_e32 %0, implicit $exec
167    %0 = V_MOV_B32_e32 %1, implicit $exec
168    %1 = V_MOV_B32_e32 %2, implicit $exec
169...
170
171# GCN-LABEL: name: swap_virt_read_x
172# GCN: bb.0:
173# GCN-NEXT: %0:vgpr_32 = IMPLICIT_DEF
174# GCN-NEXT: %1:vgpr_32 = IMPLICIT_DEF
175# GCN-NEXT: %2:vgpr_32 = COPY %0
176# GCN-NEXT: %3:vgpr_32 = COPY %0
177# GCN-NEXT: %0:vgpr_32 = COPY %1
178# GCN-NEXT: %1:vgpr_32 = COPY %2
179# GCN-NEXT: S_ENDPGM
180
181---
182name:            swap_virt_read_x
183registers:
184  - { id: 0, class: vgpr_32 }
185  - { id: 1, class: vgpr_32 }
186  - { id: 2, class: vgpr_32 }
187  - { id: 3, class: vgpr_32 }
188body:             |
189  bb.0:
190    %0 = IMPLICIT_DEF
191    %1 = IMPLICIT_DEF
192    %2 = COPY %0
193    %3 = COPY %0
194    %0 = COPY %1
195    %1 = COPY %2
196    S_ENDPGM
197...
198
199# GCN-LABEL: name: swap_virt_read_t_twice
200# GCN: bb.0:
201# GCN-NEXT: %0:vgpr_32 = IMPLICIT_DEF
202# GCN-NEXT: %1:vgpr_32 = IMPLICIT_DEF
203# GCN-NEXT: %2:vgpr_32 = COPY %0
204# GCN-NEXT: %3:vgpr_32 = COPY %2
205# GCN-NEXT: %0:vgpr_32, %1:vgpr_32 = V_SWAP_B32 %1, %0, implicit $exec
206# GCN-NEXT: S_ENDPGM
207
208---
209name:            swap_virt_read_t_twice
210registers:
211  - { id: 0, class: vgpr_32 }
212  - { id: 1, class: vgpr_32 }
213  - { id: 2, class: vgpr_32 }
214  - { id: 3, class: vgpr_32 }
215body:             |
216  bb.0:
217    %0 = IMPLICIT_DEF
218    %1 = IMPLICIT_DEF
219    %2 = COPY %0
220    %3 = COPY %2
221    %0 = COPY %1
222    %1 = COPY %2
223    S_ENDPGM
224...
225
226# GCN-LABEL: name: swap_virt_clobber_y
227# GCN: bb.0:
228# GCN-NEXT: %0:vgpr_32 = IMPLICIT_DEF
229# GCN-NEXT: %1:vgpr_32 = IMPLICIT_DEF
230# GCN-NEXT: %2:vgpr_32 = COPY %0
231# GCN-NEXT: %0:vgpr_32 = COPY %1
232# GCN-NEXT: %1:vgpr_32 = IMPLICIT_DEF
233# GCN-NEXT: %1:vgpr_32 = COPY %2
234# GCN-NEXT: S_ENDPGM
235
236---
237name:            swap_virt_clobber_y
238registers:
239  - { id: 0, class: vgpr_32 }
240  - { id: 1, class: vgpr_32 }
241  - { id: 2, class: vgpr_32 }
242body:             |
243  bb.0:
244    %0 = IMPLICIT_DEF
245    %1 = IMPLICIT_DEF
246    %2 = COPY %0
247    %0 = COPY %1
248    %1 = IMPLICIT_DEF
249    %1 = COPY %2
250    S_ENDPGM
251...
252
253# GCN-LABEL: name: swap_virt_clobber_x1
254# GCN: bb.0:
255# GCN-NEXT: %0:vgpr_32 = IMPLICIT_DEF
256# GCN-NEXT: %1:vgpr_32 = IMPLICIT_DEF
257# GCN-NEXT: %2:vgpr_32 = COPY %0
258# GCN-NEXT: %0:vgpr_32 = COPY %1
259# GCN-NEXT: %0:vgpr_32 = IMPLICIT_DEF
260# GCN-NEXT: %1:vgpr_32 = COPY %2
261# GCN-NEXT: S_ENDPGM
262
263---
264name:            swap_virt_clobber_x1
265registers:
266  - { id: 0, class: vgpr_32 }
267  - { id: 1, class: vgpr_32 }
268  - { id: 2, class: vgpr_32 }
269body:             |
270  bb.0:
271    %0 = IMPLICIT_DEF
272    %1 = IMPLICIT_DEF
273    %2 = COPY %0
274    %0 = COPY %1
275    %0 = IMPLICIT_DEF
276    %1 = COPY %2
277    S_ENDPGM
278...
279
280# GCN-LABEL: name: swap_virt_clobber_x2
281# GCN: bb.0:
282# GCN-NEXT: %0:vgpr_32 = IMPLICIT_DEF
283# GCN-NEXT: %1:vgpr_32 = IMPLICIT_DEF
284# GCN-NEXT: %2:vgpr_32 = COPY %0
285# GCN-NEXT: %0:vgpr_32 = IMPLICIT_DEF
286# GCN-NEXT: %0:vgpr_32 = COPY %1
287# GCN-NEXT: %1:vgpr_32 = COPY %2
288# GCN-NEXT: S_ENDPGM
289
290---
291name:            swap_virt_clobber_x2
292registers:
293  - { id: 0, class: vgpr_32 }
294  - { id: 1, class: vgpr_32 }
295  - { id: 2, class: vgpr_32 }
296body:             |
297  bb.0:
298    %0 = IMPLICIT_DEF
299    %1 = IMPLICIT_DEF
300    %2 = COPY %0
301    %0 = IMPLICIT_DEF
302    %0 = COPY %1
303    %1 = COPY %2
304    S_ENDPGM
305...
306
307# GCN-LABEL: name: swap_virt_clobber_t
308# GCN: bb.0:
309# GCN-NEXT: %0:vgpr_32 = IMPLICIT_DEF
310# GCN-NEXT: %1:vgpr_32 = IMPLICIT_DEF
311# GCN-NEXT: %2:vgpr_32 = COPY %0
312# GCN-NEXT: %0:vgpr_32 = COPY %1
313# GCN-NEXT: %2:vgpr_32 = IMPLICIT_DEF
314# GCN-NEXT: %1:vgpr_32 = COPY %2
315# GCN-NEXT: S_ENDPGM
316
317---
318name:            swap_virt_clobber_t
319registers:
320  - { id: 0, class: vgpr_32 }
321  - { id: 1, class: vgpr_32 }
322  - { id: 2, class: vgpr_32 }
323body:             |
324  bb.0:
325    %0 = IMPLICIT_DEF
326    %1 = IMPLICIT_DEF
327    %2 = COPY %0
328    %0 = COPY %1
329    %2 = IMPLICIT_DEF
330    %1 = COPY %2
331    S_ENDPGM
332...
333
334# GCN-LABEL: name: swap_virt_copy_subreg_overlap_x_full
335# GCN: bb.0:
336# GCN-NEXT: %0:vreg_64 = IMPLICIT_DEF
337# GCN-NEXT: %1:vreg_64 = IMPLICIT_DEF
338# GCN-NEXT: %2.sub0:vreg_64 = COPY %0.sub0
339# GCN-NEXT: %3:vreg_64 = COPY %0
340# GCN-NEXT: %0.sub0:vreg_64 = COPY %1.sub0
341# GCN-NEXT: %1.sub0:vreg_64 = COPY %2.sub0
342---
343name:            swap_virt_copy_subreg_overlap_x_full
344registers:
345  - { id: 0, class: vreg_64 }
346  - { id: 1, class: vreg_64 }
347  - { id: 2, class: vreg_64 }
348  - { id: 3, class: vreg_64 }
349body:             |
350  bb.0:
351    %0 = IMPLICIT_DEF
352    %1 = IMPLICIT_DEF
353    %2.sub0 = COPY %0.sub0
354    %3 = COPY %0
355    %0.sub0 = COPY %1.sub0
356    %1.sub0 = COPY %2.sub0
357...
358
359# GCN-LABEL: name: swap_virt_copy_subreg_overlap_x_part
360# GCN: bb.0:
361# GCN-NEXT: %0:vreg_128 = IMPLICIT_DEF
362# GCN-NEXT: %1:vreg_64 = IMPLICIT_DEF
363# GCN-NEXT: %2.sub0:vreg_64 = COPY %0.sub0
364# GCN-NEXT: %3:vreg_64 = COPY %0.sub0_sub1
365# GCN-NEXT: %0.sub0:vreg_128 = COPY %1.sub0
366# GCN-NEXT: %1.sub0:vreg_64 = COPY %2.sub0
367---
368name:            swap_virt_copy_subreg_overlap_x_part
369registers:
370  - { id: 0, class: vreg_128 }
371  - { id: 1, class: vreg_64 }
372  - { id: 2, class: vreg_64 }
373  - { id: 3, class: vreg_64 }
374body:             |
375  bb.0:
376    %0 = IMPLICIT_DEF
377    %1 = IMPLICIT_DEF
378    %2.sub0 = COPY %0.sub0
379    %3 = COPY %0.sub0_sub1
380    %0.sub0 = COPY %1.sub0
381    %1.sub0 = COPY %2.sub0
382...
383
384# GCN-LABEL: name: swap_virt_copy_subreg_wide_y
385# GCN: bb.0:
386# GCN-NEXT: %0:vreg_64 = IMPLICIT_DEF
387# GCN-NEXT: %1:vreg_64 = IMPLICIT_DEF
388# GCN-NEXT: %2.sub0:vreg_64 = COPY %0.sub0
389# GCN-NEXT: %0.sub0:vreg_64 = COPY %1.sub0
390# GCN-NEXT: %1:vreg_64 = COPY %2
391---
392name:            swap_virt_copy_subreg_wide_y
393registers:
394  - { id: 0, class: vreg_64 }
395  - { id: 1, class: vreg_64 }
396  - { id: 2, class: vreg_64 }
397body:             |
398  bb.0:
399    %0 = IMPLICIT_DEF
400    %1 = IMPLICIT_DEF
401    %2.sub0 = COPY %0.sub0
402    %0.sub0 = COPY %1.sub0
403    %1 = COPY %2
404...
405
406# GCN-LABEL: name: swap_virt_b64
407# GCN: bb.0:
408# GCN-NEXT: %0:vreg_64 = IMPLICIT_DEF
409# GCN-NEXT: %1:vreg_64 = IMPLICIT_DEF
410# GCN-NEXT: %0.sub0:vreg_64, %1.sub0:vreg_64 = V_SWAP_B32 %1.sub0, %0.sub0, implicit $exec
411# GCN-NEXT: %0.sub1:vreg_64, %1.sub1:vreg_64 = V_SWAP_B32 %1.sub1, %0.sub1, implicit $exec
412---
413name:            swap_virt_b64
414registers:
415  - { id: 0, class: vreg_64 }
416  - { id: 1, class: vreg_64 }
417  - { id: 2, class: vreg_64 }
418body:             |
419  bb.0:
420    %0 = IMPLICIT_DEF
421    %1 = IMPLICIT_DEF
422    %2 = COPY %0
423    %0 = COPY %1
424    %1 = COPY %2
425...
426
427# GCN-LABEL: name: swap_virt_b128
428# GCN: bb.0:
429# GCN-NEXT: %0:vreg_128 = IMPLICIT_DEF
430# GCN-NEXT: %1:vreg_128 = IMPLICIT_DEF
431# GCN-NEXT: %0.sub0:vreg_128, %1.sub0:vreg_128 = V_SWAP_B32 %1.sub0, %0.sub0, implicit $exec
432# GCN-NEXT: %0.sub1:vreg_128, %1.sub1:vreg_128 = V_SWAP_B32 %1.sub1, %0.sub1, implicit $exec
433# GCN-NEXT: %0.sub2:vreg_128, %1.sub2:vreg_128 = V_SWAP_B32 %1.sub2, %0.sub2, implicit $exec
434# GCN-NEXT: %0.sub3:vreg_128, %1.sub3:vreg_128 = V_SWAP_B32 %1.sub3, %0.sub3, implicit $exec
435---
436name:            swap_virt_b128
437registers:
438  - { id: 0, class: vreg_128 }
439  - { id: 1, class: vreg_128 }
440  - { id: 2, class: vreg_128 }
441body:             |
442  bb.0:
443    %0 = IMPLICIT_DEF
444    %1 = IMPLICIT_DEF
445    %2 = COPY %0
446    %0 = COPY %1
447    %1 = COPY %2
448...
449
450# GCN-LABEL: name: swap_virt_b128_sub0_1
451# GCN: bb.0:
452# GCN-NEXT: %0:vreg_128 = IMPLICIT_DEF
453# GCN-NEXT: %1:vreg_128 = IMPLICIT_DEF
454# GCN-NEXT: %0.sub0:vreg_128, %1.sub0:vreg_128 = V_SWAP_B32 %1.sub0, %0.sub0, implicit $exec
455# GCN-NEXT: %0.sub1:vreg_128, %1.sub1:vreg_128 = V_SWAP_B32 %1.sub1, %0.sub1, implicit $exec
456# GCN-NEXT: S_ENDPGM
457---
458name:            swap_virt_b128_sub0_1
459registers:
460  - { id: 0, class: vreg_128 }
461  - { id: 1, class: vreg_128 }
462  - { id: 2, class: vreg_128 }
463body:             |
464  bb.0:
465    %0 = IMPLICIT_DEF
466    %1 = IMPLICIT_DEF
467    %2.sub0_sub1 = COPY %0.sub0_sub1
468    %0.sub0_sub1 = COPY %1.sub0_sub1
469    %1.sub0_sub1 = COPY %2.sub0_sub1
470    S_ENDPGM
471...
472
473# GCN-LABEL: name: swap_virt_b128_sub2_3
474# GCN: bb.0:
475# GCN-NEXT: %0:vreg_128 = IMPLICIT_DEF
476# GCN-NEXT: %1:vreg_128 = IMPLICIT_DEF
477# GCN-NEXT: %0.sub2:vreg_128, %1.sub2:vreg_128 = V_SWAP_B32 %1.sub2, %0.sub2, implicit $exec
478# GCN-NEXT: %0.sub3:vreg_128, %1.sub3:vreg_128 = V_SWAP_B32 %1.sub3, %0.sub3, implicit $exec
479# GCN-NEXT: S_ENDPGM
480---
481name:            swap_virt_b128_sub2_3
482registers:
483  - { id: 0, class: vreg_128 }
484  - { id: 1, class: vreg_128 }
485  - { id: 2, class: vreg_128 }
486body:             |
487  bb.0:
488    %0 = IMPLICIT_DEF
489    %1 = IMPLICIT_DEF
490    %2.sub2_sub3 = COPY %0.sub2_sub3
491    %0.sub2_sub3 = COPY %1.sub2_sub3
492    %1.sub2_sub3 = COPY %2.sub2_sub3
493    S_ENDPGM
494...
495
496
497# GCN-LABEL: name: swap_virt_s_to_s
498# GCN: bb.0:
499# GCN-NEXT: %0:sgpr_32 = IMPLICIT_DEF
500# GCN-NEXT: %1:sgpr_32 = IMPLICIT_DEF
501# GCN-NEXT: %2:sgpr_32 = COPY %0
502# GCN-NEXT: %0:sgpr_32 = COPY %1
503# GCN-NEXT: %1:sgpr_32 = COPY %2
504---
505name:            swap_virt_s_to_s
506registers:
507  - { id: 0, class: sgpr_32 }
508  - { id: 1, class: sgpr_32 }
509  - { id: 2, class: sgpr_32 }
510body:             |
511  bb.0:
512    %0 = IMPLICIT_DEF
513    %1 = IMPLICIT_DEF
514    %2 = COPY %0
515    %0 = COPY %1
516    %1 = COPY %2
517...
518
519# GCN-LABEL: name: swap_virt_copy_subreg_impdef_super
520# GCN: %0.sub0:vreg_64, %1.sub0:vreg_64 = V_SWAP_B32 %1.sub0, %0.sub0, implicit $exec
521---
522name:            swap_virt_copy_subreg_impdef_super
523registers:
524  - { id: 0, class: vreg_64 }
525  - { id: 1, class: vreg_64 }
526  - { id: 2, class: vreg_64 }
527body:             |
528  bb.0:
529    %0 = IMPLICIT_DEF
530    %1 = IMPLICIT_DEF
531    %2.sub0 = COPY %0.sub0, implicit-def %2, implicit $exec
532    %2.sub1 = COPY %0.sub1
533    %0.sub0 = COPY %1.sub0
534    %0.sub1 = COPY %1.sub1
535    %1.sub0 = COPY %2.sub0
536...
537
538# GCN-LABEL: name: swap_virt_copy_subreg_impuse_x
539# GCN: bb.0:
540# GCN-NEXT: %0:vreg_64 = IMPLICIT_DEF
541# GCN-NEXT: %1:vreg_64 = IMPLICIT_DEF
542# GCN-NEXT: %2.sub0:vreg_64 = COPY %0.sub0
543# GCN-NEXT: %2.sub1:vreg_64 = COPY %0.sub1
544# GCN-NEXT: %0.sub0:vreg_64 = COPY %1.sub0, implicit %0
545# GCN-NEXT: %0.sub1:vreg_64 = COPY %1.sub1
546# GCN-NEXT: %1.sub0:vreg_64 = COPY %2.sub0
547# GCN-NEXT: S_ENDPGM
548---
549name:            swap_virt_copy_subreg_impuse_x
550registers:
551  - { id: 0, class: vreg_64 }
552  - { id: 1, class: vreg_64 }
553  - { id: 2, class: vreg_64 }
554body:             |
555  bb.0:
556    %0 = IMPLICIT_DEF
557    %1 = IMPLICIT_DEF
558    %2.sub0 = COPY %0.sub0
559    %2.sub1 = COPY %0.sub1
560    %0.sub0 = COPY %1.sub0, implicit %0
561    %0.sub1 = COPY %1.sub1
562    %1.sub0 = COPY %2.sub0
563    S_ENDPGM
564...
565