1# RUN: llc -march=amdgcn -mcpu=fiji -run-pass si-pre-emit-peephole -verify-machineinstrs -o - %s | FileCheck -check-prefix=GCN %s
2# RUN: llc -march=amdgcn -mcpu=gfx1010 -run-pass si-pre-emit-peephole -verify-machineinstrs -o - %s | FileCheck -check-prefix=W32 %s
3
4---
5# GCN-LABEL: name: and_execz_mov_vccz
6# GCN-NOT: S_MOV_
7# GCN-NOT: S_AND_
8# GCN: S_CBRANCH_EXECZ %bb.1, implicit $exec
9name:            and_execz_mov_vccz
10body:             |
11  bb.0:
12    S_NOP 0
13
14  bb.1:
15    S_NOP 0
16
17  bb.2:
18    $sgpr0_sgpr1 = S_MOV_B64 -1
19    $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
20    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
21    S_ENDPGM 0
22...
23---
24# GCN-LABEL: name: and_execz_imm_vccz
25# GCN-NOT: S_AND_
26# GCN: S_CBRANCH_EXECZ %bb.1, implicit $exec
27name:            and_execz_imm_vccz
28body:             |
29  bb.0:
30    S_NOP 0
31
32  bb.1:
33    S_NOP 0
34
35  bb.2:
36    $vcc = S_AND_B64 $exec, -1, implicit-def dead $scc
37    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
38    S_ENDPGM 0
39...
40---
41# GCN-LABEL: name: and_execnz_imm_vccnz
42# GCN-NOT: S_AND_
43# GCN: S_CBRANCH_EXECNZ %bb.1, implicit $exec
44name:            and_execnz_imm_vccnz
45body:             |
46  bb.0:
47    S_NOP 0
48
49  bb.1:
50    S_NOP 0
51
52  bb.2:
53    $vcc = S_AND_B64 $exec, -1, implicit-def dead $scc
54    S_CBRANCH_VCCNZ %bb.1, implicit killed $vcc
55    S_ENDPGM 0
56...
57---
58# GCN-LABEL: name: and_execz_imm_vccz_live_scc
59# GCN: $vcc = S_AND_B64 $exec, -1, implicit-def $scc
60# GCN: S_CBRANCH_EXECZ %bb.1, implicit $exec
61name:            and_execz_imm_vccz_live_scc
62body:             |
63  bb.0:
64    S_NOP 0
65
66  bb.1:
67    S_NOP 0
68
69  bb.2:
70    $vcc = S_AND_B64 $exec, -1, implicit-def $scc
71    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
72    S_ENDPGM 0
73...
74---
75# GCN-LABEL: name: and_execz_mov_vccz_live_scc
76# GCN-NOT: S_MOV_
77# GCN: $vcc = S_AND_B64 $exec, -1, implicit-def $scc
78# GCN: S_CBRANCH_EXECZ %bb.1, implicit $exec
79name:            and_execz_mov_vccz_live_scc
80body:             |
81  bb.0:
82    S_NOP 0
83
84  bb.1:
85    S_NOP 0
86
87  bb.2:
88    $sgpr0_sgpr1 = S_MOV_B64 -1
89    $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc
90    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
91    S_ENDPGM 0
92...
93---
94# GCN-LABEL: name: and_execz_mov_vccz_live_sreg
95# GCN:      $sgpr0_sgpr1 = S_MOV_B64 -1
96# GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec
97name:            and_execz_mov_vccz_live_sreg
98body:             |
99  bb.0:
100    S_NOP 0
101
102  bb.1:
103    S_NOP 0
104
105  bb.2:
106    $sgpr0_sgpr1 = S_MOV_B64 -1
107    $vcc = S_AND_B64 $exec, $sgpr0_sgpr1, implicit-def dead $scc
108    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
109    S_ENDPGM 0
110...
111---
112# GCN-LABEL: name: and_execz_mov_vccz_live_sreg_commute
113# GCN:      $sgpr0_sgpr1 = S_MOV_B64 -1
114# GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec
115name:            and_execz_mov_vccz_live_sreg_commute
116body:             |
117  bb.0:
118    S_NOP 0
119
120  bb.1:
121    S_NOP 0
122
123  bb.2:
124    $sgpr0_sgpr1 = S_MOV_B64 -1
125    $vcc = S_AND_B64 $sgpr0_sgpr1, $exec, implicit-def dead $scc
126    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
127    S_ENDPGM 0
128...
129---
130# GCN-LABEL: name: and_execz_mov_vccz_live_scc_commute
131# GCN-NOT: S_MOV_
132# GCN: $vcc = S_AND_B64 $exec, -1, implicit-def $scc
133# GCN: S_CBRANCH_EXECZ %bb.1, implicit $exec
134name:            and_execz_mov_vccz_live_scc_commute
135body:             |
136  bb.0:
137    S_NOP 0
138
139  bb.1:
140    S_NOP 0
141
142  bb.2:
143    $sgpr0_sgpr1 = S_MOV_B64 -1
144    $vcc = S_AND_B64 killed $sgpr0_sgpr1, $exec, implicit-def $scc
145    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
146    S_ENDPGM 0
147...
148---
149# GCN-LABEL: name: and_execz_mov_vccz_commute
150# GCN-NOT: S_MOV_
151# GCN-NOT: S_AND_
152# GCN: S_CBRANCH_EXECZ %bb.1, implicit $exec
153name:            and_execz_mov_vccz_commute
154body:             |
155  bb.0:
156    S_NOP 0
157
158  bb.1:
159    S_NOP 0
160
161  bb.2:
162    $sgpr0_sgpr1 = S_MOV_B64 -1
163    $vcc = S_AND_B64 killed $sgpr0_sgpr1, $exec, implicit-def dead $scc
164    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
165    S_ENDPGM 0
166...
167---
168# GCN-LABEL: name: and_execz_mov_exec_vccz
169# GCN:      $exec = S_MOV_B64 -1
170# GCN-NEXT: S_ENDPGM 0
171name:            and_execz_mov_exec_vccz
172body:             |
173  bb.0:
174    S_NOP 0
175
176  bb.1:
177    S_NOP 0
178
179  bb.2:
180    $exec = S_MOV_B64 -1
181    $vcc = S_AND_B64 $exec, $exec, implicit-def dead $scc
182    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
183    S_ENDPGM 0
184...
185---
186# GCN-LABEL: name: and_execz_mov_exec_vccnz
187# GCN:      $exec = S_MOV_B64 -1
188# GCN-NEXT: S_BRANCH %bb.1{{$}}
189name:            and_execz_mov_exec_vccnz
190body:             |
191  bb.0:
192    S_NOP 0
193
194  bb.1:
195    S_NOP 0
196
197  bb.2:
198    $exec = S_MOV_B64 -1
199    $vcc = S_AND_B64 $exec, $exec, implicit-def dead $scc
200    S_CBRANCH_VCCNZ %bb.1, implicit killed $vcc
201    S_ENDPGM 0
202...
203---
204# GCN-LABEL: name: and_execz_mov_vccz_reads_sreg_early
205# GCN:      $sgpr0_sgpr1 = S_MOV_B64 -1
206# GCN-NEXT: $sgpr2 = S_MOV_B32 $sgpr1
207# GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec
208name:            and_execz_mov_vccz_reads_sreg_early
209body:             |
210  bb.0:
211    S_NOP 0
212
213  bb.1:
214    S_NOP 0
215
216  bb.2:
217    $sgpr0_sgpr1 = S_MOV_B64 -1
218    $sgpr2 = S_MOV_B32 $sgpr1
219    $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
220    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
221    S_ENDPGM 0
222...
223---
224# GCN-LABEL: name: and_execz_mov_vccz_reads_sreg_late
225# GCN:      $sgpr0_sgpr1 = S_MOV_B64 -1
226# GCN-NEXT: $sgpr2 = S_MOV_B32 $sgpr1
227# GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec
228name:            and_execz_mov_vccz_reads_sreg_late
229body:             |
230  bb.0:
231    S_NOP 0
232
233  bb.1:
234    S_NOP 0
235
236  bb.2:
237    $sgpr0_sgpr1 = S_MOV_B64 -1
238    $vcc = S_AND_B64 $exec, $sgpr0_sgpr1, implicit-def dead $scc
239    $sgpr2 = S_MOV_B32 $sgpr1
240    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
241    S_ENDPGM 0
242...
243# GCN-LABEL: name: and_execz_mov_vccz_reads_writes_sreg_early
244# GCN:      $sgpr0_sgpr1 = S_MOV_B64 -1
245# GCN-NEXT: $sgpr1 = S_MOV_B32 $sgpr0
246# GCN-NEXT: $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
247# GCN-NEXT: S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
248name:            and_execz_mov_vccz_reads_writes_sreg_early
249body:             |
250  bb.0:
251    S_NOP 0
252
253  bb.1:
254    S_NOP 0
255
256  bb.2:
257    $sgpr0_sgpr1 = S_MOV_B64 -1
258    $sgpr1 = S_MOV_B32 $sgpr0
259    $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
260    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
261    S_ENDPGM 0
262...
263---
264# GCN-LABEL: name: and_execz_mov_vccz_reads_cond
265# GCN:      $vcc = S_AND_B64 $exec, -1, implicit-def dead $scc
266# GCN-NEXT: $sgpr2 = S_MOV_B32 $vcc_lo
267# GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec
268name:            and_execz_mov_vccz_reads_cond
269body:             |
270  bb.0:
271    S_NOP 0
272
273  bb.1:
274    S_NOP 0
275
276  bb.2:
277    $sgpr0_sgpr1 = S_MOV_B64 -1
278    $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
279    $sgpr2 = S_MOV_B32 $vcc_lo
280    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
281    S_ENDPGM 0
282...
283---
284# GCN-LABEL: name: and_execz_mov_vccz_modifies_sreg
285# GCN:      $sgpr0_sgpr1 = S_MOV_B64 -1
286# GCN-NEXT: $sgpr0 = S_MOV_B32 0
287# GCN-NEXT: $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
288# GCN-NEXT: S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
289name:            and_execz_mov_vccz_modifies_sreg
290body:             |
291  bb.0:
292    S_NOP 0
293
294  bb.1:
295    S_NOP 0
296
297  bb.2:
298    $sgpr0_sgpr1 = S_MOV_B64 -1
299    $sgpr0 = S_MOV_B32 0
300    $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
301    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
302    S_ENDPGM 0
303...
304---
305# GCN-LABEL: name: and_execz_imm_vccz_liveout_scc
306# GCN:      $vcc = S_AND_B64 $exec, -1, implicit-def $scc
307# GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec
308# GCN-NEXT: S_ENDPGM 0, implicit $scc
309name:            and_execz_imm_vccz_liveout_scc
310body:             |
311  bb.0:
312    S_NOP 0
313
314  bb.1:
315    S_NOP 0
316
317  bb.2:
318    $vcc = S_AND_B64 $exec, -1, implicit-def $scc
319    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
320    S_ENDPGM 0, implicit $scc
321...
322---
323# W32-LABEL: name: and_execz_mov_vccz_w32
324# W32-NOT: S_MOV_
325# W32-NOT: S_AND_
326# W32: S_CBRANCH_EXECZ %bb.1, implicit $exec
327name:            and_execz_mov_vccz_w32
328body:             |
329  bb.0:
330    S_NOP 0
331
332  bb.1:
333    S_NOP 0
334
335  bb.2:
336    $sgpr0 = S_MOV_B32 -1
337    $vcc_lo = S_AND_B32 $exec_lo, killed $sgpr0, implicit-def dead $scc
338    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
339    S_ENDPGM 0
340...
341---
342# GCN-LABEL: name: andn2_execz_mov_vccz
343# GCN-NOT: S_MOV_
344# GCN-NOT: S_ANDN2_
345# GCN: S_CBRANCH_EXECZ %bb.1, implicit $exec
346name:            andn2_execz_mov_vccz
347body:             |
348  bb.0:
349    S_NOP 0
350
351  bb.1:
352    S_NOP 0
353
354  bb.2:
355    $sgpr0_sgpr1 = S_MOV_B64 0
356    $vcc = S_ANDN2_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
357    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
358    S_ENDPGM 0
359...
360---
361# GCN-LABEL: name: andn2_branch_mov_vccz
362# GCN-NOT: S_MOV_
363# GCN-NOT: S_ANDN2_
364# GCN: S_BRANCH %bb.1
365name:            andn2_branch_mov_vccz
366body:             |
367  bb.0:
368    S_NOP 0
369
370  bb.1:
371    S_NOP 0
372
373  bb.2:
374    $sgpr0_sgpr1 = S_MOV_B64 -1
375    $vcc = S_ANDN2_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
376    S_CBRANCH_VCCZ %bb.1, implicit killed $vcc
377    S_ENDPGM 0
378...
379---
380# GCN-LABEL: name: andn2_execnz_mov_vccnz
381# GCN-NOT: S_MOV_
382# GCN-NOT: S_ANDN2_
383# GCN: S_CBRANCH_EXECNZ %bb.1, implicit $exec
384name:            andn2_execnz_mov_vccnz
385body:             |
386  bb.0:
387    S_NOP 0
388
389  bb.1:
390    S_NOP 0
391
392  bb.2:
393    $sgpr0_sgpr1 = S_MOV_B64 0
394    $vcc = S_ANDN2_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
395    S_CBRANCH_VCCNZ %bb.1, implicit killed $vcc
396    S_ENDPGM 0
397...
398---
399# GCN-LABEL: name: andn2_no_branch_mov_vccnz
400# GCN-NOT: S_MOV_
401# GCN-NOT: S_ANDN2_
402# GCN-NOT: S_CBRANCH
403# GCN-NOT: S_BRANCH
404name:            andn2_no_branch_mov_vccnz
405body:             |
406  bb.0:
407    S_NOP 0
408
409  bb.1:
410    S_NOP 0
411
412  bb.2:
413    $sgpr0_sgpr1 = S_MOV_B64 -1
414    $vcc = S_ANDN2_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
415    S_CBRANCH_VCCNZ %bb.1, implicit killed $vcc
416    S_ENDPGM 0
417...
418---
419# GCN-LABEL: name: and_0_mov
420# GCN: bb.2:
421# GCN-NOT: S_AND
422# GCN: $vcc = S_MOV_B64 0
423# GCN-NEXT: S_BRANCH %bb.1
424name:            and_0_mov
425body:             |
426  bb.0:
427    S_NOP 0
428
429  bb.1:
430    S_NOP 0
431
432  bb.2:
433    $sgpr0_sgpr1 = S_MOV_B64 0
434    $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
435    S_CBRANCH_VCCZ %bb.1, implicit $vcc
436    S_ENDPGM 0
437...
438---
439# GCN-LABEL: name: andn2_m1_mov
440# GCN: bb.2:
441# GCN-NOT: S_ANDN2
442# GCN: $vcc = S_MOV_B64 0
443# GCN-NEXT: S_BRANCH %bb.1
444name:            andn2_m1_mov
445body:             |
446  bb.0:
447    S_NOP 0
448
449  bb.1:
450    S_NOP 0
451
452  bb.2:
453    $sgpr0_sgpr1 = S_MOV_B64 -1
454    $vcc = S_ANDN2_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
455    S_CBRANCH_VCCZ %bb.1, implicit $vcc
456    S_ENDPGM 0
457...
458---
459# GCN-LABEL: name: and_m1_mov
460# GCN: bb.2:
461# GCN-NOT: S_AND
462# GCN: $vcc = S_MOV_B64 $exec
463# GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec
464name:            and_m1_mov
465body:             |
466  bb.0:
467    S_NOP 0
468
469  bb.1:
470    S_NOP 0
471
472  bb.2:
473    $sgpr0_sgpr1 = S_MOV_B64 -1
474    $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
475    S_CBRANCH_VCCZ %bb.1, implicit $vcc
476    S_ENDPGM 0
477...
478---
479# GCN-LABEL: name: andn2_0_mov
480# GCN: bb.2:
481# GCN-NOT: S_ANDN2
482# GCN: $vcc = S_MOV_B64 $exec
483# GCN-NEXT: S_CBRANCH_EXECZ %bb.1, implicit $exec
484name:            andn2_0_mov
485body:             |
486  bb.0:
487    S_NOP 0
488
489  bb.1:
490    S_NOP 0
491
492  bb.2:
493    $sgpr0_sgpr1 = S_MOV_B64 0
494    $vcc = S_ANDN2_B64 $exec, killed $sgpr0_sgpr1, implicit-def dead $scc
495    S_CBRANCH_VCCZ %bb.1, implicit $vcc
496    S_ENDPGM 0
497...
498---
499# GCN-LABEL: name: and_0_scc_req
500# GCN: bb.2:
501# GCN-NOT: S_MOV_
502# GCN: S_AND_
503# GCN-NEXT: S_BRANCH %bb.1
504name:            and_0_scc_req
505body:             |
506  bb.0:
507    S_NOP 0
508
509  bb.1:
510    S_NOP 0
511
512  bb.2:
513    $sgpr0_sgpr1 = S_MOV_B64 0
514    $vcc = S_AND_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc
515    S_CBRANCH_VCCZ %bb.1, implicit $vcc
516    S_ENDPGM 0
517...
518---
519# GCN-LABEL: name: andn2_m1_scc_req
520# GCN: bb.2:
521# GCN-NOT: S_MOV_
522# GCN: S_ANDN2_
523# GCN-NEXT: S_BRANCH %bb.1
524name:            andn2_m1_scc_req
525body:             |
526  bb.0:
527    S_NOP 0
528
529  bb.1:
530    S_NOP 0
531
532  bb.2:
533    $sgpr0_sgpr1 = S_MOV_B64 -1
534    $vcc = S_ANDN2_B64 $exec, killed $sgpr0_sgpr1, implicit-def $scc
535    S_CBRANCH_VCCZ %bb.1, implicit $vcc
536    S_ENDPGM 0
537...
538