brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.0 KiB · 0d54bfa Raw
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