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