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