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