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