Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / waitcnt-preexisting.mir
blob50d25f0756695242bd79f80c5e075249e32d0ffc
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
4 ---
5 name:            test_waitcnt_preexisting_lgkmcnt_unmodified
6 body:             |
7   bb.0:
8     liveins: $vgpr0
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 ...
27 ---
28 name:            test_waitcnt_preexisting_vmcnt_unmodified
29 body:             |
30   bb.0:
31     liveins: $vgpr0_vgpr1
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 ...
50 # Respect preexisting waitcnt and add required wait.
52 ---
53 name:            test_waitcnt_preexisting_vmcnt_needs_lgkmcnt
54 body:             |
55   bb.0:
56     liveins: $vgpr0
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 ...
75 ---
76 name:            test_waitcnt_preexisting_lgkmcnt_needs_vmcnt
77 body:             |
78   bb.0:
79     liveins: $vgpr0_vgpr1
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 ...
98 # Apply wait for all counters from preexisting waitcnt regardless of the wait
99 # required by the next instruction.
102 name:            test_waitcnt_preexisting_apply_all_counters
103 body:             |
104   bb.0:
105     liveins: $vgpr0_vgpr1, $vgpr2
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
127 name:            test_waitcnt_preexisting_combine_waitcnt
128 body:             |
129   bb.0:
130     liveins: $vgpr0_vgpr1
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
150 name:            test_waitcnt_preexisting_combine_waitcnt_diff_counters
151 body:             |
152   bb.0:
153     liveins: $vgpr0_vgpr1
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
168 # Apply preexisting waitcnt when no wait is immediately needed.
169 # FIXME: Move waitcnt as late as possible.
172 name:            test_waitcnt_preexisting_early_wait
173 body:             |
174   bb.0:
175     liveins: $vgpr0_vgpr1
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
198 name:            test_waitcnt_preexisting_ignore_kill
199 body:             |
200   bb.0:
201     liveins: $vgpr0_vgpr1
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
215 # Combine preexisting waitcnt with wait added to the start of a non-entry function.
218 name:            test_waitcnt_preexisting_func_start
219 body:             |
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
228 # Verify that extra waitcnt are not added after buffer invalidate instructions.
231 name:            test_waitcnt_preexisting_buffer_inv
232 body:             |
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