1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -march=amdgcn -mcpu=gfx908 -verify-machineinstrs -run-pass si-insert-waitcnts -o - %s | FileCheck -check-prefixes=GFX9 %s 3 4--- 5name: test_waitcnt_preexisting_lgkmcnt_unmodified 6body: | 7 bb.0: 8 liveins: $vgpr0 9 10 ; GFX9-LABEL: name: test_waitcnt_preexisting_lgkmcnt_unmodified 11 ; GFX9: S_WAITCNT 0 12 ; GFX9: $vgpr0_vgpr1 = DS_READ2_B32 $vgpr0, 0, 1, 0, implicit $m0, implicit $exec 13 ; GFX9: S_WAITCNT 49279 14 ; GFX9: $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 15 ; GFX9: S_WAITCNT 112 16 ; GFX9: FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 17 ; GFX9: S_ENDPGM 0 18 $vgpr0_vgpr1 = DS_READ2_B32 $vgpr0, 0, 1, 0, implicit $m0, implicit $exec 19 S_WAITCNT 49279 20 $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 21 FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 22 S_ENDPGM 0 23... 24 25--- 26name: test_waitcnt_preexisting_vmcnt_unmodified 27body: | 28 bb.0: 29 liveins: $vgpr0_vgpr1 30 31 ; GFX9-LABEL: name: test_waitcnt_preexisting_vmcnt_unmodified 32 ; GFX9: S_WAITCNT 0 33 ; GFX9: $vgpr0_vgpr1 = GLOBAL_LOAD_DWORDX2 $vgpr0_vgpr1, 0, 0, implicit $exec 34 ; GFX9: S_WAITCNT 3952 35 ; GFX9: $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 36 ; GFX9: S_WAITCNT 112 37 ; GFX9: FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 38 ; GFX9: S_ENDPGM 0 39 $vgpr0_vgpr1 = GLOBAL_LOAD_DWORDX2 $vgpr0_vgpr1, 0, 0, implicit $exec 40 S_WAITCNT 3952 41 $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 42 FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 43 S_ENDPGM 0 44... 45 46# Respect preexisting waitcnt and add required wait. 47 48--- 49name: test_waitcnt_preexisting_vmcnt_needs_lgkmcnt 50body: | 51 bb.0: 52 liveins: $vgpr0 53 54 ; GFX9-LABEL: name: test_waitcnt_preexisting_vmcnt_needs_lgkmcnt 55 ; GFX9: S_WAITCNT 0 56 ; GFX9: $vgpr0_vgpr1 = DS_READ2_B32 $vgpr0, 0, 1, 0, implicit $m0, implicit $exec 57 ; GFX9: S_WAITCNT 112 58 ; GFX9: $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 59 ; GFX9: S_WAITCNT 112 60 ; GFX9: FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 61 ; GFX9: S_ENDPGM 0 62 $vgpr0_vgpr1 = DS_READ2_B32 $vgpr0, 0, 1, 0, implicit $m0, implicit $exec 63 S_WAITCNT 3952 64 $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 65 FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 66 S_ENDPGM 0 67... 68 69--- 70name: test_waitcnt_preexisting_lgkmcnt_needs_vmcnt 71body: | 72 bb.0: 73 liveins: $vgpr0_vgpr1 74 75 ; GFX9-LABEL: name: test_waitcnt_preexisting_lgkmcnt_needs_vmcnt 76 ; GFX9: S_WAITCNT 0 77 ; GFX9: $vgpr0_vgpr1 = GLOBAL_LOAD_DWORDX2 $vgpr0_vgpr1, 0, 0, implicit $exec 78 ; GFX9: S_WAITCNT 112 79 ; GFX9: $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 80 ; GFX9: S_WAITCNT 112 81 ; GFX9: FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 82 ; GFX9: S_ENDPGM 0 83 $vgpr0_vgpr1 = GLOBAL_LOAD_DWORDX2 $vgpr0_vgpr1, 0, 0, implicit $exec 84 S_WAITCNT 49279 85 $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 86 FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 87 S_ENDPGM 0 88... 89 90# Apply wait for all counters from preexisting waitcnt regardless of the wait 91# required by the next instruction. 92 93--- 94name: test_waitcnt_preexisting_apply_all_counters 95body: | 96 bb.0: 97 liveins: $vgpr0_vgpr1, $vgpr2 98 99 ; GFX9-LABEL: name: test_waitcnt_preexisting_apply_all_counters 100 ; GFX9: S_WAITCNT 0 101 ; GFX9: $vgpr4_vgpr5 = GLOBAL_LOAD_DWORDX2 $vgpr0_vgpr1, 0, 0, implicit $exec 102 ; GFX9: $vgpr6_vgpr7 = DS_READ2_B32 $vgpr2, 0, 1, 0, implicit $m0, implicit $exec 103 ; GFX9: S_WAITCNT 0 104 ; GFX9: $vgpr6 = V_OR_B32_e32 1, killed $vgpr6, implicit $exec 105 ; GFX9: $vgpr0 = FLAT_LOAD_DWORD $vgpr4_vgpr5, 0, 0, implicit $exec, implicit $flat_scr 106 ; GFX9: S_WAITCNT 112 107 ; GFX9: FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 108 $vgpr4_vgpr5 = GLOBAL_LOAD_DWORDX2 $vgpr0_vgpr1, 0, 0, implicit $exec 109 $vgpr6_vgpr7 = DS_READ2_B32 $vgpr2, 0, 1, 0, implicit $m0, implicit $exec 110 S_WAITCNT 0 111 $vgpr6 = V_OR_B32_e32 1, killed $vgpr6, implicit $exec 112 $vgpr0 = FLAT_LOAD_DWORD $vgpr4_vgpr5, 0, 0, implicit $exec, implicit $flat_scr 113 FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 114... 115 116--- 117name: test_waitcnt_preexisting_combine_waitcnt 118body: | 119 bb.0: 120 liveins: $vgpr0_vgpr1 121 122 ; GFX9-LABEL: name: test_waitcnt_preexisting_combine_waitcnt 123 ; GFX9: S_WAITCNT 0 124 ; GFX9: $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 125 ; GFX9: S_WAITCNT 0 126 ; GFX9: FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 127 $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 128 S_WAITCNT 0 129 S_WAITCNT 0 130 S_WAITCNT 0 131 S_WAITCNT 0 132 S_WAITCNT 0 133 S_WAITCNT 0 134 FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 135... 136 137--- 138name: test_waitcnt_preexisting_combine_waitcnt_diff_counters 139body: | 140 bb.0: 141 liveins: $vgpr0_vgpr1 142 143 ; GFX9-LABEL: name: test_waitcnt_preexisting_combine_waitcnt_diff_counters 144 ; GFX9: S_WAITCNT 0 145 ; GFX9: $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 146 ; GFX9: S_WAITCNT 112 147 ; GFX9: FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 148 $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 149 S_WAITCNT 49279 150 S_WAITCNT 3952 151 FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 152... 153 154# Apply preexisting waitcnt when no wait is immediately needed. 155# FIXME: Move waitcnt as late as possible. 156 157--- 158name: test_waitcnt_preexisting_early_wait 159body: | 160 bb.0: 161 liveins: $vgpr0_vgpr1 162 163 ; GFX9-LABEL: name: test_waitcnt_preexisting_early_wait 164 ; GFX9: S_WAITCNT 0 165 ; GFX9: $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 166 ; GFX9: S_WAITCNT 0 167 ; GFX9: S_NOP 0 168 ; GFX9: S_NOP 0 169 ; GFX9: S_NOP 0 170 ; GFX9: FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 171 ; GFX9: S_ENDPGM 0 172 $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 173 S_WAITCNT 0 174 S_NOP 0 175 S_NOP 0 176 S_NOP 0 177 FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 178 S_ENDPGM 0 179... 180 181--- 182name: test_waitcnt_preexisting_ignore_kill 183body: | 184 bb.0: 185 liveins: $vgpr0_vgpr1 186 187 ; GFX9-LABEL: name: test_waitcnt_preexisting_ignore_kill 188 ; GFX9: S_WAITCNT 0 189 ; GFX9: $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 190 ; GFX9: S_WAITCNT 3952 191 ; GFX9: KILL $vgpr0 192 $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 193 S_WAITCNT 3952 194 KILL $vgpr0 195... 196 197# Combine preexisting waitcnt with wait added to the start of a non-entry function. 198 199--- 200name: test_waitcnt_preexisting_func_start 201body: | 202 bb.0: 203 ; GFX9-LABEL: name: test_waitcnt_preexisting_func_start 204 ; GFX9: S_WAITCNT 0 205 ; GFX9-NOT: S_WAITCNT 0 206 ; GFX9: S_ENDPGM 0 207 S_WAITCNT 0 208 S_ENDPGM 0 209... 210 211# Verify that extra waitcnt are not added after buffer invalidate instructions. 212 213--- 214name: test_waitcnt_preexisting_buffer_inv 215body: | 216 bb.0: 217 ; GFX9-LABEL: name: test_waitcnt_preexisting_buffer_inv 218 ; GFX9: S_WAITCNT 0 219 ; GFX9: $vgpr0_vgpr1 = GLOBAL_LOAD_DWORDX2 $vgpr0_vgpr1, 0, 0, implicit $exec 220 ; GFX9: S_WAITCNT 3952 221 ; GFX9: BUFFER_INVL2 implicit $exec 222 ; GFX9: BUFFER_WBINVL1_VOL implicit $exec 223 ; GFX9: $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 224 ; GFX9: S_WAITCNT 112 225 ; GFX9: FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 226 ; GFX9: S_ENDPGM 0 227 $vgpr0_vgpr1 = GLOBAL_LOAD_DWORDX2 $vgpr0_vgpr1, 0, 0, implicit $exec 228 S_WAITCNT 3952 229 BUFFER_INVL2 implicit $exec 230 BUFFER_WBINVL1_VOL implicit $exec 231 $vgpr0 = FLAT_LOAD_DWORD $vgpr0_vgpr1, 0, 0, implicit $exec, implicit $flat_scr 232 FLAT_STORE_DWORD $vgpr0_vgpr1, $vgpr0, 0, 0, implicit $exec, implicit $flat_scr 233 S_ENDPGM 0 234... 235