1# RUN: llc -march=amdgcn -verify-machineinstrs -run-pass si-optimize-exec-masking-pre-ra %s -o - | FileCheck -check-prefix=GCN %s
2
3# GCN-LABEL: name: kill_all
4# GCN:      bb.0:
5# GCN-NEXT: S_ENDPGM
6name: kill_all
7tracksRegLiveness: true
8registers:
9  - { id: 0, class: vreg_64 }
10  - { id: 1, class: vgpr_32 }
11  - { id: 2, class: vgpr_32 }
12  - { id: 3, class: sgpr_32 }
13  - { id: 4, class: sgpr_32 }
14body:             |
15  bb.0:
16    %vcc = IMPLICIT_DEF
17    %0 = IMPLICIT_DEF
18    %3 = IMPLICIT_DEF
19    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
20    %1 = FLAT_LOAD_DWORD %0, 0, 0, 0, implicit %exec, implicit %flat_scr :: (load 4)
21    %2 = V_ADD_F32_e64 0, killed %1, 0, 1, 0, 0, implicit %exec
22    %4 = S_ADD_U32 %3, 1, implicit-def %scc
23    S_ENDPGM
24...
25---
26# GCN-LABEL: name: load_without_memoperand
27# GCN:      %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
28# GCN-NEXT: dead %1:vgpr_32 = FLAT_LOAD_DWORD %0, 0, 0, 0, implicit %exec, implicit %flat_scr
29# GCN-NEXT: S_ENDPGM
30name: load_without_memoperand
31tracksRegLiveness: true
32registers:
33  - { id: 0, class: vreg_64 }
34  - { id: 1, class: vgpr_32 }
35  - { id: 2, class: vgpr_32 }
36  - { id: 3, class: sgpr_32 }
37  - { id: 4, class: sgpr_32 }
38body:             |
39  bb.0:
40    %vcc = IMPLICIT_DEF
41    %0 = IMPLICIT_DEF
42    %3 = IMPLICIT_DEF
43    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
44    %1 = FLAT_LOAD_DWORD %0, 0, 0, 0, implicit %exec, implicit %flat_scr
45    %2 = V_ADD_F32_e64 0, killed %1, 0, 1, 0, 0, implicit %exec
46    %4 = S_ADD_U32 %3, 1, implicit-def %scc
47    S_ENDPGM
48...
49---
50# GCN-LABEL: name: load_volatile
51# GCN:      %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
52# GCN-NEXT: dead %1:vgpr_32 = FLAT_LOAD_DWORD %0, 0, 0, 0, implicit %exec, implicit %flat_scr :: (volatile load 4)
53# GCN-NEXT: S_ENDPGM
54name: load_volatile
55tracksRegLiveness: true
56registers:
57  - { id: 0, class: vreg_64 }
58  - { id: 1, class: vgpr_32 }
59  - { id: 2, class: vgpr_32 }
60  - { id: 3, class: sgpr_32 }
61  - { id: 4, class: sgpr_32 }
62body:             |
63  bb.0:
64    %vcc = IMPLICIT_DEF
65    %0 = IMPLICIT_DEF
66    %3 = IMPLICIT_DEF
67    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
68    %1 = FLAT_LOAD_DWORD %0, 0, 0, 0, implicit %exec, implicit %flat_scr :: (volatile load 4)
69    %2 = V_ADD_F32_e64 0, killed %1, 0, 1, 0, 0, implicit %exec
70    %4 = S_ADD_U32 %3, 1, implicit-def %scc
71    S_ENDPGM
72...
73---
74# GCN-LABEL: name: store
75# GCN:      %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
76# GCN-NEXT: FLAT_STORE_DWORD %0, %1, 0, 0, 0, implicit %exec, implicit %flat_scr :: (store 4)
77# GCN-NEXT: S_ENDPGM
78name: store
79tracksRegLiveness: true
80registers:
81  - { id: 0, class: vreg_64 }
82  - { id: 1, class: vgpr_32 }
83body:             |
84  bb.0:
85    %vcc = IMPLICIT_DEF
86    %0 = IMPLICIT_DEF
87    %1 = IMPLICIT_DEF
88    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
89    FLAT_STORE_DWORD %0, %1, 0, 0, 0, implicit %exec, implicit %flat_scr :: (store 4)
90    S_ENDPGM
91...
92---
93# GCN-LABEL: name: barrier
94# GCN:      %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
95# GCN-NEXT: S_BARRIER
96# GCN-NEXT: S_ENDPGM
97name: barrier
98tracksRegLiveness: true
99body:             |
100  bb.0:
101    %vcc = IMPLICIT_DEF
102    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
103    S_BARRIER
104    S_ENDPGM
105...
106---
107# GCN-LABEL: name: call
108# GCN:      %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
109# GCN-NEXT: %sgpr4_sgpr5 = S_SWAPPC_B64 %sgpr2_sgpr3
110# GCN-NEXT: S_ENDPGM
111name: call
112tracksRegLiveness: true
113body:             |
114  bb.0:
115    %vcc = IMPLICIT_DEF
116    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
117    %sgpr4_sgpr5 = S_SWAPPC_B64 %sgpr2_sgpr3
118    S_ENDPGM
119...
120---
121# GCN-LABEL: name: exp
122# GCN:      %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
123# GCN-NEXT: EXP 32, undef %0:vgpr_32, undef %1:vgpr_32, %2, undef %3:vgpr_32, 0, 0, 15, implicit %exec
124# GCN-NEXT: S_ENDPGM
125name: exp
126tracksRegLiveness: true
127registers:
128  - { id: 0, class: vgpr_32 }
129  - { id: 1, class: vgpr_32 }
130  - { id: 2, class: vgpr_32 }
131  - { id: 3, class: vgpr_32 }
132body:             |
133  bb.0:
134    %vcc = IMPLICIT_DEF
135    %2 = IMPLICIT_DEF
136    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
137    EXP 32, undef %0, undef %1, killed %2, undef %3, 0, 0, 15, implicit %exec
138    S_ENDPGM
139...
140---
141# GCN-LABEL: name: return_to_epilog
142# GCN:      %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
143# GCN-NEXT: SI_RETURN_TO_EPILOG killed %vgpr0
144name: return_to_epilog
145tracksRegLiveness: true
146body:             |
147  bb.0:
148    %vcc = IMPLICIT_DEF
149    %vgpr0 = IMPLICIT_DEF
150    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
151    SI_RETURN_TO_EPILOG killed %vgpr0
152...
153---
154# GCN-LABEL: name: split_block
155# GCN:      bb.0:
156# GCN-NEXT:   successors: %bb.1
157# GCN-NOT:  S_OR_B64
158# GCN:      bb.1:
159# GCN-NEXT:   S_ENDPGM
160name: split_block
161tracksRegLiveness: true
162registers:
163  - { id: 0, class: vgpr_32 }
164  - { id: 1, class: vgpr_32 }
165  - { id: 2, class: sgpr_32 }
166  - { id: 3, class: sgpr_32 }
167body:             |
168  bb.0:
169    %vcc = IMPLICIT_DEF
170    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
171
172  bb.1:
173    %0 = IMPLICIT_DEF
174    %2 = IMPLICIT_DEF
175    %1 = V_ADD_F32_e64 0, killed %0, 0, 1, 0, 0, implicit %exec
176    %3 = S_ADD_U32 %2, 1, implicit-def %scc
177    S_ENDPGM
178...
179---
180# GCN-LABEL: name: split_block_empty_block
181# GCN:      bb.0:
182# GCN-NEXT:   successors: %bb.1
183# GCN-NOT:  S_OR_B64
184# GCN:      bb.1:
185# GCN:      bb.2:
186# GCN-NEXT:   S_ENDPGM
187name: split_block_empty_block
188tracksRegLiveness: true
189body:             |
190  bb.0:
191    %vcc = IMPLICIT_DEF
192    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
193
194  bb.1:
195
196  bb.2:
197    S_ENDPGM
198...
199---
200# GCN-LABEL: name: split_block_uncond_branch
201# GCN:      bb.0:
202# GCN-NEXT:   successors: %bb.1
203# GCN:        S_BRANCH %bb.1
204# GCN-NOT:  S_OR_B64
205# GCN:      bb.1:
206# GCN-NEXT:   S_ENDPGM
207name: split_block_uncond_branch
208tracksRegLiveness: true
209body:             |
210  bb.0:
211    %vcc = IMPLICIT_DEF
212    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
213    S_BRANCH %bb.1
214
215  bb.1:
216    S_ENDPGM
217...
218---
219# GCN-LABEL: name: split_block_cond_branch
220# GCN:      bb.0:
221# GCN-NEXT:   successors: %bb.2(0x40000000), %bb.1(0x40000000)
222# GCN:        %sgpr0_sgpr1 = S_OR_B64 %exec, %vcc, implicit-def %scc
223# GCN:        S_CBRANCH_VCCNZ %bb.2, implicit undef %vcc
224# GCN:      bb.1:
225# GCN:      bb.2:
226# GCN-NEXT:   S_ENDPGM
227name: split_block_cond_branch
228tracksRegLiveness: true
229body:             |
230  bb.0:
231    %vcc = IMPLICIT_DEF
232    %sgpr0_sgpr1 = S_OR_B64 %exec, %vcc, implicit-def %scc
233    S_CBRANCH_VCCNZ %bb.2, implicit undef %vcc
234
235  bb.1:
236
237  bb.2:
238    S_ENDPGM
239...
240---
241# GCN-LABEL: name: two_preds_both_dead
242# GCN:      bb.0:
243# GCN-NEXT:   successors: %bb.2
244# GCN-NOT:    S_OR
245# GCN:        S_BRANCH %bb.2
246# GCN:      bb.1:
247# GCN-NEXT:   successors: %bb.2
248# GCN-NOT:    S_AND
249# GCN:        S_BRANCH %bb.2
250# GCN:      bb.2:
251# GCN-NEXT:   S_ENDPGM
252name: two_preds_both_dead
253tracksRegLiveness: true
254body:             |
255  bb.0:
256    %vcc = IMPLICIT_DEF
257    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
258    S_BRANCH %bb.2
259
260  bb.1:
261    %vcc = IMPLICIT_DEF
262    %sgpr0_sgpr1 = S_AND_B64 %exec, killed %vcc, implicit-def %scc
263    S_BRANCH %bb.2
264
265  bb.2:
266    S_ENDPGM
267...
268---
269# GCN-LABEL: name: two_preds_one_dead
270# GCN:      bb.0:
271# GCN-NEXT:   successors: %bb.2
272# GCN:        %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
273# GCN-NEXT:   S_BARRIER
274# GCN-NEXT:   S_BRANCH %bb.2
275# GCN:      bb.1:
276# GCN-NEXT:   successors: %bb.2
277# GCN-NOT:    S_AND
278# GCN:        S_BRANCH %bb.2
279# GCN:      bb.2:
280# GCN-NEXT:   S_ENDPGM
281name: two_preds_one_dead
282tracksRegLiveness: true
283body:             |
284  bb.0:
285    %vcc = IMPLICIT_DEF
286    %sgpr0_sgpr1 = S_OR_B64 %exec, killed %vcc, implicit-def %scc
287    S_BARRIER
288    S_BRANCH %bb.2
289
290  bb.1:
291    %vcc = IMPLICIT_DEF
292    %sgpr0_sgpr1 = S_AND_B64 %exec, killed %vcc, implicit-def %scc
293    S_BRANCH %bb.2
294
295  bb.2:
296    S_ENDPGM
297...
298