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