868 lines · plain
1# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs -run-pass si-insert-waitcnts -o - %s | FileCheck -check-prefix=GFX9 %s2# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs -run-pass si-insert-waitcnts -o - %s -debugify-and-strip-all-safe | FileCheck -check-prefix=GFX9 %s3# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -verify-machineinstrs -run-pass si-insert-waitcnts -o - %s | FileCheck -check-prefix=GFX10 %s4# RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -verify-machineinstrs -run-pass si-insert-waitcnts -o - %s | FileCheck -check-prefix=GFX12 %s5 6---7 8# The loop contains a store and a use of a value loaded outside of the loop.9# We expect the waitcnt for the use to be hoisted on GFX9, but not on GFX10+10# because we have the vscnt counter.11 12# GFX9-LABEL: waitcnt_vm_loop13# GFX9-LABEL: bb.0:14# GFX9: S_WAITCNT 3915# GFX9-LABEL: bb.1:16# GFX9-NOT: S_WAITCNT 3917# GFX9-LABEL: bb.2:18 19# GFX10-LABEL: waitcnt_vm_loop20# GFX10-LABEL: bb.0:21# GFX10-NOT: S_WAITCNT 1622# GFX10-LABEL: bb.1:23# GFX10: S_WAITCNT 1624# GFX10-LABEL: bb.2:25 26# GFX12-LABEL: waitcnt_vm_loop27# GFX12-LABEL: bb.0:28# GFX12-NOT: S_WAIT_LOADCNT 029# GFX12-LABEL: bb.1:30# GFX12: S_WAIT_LOADCNT 031# GFX12-LABEL: bb.2:32name: waitcnt_vm_loop33body: |34 bb.0:35 successors: %bb.136 37 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec38 S_BRANCH %bb.139 40 bb.1:41 successors: %bb.1, %bb.242 43 BUFFER_STORE_DWORD_OFFEN_exact $vgpr5, $vgpr6, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec44 $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec45 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc46 S_CBRANCH_SCC1 %bb.1, implicit killed $scc47 S_BRANCH %bb.248 49 bb.2:50 S_ENDPGM 051 52...53---54 55# Same as before, but the loop preheader has no terminator.56 57# GFX9-LABEL: waitcnt_vm_loop_noterm58# GFX9-LABEL: bb.0:59# GFX9: S_WAITCNT 3960# GFX9-LABEL: bb.1:61# GFX9-NOT: S_WAITCNT 3962# GFX9-LABEL: bb.2:63 64# GFX10-LABEL: waitcnt_vm_loop_noterm65# GFX10-LABEL: bb.0:66# GFX10-NOT: S_WAITCNT 1667# GFX10-LABEL: bb.1:68# GFX10: S_WAITCNT 1669# GFX10-LABEL: bb.2:70 71# GFX12-LABEL: waitcnt_vm_loop_noterm72# GFX12-LABEL: bb.0:73# GFX12-NOT: S_WAIT_LOADCNT 074# GFX12-LABEL: bb.1:75# GFX12: S_WAIT_LOADCNT 076# GFX12-LABEL: bb.2:77name: waitcnt_vm_loop_noterm78body: |79 bb.0:80 successors: %bb.181 82 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec83 84 bb.1:85 successors: %bb.1, %bb.286 87 BUFFER_STORE_DWORD_OFFEN_exact $vgpr5, $vgpr6, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec88 $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec89 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc90 S_CBRANCH_SCC1 %bb.1, implicit killed $scc91 S_BRANCH %bb.292 93 bb.2:94 S_ENDPGM 095 96...97---98 99# Same as before but there is a preexisting waitcnt in the preheader.100 101# GFX9-LABEL: waitcnt_vm_loop_noterm_wait102# GFX9-LABEL: bb.0:103# GFX9: S_WAITCNT 39104# GFX9-NOT: S_WAITCNT 39105# GFX9-LABEL: bb.1:106# GFX9-NOT: S_WAITCNT 39107# GFX9-LABEL: bb.2:108name: waitcnt_vm_loop_noterm_wait109body: |110 bb.0:111 successors: %bb.1112 113 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec114 S_WAITCNT 3952115 116 bb.1:117 successors: %bb.1, %bb.2118 119 BUFFER_STORE_DWORD_OFFEN_exact $vgpr5, $vgpr6, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec120 $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec121 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc122 S_CBRANCH_SCC1 %bb.1, implicit killed $scc123 S_BRANCH %bb.2124 125 bb.2:126 S_ENDPGM 0127 128...129---130 131# The loop contains a store, a load, and uses values loaded both inside and132# outside the loop.133# We do not expect the waitcnt to be hoisted out of the loop.134 135# GFX9-LABEL: waitcnt_vm_loop_load136# GFX9-LABEL: bb.0:137# GFX9-NOT: S_WAITCNT 39138# GFX9-LABEL: bb.1:139# GFX9: S_WAITCNT 39140# GFX9-LABEL: bb.2:141 142# GFX10-LABEL: waitcnt_vm_loop_load143# GFX10-LABEL: bb.0:144# GFX10-NOT: S_WAITCNT 16145# GFX10-LABEL: bb.1:146# GFX10: S_WAITCNT 16147# GFX10-LABEL: bb.2:148 149# GFX12-LABEL: waitcnt_vm_loop_load150# GFX12-LABEL: bb.0:151# GFX12-NOT: S_WAIT_LOADCNT 0152# GFX12-LABEL: bb.1:153# GFX12: S_WAIT_LOADCNT 0154# GFX12-LABEL: bb.2:155name: waitcnt_vm_loop_load156body: |157 bb.0:158 successors: %bb.1159 160 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec161 S_BRANCH %bb.1162 163 bb.1:164 successors: %bb.1, %bb.2165 166 BUFFER_STORE_DWORD_OFFEN_exact $vgpr5, $vgpr6, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec167 $vgpr7 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr7, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec168 $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr7, implicit $exec169 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc170 S_CBRANCH_SCC1 %bb.1, implicit killed $scc171 S_BRANCH %bb.2172 173 bb.2:174 S_ENDPGM 0175 176...177---178 179# The loop contains a use of a value loaded outside of the loop, and no store180# nor load.181# We do not expect the waitcnt to be hoisted out of the loop.182 183# GFX9-LABEL: waitcnt_vm_loop_no_store184# GFX9-LABEL: bb.0:185# GFX9-NOT: S_WAITCNT 39186# GFX9-LABEL: bb.1:187# GFX9: S_WAITCNT 39188# GFX9-LABEL: bb.2:189 190# GFX10-LABEL: waitcnt_vm_loop_no_store191# GFX10-LABEL: bb.0:192# GFX10-NOT: S_WAITCNT 16193# GFX10-LABEL: bb.1:194# GFX10: S_WAITCNT 16195# GFX10-LABEL: bb.2:196 197# GFX12-LABEL: waitcnt_vm_loop_no_store198# GFX12-LABEL: bb.0:199# GFX12-NOT: S_WAIT_LOADCNT 0200# GFX12-LABEL: bb.1:201# GFX12: S_WAIT_LOADCNT 0202# GFX12-LABEL: bb.2:203name: waitcnt_vm_loop_no_store204body: |205 bb.0:206 successors: %bb.1207 208 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec209 S_BRANCH %bb.1210 211 bb.1:212 successors: %bb.1, %bb.2213 214 $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec215 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc216 S_CBRANCH_SCC1 %bb.1, implicit killed $scc217 S_BRANCH %bb.2218 219 bb.2:220 S_ENDPGM 0221 222...223---224 225# The loop contains a store, no load, and doesn't use any value loaded inside226# or outside of the loop. There is only one use of the loaded value in the227# exit block.228# We don't expect any s_waitcnt vmcnt in the loop body or preheader, but expect229# one in the exit block.230 231 232# GFX9-LABEL: waitcnt_vm_loop_no_use233# GFX9-LABEL: bb.0:234# GFX9-NOT: S_WAITCNT 39235# GFX9-LABEL: bb.1:236# GFX9-NOT: S_WAITCNT 39237# GFX9-LABEL: bb.2:238 239# GFX10-LABEL: waitcnt_vm_loop_no_use240# GFX10-LABEL: bb.0:241# GFX10-NOT: S_WAITCNT 16242# GFX10-LABEL: bb.1:243# GFX10-NOT: S_WAITCNT 16244# GFX10-LABEL: bb.2:245 246# GFX12-LABEL: waitcnt_vm_loop_no_use247# GFX12-LABEL: bb.0:248# GFX12-NOT: S_WAIT_LOADCNT 0249# GFX12-LABEL: bb.1:250# GFX12-NOT: S_WAIT_LOADCNT 0251# GFX12-LABEL: bb.2:252name: waitcnt_vm_loop_no_use253body: |254 bb.0:255 successors: %bb.1256 257 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec258 S_BRANCH %bb.1259 260 bb.1:261 successors: %bb.1, %bb.2262 263 BUFFER_STORE_DWORD_OFFEN_exact $vgpr5, $vgpr6, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec264 $vgpr1 = V_ADD_U32_e32 $vgpr2, $vgpr2, implicit $exec265 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc266 S_CBRANCH_SCC1 %bb.1, implicit killed $scc267 S_BRANCH %bb.2268 269 bb.2:270 $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr0, implicit $exec271 S_ENDPGM 0272 273...274---275 276# The loop loads a value that is not used in the loop, and uses a value loaded277# outside of the loop.278# We expect the waitcnt to be hoisted of the loop to wait a single time before279# the loop is executed and avoid waiting for the load to complete on each280# iteration.281 282# GFX9-LABEL: waitcnt_vm_loop2283# GFX9-LABEL: bb.0:284# GFX9: S_WAITCNT 39285# GFX9-LABEL: bb.1:286# GFX9-NOT: S_WAITCNT 39287# GFX9-LABEL: bb.2:288 289# GFX10-LABEL: waitcnt_vm_loop2290# GFX10-LABEL: bb.0:291# GFX10: S_WAITCNT 16292# GFX10-LABEL: bb.1:293# GFX10-NOT: S_WAITCNT 16294# GFX10-LABEL: bb.2:295 296# GFX12-LABEL: waitcnt_vm_loop2297# GFX12-LABEL: bb.0:298# GFX12: BUFFER_LOAD_FORMAT_X_IDXEN299# GFX12-NOT: S_WAIT_LOADCNT 0300# GFX12-LABEL: bb.1:301# GFX12: S_WAIT_LOADCNT 0302# GFX12-LABEL: bb.2:303name: waitcnt_vm_loop2304body: |305 bb.0:306 successors: %bb.1307 308 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec309 S_BRANCH %bb.1310 311 bb.1:312 successors: %bb.1, %bb.2313 314 $vgpr3 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec315 $vgpr1 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr4, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec316 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc317 S_CBRANCH_SCC1 %bb.1, implicit killed $scc318 S_BRANCH %bb.2319 320 bb.2:321 S_ENDPGM 0322 323...324---325 326# Same as before with an additional store in the loop. We still expect the327# waitcnt instructions to be hoisted.328 329# GFX9-LABEL: waitcnt_vm_loop2_store330# GFX9-LABEL: bb.0:331# GFX9: S_WAITCNT 39332# GFX9-LABEL: bb.1:333# GFX9-NOT: S_WAITCNT 39334# GFX9-LABEL: bb.2:335 336# GFX10-LABEL: waitcnt_vm_loop2_store337# GFX10-LABEL: bb.0:338# GFX10: S_WAITCNT 16339# GFX10-LABEL: bb.1:340# GFX10-NOT: S_WAITCNT 16341# GFX10-LABEL: bb.2:342 343# GFX12-LABEL: waitcnt_vm_loop2_store344# GFX12-LABEL: bb.0:345# GFX12: BUFFER_LOAD_FORMAT_X_IDXEN346# GFX12-NOT: S_WAIT_LOADCNT 0347# GFX12-LABEL: bb.1:348# GFX12: S_WAIT_LOADCNT 0349# GFX12-LABEL: bb.2:350name: waitcnt_vm_loop2_store351body: |352 bb.0:353 successors: %bb.1354 355 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec356 S_BRANCH %bb.1357 358 bb.1:359 successors: %bb.1, %bb.2360 361 $vgpr3 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec362 $vgpr1 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr4, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec363 BUFFER_STORE_DWORD_OFFEN_exact $vgpr5, $vgpr6, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec364 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc365 S_CBRANCH_SCC1 %bb.1, implicit killed $scc366 S_BRANCH %bb.2367 368 bb.2:369 S_ENDPGM 0370 371...372---373 374# Same as loop2 but the value loaded inside the loop is also used in the loop.375# We do not expect the waitcnt to be hoisted out of the loop.376 377# GFX9-LABEL: waitcnt_vm_loop2_use_in_loop378# GFX9-LABEL: bb.0:379# GFX9-NOT: S_WAITCNT 39380# GFX9-LABEL: bb.1:381# GFX9: S_WAITCNT 39382# GFX9-LABEL: bb.2:383 384# GFX10-LABEL: waitcnt_vm_loop2_use_in_loop385# GFX10-LABEL: bb.0:386# GFX10-NOT: S_WAITCNT 16387# GFX10-LABEL: bb.1:388# GFX10: S_WAITCNT 16389# GFX10-LABEL: bb.2:390 391# GFX12-LABEL: waitcnt_vm_loop2_use_in_loop392# GFX12-LABEL: bb.0:393# GFX12-NOT: S_WAIT_LOADCNT 0394# GFX12-LABEL: bb.1:395# GFX12: S_WAIT_LOADCNT 0396# GFX12-LABEL: bb.2:397name: waitcnt_vm_loop2_use_in_loop398body: |399 bb.0:400 successors: %bb.1401 402 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec403 S_BRANCH %bb.1404 405 bb.1:406 successors: %bb.1, %bb.2407 408 $vgpr3 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec409 $vgpr1 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr4, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec410 $vgpr4 = V_ADD_U32_e32 $vgpr5, $vgpr1, implicit $exec411 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc412 S_CBRANCH_SCC1 %bb.1, implicit killed $scc413 S_BRANCH %bb.2414 415 bb.2:416 S_ENDPGM 0417 418...419---420 421# The loop contains a use of a value loaded outside of the loop, but we already422# waited for that load to complete. The loop also loads a value that is not used423# in the loop. We do not expect any waitcnt in the loop.424 425# GFX9-LABEL: waitcnt_vm_loop2_nowait426# GFX9-LABEL: bb.0:427# GFX9: S_WAITCNT 39428# GFX9-LABEL: bb.1:429# GFX9-NOT: S_WAITCNT 39430# GFX9-LABEL: bb.2:431# GFX9-NOT: S_WAITCNT 39432# GFX9-LABEL: bb.3:433 434# GFX10-LABEL: waitcnt_vm_loop2_nowait435# GFX10-LABEL: bb.0:436# GFX10: S_WAITCNT 16437# GFX10-LABEL: bb.1:438# GFX10-NOT: S_WAITCNT 16439# GFX10-LABEL: bb.2:440# GFX10-NOT: S_WAITCNT 16441# GFX10-LABEL: bb.3:442 443# GFX12-LABEL: waitcnt_vm_loop2_nowait444# GFX12-LABEL: bb.0:445# GFX12: S_WAIT_LOADCNT 0446# GFX12-LABEL: bb.1:447# GFX12-NOT: S_WAIT_LOADCNT 0448# GFX12-LABEL: bb.2:449# GFX12: S_WAIT_LOADCNT 0450# GFX12-LABEL: bb.3:451name: waitcnt_vm_loop2_nowait452body: |453 bb.0:454 successors: %bb.1455 456 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec457 $vgpr3 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec458 S_BRANCH %bb.1459 460 bb.1:461 successors: %bb.2462 463 $vgpr3 = V_ADD_U32_e32 $vgpr4, $vgpr5, implicit $exec464 $vgpr3 = V_ADD_U32_e32 $vgpr4, $vgpr5, implicit $exec465 $vgpr3 = V_ADD_U32_e32 $vgpr4, $vgpr5, implicit $exec466 467 S_BRANCH %bb.2468 469 bb.2:470 successors: %bb.2, %bb.3471 472 $vgpr3 = V_ADD_U32_e32 $vgpr0, $vgpr2, implicit $exec473 $vgpr1 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr4, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec474 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc475 S_CBRANCH_SCC1 %bb.2, implicit killed $scc476 S_BRANCH %bb.3477 478 bb.3:479 S_ENDPGM 0480 481...482---483 484# Similar test case but for register intervals.485 486# GFX9-LABEL: waitcnt_vm_loop2_reginterval487# GFX9-LABEL: bb.0:488# GFX9: S_WAITCNT 39489# GFX9-LABEL: bb.1:490# GFX9-NOT: S_WAITCNT 39491# GFX9-LABEL: bb.2:492 493# GFX10-LABEL: waitcnt_vm_loop2_reginterval494# GFX10-LABEL: bb.0:495# GFX10: S_WAITCNT 16496# GFX10-LABEL: bb.1:497# GFX10-NOT: S_WAITCNT 16498# GFX10-LABEL: bb.2:499 500# GFX12-LABEL: waitcnt_vm_loop2_reginterval501# GFX12-LABEL: bb.0:502# GFX12: GLOBAL_LOAD_DWORDX4503# GFX12-NOT: S_WAIT_LOADCNT 0504# GFX12-LABEL: bb.1:505# GFX12: S_WAIT_LOADCNT 0506# GFX12-LABEL: bb.2:507name: waitcnt_vm_loop2_reginterval508body: |509 bb.0:510 successors: %bb.1511 512 $vgpr0_vgpr1_vgpr2_vgpr3 = GLOBAL_LOAD_DWORDX4 $vgpr10_vgpr11, 0, 0, implicit $exec513 514 S_BRANCH %bb.1515 516 bb.1:517 successors: %bb.1, %bb.2518 519 $vgpr10 = COPY $vgpr0520 521 $vgpr4_vgpr5_vgpr6_vgpr7 = IMAGE_SAMPLE_V4_V2 $vgpr20_vgpr21, $sgpr4_sgpr5_sgpr6_sgpr7_sgpr8_sgpr9_sgpr10_sgpr11, $sgpr0_sgpr1_sgpr2_sgpr3, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 4, addrspace 4)522 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc523 S_CBRANCH_SCC1 %bb.1, implicit killed $scc524 S_BRANCH %bb.2525 526 bb.2:527 S_ENDPGM 0528 529...530---531 532# Similar test case but for register intervals.533 534# GFX9-LABEL: waitcnt_vm_loop2_reginterval2535# GFX9-LABEL: bb.0:536# GFX9-NOT: S_WAITCNT 39537# GFX9-LABEL: bb.1:538# GFX9: S_WAITCNT 39539# GFX9-LABEL: bb.2:540 541# GFX10-LABEL: waitcnt_vm_loop2_reginterval2542# GFX10-LABEL: bb.0:543# GFX10-NOT: S_WAITCNT 16544# GFX10-LABEL: bb.1:545# GFX10: S_WAITCNT 16546# GFX10-LABEL: bb.2:547 548# GFX12-LABEL: waitcnt_vm_loop2_reginterval2549# GFX12-LABEL: bb.0:550# GFX12-NOT: S_WAIT_LOADCNT 0551# GFX12-LABEL: bb.1:552# GFX12: S_WAIT_LOADCNT 0553# GFX12-LABEL: bb.2:554name: waitcnt_vm_loop2_reginterval2555body: |556 bb.0:557 successors: %bb.1558 559 $vgpr0_vgpr1_vgpr2_vgpr3 = GLOBAL_LOAD_DWORDX4 $vgpr10_vgpr11, 0, 0, implicit $exec560 561 S_BRANCH %bb.1562 563 bb.1:564 successors: %bb.1, %bb.2565 566 $vgpr10 = COPY $vgpr0567 568 $vgpr4_vgpr5_vgpr6_vgpr7 = IMAGE_SAMPLE_V4_V2 $vgpr20_vgpr21, $sgpr4_sgpr5_sgpr6_sgpr7_sgpr8_sgpr9_sgpr10_sgpr11, $sgpr0_sgpr1_sgpr2_sgpr3, 15, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load (s128), align 4, addrspace 4)569 $vgpr11 = COPY $vgpr7570 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc571 S_CBRANCH_SCC1 %bb.1, implicit killed $scc572 S_BRANCH %bb.2573 574 bb.2:575 S_ENDPGM 0576 577...578---579 580# The loop loads a value that is not used in the loop, but uses a value loaded581# outside of it. We expect the s_waitcnt instruction to be hoisted.582# A s_waitcnt vmcnt(0) is generated to flush in the preheader, but for this583# specific test case, it would be better to use vmcnt(1) instead. This is584# currently not implemented.585 586# GFX9-LABEL: waitcnt_vm_zero587# GFX9-LABEL: bb.0:588# GFX9: S_WAITCNT 3952589# GFX9-LABEL: bb.1:590# GFX9-NOT: S_WAITCNT 39591# GFX9-LABEL: bb.2:592 593# GFX10-LABEL: waitcnt_vm_zero594# GFX10-LABEL: bb.0:595# GFX10: S_WAITCNT 16240596# GFX10-LABEL: bb.1:597# GFX10-NOT: S_WAITCNT 16240598# GFX10-LABEL: bb.2:599 600# GFX12-LABEL: waitcnt_vm_zero601# GFX12-LABEL: bb.0:602# GFX12: BUFFER_LOAD_FORMAT_X_IDXEN603# GFX12: BUFFER_LOAD_FORMAT_X_IDXEN604# GFX12-NOT: S_WAIT_LOADCNT 0605# GFX12-LABEL: bb.1:606# GFX12: S_WAIT_LOADCNT 0607# GFX12-LABEL: bb.2:608 609name: waitcnt_vm_zero610body: |611 bb.0:612 successors: %bb.1613 614 $vgpr0 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec615 $vgpr1 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr1, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec616 S_BRANCH %bb.1617 618 bb.1:619 successors: %bb.1, %bb.2620 621 $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr3, implicit $exec622 $vgpr2 = BUFFER_LOAD_FORMAT_X_IDXEN killed $vgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec623 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc624 S_CBRANCH_SCC1 %bb.1, implicit killed $scc625 S_BRANCH %bb.2626 627 bb.2:628 S_ENDPGM 0629 630...631---632 633# This test case checks that we flush the vmcnt counter only if necessary634# (i.e. if a waitcnt is needed for the vgpr use we find in the loop)635 636# GFX10-LABEL: waitcnt_vm_necessary637# GFX10-LABEL: bb.0:638# GFX10: S_WAITCNT 16240639# GFX10: $vgpr4640# GFX10-NOT: S_WAITCNT641# GFX10-LABEL: bb.1:642# GFX10-NOT: S_WAITCNT643 644# GFX12-LABEL: waitcnt_vm_necessary645# GFX12-LABEL: bb.0:646# GFX12: S_WAIT_LOADCNT 0647# GFX12: $vgpr4648# GFX12-NOT: S_WAITCNT649# GFX12-LABEL: bb.1:650# GFX12-NOT: S_WAITCNT651 652# GFX9-LABEL: waitcnt_vm_necessary653# GFX9-LABEL: bb.0:654# GFX9: S_WAITCNT 3952655# GFX9: $vgpr4656# GFX9-NOT: S_WAITCNT657# GFX9-LABEL: bb.1:658# GFX9-NOT: S_WAITCNT659 660name: waitcnt_vm_necessary661body: |662 bb.0:663 successors: %bb.1(0x80000000)664 665 $vgpr0_vgpr1_vgpr2_vgpr3 = GLOBAL_LOAD_DWORDX4 killed $vgpr0_vgpr1, 0, 0, implicit $exec666 $vgpr4 = BUFFER_LOAD_DWORD_OFFEN $vgpr0, $sgpr0_sgpr1_sgpr2_sgpr3, 0, 0, 0, 0, implicit $exec667 668 bb.1:669 successors: %bb.1(0x40000000)670 671 $vgpr5 = BUFFER_LOAD_DWORD_OFFEN $vgpr0, $sgpr4_sgpr5_sgpr6_sgpr7, 0, 0, 0, 0, implicit $exec672 S_CBRANCH_SCC1 %bb.1, implicit killed $scc673 S_ENDPGM 0674 675...676---677 678# The loop contains a global store, and uses a (global) loaded value outside of the loop.679 680# GFX9-LABEL: waitcnt_vm_loop_global_mem681# GFX9-LABEL: bb.0:682# GFX9: S_WAITCNT 39683# GFX9-LABEL: bb.1:684# GFX9-NOT: S_WAITCNT 39685# GFX9-LABEL: bb.2:686 687# GFX10-LABEL: waitcnt_vm_loop_global_mem688# GFX10-LABEL: bb.0:689# GFX10-NOT: S_WAITCNT 16690# GFX10-LABEL: bb.1:691# GFX10: S_WAITCNT 16692# GFX10-LABEL: bb.2:693 694# GFX12-LABEL: waitcnt_vm_loop_global_mem695# GFX12-LABEL: bb.0:696# GFX12-NOT: S_WAIT_LOADCNT 0697# GFX12-LABEL: bb.1:698# GFX12: S_WAIT_LOADCNT 0699# GFX12-LABEL: bb.2:700 701name: waitcnt_vm_loop_global_mem702body: |703 bb.0:704 successors: %bb.1705 $vgpr0 = GLOBAL_LOAD_DWORD $vgpr1_vgpr2, 0, 0, implicit $exec706 S_BRANCH %bb.1707 708 bb.1:709 successors: %bb.1, %bb.2710 711 $vgpr3 = V_ADD_U32_e32 $vgpr0, $vgpr0, implicit $exec712 GLOBAL_STORE_DWORD $vgpr4_vgpr5, $vgpr6, 0, 0, implicit $exec713 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc714 S_CBRANCH_SCC1 %bb.1, implicit killed $scc715 716 bb.2:717 successors: %bb.3718 S_BRANCH %bb.3719 720 bb.3:721 S_ENDPGM 0722 723...724---725 726# Same as above case, but use scratch memory instructions instead727 728# GFX9-LABEL: waitcnt_vm_loop_scratch_mem729# GFX9-LABEL: bb.0:730# GFX9: S_WAITCNT 39731# GFX9-LABEL: bb.1:732# GFX9-NOT: S_WAITCNT 39733# GFX9-LABEL: bb.2:734 735# GFX10-LABEL: waitcnt_vm_loop_scratch_mem736# GFX10-LABEL: bb.0:737# GFX10-NOT: S_WAITCNT 16738# GFX10-LABEL: bb.1:739# GFX10: S_WAITCNT 16740# GFX10-LABEL: bb.2:741 742# GFX12-LABEL: waitcnt_vm_loop_scratch_mem743# GFX12-LABEL: bb.0:744# GFX12-NOT: S_WAIT_LOADCNT 0745# GFX12-LABEL: bb.1:746# GFX12: S_WAIT_LOADCNT 0747# GFX12-LABEL: bb.2:748 749name: waitcnt_vm_loop_scratch_mem750body: |751 bb.0:752 successors: %bb.1753 $vgpr0 = SCRATCH_LOAD_DWORD $vgpr1, 0, 0, implicit $exec, implicit $flat_scr754 S_BRANCH %bb.1755 756 bb.1:757 successors: %bb.1, %bb.2758 759 $vgpr3 = V_ADD_U32_e32 $vgpr0, $vgpr0, implicit $exec760 SCRATCH_STORE_DWORD $vgpr4, $vgpr6, 0, 0, implicit $exec, implicit $flat_scr761 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc762 S_CBRANCH_SCC1 %bb.1, implicit killed $scc763 764 bb.2:765 successors: %bb.3766 S_BRANCH %bb.3767 768 bb.3:769 S_ENDPGM 0770 771...772---773 774# Same as above case, but use flat memory instructions instead775 776# GFX9-LABEL: waitcnt_vm_loop_flat_mem777# GFX9-LABEL: bb.0:778# GFX9: S_WAITCNT 39779# GFX9-LABEL: bb.1:780# GFX9-NOT: S_WAITCNT 39781# GFX9-LABEL: bb.2:782 783# GFX10-LABEL: waitcnt_vm_loop_flat_mem784# GFX10-LABEL: bb.0:785# GFX10-NOT: S_WAITCNT 11786# GFX10-LABEL: bb.1:787# GFX10: S_WAITCNT 11788# GFX10-LABEL: bb.2:789 790# GFX12-LABEL: waitcnt_vm_loop_flat_mem791# GFX12-LABEL: bb.0:792# GFX12: FLAT_LOAD_DWORD793# GFX12-NOT: S_WAIT_LOADCNT_DSCNT 0794# GFX12-LABEL: bb.1:795# GFX12: S_WAIT_LOADCNT_DSCNT 0796# GFX12-LABEL: bb.2:797name: waitcnt_vm_loop_flat_mem798body: |799 bb.0:800 successors: %bb.1801 $vgpr0 = FLAT_LOAD_DWORD $vgpr1_vgpr2, 0, 0, implicit $exec, implicit $flat_scr802 S_BRANCH %bb.1803 804 bb.1:805 successors: %bb.1, %bb.2806 807 $vgpr3 = V_ADD_U32_e32 $vgpr0, $vgpr0, implicit $exec808 FLAT_STORE_DWORD $vgpr4_vgpr5, $vgpr6, 0, 0, implicit $exec, implicit $flat_scr809 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc810 S_CBRANCH_SCC1 %bb.1, implicit killed $scc811 812 bb.2:813 successors: %bb.3814 S_BRANCH %bb.3815 816 bb.3:817 S_ENDPGM 0818 819...820---821 822# The loop contains a store, a load, and uses values loaded both inside and823# outside the loop.824# We do not expect the waitcnt to be hoisted out of the loop.825 826# GFX9-LABEL: waitcnt_vm_loop_flat_load827# GFX9-LABEL: bb.0:828# GFX9-NOT: S_WAITCNT 39829# GFX9-LABEL: bb.1:830# GFX9: S_WAITCNT 39831# GFX9-LABEL: bb.2:832 833# GFX10-LABEL: waitcnt_vm_loop_flat_load834# GFX10-LABEL: bb.0:835# GFX10-NOT: S_WAITCNT 16836# GFX10-LABEL: bb.1:837# GFX10: S_WAITCNT 16838# GFX10-LABEL: bb.2:839 840# GFX12-LABEL: waitcnt_vm_loop_flat_load841# GFX12-LABEL: bb.0:842# GFX12-NOT: S_WAIT_LOADCNT 0843# GFX12-LABEL: bb.1:844# GFX12: S_WAIT_LOADCNT 0845# GFX12-LABEL: bb.2:846name: waitcnt_vm_loop_flat_load847body: |848 bb.0:849 successors: %bb.1850 851 $vgpr0 = GLOBAL_LOAD_DWORD $vgpr1_vgpr2, 0, 0, implicit $exec852 S_BRANCH %bb.1853 854 bb.1:855 successors: %bb.1, %bb.2856 857 GLOBAL_STORE_DWORD $vgpr4_vgpr5, $vgpr6, 0, 0, implicit $exec858 $vgpr7 = GLOBAL_LOAD_DWORD $vgpr1_vgpr2, 0, 0, implicit $exec859 $vgpr1 = V_ADD_U32_e32 $vgpr0, $vgpr7, implicit $exec860 S_CMP_LG_U32 killed $sgpr3, $sgpr4, implicit-def $scc861 S_CBRANCH_SCC1 %bb.1, implicit killed $scc862 S_BRANCH %bb.2863 864 bb.2:865 S_ENDPGM 0866 867...868