1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -verify-machineinstrs -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -run-pass=regallocfast -o - %s | FileCheck -check-prefix=GCN %s
3
4---
5name: self_loop_single_def_use
6tracksRegLiveness: true
7machineFunctionInfo:
8  isEntryFunction: true
9  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
10  stackPtrOffsetReg: '$sgpr32'
11body:             |
12  ; GCN-LABEL: name: self_loop_single_def_use
13  ; GCN: bb.0:
14  ; GCN-NEXT:   successors: %bb.1(0x80000000)
15  ; GCN-NEXT:   liveins: $vgpr0_vgpr1
16  ; GCN-NEXT: {{  $}}
17  ; GCN-NEXT:   SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5)
18  ; GCN-NEXT: {{  $}}
19  ; GCN-NEXT: bb.1:
20  ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
21  ; GCN-NEXT: {{  $}}
22  ; GCN-NEXT:   $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5)
23  ; GCN-NEXT:   renamable $vgpr2 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, implicit $exec
24  ; GCN-NEXT:   GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, killed renamable $vgpr2, 0, 0, implicit $exec
25  ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec
26  ; GCN-NEXT: {{  $}}
27  ; GCN-NEXT: bb.2:
28  ; GCN-NEXT:   S_ENDPGM 0
29  bb.0:
30    liveins: $vgpr0_vgpr1
31    %0:vreg_64 = COPY $vgpr0_vgpr1
32
33  bb.1:
34    %1:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec
35    GLOBAL_STORE_DWORD %0, %1, 0, 0, implicit $exec
36    S_CBRANCH_EXECZ %bb.1, implicit $exec
37
38  bb.2:
39    S_ENDPGM 0
40
41...
42
43---
44name: self_loop_multi_def
45tracksRegLiveness: true
46machineFunctionInfo:
47  isEntryFunction: true
48  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
49  stackPtrOffsetReg: '$sgpr32'
50body:             |
51  ; GCN-LABEL: name: self_loop_multi_def
52  ; GCN: bb.0:
53  ; GCN-NEXT:   successors: %bb.1(0x80000000)
54  ; GCN-NEXT:   liveins: $vgpr0_vgpr1
55  ; GCN-NEXT: {{  $}}
56  ; GCN-NEXT:   SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5)
57  ; GCN-NEXT: {{  $}}
58  ; GCN-NEXT: bb.1:
59  ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
60  ; GCN-NEXT: {{  $}}
61  ; GCN-NEXT:   $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5)
62  ; GCN-NEXT:   renamable $vgpr2 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, implicit $exec
63  ; GCN-NEXT:   GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, renamable $vgpr2, 0, 0, implicit $exec
64  ; GCN-NEXT:   renamable $vgpr2 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, implicit $exec
65  ; GCN-NEXT:   GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, killed renamable $vgpr2, 0, 0, implicit $exec
66  ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec
67  ; GCN-NEXT: {{  $}}
68  ; GCN-NEXT: bb.2:
69  ; GCN-NEXT:   S_ENDPGM 0
70
71  bb.0:
72    liveins: $vgpr0_vgpr1
73    %0:vreg_64 = COPY $vgpr0_vgpr1
74
75  bb.1:
76    %1:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec
77    GLOBAL_STORE_DWORD %0, %1, 0, 0, implicit $exec
78    %1:vgpr_32 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec
79    GLOBAL_STORE_DWORD %0, %1, 0, 0, implicit $exec
80    S_CBRANCH_EXECZ %bb.1, implicit $exec
81
82  bb.2:
83    S_ENDPGM 0
84
85...
86
87# There's a single def inside the self loop, but it's also a use.
88
89---
90name: self_loop_def_use_same_inst
91tracksRegLiveness: true
92machineFunctionInfo:
93  isEntryFunction: true
94  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
95  stackPtrOffsetReg: '$sgpr32'
96body:             |
97  ; GCN-LABEL: name: self_loop_def_use_same_inst
98  ; GCN: bb.0:
99  ; GCN-NEXT:   successors: %bb.1(0x80000000)
100  ; GCN-NEXT:   liveins: $vgpr0_vgpr1
101  ; GCN-NEXT: {{  $}}
102  ; GCN-NEXT:   SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5)
103  ; GCN-NEXT: {{  $}}
104  ; GCN-NEXT: bb.1:
105  ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
106  ; GCN-NEXT: {{  $}}
107  ; GCN-NEXT:   $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5)
108  ; GCN-NEXT:   renamable $vgpr2 = V_ADD_U32_e32 1, undef $vgpr0, implicit $exec
109  ; GCN-NEXT:   SI_SPILL_V32_SAVE $vgpr2, %stack.1, $sgpr32, 0, implicit $exec :: (store (s32) into %stack.1, addrspace 5)
110  ; GCN-NEXT:   GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, renamable $vgpr2, 0, 0, implicit $exec
111  ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec
112  ; GCN-NEXT: {{  $}}
113  ; GCN-NEXT: bb.2:
114  ; GCN-NEXT:   S_ENDPGM 0
115  bb.0:
116    liveins: $vgpr0_vgpr1
117    %0:vreg_64 = COPY $vgpr0_vgpr1
118
119  bb.1:
120    %1:vgpr_32 = V_ADD_U32_e32 1, undef %1, implicit $exec
121    GLOBAL_STORE_DWORD %0, %1, 0, 0, implicit $exec
122    S_CBRANCH_EXECZ %bb.1, implicit $exec
123
124  bb.2:
125    S_ENDPGM 0
126
127...
128
129---
130name: self_loop_def_after_use
131tracksRegLiveness: true
132machineFunctionInfo:
133  isEntryFunction: true
134  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
135  stackPtrOffsetReg: '$sgpr32'
136body:             |
137  ; GCN-LABEL: name: self_loop_def_after_use
138  ; GCN: bb.0:
139  ; GCN-NEXT:   successors: %bb.1(0x80000000)
140  ; GCN-NEXT:   liveins: $vgpr0_vgpr1
141  ; GCN-NEXT: {{  $}}
142  ; GCN-NEXT:   SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5)
143  ; GCN-NEXT: {{  $}}
144  ; GCN-NEXT: bb.1:
145  ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
146  ; GCN-NEXT: {{  $}}
147  ; GCN-NEXT:   $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5)
148  ; GCN-NEXT:   GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, undef renamable $vgpr0, 0, 0, implicit $exec
149  ; GCN-NEXT:   renamable $vgpr0 = V_ADD_U32_e64 1, 1, 0, implicit $exec
150  ; GCN-NEXT:   SI_SPILL_V32_SAVE killed $vgpr0, %stack.1, $sgpr32, 0, implicit $exec :: (store (s32) into %stack.1, addrspace 5)
151  ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec
152  ; GCN-NEXT: {{  $}}
153  ; GCN-NEXT: bb.2:
154  ; GCN-NEXT:   S_ENDPGM 0
155  bb.0:
156    liveins: $vgpr0_vgpr1
157    %0:vreg_64 = COPY $vgpr0_vgpr1
158
159  bb.1:
160    GLOBAL_STORE_DWORD %0, undef %1, 0, 0, implicit $exec
161    %1:vgpr_32 = V_ADD_U32_e64 1, 1, 0, implicit $exec
162    S_CBRANCH_EXECZ %bb.1, implicit $exec
163
164  bb.2:
165    S_ENDPGM 0
166
167...
168
169---
170name: self_loop_single_subreg_def_use
171tracksRegLiveness: true
172machineFunctionInfo:
173  isEntryFunction: true
174  scratchRSrcReg:  '$sgpr0_sgpr1_sgpr2_sgpr3'
175  stackPtrOffsetReg: '$sgpr32'
176body:             |
177  ; GCN-LABEL: name: self_loop_single_subreg_def_use
178  ; GCN: bb.0:
179  ; GCN-NEXT:   successors: %bb.1(0x80000000)
180  ; GCN-NEXT:   liveins: $vgpr0_vgpr1
181  ; GCN-NEXT: {{  $}}
182  ; GCN-NEXT:   SI_SPILL_V64_SAVE killed $vgpr0_vgpr1, %stack.0, $sgpr32, 0, implicit $exec :: (store (s64) into %stack.0, align 4, addrspace 5)
183  ; GCN-NEXT: {{  $}}
184  ; GCN-NEXT: bb.1:
185  ; GCN-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
186  ; GCN-NEXT: {{  $}}
187  ; GCN-NEXT:   $vgpr0_vgpr1 = SI_SPILL_V64_RESTORE %stack.0, $sgpr32, 0, implicit $exec :: (load (s64) from %stack.0, align 4, addrspace 5)
188  ; GCN-NEXT:   undef renamable $vgpr3 = GLOBAL_LOAD_DWORD renamable $vgpr0_vgpr1, 0, 0, implicit $exec, implicit-def dead $vgpr2_vgpr3
189  ; GCN-NEXT:   GLOBAL_STORE_DWORD renamable $vgpr0_vgpr1, undef renamable $vgpr1, 0, 0, implicit $exec
190  ; GCN-NEXT:   S_CBRANCH_EXECZ %bb.1, implicit $exec
191  ; GCN-NEXT: {{  $}}
192  ; GCN-NEXT: bb.2:
193  ; GCN-NEXT:   S_ENDPGM 0
194  bb.0:
195    liveins: $vgpr0_vgpr1
196    %0:vreg_64 = COPY $vgpr0_vgpr1
197
198  bb.1:
199    undef %1.sub1:vreg_64 = GLOBAL_LOAD_DWORD %0, 0, 0, implicit $exec
200    GLOBAL_STORE_DWORD %0, undef %1.sub1, 0, 0, implicit $exec
201    S_CBRANCH_EXECZ %bb.1, implicit $exec
202
203  bb.2:
204    S_ENDPGM 0
205
206...
207