[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / valu-mask-write-hazard.mir
blob350d0985fbfed97e5e3c10f13ff0a316045bcfe1
1 # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2 # RUN: llc -march=amdgcn -mcpu=gfx1100 -mattr=+wavefrontsize64 -verify-machineinstrs -run-pass post-RA-hazard-rec -o - %s | FileCheck -check-prefix=GCN %s
4 --- |
5   @mem = internal unnamed_addr addrspace(4) constant [4 x <4 x i32>] [<4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 0, i32 0, i32 0, i32 0>]
7   define amdgpu_gs void @mask_hazard_getpc1() { ret void }
8   define amdgpu_gs void @mask_hazard_getpc2() { ret void }
9   define amdgpu_gs void @mask_hazard_vcc1() { ret void }
10   define amdgpu_gs void @mask_hazard_vcc2() { ret void }
11   define amdgpu_gs void @mask_hazard_cndmask_dpp1() { ret void }
12   define amdgpu_gs void @mask_hazard_cndmask_dpp2() { ret void }
13   define amdgpu_gs void @mask_hazard_cndmask_dpp3() { ret void }
14   define amdgpu_gs void @mask_hazard_cndmask_dpp4() { ret void }
15   define amdgpu_gs void @mask_hazard_addc1() { ret void }
16   define amdgpu_gs void @mask_hazard_addc2() { ret void }
17   define amdgpu_gs void @mask_hazard_addc3() { ret void }
18   define amdgpu_gs void @mask_hazard_addc4() { ret void }
19   define amdgpu_gs void @mask_hazard_subb1() { ret void }
20   define amdgpu_gs void @mask_hazard_subb2() { ret void }
21   define amdgpu_gs void @mask_hazard_subb3() { ret void }
22   define amdgpu_gs void @mask_hazard_subb4() { ret void }
23   define amdgpu_gs void @mask_hazard_subbrev1() { ret void }
24   define amdgpu_gs void @mask_hazard_subbrev2() { ret void }
25   define amdgpu_gs void @mask_hazard_subbrev3() { ret void }
26   define amdgpu_gs void @mask_hazard_subbrev4() { ret void }
27   define amdgpu_gs void @mask_hazard_div_fmas_f32() { ret void }
28   define amdgpu_gs void @mask_hazard_div_fmas_f64() { ret void }
29   define amdgpu_gs void @mask_hazard_subreg1() { ret void }
30   define amdgpu_gs void @mask_hazard_subreg2() { ret void }
31   define amdgpu_gs void @mask_hazard_subreg3() { ret void }
32   define amdgpu_gs void @mask_hazard_subreg4() { ret void }
33   define amdgpu_gs void @mask_hazard_subreg5() { ret void }
34   define amdgpu_gs void @mask_hazard_waitcnt() { ret void }
35   define amdgpu_gs void @mask_hazard_gap1() { ret void }
36   define amdgpu_gs void @mask_hazard_gap2() { ret void }
37   define amdgpu_gs void @mask_hazard_gap3() { ret void }
38   define amdgpu_gs void @mask_hazard_no_hazard1() { ret void }
39   define amdgpu_gs void @mask_hazard_no_hazard2() { ret void }
40   define amdgpu_gs void @mask_hazard_no_hazard3() { ret void }
41 ...
43 ---
44 name:            mask_hazard_getpc1
45 body:            |
46   bb.0:
47     ; GCN-LABEL: name: mask_hazard_getpc1
48     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
49     ; GCN-NEXT: $sgpr0_sgpr1 = S_GETPC_B64
50     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
51     ; GCN-NEXT: $sgpr0 = S_ADD_U32 $sgpr0, 0, implicit-def $scc
52     ; GCN-NEXT: S_ENDPGM 0
53     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
54     $sgpr0_sgpr1 = S_GETPC_B64
55     $sgpr0 = S_ADD_U32 $sgpr0, 0, implicit-def $scc
56     S_ENDPGM 0
57 ...
59 ---
60 name:            mask_hazard_getpc2
61 body:            |
62   bb.0:
63     ; GCN-LABEL: name: mask_hazard_getpc2
64     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
65     ; GCN-NEXT: BUNDLE implicit-def $sgpr0_sgpr1 {
66     ; GCN-NEXT:   $sgpr0_sgpr1 = S_GETPC_B64
67     ; GCN-NEXT:   S_WAITCNT_DEPCTR 65534
68     ; GCN-NEXT:   $sgpr0 = S_ADD_U32 $sgpr0, target-flags(amdgpu-rel32-lo) @mem + 8, implicit-def $scc
69     ; GCN-NEXT:   $sgpr1 = S_ADDC_U32 $sgpr1, target-flags(amdgpu-rel32-lo) @mem + 16, implicit-def $scc, implicit $scc
70     ; GCN-NEXT: }
71     ; GCN-NEXT: S_ENDPGM 0
72     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
73     BUNDLE implicit-def $sgpr0_sgpr1 {
74       $sgpr0_sgpr1 = S_GETPC_B64
75       $sgpr0 = S_ADD_U32 $sgpr0, target-flags(amdgpu-rel32-lo) @mem + 4, implicit-def $scc
76       $sgpr1 = S_ADDC_U32 $sgpr1, target-flags(amdgpu-rel32-lo) @mem + 12, implicit-def $scc, implicit $scc
77     }
78     S_ENDPGM 0
79 ...
81 ---
82 name:            mask_hazard_vcc1
83 body:            |
84   bb.0:
85     ; GCN-LABEL: name: mask_hazard_vcc1
86     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, implicit $exec
87     ; GCN-NEXT: $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
88     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
89     ; GCN-NEXT: S_ENDPGM 0
90     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, implicit $exec
91     $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
92     S_ENDPGM 0
93 ...
95 ---
96 name:            mask_hazard_vcc2
97 body:            |
98   bb.0:
99     ; GCN-LABEL: name: mask_hazard_vcc2
100     ; GCN: $vgpr1 = V_CNDMASK_B32_e32 $vgpr1, $vgpr2, implicit $vcc, implicit $exec
101     ; GCN-NEXT: $vcc = S_CSELECT_B64 -1, 0, implicit $scc
102     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
103     ; GCN-NEXT: S_ENDPGM 0
104     $vgpr1 = V_CNDMASK_B32_e32 $vgpr1, $vgpr2, implicit $vcc, implicit $exec
105     $vcc = S_CSELECT_B64 -1, 0, implicit $scc
106     S_ENDPGM 0
110 name:            mask_hazard_cndmask_dpp1
111 body:            |
112   bb.0:
113     ; GCN-LABEL: name: mask_hazard_cndmask_dpp1
114     ; GCN: $vgpr0 = V_CNDMASK_B32_dpp $vgpr0, 0, $vgpr1, 0, $vgpr2, 1, 15, 15, 1, implicit $vcc, implicit $exec
115     ; GCN-NEXT: $vcc = S_CSELECT_B64 -1, 0, implicit $scc
116     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
117     ; GCN-NEXT: S_ENDPGM 0
118     $vgpr0 = V_CNDMASK_B32_dpp $vgpr0, 0, $vgpr1, 0, $vgpr2, 1, 15, 15, 1, implicit $vcc, implicit $exec
119     $vcc = S_CSELECT_B64 -1, 0, implicit $scc
120     S_ENDPGM 0
124 name:            mask_hazard_cndmask_dpp2
125 body:            |
126   bb.0:
127     ; GCN-LABEL: name: mask_hazard_cndmask_dpp2
128     ; GCN: $vgpr0 = V_CNDMASK_B32_e64_dpp $vgpr0, 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, 1, 15, 15, 1, implicit $exec
129     ; GCN-NEXT: $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
130     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
131     ; GCN-NEXT: S_ENDPGM 0
132     $vgpr0 = V_CNDMASK_B32_e64_dpp $vgpr0, 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, 1, 15, 15, 1, implicit $exec
133     $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
134     S_ENDPGM 0
138 name:            mask_hazard_cndmask_dpp4
139 body:            |
140   bb.0:
141     ; GCN-LABEL: name: mask_hazard_cndmask_dpp4
142     ; GCN: $vgpr0 = V_CNDMASK_B16_e64_dpp $vgpr0, 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, 1, 15, 15, 1, implicit $exec
143     ; GCN-NEXT: $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
144     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
145     ; GCN-NEXT: S_ENDPGM 0
146     $vgpr0 = V_CNDMASK_B16_e64_dpp $vgpr0, 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, 1, 15, 15, 1, implicit $exec
147     $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
148     S_ENDPGM 0
152 name:            mask_hazard_addc1
153 body:            |
154   bb.0:
155     ; GCN-LABEL: name: mask_hazard_addc1
156     ; GCN: $vgpr1, $vcc = V_ADDC_U32_e64 0, $vgpr1, $sgpr2_sgpr3, 0, implicit $exec
157     ; GCN-NEXT: $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
158     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
159     ; GCN-NEXT: S_ENDPGM 0
160     $vgpr1, $vcc = V_ADDC_U32_e64 0, $vgpr1, $sgpr2_sgpr3, 0, implicit $exec
161     $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
162     S_ENDPGM 0
166 name:            mask_hazard_addc2
167 body:            |
168   bb.0:
169     ; GCN-LABEL: name: mask_hazard_addc2
170     ; GCN: $vgpr1 = V_ADDC_U32_e32 0, $vgpr1, implicit-def $vcc, implicit $vcc, implicit $exec
171     ; GCN-NEXT: $vcc = S_CSELECT_B64 -1, 0, implicit $scc
172     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
173     ; GCN-NEXT: S_ENDPGM 0
174     $vgpr1 = V_ADDC_U32_e32 0, $vgpr1, implicit-def $vcc, implicit $vcc, implicit $exec
175     $vcc = S_CSELECT_B64 -1, 0, implicit $scc
176     S_ENDPGM 0
180 name:            mask_hazard_addc3
181 body:            |
182   bb.0:
183     ; GCN-LABEL: name: mask_hazard_addc3
184     ; GCN: $vgpr0 = V_ADDC_U32_dpp $vgpr0, $vgpr1, $vgpr2, 1, 15, 15, 1, implicit-def $vcc, implicit $vcc, implicit $exec
185     ; GCN-NEXT: $vcc = S_CSELECT_B64 -1, 0, implicit $scc
186     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
187     ; GCN-NEXT: S_ENDPGM 0
188     $vgpr0 = V_ADDC_U32_dpp $vgpr0, $vgpr1, $vgpr2, 1, 15, 15, 1, implicit-def $vcc, implicit $vcc, implicit $exec
189     $vcc = S_CSELECT_B64 -1, 0, implicit $scc
190     S_ENDPGM 0
194 name:            mask_hazard_addc4
195 body:            |
196   bb.0:
197     ; GCN-LABEL: name: mask_hazard_addc4
198     ; GCN: $vgpr0, $sgpr2_sgpr3 = V_ADDC_U32_e64_dpp $vgpr0, $vgpr1, $vgpr2, $sgpr2_sgpr3, 0, 1, 15, 15, 1, implicit $exec
199     ; GCN-NEXT: $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
200     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
201     ; GCN-NEXT: S_ENDPGM 0
202     $vgpr0, $sgpr2_sgpr3 = V_ADDC_U32_e64_dpp $vgpr0, $vgpr1, $vgpr2, $sgpr2_sgpr3, 0, 1, 15, 15, 1, implicit $exec
203     $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
204     S_ENDPGM 0
208 name:            mask_hazard_subb1
209 body:            |
210   bb.0:
211     ; GCN-LABEL: name: mask_hazard_subb1
212     ; GCN: $vgpr1, $vcc = V_SUBB_U32_e64 0, $vgpr1, $sgpr2_sgpr3, 0, implicit $exec
213     ; GCN-NEXT: $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
214     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
215     ; GCN-NEXT: S_ENDPGM 0
216     $vgpr1, $vcc = V_SUBB_U32_e64 0, $vgpr1, $sgpr2_sgpr3, 0, implicit $exec
217     $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
218     S_ENDPGM 0
222 name:            mask_hazard_subb2
223 body:            |
224   bb.0:
225     ; GCN-LABEL: name: mask_hazard_subb2
226     ; GCN: $vgpr1 = V_SUBB_U32_e32 0, $vgpr1, implicit-def $vcc, implicit $vcc, implicit $exec
227     ; GCN-NEXT: $vcc = S_CSELECT_B64 -1, 0, implicit $scc
228     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
229     ; GCN-NEXT: S_ENDPGM 0
230     $vgpr1 = V_SUBB_U32_e32 0, $vgpr1, implicit-def $vcc, implicit $vcc, implicit $exec
231     $vcc = S_CSELECT_B64 -1, 0, implicit $scc
232     S_ENDPGM 0
236 name:            mask_hazard_subb3
237 body:            |
238   bb.0:
239     ; GCN-LABEL: name: mask_hazard_subb3
240     ; GCN: $vgpr0 = V_SUBB_U32_dpp $vgpr0, $vgpr1, $vgpr2, 1, 15, 15, 1, implicit-def $vcc, implicit $vcc, implicit $exec
241     ; GCN-NEXT: $vcc = S_CSELECT_B64 -1, 0, implicit $scc
242     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
243     ; GCN-NEXT: S_ENDPGM 0
244     $vgpr0 = V_SUBB_U32_dpp $vgpr0, $vgpr1, $vgpr2, 1, 15, 15, 1, implicit-def $vcc, implicit $vcc, implicit $exec
245     $vcc = S_CSELECT_B64 -1, 0, implicit $scc
246     S_ENDPGM 0
250 name:            mask_hazard_subb4
251 body:            |
252   bb.0:
253     ; GCN-LABEL: name: mask_hazard_subb4
254     ; GCN: $vgpr0, $sgpr2_sgpr3 = V_SUBB_U32_e64_dpp $vgpr0, $vgpr1, $vgpr2, $sgpr2_sgpr3, 0, 1, 15, 15, 1, implicit $exec
255     ; GCN-NEXT: $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
256     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
257     ; GCN-NEXT: S_ENDPGM 0
258     $vgpr0, $sgpr2_sgpr3 = V_SUBB_U32_e64_dpp $vgpr0, $vgpr1, $vgpr2, $sgpr2_sgpr3, 0, 1, 15, 15, 1, implicit $exec
259     $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
260     S_ENDPGM 0
264 name:            mask_hazard_subbrev1
265 body:            |
266   bb.0:
267     ; GCN-LABEL: name: mask_hazard_subbrev1
268     ; GCN: $vgpr1, $vcc = V_SUBBREV_U32_e64 0, $vgpr1, $sgpr2_sgpr3, 0, implicit $exec
269     ; GCN-NEXT: $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
270     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
271     ; GCN-NEXT: S_ENDPGM 0
272     $vgpr1, $vcc = V_SUBBREV_U32_e64 0, $vgpr1, $sgpr2_sgpr3, 0, implicit $exec
273     $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
274     S_ENDPGM 0
278 name:            mask_hazard_subbrev2
279 body:            |
280   bb.0:
281     ; GCN-LABEL: name: mask_hazard_subbrev2
282     ; GCN: $vgpr1 = V_SUBBREV_U32_e32 0, $vgpr1, implicit-def $vcc, implicit $vcc, implicit $exec
283     ; GCN-NEXT: $vcc = S_CSELECT_B64 -1, 0, implicit $scc
284     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
285     ; GCN-NEXT: S_ENDPGM 0
286     $vgpr1 = V_SUBBREV_U32_e32 0, $vgpr1, implicit-def $vcc, implicit $vcc, implicit $exec
287     $vcc = S_CSELECT_B64 -1, 0, implicit $scc
288     S_ENDPGM 0
292 name:            mask_hazard_subbrev3
293 body:            |
294   bb.0:
295     ; GCN-LABEL: name: mask_hazard_subbrev3
296     ; GCN: $vgpr0 = V_SUBBREV_U32_dpp $vgpr0, $vgpr1, $vgpr2, 1, 15, 15, 1, implicit-def $vcc, implicit $vcc, implicit $exec
297     ; GCN-NEXT: $vcc = S_CSELECT_B64 -1, 0, implicit $scc
298     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
299     ; GCN-NEXT: S_ENDPGM 0
300     $vgpr0 = V_SUBBREV_U32_dpp $vgpr0, $vgpr1, $vgpr2, 1, 15, 15, 1, implicit-def $vcc, implicit $vcc, implicit $exec
301     $vcc = S_CSELECT_B64 -1, 0, implicit $scc
302     S_ENDPGM 0
306 name:            mask_hazard_subbrev4
307 body:            |
308   bb.0:
309     ; GCN-LABEL: name: mask_hazard_subbrev4
310     ; GCN: $vgpr0, $sgpr2_sgpr3 = V_SUBBREV_U32_e64_dpp $vgpr0, $vgpr1, $vgpr2, $sgpr2_sgpr3, 0, 1, 15, 15, 1, implicit $exec
311     ; GCN-NEXT: $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
312     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
313     ; GCN-NEXT: S_ENDPGM 0
314     $vgpr0, $sgpr2_sgpr3 = V_SUBBREV_U32_e64_dpp $vgpr0, $vgpr1, $vgpr2, $sgpr2_sgpr3, 0, 1, 15, 15, 1, implicit $exec
315     $sgpr2_sgpr3 = S_CSELECT_B64 -1, 0, implicit $scc
316     S_ENDPGM 0
320 name:            mask_hazard_div_fmas_f32
321 body:            |
322   bb.0:
323     ; GCN-LABEL: name: mask_hazard_div_fmas_f32
324     ; GCN: $vgpr0 = V_DIV_FMAS_F32_e64 0, $vgpr1, 0, $vgpr2, 0, $vgpr3, 0, 0, implicit $mode, implicit $vcc, implicit $exec
325     ; GCN-NEXT: $vcc = S_CSELECT_B64 -1, 0, implicit $scc
326     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
327     ; GCN-NEXT: S_ENDPGM 0
328     $vgpr0 = V_DIV_FMAS_F32_e64 0, $vgpr1, 0, $vgpr2, 0, $vgpr3, 0, 0, implicit $mode, implicit $vcc, implicit $exec
329     $vcc = S_CSELECT_B64 -1, 0, implicit $scc
330     S_ENDPGM 0
334 name:            mask_hazard_div_fmas_f64
335 body:            |
336   bb.0:
337     ; GCN-LABEL: name: mask_hazard_div_fmas_f64
338     ; GCN: $vgpr0_vgpr1 = V_DIV_FMAS_F64_e64 0, $vgpr0_vgpr1, 0, $vgpr2_vgpr3, 0, $vgpr4_vgpr5, 0, 0, implicit $mode, implicit $vcc, implicit $exec
339     ; GCN-NEXT: $vcc = S_CSELECT_B64 -1, 0, implicit $scc
340     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
341     ; GCN-NEXT: S_ENDPGM 0
342     $vgpr0_vgpr1 = V_DIV_FMAS_F64_e64 0, $vgpr0_vgpr1, 0, $vgpr2_vgpr3, 0, $vgpr4_vgpr5, 0, 0, implicit $mode, implicit $vcc, implicit $exec
343     $vcc = S_CSELECT_B64 -1, 0, implicit $scc
344     S_ENDPGM 0
347 # Check low word overlap
349 name:            mask_hazard_subreg1
350 body:            |
351   bb.0:
352     ; GCN-LABEL: name: mask_hazard_subreg1
353     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, implicit $exec
354     ; GCN-NEXT: $sgpr2 = S_MOV_B32 0
355     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
356     ; GCN-NEXT: S_ENDPGM 0
357     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, implicit $exec
358     $sgpr2 = S_MOV_B32 0
359     S_ENDPGM 0
362 # Check high word overlap
364 name:            mask_hazard_subreg2
365 body:            |
366   bb.0:
367     ; GCN-LABEL: name: mask_hazard_subreg2
368     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, implicit $exec
369     ; GCN-NEXT: $sgpr3 = S_MOV_B32 0
370     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
371     ; GCN-NEXT: S_ENDPGM 0
372     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, implicit $exec
373     $sgpr3 = S_MOV_B32 0
374     S_ENDPGM 0
377 # Check multiple subreg overlap
379 name:            mask_hazard_subreg3
380 body:            |
381   bb.0:
382     ; GCN-LABEL: name: mask_hazard_subreg3
383     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, implicit $exec
384     ; GCN-NEXT: $sgpr2 = S_MOV_B32 0
385     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
386     ; GCN-NEXT: $sgpr3 = S_MOV_B32 0
387     ; GCN-NEXT: S_ENDPGM 0
388     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, implicit $exec
389     $sgpr2 = S_MOV_B32 0
390     $sgpr3 = S_MOV_B32 0
391     S_ENDPGM 0
394 # Check vcc_lo overlap
396 name:            mask_hazard_subreg4
397 body:            |
398   bb.0:
399     ; GCN-LABEL: name: mask_hazard_subreg4
400     ; GCN: $vgpr1 = V_CNDMASK_B32_e32 $vgpr1, $vgpr2, implicit $vcc, implicit $exec
401     ; GCN-NEXT: $vcc_lo = S_MOV_B32 0
402     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
403     ; GCN-NEXT: $sgpr2 = S_MOV_B32 $vcc_lo
404     ; GCN-NEXT: S_ENDPGM 0
405     $vgpr1 = V_CNDMASK_B32_e32 $vgpr1, $vgpr2, implicit $vcc, implicit $exec
406     $vcc_lo = S_MOV_B32 0
407     $sgpr2 = S_MOV_B32 $vcc_lo
408     S_ENDPGM 0
411 # Check vcc_hi overlap
413 name:            mask_hazard_subreg5
414 body:            |
415   bb.0:
416     ; GCN-LABEL: name: mask_hazard_subreg5
417     ; GCN: $vgpr1 = V_CNDMASK_B32_e32 $vgpr1, $vgpr2, implicit $vcc, implicit $exec
418     ; GCN-NEXT: $vcc_hi = S_MOV_B32 0
419     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
420     ; GCN-NEXT: $sgpr2 = S_MOV_B32 $vcc_hi
421     ; GCN-NEXT: S_ENDPGM 0
422     $vgpr1 = V_CNDMASK_B32_e32 $vgpr1, $vgpr2, implicit $vcc, implicit $exec
423     $vcc_hi = S_MOV_B32 0
424     $sgpr2 = S_MOV_B32 $vcc_hi
425     S_ENDPGM 0
428 # S_WAITCNT does not mitigate hazard
430 name:            mask_hazard_waitcnt
431 body:            |
432   bb.0:
433     ; GCN-LABEL: name: mask_hazard_waitcnt
434     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
435     ; GCN-NEXT: S_WAITCNT 0
436     ; GCN-NEXT: $sgpr0_sgpr1 = S_GETPC_B64
437     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
438     ; GCN-NEXT: $sgpr0 = S_ADD_U32 $sgpr0, 0, implicit-def $scc
439     ; GCN-NEXT: S_ENDPGM 0
440     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
441     S_WAITCNT 0
442     $sgpr0_sgpr1 = S_GETPC_B64
443     $sgpr0 = S_ADD_U32 $sgpr0, 0, implicit-def $scc
444     S_ENDPGM 0
447 # Check implicit $exec
449 name:            mask_hazard_gap1
450 body:            |
451   bb.0:
452     ; GCN-LABEL: name: mask_hazard_gap1
453     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
454     ; GCN-NEXT: $vgpr2 = V_MOV_B32_e32 0, implicit $exec
455     ; GCN-NEXT: $vgpr3 = V_MOV_B32_e32 0, implicit $exec
456     ; GCN-NEXT: $sgpr0_sgpr1 = S_GETPC_B64
457     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
458     ; GCN-NEXT: $sgpr0 = S_ADD_U32 $sgpr0, 0, implicit-def $scc
459     ; GCN-NEXT: S_ENDPGM 0
460     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
461     $vgpr2 = V_MOV_B32_e32 0, implicit $exec
462     $vgpr3 = V_MOV_B32_e32 0, implicit $exec
463     $sgpr0_sgpr1 = S_GETPC_B64
464     $sgpr0 = S_ADD_U32 $sgpr0, 0, implicit-def $scc
465     S_ENDPGM 0
468 # Check implicit $mode
470 name:            mask_hazard_gap2
471 body:            |
472   bb.0:
473     ; GCN-LABEL: name: mask_hazard_gap2
474     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
475     ; GCN-NEXT: $vgpr2 = V_MOV_B32_e32 0, implicit $exec, implicit $mode
476     ; GCN-NEXT: $sgpr0_sgpr1 = S_GETPC_B64
477     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
478     ; GCN-NEXT: $sgpr0 = S_ADD_U32 $sgpr0, 0, implicit-def $scc
479     ; GCN-NEXT: S_ENDPGM 0
480     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
481     $vgpr2 = V_MOV_B32_e32 0, implicit $exec, implicit $mode
482     $sgpr0_sgpr1 = S_GETPC_B64
483     $sgpr0 = S_ADD_U32 $sgpr0, 0, implicit-def $scc
484     S_ENDPGM 0
487 # Check explicit $exec
489 name:            mask_hazard_gap3
490 body:            |
491   bb.0:
492     ; GCN-LABEL: name: mask_hazard_gap3
493     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
494     ; GCN-NEXT: $vgpr2 = V_WRITELANE_B32 $exec_lo, 0, $vgpr2
495     ; GCN-NEXT: $sgpr0_sgpr1 = S_GETPC_B64
496     ; GCN-NEXT: S_WAITCNT_DEPCTR 65534
497     ; GCN-NEXT: $sgpr0 = S_ADD_U32 $sgpr0, 0, implicit-def $scc
498     ; GCN-NEXT: S_ENDPGM 0
499     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr0_sgpr1, implicit $exec
500     $vgpr2 = V_WRITELANE_B32 $exec_lo, 0, $vgpr2
501     $sgpr0_sgpr1 = S_GETPC_B64
502     $sgpr0 = S_ADD_U32 $sgpr0, 0, implicit-def $scc
503     S_ENDPGM 0
506 # Different SGPR write
508 name:            mask_hazard_no_hazard1
509 body:            |
510   bb.0:
511     ; GCN-LABEL: name: mask_hazard_no_hazard1
512     ; GCN: $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, implicit $exec
513     ; GCN-NEXT: $sgpr0 = S_MOV_B32 0
514     ; GCN-NEXT: S_ENDPGM 0
515     $vgpr1 = V_CNDMASK_B32_e64 0, $vgpr1, 0, $vgpr2, $sgpr2_sgpr3, implicit $exec
516     $sgpr0 = S_MOV_B32 0
517     S_ENDPGM 0
520 # Different SGPR write with mask read overlap
522 name:            mask_hazard_no_hazard2
523 body:            |
524   bb.0:
525     ; GCN-LABEL: name: mask_hazard_no_hazard2
526     ; GCN: $vgpr1 = V_CNDMASK_B32_e32 $vgpr1, $vgpr2, implicit $vcc, implicit $exec
527     ; GCN-NEXT: $sgpr0_sgpr1 = S_MOV_B64 $vcc
528     ; GCN-NEXT: S_ENDPGM 0
529     $vgpr1 = V_CNDMASK_B32_e32 $vgpr1, $vgpr2, implicit $vcc, implicit $exec
530     $sgpr0_sgpr1 = S_MOV_B64 $vcc
531     S_ENDPGM 0
534 # Overlapping VGPR write
536 name:            mask_hazard_no_hazard3
537 body:            |
538   bb.0:
539     ; GCN-LABEL: name: mask_hazard_no_hazard3
540     ; GCN: $vgpr1 = V_CNDMASK_B32_e32 $vgpr1, $vgpr2, implicit $vcc, implicit $exec
541     ; GCN-NEXT: $vgpr2 = V_MOV_B32_e32 0, implicit $exec
542     ; GCN-NEXT: S_ENDPGM 0
543     $vgpr1 = V_CNDMASK_B32_e32 $vgpr1, $vgpr2, implicit $vcc, implicit $exec
544     $vgpr2 = V_MOV_B32_e32 0, implicit $exec
545     S_ENDPGM 0