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