1# RUN: llc -march=amdgcn -mcpu=gfx900 -run-pass=si-late-branch-lowering -verify-machineinstrs  %s -o - | FileCheck -check-prefixes=GCN,GFX9 %s
2# RUN: llc -march=amdgcn -mcpu=gfx1010 -mattr=-wavefrontsize32,+wavefrontsize64 -run-pass=si-late-branch-lowering -verify-machineinstrs  %s -o - | FileCheck -check-prefixes=GCN,GFX10 %s
3# RUN: llc -march=amdgcn -mcpu=gfx1100 -mattr=-wavefrontsize32,+wavefrontsize64 -run-pass=si-late-branch-lowering -verify-machineinstrs  %s -o - | FileCheck -check-prefixes=GCN,GFX11 %s
4
5--- |
6  define amdgpu_ps void @early_term_scc0_end_block() {
7    ret void
8  }
9
10  define amdgpu_ps void @early_term_scc0_next_terminator() {
11    ret void
12  }
13
14  define amdgpu_ps void @early_term_scc0_in_block() {
15    ret void
16  }
17
18  define amdgpu_gs void @early_term_scc0_gs() {
19    ret void
20  }
21
22  define amdgpu_cs void @early_term_scc0_cs() {
23    ret void
24  }
25
26  define amdgpu_ps void @early_term_no_export() #0 {
27    ret void
28  }
29
30  define amdgpu_ps void @early_term_depth_only() #1 {
31    ret void
32  }
33
34  attributes #0 = { "amdgpu-color-export"="0" "amdgpu-depth-export"="0" }
35  attributes #1 = { "amdgpu-color-export"="0" "amdgpu-depth-export"="1" }
36...
37
38---
39name: early_term_scc0_end_block
40tracksRegLiveness: true
41liveins:
42  - { reg: '$sgpr0' }
43  - { reg: '$sgpr1' }
44body: |
45  ; GCN-LABEL: name: early_term_scc0_end_block
46  ; GCN: bb.0:
47  ; GCN:   successors: %bb.1(0x80000000), %bb.2(0x00000000)
48  ; GCN:   liveins: $sgpr0, $sgpr1
49  ; GCN:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
50  ; GCN:   dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
51  ; GCN:   S_CBRANCH_SCC0 %bb.2, implicit $scc
52  ; GCN: bb.1:
53  ; GCN:   liveins: $vgpr0
54  ; GCN:   EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec
55  ; GCN:   S_ENDPGM 0
56  ; GCN: bb.2:
57  ; GCN:   $exec = S_MOV_B64 0
58  ; GFX9:  EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
59  ; GFX10: EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
60  ; GFX11: EXP_DONE 0, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
61  ; GCN:   S_ENDPGM 0
62  bb.0:
63    liveins: $sgpr0, $sgpr1
64    successors: %bb.1
65
66    $vgpr0 = V_MOV_B32_e32 0, implicit $exec
67    dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
68    SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec
69
70  bb.1:
71    liveins: $vgpr0
72    EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec
73    S_ENDPGM 0
74...
75
76---
77name: early_term_scc0_next_terminator
78tracksRegLiveness: true
79liveins:
80  - { reg: '$sgpr0' }
81  - { reg: '$sgpr1' }
82body: |
83  ; GCN-LABEL: name: early_term_scc0_next_terminator
84  ; GCN: bb.0:
85  ; GCN:   successors: %bb.2(0x80000000), %bb.3(0x00000000)
86  ; GCN:   liveins: $sgpr0, $sgpr1
87  ; GCN:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
88  ; GCN:   dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
89  ; GCN:   S_CBRANCH_SCC0 %bb.3, implicit $scc
90  ; GCN:   S_BRANCH %bb.2
91  ; GCN: bb.1:
92  ; GCN:   successors: %bb.2(0x80000000)
93  ; GCN:   $vgpr0 = V_MOV_B32_e32 1, implicit $exec
94  ; GCN: bb.2:
95  ; GCN:   liveins: $vgpr0
96  ; GCN:   EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec
97  ; GCN:   S_ENDPGM 0
98  ; GCN: bb.3:
99  ; GCN:   $exec = S_MOV_B64 0
100  ; GFX9:  EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
101  ; GFX10: EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
102  ; GFX11: EXP_DONE 0, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
103  ; GCN:   S_ENDPGM 0
104  bb.0:
105    liveins: $sgpr0, $sgpr1
106    successors: %bb.2
107
108    $vgpr0 = V_MOV_B32_e32 0, implicit $exec
109    dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
110    SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec
111    S_BRANCH %bb.2
112
113  bb.1:
114    successors: %bb.2
115    $vgpr0 = V_MOV_B32_e32 1, implicit $exec
116    S_BRANCH %bb.2
117
118  bb.2:
119    liveins: $vgpr0
120    EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec
121    S_ENDPGM 0
122...
123
124---
125name: early_term_scc0_in_block
126tracksRegLiveness: true
127liveins:
128  - { reg: '$sgpr0' }
129  - { reg: '$sgpr1' }
130body: |
131  ; GCN-LABEL: name: early_term_scc0_in_block
132  ; GCN: bb.0:
133  ; GCN:   successors: %bb.3(0x40000000), %bb.2(0x40000000)
134  ; GCN:   liveins: $sgpr0, $sgpr1
135  ; GCN:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
136  ; GCN:   dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
137  ; GCN:   S_CBRANCH_SCC0 %bb.2, implicit $scc
138  ; GCN: bb.3:
139  ; GCN:   successors: %bb.1(0x80000000)
140  ; GCN:   liveins: $vgpr0, $scc
141  ; GCN:   $vgpr1 = V_MOV_B32_e32 1, implicit $exec
142  ; GCN: bb.1:
143  ; GCN:   liveins: $vgpr0, $vgpr1
144  ; GCN:   EXP 1, $vgpr1, $vgpr1, $vgpr1, $vgpr1, -1, -1, 15, implicit $exec
145  ; GCN:   EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec
146  ; GCN:   S_ENDPGM 0
147  ; GCN: bb.2:
148  ; GCN:   $exec = S_MOV_B64 0
149  ; GFX9:  EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
150  ; GFX10: EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
151  ; GFX11: EXP_DONE 0, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
152  ; GCN:   S_ENDPGM 0
153  bb.0:
154    liveins: $sgpr0, $sgpr1
155    successors: %bb.1
156
157    $vgpr0 = V_MOV_B32_e32 0, implicit $exec
158    dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
159    SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec
160    $vgpr1 = V_MOV_B32_e32 1, implicit $exec
161
162  bb.1:
163    liveins: $vgpr0, $vgpr1
164    EXP 1, $vgpr1, $vgpr1, $vgpr1, $vgpr1, -1, -1, 15, implicit $exec
165    EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec
166    S_ENDPGM 0
167...
168
169---
170name: early_term_scc0_gs
171tracksRegLiveness: true
172liveins:
173  - { reg: '$sgpr0' }
174  - { reg: '$sgpr1' }
175body: |
176  ; GCN-LABEL: name: early_term_scc0_gs
177  ; GCN: bb.0:
178  ; GCN:   successors: %bb.1(0x80000000)
179  ; GCN:   liveins: $sgpr0, $sgpr1
180  ; GCN:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
181  ; GCN:   dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
182  ; GCN: bb.1:
183  ; GCN:   liveins: $vgpr0
184  ; GCN:   S_ENDPGM 0
185  ; GCN: bb.2:
186  ; GCN:   $exec = S_MOV_B64 0
187  ; GCN:   S_ENDPGM 0
188  bb.0:
189    liveins: $sgpr0, $sgpr1
190    successors: %bb.1
191
192    $vgpr0 = V_MOV_B32_e32 0, implicit $exec
193    dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
194    SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec
195
196  bb.1:
197    liveins: $vgpr0
198    S_ENDPGM 0
199...
200
201---
202name: early_term_scc0_cs
203tracksRegLiveness: true
204liveins:
205  - { reg: '$sgpr0' }
206  - { reg: '$sgpr1' }
207body: |
208  ; GCN-LABEL: name: early_term_scc0_cs
209  ; GCN: bb.0:
210  ; GCN:   successors: %bb.1(0x80000000), %bb.2(0x00000000)
211  ; GCN:   liveins: $sgpr0, $sgpr1
212  ; GCN:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
213  ; GCN:   dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
214  ; GCN:   S_CBRANCH_SCC0 %bb.2, implicit $scc
215  ; GCN: bb.1:
216  ; GCN:   liveins: $vgpr0
217  ; GCN:   S_ENDPGM 0
218  ; GCN: bb.2:
219  ; GCN:   $exec = S_MOV_B64 0
220  ; GCN:   S_ENDPGM 0
221  bb.0:
222    liveins: $sgpr0, $sgpr1
223    successors: %bb.1
224
225    $vgpr0 = V_MOV_B32_e32 0, implicit $exec
226    dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
227    SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec
228
229  bb.1:
230    liveins: $vgpr0
231    S_ENDPGM 0
232...
233
234---
235name: early_term_no_export
236tracksRegLiveness: true
237liveins:
238  - { reg: '$sgpr0' }
239  - { reg: '$sgpr1' }
240body: |
241  ; GCN-LABEL: name: early_term_no_export
242  ; GCN: bb.0:
243  ; GCN:   successors: %bb.1(0x80000000), %bb.2(0x00000000)
244  ; GCN:   liveins: $sgpr0, $sgpr1
245  ; GCN:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
246  ; GCN:   dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
247  ; GCN:   S_CBRANCH_SCC0 %bb.2, implicit $scc
248  ; GCN: bb.1:
249  ; GCN:   liveins: $vgpr0
250  ; GCN:   EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec
251  ; GCN:   S_ENDPGM 0
252  ; GCN: bb.2:
253  ; GCN:   $exec = S_MOV_B64 0
254  ; GFX9:  EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
255  ; GFX10-NOT: EXP_DONE
256  ; GFX11-NOT: EXP_DONE
257  ; GCN:   S_ENDPGM 0
258  bb.0:
259    liveins: $sgpr0, $sgpr1
260    successors: %bb.1
261
262    $vgpr0 = V_MOV_B32_e32 0, implicit $exec
263    dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
264    SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec
265
266  bb.1:
267    liveins: $vgpr0
268    EXP_DONE 0, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec
269    S_ENDPGM 0
270...
271
272---
273name: early_term_depth_only
274tracksRegLiveness: true
275liveins:
276  - { reg: '$sgpr0' }
277  - { reg: '$sgpr1' }
278body: |
279  ; GCN-LABEL: name: early_term_depth_only
280  ; GCN: bb.0:
281  ; GCN:   successors: %bb.1(0x80000000), %bb.2(0x00000000)
282  ; GCN:   liveins: $sgpr0, $sgpr1
283  ; GCN:   $vgpr0 = V_MOV_B32_e32 0, implicit $exec
284  ; GCN:   dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
285  ; GCN:   S_CBRANCH_SCC0 %bb.2, implicit $scc
286  ; GCN: bb.1:
287  ; GCN:   liveins: $vgpr0
288  ; GCN:   EXP_DONE 8, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec
289  ; GCN:   S_ENDPGM 0
290  ; GCN: bb.2:
291  ; GCN:   $exec = S_MOV_B64 0
292  ; GFX9:  EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
293  ; GFX10: EXP_DONE 9, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
294  ; GFX11: EXP_DONE 8, undef $vgpr0, undef $vgpr0, undef $vgpr0, undef $vgpr0, 1, 0, 0, implicit $exec
295  ; GCN:   S_ENDPGM 0
296  bb.0:
297    liveins: $sgpr0, $sgpr1
298    successors: %bb.1
299
300    $vgpr0 = V_MOV_B32_e32 0, implicit $exec
301    dead $sgpr0 = S_AND_B32 $sgpr0, killed $sgpr1, implicit-def $scc
302    SI_EARLY_TERMINATE_SCC0 implicit $scc, implicit $exec
303
304  bb.1:
305    liveins: $vgpr0
306    EXP_DONE 8, $vgpr0, $vgpr0, $vgpr0, $vgpr0, -1, -1, 15, implicit $exec
307    S_ENDPGM 0
308...
309