622 lines · plain
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py2# RUN: llc -O2 -mtriple=amdgcn -mcpu=gfx1100 -run-pass=si-insert-waitcnts -verify-machineinstrs -o - %s | FileCheck %s -check-prefixes=CHECK,OPT3# RUN: llc -O0 -mtriple=amdgcn -mcpu=gfx1100 -run-pass=si-insert-waitcnts -verify-machineinstrs -o - %s | FileCheck %s -check-prefixes=CHECK,NOOPT4 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...29 30---31name: tbuffer_store132machineFunctionInfo:33 isEntryFunction: true34body: |35 bb.0:36 ; OPT-LABEL: name: tbuffer_store137 ; 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 $exec38 ; OPT-NEXT: S_NOP 039 ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m040 ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr9741 ;42 ; NOOPT-LABEL: name: tbuffer_store143 ; 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 $exec44 ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr9745 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 $exec46 S_ENDPGM 0, implicit $vgpr9747...48 49---50name: tbuffer_store251machineFunctionInfo:52 isEntryFunction: true53body: |54 bb.0:55 ; OPT-LABEL: name: tbuffer_store256 ; 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 058 ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m059 ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr9760 ;61 ; NOOPT-LABEL: name: tbuffer_store262 ; 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 $vgpr9764 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 $vgpr9766...67 68---69name: flat_store70machineFunctionInfo:71 isEntryFunction: true72body: |73 bb.0:74 ; CHECK-LABEL: name: flat_store75 ; CHECK: FLAT_STORE_DWORDX4 $vgpr49_vgpr50, $vgpr26_vgpr27_vgpr28_vgpr29, 0, 0, implicit $exec, implicit $flat_scr76 ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr9777 FLAT_STORE_DWORDX4 $vgpr49_vgpr50, $vgpr26_vgpr27_vgpr28_vgpr29, 0, 0, implicit $exec, implicit $flat_scr78 S_ENDPGM 0, implicit $vgpr9779...80 81---82name: global_store83machineFunctionInfo:84 isEntryFunction: true85body: |86 bb.0:87 ; OPT-LABEL: name: global_store88 ; OPT: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec89 ; OPT-NEXT: S_WAITCNT_VSCNT undef $sgpr_null, 090 ; OPT-NEXT: S_NOP 091 ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m092 ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr9793 ;94 ; NOOPT-LABEL: name: global_store95 ; NOOPT: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec96 ; NOOPT-NEXT: S_WAITCNT_VSCNT undef $sgpr_null, 097 ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr9798 GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec99 S_WAITCNT_VSCNT undef $sgpr_null, 0100 S_ENDPGM 0, implicit $vgpr97101...102 103---104name: buffer_store_format105machineFunctionInfo:106 isEntryFunction: true107body: |108 bb.0:109 ; OPT-LABEL: name: buffer_store_format110 ; 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 $exec111 ; OPT-NEXT: S_NOP 0112 ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0113 ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97114 ;115 ; NOOPT-LABEL: name: buffer_store_format116 ; 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 $exec117 ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97118 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 $exec119 S_ENDPGM 0, implicit $vgpr97120...121 122---123name: ds_write_b32124machineFunctionInfo:125 isEntryFunction: true126body: |127 bb.0:128 ; CHECK-LABEL: name: ds_write_b32129 ; CHECK: renamable $vgpr0 = IMPLICIT_DEF130 ; CHECK-NEXT: renamable $vgpr1 = IMPLICIT_DEF131 ; CHECK-NEXT: DS_WRITE_B32_gfx9 killed renamable $vgpr0, killed renamable $vgpr1, 12, 0, implicit $exec132 ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97133 renamable $vgpr0 = IMPLICIT_DEF134 renamable $vgpr1 = IMPLICIT_DEF135 DS_WRITE_B32_gfx9 killed renamable $vgpr0, killed renamable $vgpr1, 12, 0, implicit $exec136 S_ENDPGM 0, implicit $vgpr97137 138...139---140name: global_store_dword141machineFunctionInfo:142 isEntryFunction: true143body: |144 bb.0:145 liveins: $vgpr0, $sgpr0_sgpr1146 147 ; OPT-LABEL: name: global_store_dword148 ; OPT: liveins: $vgpr0, $sgpr0_sgpr1149 ; OPT-NEXT: {{ $}}150 ; OPT-NEXT: renamable $vgpr0 = V_MAD_I32_I24_e64 killed $vgpr1, killed $vgpr0, killed $sgpr2, 0, implicit $exec151 ; OPT-NEXT: GLOBAL_STORE_DWORD_SADDR killed renamable $vgpr2, killed renamable $vgpr0, killed renamable $sgpr0_sgpr1, 0, 0, implicit $exec152 ; OPT-NEXT: S_NOP 0153 ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0154 ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97155 ;156 ; NOOPT-LABEL: name: global_store_dword157 ; NOOPT: liveins: $vgpr0, $sgpr0_sgpr1158 ; NOOPT-NEXT: {{ $}}159 ; NOOPT-NEXT: renamable $vgpr0 = V_MAD_I32_I24_e64 killed $vgpr1, killed $vgpr0, killed $sgpr2, 0, implicit $exec160 ; NOOPT-NEXT: GLOBAL_STORE_DWORD_SADDR killed renamable $vgpr2, killed renamable $vgpr0, killed renamable $sgpr0_sgpr1, 0, 0, implicit $exec161 ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97162 renamable $vgpr0 = V_MAD_I32_I24_e64 killed $vgpr1, killed $vgpr0, killed $sgpr2, 0, implicit $exec163 GLOBAL_STORE_DWORD_SADDR killed renamable $vgpr2, killed renamable $vgpr0, killed renamable $sgpr0_sgpr1, 0, 0, implicit $exec164 S_ENDPGM 0, implicit $vgpr97165...166 167---168name: multiple_basic_blocks1169machineFunctionInfo:170 isEntryFunction: true171body: |172 ; CHECK-LABEL: name: multiple_basic_blocks1173 ; 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 $exec177 ; CHECK-NEXT: S_BRANCH %bb.1178 ; 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 1015183 ; CHECK-NEXT: $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec184 ; CHECK-NEXT: S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc185 ; CHECK-NEXT: S_CBRANCH_SCC1 %bb.1, implicit killed $scc186 ; CHECK-NEXT: S_BRANCH %bb.2187 ; CHECK-NEXT: {{ $}}188 ; CHECK-NEXT: bb.2:189 ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97190 bb.0:191 successors: %bb.1192 193 renamable $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed renamable $vgpr0, renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec194 S_BRANCH %bb.1195 196 bb.1:197 successors: %bb.1, %bb.2198 199 $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec200 S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc201 S_CBRANCH_SCC1 %bb.1, implicit killed $scc202 S_BRANCH %bb.2203 204 bb.2:205 S_ENDPGM 0, implicit $vgpr97206 207...208 209 210# One block has a VMEM store as the last instruction, we should release the VGPRS211...212---213name: multiple_basic_blocks2214machineFunctionInfo:215 isEntryFunction: true216body: |217 ; OPT-LABEL: name: multiple_basic_blocks2218 ; 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 $exec222 ; OPT-NEXT: $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec223 ; OPT-NEXT: S_BRANCH %bb.2224 ; 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 $exec229 ; OPT-NEXT: TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec230 ; OPT-NEXT: S_BRANCH %bb.2231 ; OPT-NEXT: {{ $}}232 ; OPT-NEXT: bb.2:233 ; OPT-NEXT: S_NOP 0234 ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0235 ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97236 ;237 ; NOOPT-LABEL: name: multiple_basic_blocks2238 ; 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 $exec242 ; NOOPT-NEXT: $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec243 ; NOOPT-NEXT: S_BRANCH %bb.2244 ; 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 $exec249 ; NOOPT-NEXT: TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec250 ; NOOPT-NEXT: S_BRANCH %bb.2251 ; NOOPT-NEXT: {{ $}}252 ; NOOPT-NEXT: bb.2:253 ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97254 bb.0:255 successors: %bb.2256 257 TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec258 $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec259 S_BRANCH %bb.2260 261 bb.1:262 successors: %bb.2263 264 $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec265 TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec266 S_BRANCH %bb.2267 268 bb.2:269 S_ENDPGM 0, implicit $vgpr97270...271 272 273# One parent block has a VMEM store, release VGPRs274---275name: multiple_basic_blocks3276machineFunctionInfo:277 isEntryFunction: true278body: |279 ; OPT-LABEL: name: multiple_basic_blocks3280 ; OPT: bb.0:281 ; OPT-NEXT: successors: %bb.2(0x80000000)282 ; OPT-NEXT: {{ $}}283 ; OPT-NEXT: $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec284 ; OPT-NEXT: TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec285 ; OPT-NEXT: S_BRANCH %bb.2286 ; 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 $exec291 ; OPT-NEXT: S_BRANCH %bb.2292 ; OPT-NEXT: {{ $}}293 ; OPT-NEXT: bb.2:294 ; OPT-NEXT: successors: %bb.4(0x80000000)295 ; OPT-NEXT: {{ $}}296 ; OPT-NEXT: S_BRANCH %bb.4297 ; 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 $exec302 ; OPT-NEXT: S_BRANCH %bb.4303 ; OPT-NEXT: {{ $}}304 ; OPT-NEXT: bb.4:305 ; OPT-NEXT: S_NOP 0306 ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0307 ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97308 ;309 ; NOOPT-LABEL: name: multiple_basic_blocks3310 ; NOOPT: bb.0:311 ; NOOPT-NEXT: successors: %bb.2(0x80000000)312 ; NOOPT-NEXT: {{ $}}313 ; NOOPT-NEXT: $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec314 ; NOOPT-NEXT: TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec315 ; NOOPT-NEXT: S_BRANCH %bb.2316 ; 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 $exec321 ; NOOPT-NEXT: S_BRANCH %bb.2322 ; NOOPT-NEXT: {{ $}}323 ; NOOPT-NEXT: bb.2:324 ; NOOPT-NEXT: successors: %bb.4(0x80000000)325 ; NOOPT-NEXT: {{ $}}326 ; NOOPT-NEXT: S_BRANCH %bb.4327 ; 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 $exec332 ; NOOPT-NEXT: S_BRANCH %bb.4333 ; NOOPT-NEXT: {{ $}}334 ; NOOPT-NEXT: bb.4:335 ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97336 bb.0:337 successors: %bb.2338 339 $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec340 TBUFFER_STORE_FORMAT_X_OFFSET_exact killed renamable $vgpr0, killed renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 125, 0, 0, implicit $exec341 S_BRANCH %bb.2342 343 bb.1:344 successors: %bb.2345 346 $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec347 S_BRANCH %bb.2348 349 bb.2:350 successors: %bb.4351 352 S_BRANCH %bb.4353 354 bb.3:355 successors: %bb.4356 357 $vgpr1 = V_ADD_U32_e32 renamable $vgpr0, renamable $vgpr2, implicit $exec358 S_BRANCH %bb.4359 360 bb.4:361 S_ENDPGM 0, implicit $vgpr97362...363 364---365name: recursive_loop366machineFunctionInfo:367 isEntryFunction: true368body: |369 ; CHECK-LABEL: name: recursive_loop370 ; 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 $exec374 ; CHECK-NEXT: S_BRANCH %bb.1375 ; 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 $scc380 ; CHECK-NEXT: S_CBRANCH_SCC1 %bb.1, implicit killed $scc381 ; CHECK-NEXT: S_BRANCH %bb.2382 ; CHECK-NEXT: {{ $}}383 ; CHECK-NEXT: bb.2:384 ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97385 bb.0:386 successors: %bb.1387 388 renamable $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed renamable $vgpr0, renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec389 S_BRANCH %bb.1390 391 bb.1:392 successors: %bb.1, %bb.2393 394 S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc395 S_CBRANCH_SCC1 %bb.1, implicit killed $scc396 S_BRANCH %bb.2397 398 bb.2:399 S_ENDPGM 0, implicit $vgpr97400...401 402---403name: recursive_loop_vmem404machineFunctionInfo:405 isEntryFunction: true406body: |407 ; OPT-LABEL: name: recursive_loop_vmem408 ; 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 $exec412 ; OPT-NEXT: S_BRANCH %bb.1413 ; 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 1015418 ; 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 $exec419 ; OPT-NEXT: S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc420 ; OPT-NEXT: S_CBRANCH_SCC1 %bb.1, implicit killed $scc421 ; OPT-NEXT: S_BRANCH %bb.2422 ; OPT-NEXT: {{ $}}423 ; OPT-NEXT: bb.2:424 ; OPT-NEXT: S_NOP 0425 ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0426 ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97427 ;428 ; NOOPT-LABEL: name: recursive_loop_vmem429 ; 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 $exec433 ; NOOPT-NEXT: S_BRANCH %bb.1434 ; 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 1015439 ; 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 $exec440 ; NOOPT-NEXT: S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc441 ; NOOPT-NEXT: S_CBRANCH_SCC1 %bb.1, implicit killed $scc442 ; NOOPT-NEXT: S_BRANCH %bb.2443 ; NOOPT-NEXT: {{ $}}444 ; NOOPT-NEXT: bb.2:445 ; NOOPT-NEXT: S_ENDPGM 0, implicit $vgpr97446 bb.0:447 successors: %bb.1448 449 renamable $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed renamable $vgpr0, renamable $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec450 S_BRANCH %bb.1451 452 bb.1:453 successors: %bb.1, %bb.2454 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 $exec456 S_CMP_LG_U32 killed renamable $sgpr3, renamable $sgpr4, implicit-def $scc457 S_CBRANCH_SCC1 %bb.1, implicit killed $scc458 S_BRANCH %bb.2459 460 bb.2:461 S_ENDPGM 0, implicit $vgpr97462...463 464---465name: image_store466machineFunctionInfo:467 isEntryFunction: true468body: |469 bb.0:470 ; OPT-LABEL: name: image_store471 ; 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 0473 ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0474 ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97475 ;476 ; NOOPT-LABEL: name: image_store477 ; 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 $vgpr97479 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 $vgpr97481...482 483---484name: scratch_store485machineFunctionInfo:486 isEntryFunction: true487body: |488 bb.0:489 ; CHECK-LABEL: name: scratch_store490 ; CHECK: renamable $sgpr0 = S_AND_B32 killed renamable $sgpr0, -16, implicit-def dead $scc491 ; CHECK-NEXT: SCRATCH_STORE_DWORD_SADDR killed renamable $vgpr0, killed renamable $sgpr0, 0, 0, implicit $exec, implicit $flat_scr492 ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97493 renamable $sgpr0 = S_AND_B32 killed renamable $sgpr0, -16, implicit-def dead $scc494 SCRATCH_STORE_DWORD_SADDR killed renamable $vgpr0, killed renamable $sgpr0, 0, 0, implicit $exec, implicit $flat_scr495 S_ENDPGM 0, implicit $vgpr97496...497 498---499name: buffer_atomic500machineFunctionInfo:501 isEntryFunction: true502body: |503 bb.0:504 ; OPT-LABEL: name: buffer_atomic505 ; 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 0507 ; OPT-NEXT: S_SENDMSG 3, implicit $exec, implicit $m0508 ; OPT-NEXT: S_ENDPGM 0, implicit $vgpr97509 ;510 ; NOOPT-LABEL: name: buffer_atomic511 ; 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 $vgpr97513 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 $vgpr97515...516 517---518name: flat_atomic519machineFunctionInfo:520 isEntryFunction: true521body: |522 bb.0:523 ; CHECK-LABEL: name: flat_atomic524 ; CHECK: renamable $vgpr0_vgpr1 = FLAT_ATOMIC_DEC_X2_RTN killed renamable $vgpr0_vgpr1, killed renamable $vgpr2_vgpr3, 40, 1, implicit $exec, implicit $flat_scr525 ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97526 renamable $vgpr0_vgpr1 = FLAT_ATOMIC_DEC_X2_RTN killed renamable $vgpr0_vgpr1, killed renamable $vgpr2_vgpr3, 40, 1, implicit $exec, implicit $flat_scr527 S_ENDPGM 0, implicit $vgpr97528...529 530 531---532name: global_atomic533machineFunctionInfo:534 isEntryFunction: true535body: |536 bb.0:537 ; CHECK-LABEL: name: global_atomic538 ; CHECK: renamable $vgpr0_vgpr1 = GLOBAL_ATOMIC_INC_X2_SADDR_RTN killed renamable $vgpr0, killed renamable $vgpr1_vgpr2, killed renamable $sgpr0_sgpr1, 40, 1, implicit $exec539 ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97540 renamable $vgpr0_vgpr1 = GLOBAL_ATOMIC_INC_X2_SADDR_RTN killed renamable $vgpr0, killed renamable $vgpr1_vgpr2, killed renamable $sgpr0_sgpr1, 40, 1, implicit $exec541 S_ENDPGM 0, implicit $vgpr97542...543 544---545name: image_atomic546machineFunctionInfo:547 isEntryFunction: true548body: |549 bb.0:550 ; CHECK-LABEL: name: image_atomic551 ; 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 $vgpr97553 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 $vgpr97555...556 557---558name: global_store_optnone559machineFunctionInfo:560 isEntryFunction: true561body: |562 bb.0:563 ; CHECK-LABEL: name: global_store_optnone564 ; CHECK: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec565 ; CHECK-NEXT: S_WAITCNT_VSCNT undef $sgpr_null, 0566 ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97567 GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec568 S_WAITCNT_VSCNT undef $sgpr_null, 0569 S_ENDPGM 0, implicit $vgpr97570...571 572---573# Make sure we don't send DEALLOC_VGPRS after a call, since there might be574# scratch stores still in progress.575name: with_calls576frameInfo:577 hasCalls: true578body: |579 bb.0:580 ; CHECK-LABEL: name: with_calls581 ; CHECK: S_WAITCNT 0582 ; CHECK-NEXT: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec583 ; CHECK-NEXT: $sgpr30_sgpr31 = SI_CALL undef renamable $sgpr4_sgpr5, 0, csr_amdgpu584 ; CHECK-NEXT: S_ENDPGM 0, implicit $vgpr97585 GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr1, 0, 4, implicit $exec586 $sgpr30_sgpr31 = SI_CALL undef renamable $sgpr4_sgpr5, 0, csr_amdgpu587 S_ENDPGM 0, implicit $vgpr97588...589 590---591# Make sure we don't send DEALLOC_VGPRS when there's a tail call, since the592# only valid action after DEALLOC_VGPRS is to terminate the wave.593name: with_tail_calls594frameInfo:595 hasCalls: true596body: |597 bb.0:598 ; CHECK-LABEL: name: with_tail_calls599 ; CHECK: S_WAITCNT 0600 ; CHECK-NEXT: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr97, 0, 4, implicit $exec601 ; CHECK-NEXT: SI_TCRETURN undef renamable $sgpr4_sgpr5, @with_tail_calls, 0, csr_amdgpu602 GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr97, 0, 4, implicit $exec603 SI_TCRETURN undef renamable $sgpr4_sgpr5, @with_tail_calls, 0, csr_amdgpu604...605 606---607# Do not deallocate VGPRs if kernel uses a small enough number of VGPRs608# making it likely waveslot limited and not VGPR limited. For gfx11 that609# is 96 registers.610name: waveslot_limited611frameInfo:612 hasCalls: true613body: |614 bb.0:615 ; CHECK-LABEL: name: waveslot_limited616 ; CHECK: S_WAITCNT 0617 ; CHECK-NEXT: GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr96, 0, 4, implicit $exec618 ; CHECK-NEXT: S_ENDPGM 0619 GLOBAL_STORE_DWORD undef renamable $vgpr0_vgpr1, killed renamable $vgpr96, 0, 4, implicit $exec620 S_ENDPGM 0621...622