1# RUN: llc -march=amdgcn -mcpu=gfx1010 -verify-machineinstrs -run-pass=si-optimize-exec-masking-pre-ra -o - %s | FileCheck -check-prefix=GCN %s
2# RUN: llc -march=amdgcn -mcpu=gfx1100 -verify-machineinstrs -run-pass=si-optimize-exec-masking-pre-ra -o - %s | FileCheck -check-prefix=GCN %s
3
4# GCN: name: negated_cond_vop2
5# GCN:      %0:sgpr_32 = IMPLICIT_DEF
6# GCN-NEXT: $vcc_lo = S_ANDN2_B32 $exec_lo, %0, implicit-def dead $scc
7# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
8---
9name:            negated_cond_vop2
10body:             |
11  bb.0:
12    %0:sgpr_32 = IMPLICIT_DEF
13    %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
14    V_CMP_NE_U32_e32 1, %1, implicit-def $vcc, implicit $exec
15    $vcc_lo = S_AND_B32 $exec_lo, killed $vcc_lo, implicit-def dead $scc
16    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
17    S_BRANCH %bb.1
18
19  bb.1:
20    S_BRANCH %bb.2
21
22  bb.2:
23    S_ENDPGM 0
24...
25
26# GCN: name: negated_cond_vop3
27# GCN:      %0:sgpr_32 = IMPLICIT_DEF
28# GCN-NEXT: $vcc_lo = S_ANDN2_B32 $exec_lo, %0, implicit-def dead $scc
29# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
30---
31name:            negated_cond_vop3
32body:             |
33  bb.0:
34    %0:sgpr_32 = IMPLICIT_DEF
35    %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
36    %2:sgpr_32 = V_CMP_NE_U32_e64 %1, 1, implicit $exec
37    $vcc_lo = S_AND_B32 killed %2, $exec_lo, implicit-def dead $scc
38    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
39    S_BRANCH %bb.1
40
41  bb.1:
42    S_BRANCH %bb.2
43
44  bb.2:
45    S_ENDPGM 0
46...
47
48# GCN: name: negated_cond_vop2_redef_vcc1
49# GCN:      %0:sgpr_32 = IMPLICIT_DEF
50# GCN-NEXT: %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
51# GCN-NEXT: V_CMP_NE_U32_e32 1, %1, implicit-def $vcc, implicit $exec
52# GCN-NEXT: $vcc_lo = COPY $sgpr0
53# GCN-NEXT: $vcc_lo = S_AND_B32 $exec_lo, $vcc_lo, implicit-def dead $scc
54# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
55---
56name:            negated_cond_vop2_redef_vcc1
57body:             |
58  bb.0:
59    %0:sgpr_32 = IMPLICIT_DEF
60    %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
61    V_CMP_NE_U32_e32 1, %1, implicit-def $vcc, implicit $exec
62    $vcc_lo = COPY $sgpr0
63    $vcc_lo = S_AND_B32 $exec_lo, killed $vcc_lo, implicit-def dead $scc
64    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
65    S_BRANCH %bb.1
66
67  bb.1:
68    S_BRANCH %bb.2
69
70  bb.2:
71    S_ENDPGM 0
72...
73
74# GCN: name: negated_cond_vop3_redef_cmp
75# GCN:      %0:sgpr_32 = IMPLICIT_DEF
76# GCN-NEXT: %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
77# GCN-NEXT: %2:sgpr_32 = V_CMP_NE_U32_e64 %1, 1, implicit $exec
78# GCN-NEXT: %2:sgpr_32 = COPY $sgpr0
79# GCN-NEXT: $vcc_lo = S_AND_B32 %2, $exec_lo, implicit-def dead $scc
80# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
81---
82name:            negated_cond_vop3_redef_cmp
83body:             |
84  bb.0:
85    %0:sgpr_32 = IMPLICIT_DEF
86    %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
87    %2:sgpr_32 = V_CMP_NE_U32_e64 %1, 1, implicit $exec
88    %2 = COPY $sgpr0
89    $vcc_lo = S_AND_B32 killed %2, $exec_lo, implicit-def dead $scc
90    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
91    S_BRANCH %bb.1
92
93  bb.1:
94    S_BRANCH %bb.2
95
96  bb.2:
97    S_ENDPGM 0
98...
99
100# GCN: name: negated_cond_undef_vcc
101# GCN:      $vcc_lo = S_AND_B32 $exec_lo, undef $vcc_lo, implicit-def dead $scc
102# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
103---
104name:            negated_cond_undef_vcc
105body:             |
106  bb.0:
107    $vcc_lo = S_AND_B32 $exec_lo, undef $vcc_lo, implicit-def dead $scc
108    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
109    S_BRANCH %bb.1
110
111  bb.1:
112    S_BRANCH %bb.2
113
114  bb.2:
115    S_ENDPGM 0
116...
117
118# GCN: name: negated_cond_vop3_imp_vcc
119# GCN:      $vcc_lo = IMPLICIT_DEF
120# GCN-NEXT: $vcc_lo = S_ANDN2_B32 $exec_lo, $vcc_lo, implicit-def dead $scc
121# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
122---
123name:            negated_cond_vop3_imp_vcc
124body:             |
125  bb.0:
126    $vcc_lo = IMPLICIT_DEF
127    %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, $vcc_lo, implicit $exec
128    %2:sgpr_32 = V_CMP_NE_U32_e64 %1, 1, implicit $exec
129    $vcc_lo = S_AND_B32 killed %2, $exec_lo, implicit-def dead $scc
130    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
131    S_BRANCH %bb.1
132
133  bb.1:
134    S_BRANCH %bb.2
135
136  bb.2:
137    S_ENDPGM 0
138...
139
140# GCN: name: negated_cond_vop2_imp_vcc
141# GCN:      $vcc_lo = IMPLICIT_DEF
142# GCN-NEXT: $vcc_lo = S_ANDN2_B32 $exec_lo, $vcc_lo, implicit-def dead $scc
143# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
144---
145name:            negated_cond_vop2_imp_vcc
146body:             |
147  bb.0:
148    $vcc_lo = IMPLICIT_DEF
149    %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, $vcc_lo, implicit $exec
150    V_CMP_NE_U32_e32 1, %1, implicit-def $vcc, implicit $exec
151    $vcc_lo = S_AND_B32 killed $vcc_lo, $exec_lo, implicit-def dead $scc
152    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
153    S_BRANCH %bb.1
154
155  bb.1:
156    S_BRANCH %bb.2
157
158  bb.2:
159    S_ENDPGM 0
160...
161
162# GCN: name: negated_cond_vop3_redef_sel
163# GCN:      %0:sgpr_32 = IMPLICIT_DEF
164# GCN-NEXT: %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
165# GCN-NEXT: %1:vgpr_32 = COPY $vgpr0
166# GCN-NEXT: %2:sgpr_32 = V_CMP_NE_U32_e64 %1, 1, implicit $exec
167# GCN-NEXT: $vcc_lo = S_AND_B32 %2, $exec_lo, implicit-def dead $scc
168# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
169---
170name:            negated_cond_vop3_redef_sel
171body:             |
172  bb.0:
173    %0:sgpr_32 = IMPLICIT_DEF
174    %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
175    %1:vgpr_32 = COPY $vgpr0
176    %2:sgpr_32 = V_CMP_NE_U32_e64 %1, 1, implicit $exec
177    $vcc_lo = S_AND_B32 killed %2, $exec_lo, implicit-def dead $scc
178    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
179    S_BRANCH %bb.1
180
181  bb.1:
182    S_BRANCH %bb.2
183
184  bb.2:
185    S_ENDPGM 0
186...
187
188# GCN: name: negated_cond_vop2_used_sel
189# GCN:      %0:sgpr_32 = IMPLICIT_DEF
190# GCN-NEXT: %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
191# GCN-NEXT: $vcc_lo = S_ANDN2_B32 $exec_lo, %0, implicit-def dead $scc
192# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
193---
194name:            negated_cond_vop2_used_sel
195body:             |
196  bb.0:
197    %0:sgpr_32 = IMPLICIT_DEF
198    %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
199    V_CMP_NE_U32_e32 1, %1, implicit-def $vcc, implicit $exec
200    $vcc_lo = S_AND_B32 $exec_lo, killed $vcc_lo, implicit-def dead $scc
201    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
202    S_BRANCH %bb.1
203
204  bb.1:
205    S_BRANCH %bb.2
206
207  bb.2:
208    $vgpr0 = COPY %1
209    S_ENDPGM 0, implicit $vgpr0
210...
211
212# GCN: name: negated_cond_vop2_used_vcc
213# GCN:      %0:sgpr_32 = IMPLICIT_DEF
214# GCN-NEXT: %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
215# GCN-NEXT: V_CMP_NE_U32_e32 1, %1, implicit-def $vcc, implicit $exec
216# GCN-NEXT: $sgpr0_sgpr1 = COPY $vcc
217# GCN-NEXT: $vcc_lo = S_ANDN2_B32 $exec_lo, %0, implicit-def dead $scc
218# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
219---
220name:            negated_cond_vop2_used_vcc
221body:             |
222  bb.0:
223    %0:sgpr_32 = IMPLICIT_DEF
224    %1:vgpr_32 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
225    V_CMP_NE_U32_e32 1, %1, implicit-def $vcc, implicit $exec
226    $sgpr0_sgpr1 = COPY $vcc
227    $vcc_lo = S_AND_B32 $exec_lo, killed $vcc_lo, implicit-def dead $scc
228    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
229    S_BRANCH %bb.1
230
231  bb.1:
232    S_BRANCH %bb.2
233
234  bb.2:
235    S_ENDPGM 0
236...
237
238# GCN: name: negated_cond_vop3_sel_wrong_subreg1
239# GCN:      %0:sgpr_32 = IMPLICIT_DEF
240# GCN-NEXT: %1.sub1:vreg_64 = IMPLICIT_DEF
241# GCN-NEXT: %1.sub0:vreg_64 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
242# GCN-NEXT: %2:sgpr_32 = V_CMP_NE_U32_e64 %1.sub1, 1, implicit $exec
243# GCN-NEXT: $vcc_lo = S_AND_B32 %2, $exec_lo, implicit-def dead $scc
244# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
245---
246name:            negated_cond_vop3_sel_wrong_subreg1
247body:             |
248  bb.0:
249    %0:sgpr_32 = IMPLICIT_DEF
250    undef %1.sub1 = IMPLICIT_DEF
251    %1.sub0:vreg_64 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
252    %2:sgpr_32 = V_CMP_NE_U32_e64 %1.sub1, 1, implicit $exec
253    $vcc_lo = S_AND_B32 killed %2, $exec_lo, implicit-def dead $scc
254    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
255    S_BRANCH %bb.1
256
257  bb.1:
258    S_BRANCH %bb.2
259
260  bb.2:
261    S_ENDPGM 0
262...
263
264# GCN: name: negated_cond_vop3_sel_wrong_subreg2
265# GCN:      %0:sgpr_32 = IMPLICIT_DEF
266# GCN-NEXT: %1.sub0:vreg_64 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
267# GCN-NEXT: %1.sub1:vreg_64 = IMPLICIT_DEF
268# GCN-NEXT: %2:sgpr_32 = V_CMP_NE_U32_e64 %1.sub1, 1, implicit $exec
269# GCN-NEXT: $vcc_lo = S_AND_B32 %2, $exec_lo, implicit-def dead $scc
270# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
271---
272name:            negated_cond_vop3_sel_wrong_subreg2
273body:             |
274  bb.0:
275    %0:sgpr_32 = IMPLICIT_DEF
276    undef %1.sub0:vreg_64 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
277    %1.sub1 = IMPLICIT_DEF
278    %2:sgpr_32 = V_CMP_NE_U32_e64 %1.sub1, 1, implicit $exec
279    $vcc_lo = S_AND_B32 killed %2, $exec_lo, implicit-def dead $scc
280    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
281    S_BRANCH %bb.1
282
283  bb.1:
284    S_BRANCH %bb.2
285
286  bb.2:
287    S_ENDPGM 0
288...
289
290# GCN: name: negated_cond_vop3_sel_right_subreg1
291# GCN:      %0:sgpr_32 = IMPLICIT_DEF
292# GCN-NEXT: %1.sub1:vreg_64 = IMPLICIT_DEF
293# GCN-NEXT: $vcc_lo = S_ANDN2_B32 $exec_lo, %0, implicit-def dead $scc
294# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
295---
296name:            negated_cond_vop3_sel_right_subreg1
297body:             |
298  bb.0:
299    %0:sgpr_32 = IMPLICIT_DEF
300    undef %1.sub1 = IMPLICIT_DEF
301    %1.sub0:vreg_64 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
302    %2:sgpr_32 = V_CMP_NE_U32_e64 %1.sub0, 1, implicit $exec
303    $vcc_lo = S_AND_B32 killed %2, $exec_lo, implicit-def dead $scc
304    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
305    S_BRANCH %bb.1
306
307  bb.1:
308    S_BRANCH %bb.2
309
310  bb.2:
311    S_ENDPGM 0
312...
313
314# GCN: name: negated_cond_vop3_sel_right_subreg2
315# GCN:      %0:sgpr_32 = IMPLICIT_DEF
316# GCN-NEXT: %1.sub1:vreg_64 = IMPLICIT_DEF
317# GCN-NEXT: $vcc_lo = S_ANDN2_B32 $exec_lo, %0, implicit-def dead $scc
318# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
319---
320name:            negated_cond_vop3_sel_right_subreg2
321body:             |
322  bb.0:
323    %0:sgpr_32 = IMPLICIT_DEF
324    undef %1.sub0:vreg_64 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
325    %1.sub1 = IMPLICIT_DEF
326    %2:sgpr_32 = V_CMP_NE_U32_e64 %1.sub0, 1, implicit $exec
327    $vcc_lo = S_AND_B32 killed %2, $exec_lo, implicit-def dead $scc
328    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
329    S_BRANCH %bb.1
330
331  bb.1:
332    S_BRANCH %bb.2
333
334  bb.2:
335    S_ENDPGM 0
336...
337
338# GCN: name: negated_cond_vop3_sel_subreg_overlap
339# GCN:      %0:sgpr_32 = IMPLICIT_DEF
340# GCN-NEXT: %1.sub2:vreg_128 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
341# GCN-NEXT: %1.sub2_sub3:vreg_128 = IMPLICIT_DEF
342# GCN-NEXT: %2:sgpr_32 = V_CMP_NE_U32_e64 %1.sub2, 1, implicit $exec
343# GCN-NEXT: $vcc_lo = S_AND_B32 %2, $exec_lo, implicit-def dead $scc
344# GCN-NEXT: S_CBRANCH_VCCNZ %bb.2, implicit $vcc
345---
346name:            negated_cond_vop3_sel_subreg_overlap
347body:             |
348  bb.0:
349    %0:sgpr_32 = IMPLICIT_DEF
350    undef %1.sub2:vreg_128 = V_CNDMASK_B32_e64 0, 0, 0, 1, %0, implicit $exec
351    %1.sub2_sub3 = IMPLICIT_DEF
352    %2:sgpr_32 = V_CMP_NE_U32_e64 %1.sub2, 1, implicit $exec
353    $vcc_lo = S_AND_B32 killed %2, $exec_lo, implicit-def dead $scc
354    S_CBRANCH_VCCNZ %bb.2, implicit killed $vcc
355    S_BRANCH %bb.1
356
357  bb.1:
358    S_BRANCH %bb.2
359
360  bb.2:
361    S_ENDPGM 0
362...
363