[RISCV] Use RISCVSubtarget::is64Bit() instead of hasFeature(RISCV::Feature64Bit)...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / release-vgprs.mir
blobc845a4c82b9cc0671bb179fd006a69bf36d16c1a
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -O2 -mtriple=amdgcn -mcpu=gfx1100 -run-pass=si-insert-waitcnts -verify-machineinstrs -o - %s | FileCheck %s -check-prefixes=CHECK,OPT
3 # RUN: llc -O0 -mtriple=amdgcn -mcpu=gfx1100 -run-pass=si-insert-waitcnts -verify-machineinstrs -o - %s | FileCheck %s -check-prefixes=CHECK,NOOPT
5 --- |
6   define amdgpu_ps void @tbuffer_store1() { ret void }
7   define amdgpu_ps void @tbuffer_store2() { ret void }
8   define amdgpu_ps void @flat_store() { ret void }
9   define amdgpu_ps void @global_store() { ret void }
10   define amdgpu_ps void @buffer_store_format() { ret void }
11   define amdgpu_ps void @ds_write_b32() { ret void }
12   define amdgpu_ps void @global_store_dword() { ret void }
13   define amdgpu_ps void @multiple_basic_blocks1() { ret void }
14   define amdgpu_ps void @multiple_basic_blocks2() { ret void }
15   define amdgpu_ps void @multiple_basic_blocks3() { ret void }
16   define amdgpu_ps void @recursive_loop() { ret void }
17   define amdgpu_ps void @recursive_loop_vmem() { ret void }
18   define amdgpu_ps void @image_store() { ret void }
19   define amdgpu_ps void @scratch_store() { ret void }
20   define amdgpu_ps void @buffer_atomic() { ret void }
21   define amdgpu_ps void @flat_atomic() { ret void }
22   define amdgpu_ps void @global_atomic() { ret void }
23   define amdgpu_ps void @image_atomic() { ret void }
24   define amdgpu_ps void @global_store_optnone() noinline optnone { ret void }
25   define amdgpu_cs void @with_calls() { ret void }
26   define fastcc void @with_tail_calls() { ret void }
27   define amdgpu_cs void @waveslot_limited() { ret void }
28 ...
30 ---
31 name:            tbuffer_store1
32 machineFunctionInfo:
33   isEntryFunction: true
34 body:             |
35   bb.0:
36     ; OPT-LABEL: name: tbuffer_store1
37     ; OPT: TBUFFER_STORE_FORMAT_XYZW_OFFSET_exact killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, killed renamable $sgpr4, 42, 117, 0, 0, implicit $exec
38     ; OPT-NEXT: S_NOP 0
39     ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0
40     ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97
41     ;
42     ; NOOPT-LABEL: name: tbuffer_store1
43     ; NOOPT: TBUFFER_STORE_FORMAT_XYZW_OFFSET_exact killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, killed renamable $sgpr4, 42, 117, 0, 0, implicit $exec
44     ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97
45     TBUFFER_STORE_FORMAT_XYZW_OFFSET_exact killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, killed renamable $sgpr4, 42, 117, 0, 0, implicit $exec
46     S_ENDPGM 0, implicit $vgpr97
47 ...
49 ---
50 name:            tbuffer_store2
51 machineFunctionInfo:
52   isEntryFunction: true
53 body:             |
54   bb.0:
55     ; OPT-LABEL: name: tbuffer_store2
56     ; OPT: TBUFFER_STORE_FORMAT_XYZW_OFFEN_exact killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $vgpr4, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 115, 0, 0, implicit $exec :: (dereferenceable store (s128), align 1, addrspace 7)
57     ; OPT-NEXT: S_NOP 0
58     ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0
59     ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97
60     ;
61     ; NOOPT-LABEL: name: tbuffer_store2
62     ; NOOPT: TBUFFER_STORE_FORMAT_XYZW_OFFEN_exact killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $vgpr4, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 115, 0, 0, implicit $exec :: (dereferenceable store (s128), align 1, addrspace 7)
63     ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97
64     TBUFFER_STORE_FORMAT_XYZW_OFFEN_exact killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $vgpr4, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 115, 0, 0, implicit $exec :: (dereferenceable store (s128), align 1, addrspace 7)
65     S_ENDPGM 0, implicit $vgpr97
66 ...
68 ---
69 name:            flat_store
70 machineFunctionInfo:
71   isEntryFunction: true
72 body:             |
73   bb.0:
74     ; CHECK-LABEL: name: flat_store
75     ; CHECK: FLAT_STORE_DWORDX4 $vgpr49_vgpr50, $vgpr26_vgpr27_vgpr28_vgpr29, 0, 0, implicit $exec, implicit $flat_scr
76     ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97
77     FLAT_STORE_DWORDX4 $vgpr49_vgpr50, $vgpr26_vgpr27_vgpr28_vgpr29, 0, 0, implicit $exec, implicit $flat_scr
78     S_ENDPGM 0, implicit $vgpr97
79 ...
81 ---
82 name:            global_store
83 machineFunctionInfo:
84   isEntryFunction: true
85 body:             |
86   bb.0:
87     ; OPT-LABEL: name: global_store
88     ; OPT: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec
89     ; OPT-NEXT: S_WAITCNT_VSCNT undef $sgpr_null, 0
90     ; OPT-NEXT: S_NOP 0
91     ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0
92     ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97
93     ;
94     ; NOOPT-LABEL: name: global_store
95     ; NOOPT: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec
96     ; NOOPT-NEXT: S_WAITCNT_VSCNT undef $sgpr_null, 0
97     ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97
98     GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec
99     S_WAITCNT_VSCNT undef $sgpr_null, 0
100     S_ENDPGM 0, implicit $vgpr97
104 name:            buffer_store_format
105 machineFunctionInfo:
106   isEntryFunction: true
107 body:             |
108   bb.0:
109     ; OPT-LABEL: name: buffer_store_format
110     ; OPT: BUFFER_STORE_FORMAT_D16_X_OFFEN_exact killed renamable $vgpr0, killed renamable $vgpr1, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, killed renamable $sgpr4, 0, 0, 0, implicit $exec
111     ; OPT-NEXT: S_NOP 0
112     ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0
113     ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97
114     ;
115     ; NOOPT-LABEL: name: buffer_store_format
116     ; NOOPT: BUFFER_STORE_FORMAT_D16_X_OFFEN_exact killed renamable $vgpr0, killed renamable $vgpr1, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, killed renamable $sgpr4, 0, 0, 0, implicit $exec
117     ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97
118     BUFFER_STORE_FORMAT_D16_X_OFFEN_exact killed renamable $vgpr0, killed renamable $vgpr1, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, killed renamable $sgpr4, 0, 0, 0, implicit $exec
119     S_ENDPGM 0, implicit $vgpr97
123 name:            ds_write_b32
124 machineFunctionInfo:
125   isEntryFunction: true
126 body:             |
127   bb.0:
128     ; CHECK-LABEL: name: ds_write_b32
129     ; CHECK: renamable $vgpr0 = IMPLICIT_DEF
130     ; CHECK-NEXT: renamable $vgpr1 = IMPLICIT_DEF
131     ; CHECK-NEXT: DS_WRITE_B32_gfx9 killed renamable $vgpr0, killed renamable $vgpr1, 12, 0, implicit $exec
132     ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97
133     renamable $vgpr0 = IMPLICIT_DEF
134     renamable $vgpr1 = IMPLICIT_DEF
135     DS_WRITE_B32_gfx9 killed renamable $vgpr0, killed renamable $vgpr1, 12, 0, implicit $exec
136     S_ENDPGM 0, implicit $vgpr97
140 name:            global_store_dword
141 machineFunctionInfo:
142   isEntryFunction: true
143 body:             |
144   bb.0:
145     liveins: $vgpr0, $sgpr0_sgpr1
147     ; OPT-LABEL: name: global_store_dword
148     ; OPT: liveins: $vgpr0, $sgpr0_sgpr1
149     ; OPT-NEXT: {{  $}}
150     ; OPT-NEXT: renamable $vgpr0 = V_MAD_I32_I24_e64 killed $vgpr1, killed $vgpr0, killed $sgpr2, 0, implicit $exec
151     ; OPT-NEXT: GLOBAL_STORE_DWORD_SADDR killed renamable $vgpr2, killed renamable $vgpr0, killed renamable $sgpr0_sgpr1, 0, 0, implicit $exec
152     ; OPT-NEXT: S_NOP 0
153     ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0
154     ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97
155     ;
156     ; NOOPT-LABEL: name: global_store_dword
157     ; NOOPT: liveins: $vgpr0, $sgpr0_sgpr1
158     ; NOOPT-NEXT: {{  $}}
159     ; NOOPT-NEXT: renamable $vgpr0 = V_MAD_I32_I24_e64 killed $vgpr1, killed $vgpr0, killed $sgpr2, 0, implicit $exec
160     ; NOOPT-NEXT: GLOBAL_STORE_DWORD_SADDR killed renamable $vgpr2, killed renamable $vgpr0, killed renamable $sgpr0_sgpr1, 0, 0, implicit $exec
161     ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97
162     renamable $vgpr0 = V_MAD_I32_I24_e64 killed $vgpr1, killed $vgpr0, killed $sgpr2, 0, implicit $exec
163     GLOBAL_STORE_DWORD_SADDR killed renamable $vgpr2, killed renamable $vgpr0, killed renamable $sgpr0_sgpr1, 0, 0, implicit $exec
164     S_ENDPGM 0, implicit $vgpr97
168 name:            multiple_basic_blocks1
169 machineFunctionInfo:
170   isEntryFunction: true
171 body:             |
172   ; CHECK-LABEL: name: multiple_basic_blocks1
173   ; CHECK: bb.0:
174   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
175   ; CHECK-NEXT: {{  $}}
176   ; CHECK-NEXT:   renamable $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed renamable $vgpr0, renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec
177   ; CHECK-NEXT:   S_BRANCH %bb.1
178   ; CHECK-NEXT: {{  $}}
179   ; CHECK-NEXT: bb.1:
180   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
181   ; CHECK-NEXT: {{  $}}
182   ; CHECK-NEXT:   S_WAITCNT 1015
183   ; CHECK-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
184   ; CHECK-NEXT:   S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc
185   ; CHECK-NEXT:   S_CBRANCH_SCC1 %bb.1, implicit killed $scc
186   ; CHECK-NEXT:   S_BRANCH %bb.2
187   ; CHECK-NEXT: {{  $}}
188   ; CHECK-NEXT: bb.2:
189   ; CHECK-NEXT:   S_ENDPGM 0, implicit $vgpr97
190   bb.0:
191     successors: %bb.1
193     renamable $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed renamable $vgpr0, renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec
194     S_BRANCH %bb.1
196   bb.1:
197     successors: %bb.1, %bb.2
199     $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec
200     S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc
201     S_CBRANCH_SCC1 %bb.1, implicit killed $scc
202     S_BRANCH %bb.2
204   bb.2:
205     S_ENDPGM 0, implicit $vgpr97
210 # One block has a VMEM store as the last instruction, we should release the VGPRS
213 name:            multiple_basic_blocks2
214 machineFunctionInfo:
215   isEntryFunction: true
216 body:             |
217   ; OPT-LABEL: name: multiple_basic_blocks2
218   ; OPT: bb.0:
219   ; OPT-NEXT:   successors: %bb.2(0x80000000)
220   ; OPT-NEXT: {{  $}}
221   ; OPT-NEXT:   TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec
222   ; OPT-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
223   ; OPT-NEXT:   S_BRANCH %bb.2
224   ; OPT-NEXT: {{  $}}
225   ; OPT-NEXT: bb.1:
226   ; OPT-NEXT:   successors: %bb.2(0x80000000)
227   ; OPT-NEXT: {{  $}}
228   ; OPT-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
229   ; OPT-NEXT:   TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec
230   ; OPT-NEXT:   S_BRANCH %bb.2
231   ; OPT-NEXT: {{  $}}
232   ; OPT-NEXT: bb.2:
233   ; OPT-NEXT:   S_NOP 0
234   ; OPT-NEXT:   S_SENDMSG 3, implicit $exec, implicit $m0
235   ; OPT-NEXT:   S_ENDPGM 0, implicit $vgpr97
236   ;
237   ; NOOPT-LABEL: name: multiple_basic_blocks2
238   ; NOOPT: bb.0:
239   ; NOOPT-NEXT:   successors: %bb.2(0x80000000)
240   ; NOOPT-NEXT: {{  $}}
241   ; NOOPT-NEXT:   TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec
242   ; NOOPT-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
243   ; NOOPT-NEXT:   S_BRANCH %bb.2
244   ; NOOPT-NEXT: {{  $}}
245   ; NOOPT-NEXT: bb.1:
246   ; NOOPT-NEXT:   successors: %bb.2(0x80000000)
247   ; NOOPT-NEXT: {{  $}}
248   ; NOOPT-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
249   ; NOOPT-NEXT:   TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec
250   ; NOOPT-NEXT:   S_BRANCH %bb.2
251   ; NOOPT-NEXT: {{  $}}
252   ; NOOPT-NEXT: bb.2:
253   ; NOOPT-NEXT:   S_ENDPGM 0, implicit $vgpr97
254   bb.0:
255     successors: %bb.2
257     TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec
258     $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec
259     S_BRANCH %bb.2
261   bb.1:
262     successors: %bb.2
264     $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec
265     TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec
266     S_BRANCH %bb.2
268   bb.2:
269     S_ENDPGM 0, implicit $vgpr97
273 # One parent block has a VMEM store, release VGPRs
275 name:            multiple_basic_blocks3
276 machineFunctionInfo:
277   isEntryFunction: true
278 body:             |
279   ; OPT-LABEL: name: multiple_basic_blocks3
280   ; OPT: bb.0:
281   ; OPT-NEXT:   successors: %bb.2(0x80000000)
282   ; OPT-NEXT: {{  $}}
283   ; OPT-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
284   ; OPT-NEXT:   TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec
285   ; OPT-NEXT:   S_BRANCH %bb.2
286   ; OPT-NEXT: {{  $}}
287   ; OPT-NEXT: bb.1:
288   ; OPT-NEXT:   successors: %bb.2(0x80000000)
289   ; OPT-NEXT: {{  $}}
290   ; OPT-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
291   ; OPT-NEXT:   S_BRANCH %bb.2
292   ; OPT-NEXT: {{  $}}
293   ; OPT-NEXT: bb.2:
294   ; OPT-NEXT:   successors: %bb.4(0x80000000)
295   ; OPT-NEXT: {{  $}}
296   ; OPT-NEXT:   S_BRANCH %bb.4
297   ; OPT-NEXT: {{  $}}
298   ; OPT-NEXT: bb.3:
299   ; OPT-NEXT:   successors: %bb.4(0x80000000)
300   ; OPT-NEXT: {{  $}}
301   ; OPT-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
302   ; OPT-NEXT:   S_BRANCH %bb.4
303   ; OPT-NEXT: {{  $}}
304   ; OPT-NEXT: bb.4:
305   ; OPT-NEXT:   S_NOP 0
306   ; OPT-NEXT:   S_SENDMSG 3, implicit $exec, implicit $m0
307   ; OPT-NEXT:   S_ENDPGM 0, implicit $vgpr97
308   ;
309   ; NOOPT-LABEL: name: multiple_basic_blocks3
310   ; NOOPT: bb.0:
311   ; NOOPT-NEXT:   successors: %bb.2(0x80000000)
312   ; NOOPT-NEXT: {{  $}}
313   ; NOOPT-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
314   ; NOOPT-NEXT:   TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec
315   ; NOOPT-NEXT:   S_BRANCH %bb.2
316   ; NOOPT-NEXT: {{  $}}
317   ; NOOPT-NEXT: bb.1:
318   ; NOOPT-NEXT:   successors: %bb.2(0x80000000)
319   ; NOOPT-NEXT: {{  $}}
320   ; NOOPT-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
321   ; NOOPT-NEXT:   S_BRANCH %bb.2
322   ; NOOPT-NEXT: {{  $}}
323   ; NOOPT-NEXT: bb.2:
324   ; NOOPT-NEXT:   successors: %bb.4(0x80000000)
325   ; NOOPT-NEXT: {{  $}}
326   ; NOOPT-NEXT:   S_BRANCH %bb.4
327   ; NOOPT-NEXT: {{  $}}
328   ; NOOPT-NEXT: bb.3:
329   ; NOOPT-NEXT:   successors: %bb.4(0x80000000)
330   ; NOOPT-NEXT: {{  $}}
331   ; NOOPT-NEXT:   $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec
332   ; NOOPT-NEXT:   S_BRANCH %bb.4
333   ; NOOPT-NEXT: {{  $}}
334   ; NOOPT-NEXT: bb.4:
335   ; NOOPT-NEXT:   S_ENDPGM 0, implicit $vgpr97
336   bb.0:
337     successors: %bb.2
339     $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec
340     TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec
341     S_BRANCH %bb.2
343   bb.1:
344     successors: %bb.2
346     $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec
347     S_BRANCH %bb.2
349   bb.2:
350     successors: %bb.4
352     S_BRANCH %bb.4
354   bb.3:
355     successors: %bb.4
357     $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec
358     S_BRANCH %bb.4
360   bb.4:
361     S_ENDPGM 0, implicit $vgpr97
365 name:            recursive_loop
366 machineFunctionInfo:
367   isEntryFunction: true
368 body:             |
369   ; CHECK-LABEL: name: recursive_loop
370   ; CHECK: bb.0:
371   ; CHECK-NEXT:   successors: %bb.1(0x80000000)
372   ; CHECK-NEXT: {{  $}}
373   ; CHECK-NEXT:   renamable $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed renamable $vgpr0, renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec
374   ; CHECK-NEXT:   S_BRANCH %bb.1
375   ; CHECK-NEXT: {{  $}}
376   ; CHECK-NEXT: bb.1:
377   ; CHECK-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
378   ; CHECK-NEXT: {{  $}}
379   ; CHECK-NEXT:   S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc
380   ; CHECK-NEXT:   S_CBRANCH_SCC1 %bb.1, implicit killed $scc
381   ; CHECK-NEXT:   S_BRANCH %bb.2
382   ; CHECK-NEXT: {{  $}}
383   ; CHECK-NEXT: bb.2:
384   ; CHECK-NEXT:   S_ENDPGM 0, implicit $vgpr97
385   bb.0:
386     successors: %bb.1
388     renamable $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed renamable $vgpr0, renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec
389     S_BRANCH %bb.1
391   bb.1:
392     successors: %bb.1, %bb.2
394     S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc
395     S_CBRANCH_SCC1 %bb.1, implicit killed $scc
396     S_BRANCH %bb.2
398   bb.2:
399     S_ENDPGM 0, implicit $vgpr97
403 name:            recursive_loop_vmem
404 machineFunctionInfo:
405   isEntryFunction: true
406 body:             |
407   ; OPT-LABEL: name: recursive_loop_vmem
408   ; OPT: bb.0:
409   ; OPT-NEXT:   successors: %bb.1(0x80000000)
410   ; OPT-NEXT: {{  $}}
411   ; OPT-NEXT:   renamable $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed renamable $vgpr0, renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec
412   ; OPT-NEXT:   S_BRANCH %bb.1
413   ; OPT-NEXT: {{  $}}
414   ; OPT-NEXT: bb.1:
415   ; OPT-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
416   ; OPT-NEXT: {{  $}}
417   ; OPT-NEXT:   S_WAITCNT 1015
418   ; OPT-NEXT:   TBUFFER_STORE_FORMAT_XYZW_OFFEN_exact killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $vgpr4, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 115, 0, 0, implicit $exec
419   ; OPT-NEXT:   S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc
420   ; OPT-NEXT:   S_CBRANCH_SCC1 %bb.1, implicit killed $scc
421   ; OPT-NEXT:   S_BRANCH %bb.2
422   ; OPT-NEXT: {{  $}}
423   ; OPT-NEXT: bb.2:
424   ; OPT-NEXT:   S_NOP 0
425   ; OPT-NEXT:   S_SENDMSG 3, implicit $exec, implicit $m0
426   ; OPT-NEXT:   S_ENDPGM 0, implicit $vgpr97
427   ;
428   ; NOOPT-LABEL: name: recursive_loop_vmem
429   ; NOOPT: bb.0:
430   ; NOOPT-NEXT:   successors: %bb.1(0x80000000)
431   ; NOOPT-NEXT: {{  $}}
432   ; NOOPT-NEXT:   renamable $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed renamable $vgpr0, renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec
433   ; NOOPT-NEXT:   S_BRANCH %bb.1
434   ; NOOPT-NEXT: {{  $}}
435   ; NOOPT-NEXT: bb.1:
436   ; NOOPT-NEXT:   successors: %bb.1(0x40000000), %bb.2(0x40000000)
437   ; NOOPT-NEXT: {{  $}}
438   ; NOOPT-NEXT:   S_WAITCNT 1015
439   ; NOOPT-NEXT:   TBUFFER_STORE_FORMAT_XYZW_OFFEN_exact killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $vgpr4, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 115, 0, 0, implicit $exec
440   ; NOOPT-NEXT:   S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc
441   ; NOOPT-NEXT:   S_CBRANCH_SCC1 %bb.1, implicit killed $scc
442   ; NOOPT-NEXT:   S_BRANCH %bb.2
443   ; NOOPT-NEXT: {{  $}}
444   ; NOOPT-NEXT: bb.2:
445   ; NOOPT-NEXT:   S_ENDPGM 0, implicit $vgpr97
446   bb.0:
447     successors: %bb.1
449     renamable $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed renamable $vgpr0, renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec
450     S_BRANCH %bb.1
452   bb.1:
453     successors: %bb.1, %bb.2
455     TBUFFER_STORE_FORMAT_XYZW_OFFEN_exact killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $vgpr4, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 115, 0, 0, implicit $exec
456     S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc
457     S_CBRANCH_SCC1 %bb.1, implicit killed $scc
458     S_BRANCH %bb.2
460   bb.2:
461     S_ENDPGM 0, implicit $vgpr97
465 name:            image_store
466 machineFunctionInfo:
467   isEntryFunction: true
468 body:             |
469   bb.0:
470     ; OPT-LABEL: name: image_store
471     ; OPT: IMAGE_STORE_V2_V1_gfx11 killed renamable $vgpr0_vgpr1, killed renamable $vgpr2, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 12, 0, 1, 0, 0, -1, 0, 0, 0, implicit $exec :: (dereferenceable store (<2 x s32>), addrspace 7)
472     ; OPT-NEXT: S_NOP 0
473     ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0
474     ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97
475     ;
476     ; NOOPT-LABEL: name: image_store
477     ; NOOPT: IMAGE_STORE_V2_V1_gfx11 killed renamable $vgpr0_vgpr1, killed renamable $vgpr2, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 12, 0, 1, 0, 0, -1, 0, 0, 0, implicit $exec :: (dereferenceable store (<2 x s32>), addrspace 7)
478     ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97
479   IMAGE_STORE_V2_V1_gfx11 killed renamable $vgpr0_vgpr1, killed renamable $vgpr2, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 12, 0, 1, 0, 0, -1, 0, 0, 0, implicit $exec :: (dereferenceable store (<2 x s32>), addrspace 7)
480   S_ENDPGM 0, implicit $vgpr97
484 name:            scratch_store
485 machineFunctionInfo:
486   isEntryFunction: true
487 body:             |
488   bb.0:
489     ; CHECK-LABEL: name: scratch_store
490     ; CHECK: renamable $sgpr0 = S_AND_B32 killed renamable $sgpr0, -16, implicit-def dead $scc
491     ; CHECK-NEXT: SCRATCH_STORE_DWORD_SADDR killed renamable $vgpr0, killed renamable $sgpr0, 0, 0, implicit $exec, implicit $flat_scr
492     ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97
493     renamable $sgpr0 = S_AND_B32 killed renamable $sgpr0, -16, implicit-def dead $scc
494     SCRATCH_STORE_DWORD_SADDR killed renamable $vgpr0, killed renamable $sgpr0, 0, 0, implicit $exec, implicit $flat_scr
495     S_ENDPGM 0, implicit $vgpr97
499 name:            buffer_atomic
500 machineFunctionInfo:
501   isEntryFunction: true
502 body:             |
503   bb.0:
504     ; OPT-LABEL: name: buffer_atomic
505     ; OPT: BUFFER_ATOMIC_ADD_F32_OFFEN killed renamable $vgpr0, killed renamable $vgpr2, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, implicit $exec :: (volatile dereferenceable load store (s64), align 1, addrspace 7)
506     ; OPT-NEXT: S_NOP 0
507     ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0
508     ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97
509     ;
510     ; NOOPT-LABEL: name: buffer_atomic
511     ; NOOPT: BUFFER_ATOMIC_ADD_F32_OFFEN killed renamable $vgpr0, killed renamable $vgpr2, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, implicit $exec :: (volatile dereferenceable load store (s64), align 1, addrspace 7)
512     ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97
513     BUFFER_ATOMIC_ADD_F32_OFFEN killed renamable $vgpr0, killed renamable $vgpr2, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, implicit $exec :: (volatile dereferenceable load store (s64), align 1, addrspace 7)
514     S_ENDPGM 0, implicit $vgpr97
518 name:            flat_atomic
519 machineFunctionInfo:
520   isEntryFunction: true
521 body:             |
522   bb.0:
523     ; CHECK-LABEL: name: flat_atomic
524     ; CHECK: renamable $vgpr0_vgpr1 = FLAT_ATOMIC_DEC_X2_RTN killed renamable $vgpr0_vgpr1, killed renamable $vgpr2_vgpr3, 40, 1, implicit $exec, implicit $flat_scr
525     ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97
526     renamable $vgpr0_vgpr1 = FLAT_ATOMIC_DEC_X2_RTN killed renamable $vgpr0_vgpr1, killed renamable $vgpr2_vgpr3, 40, 1, implicit $exec, implicit $flat_scr
527     S_ENDPGM 0, implicit $vgpr97
532 name:            global_atomic
533 machineFunctionInfo:
534   isEntryFunction: true
535 body:             |
536   bb.0:
537     ; CHECK-LABEL: name: global_atomic
538     ; CHECK: renamable $vgpr0_vgpr1 = GLOBAL_ATOMIC_INC_X2_SADDR_RTN killed renamable $vgpr0, killed renamable $vgpr1_vgpr2, killed renamable $sgpr0_sgpr1, 40, 1, implicit $exec
539     ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97
540     renamable $vgpr0_vgpr1 = GLOBAL_ATOMIC_INC_X2_SADDR_RTN killed renamable $vgpr0, killed renamable $vgpr1_vgpr2, killed renamable $sgpr0_sgpr1, 40, 1, implicit $exec
541     S_ENDPGM 0, implicit $vgpr97
545 name:            image_atomic
546 machineFunctionInfo:
547   isEntryFunction: true
548 body:             |
549   bb.0:
550     ; CHECK-LABEL: name: image_atomic
551     ; CHECK: renamable $vgpr0_vgpr1_vgpr2_vgpr3 = IMAGE_ATOMIC_CMPSWAP_V4_V1_gfx11 killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $vgpr4, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 15, 0, 1, 1, 0, 0, 0, 0, implicit $exec :: (volatile dereferenceable load store (s64), addrspace 7)
552     ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97
553     renamable $vgpr0_vgpr1_vgpr2_vgpr3 = IMAGE_ATOMIC_CMPSWAP_V4_V1_gfx11 killed renamable $vgpr0_vgpr1_vgpr2_vgpr3, killed renamable $vgpr4, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3_sgpr4_sgpr5_sgpr6_sgpr7, 15, 0, 1, 1, 0, 0, 0, 0, implicit $exec :: (volatile dereferenceable load store (s64), addrspace 7)
554     S_ENDPGM 0, implicit $vgpr97
558 name:            global_store_optnone
559 machineFunctionInfo:
560   isEntryFunction: true
561 body:             |
562   bb.0:
563     ; CHECK-LABEL: name: global_store_optnone
564     ; CHECK: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec
565     ; CHECK-NEXT: S_WAITCNT_VSCNT undef $sgpr_null, 0
566     ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97
567     GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec
568     S_WAITCNT_VSCNT undef $sgpr_null, 0
569     S_ENDPGM 0, implicit $vgpr97
573 # Make sure we don't send DEALLOC_VGPRS after a call, since there might be
574 # scratch stores still in progress.
575 name:            with_calls
576 frameInfo:
577   hasCalls:        true
578 body:             |
579   bb.0:
580     ; CHECK-LABEL: name: with_calls
581     ; CHECK: S_WAITCNT 0
582     ; CHECK-NEXT: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec
583     ; CHECK-NEXT: $sgpr30_sgpr31 = SI_CALL undef renamable $sgpr4_sgpr5, 0, csr_amdgpu
584     ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97
585     GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec
586     $sgpr30_sgpr31 = SI_CALL undef renamable $sgpr4_sgpr5, 0, csr_amdgpu
587     S_ENDPGM 0, implicit $vgpr97
591 # Make sure we don't send DEALLOC_VGPRS when there's a tail call, since the
592 # only valid action after DEALLOC_VGPRS is to terminate the wave.
593 name:            with_tail_calls
594 frameInfo:
595   hasCalls:        true
596 body:             |
597   bb.0:
598     ; CHECK-LABEL: name: with_tail_calls
599     ; CHECK: S_WAITCNT 0
600     ; CHECK-NEXT: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr97, 0, 4, implicit $exec
601     ; CHECK-NEXT: SI_TCRETURN undef renamable $sgpr4_sgpr5, @with_tail_calls, 0, csr_amdgpu
602     GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr97, 0, 4, implicit $exec
603     SI_TCRETURN undef renamable $sgpr4_sgpr5, @with_tail_calls, 0, csr_amdgpu
607 # Do not deallocate VGPRs if kernel uses a small enough number of VGPRs
608 # making it likely waveslot limited and not VGPR limited. For gfx11 that
609 # is 96 registers.
610 name:            waveslot_limited
611 frameInfo:
612   hasCalls:        true
613 body:             |
614   bb.0:
615     ; CHECK-LABEL: name: waveslot_limited
616     ; CHECK: S_WAITCNT 0
617     ; CHECK-NEXT: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr96, 0, 4, implicit $exec
618     ; CHECK-NEXT: S_ENDPGM 0
619     GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr96, 0, 4, implicit $exec
620     S_ENDPGM 0