Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / llvm.amdgcn.reduce.umin.ll
blob19247fa0b84f35903ef8c377a1490579ff754b88
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2 ; RUN: llc -march=amdgcn -mcpu=tonga -global-isel=0 -verify-machineinstrs < %s | FileCheck  -check-prefixes=GFX8DAGISEL %s
3 ; RUN: llc -march=amdgcn -mcpu=tonga -global-isel=1 -verify-machineinstrs < %s | FileCheck  -check-prefixes=GFX8GISEL %s
4 ; RUN: llc -march=amdgcn -mcpu=gfx900 -global-isel=0 -verify-machineinstrs < %s | FileCheck  -check-prefixes=GFX9DAGISEL %s
5 ; RUN: llc -march=amdgcn -mcpu=gfx900 -global-isel=1 -verify-machineinstrs < %s | FileCheck  -check-prefixes=GFX9GISEL %s
6 ; RUN: llc -march=amdgcn -mcpu=gfx1010 -global-isel=0 -mattr=+wavefrontsize64 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10DAGISEL,GFX1064DAGISEL %s
7 ; RUN: llc -march=amdgcn -mcpu=gfx1010 -global-isel=1 -mattr=+wavefrontsize64 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10GISEL,GFX1064GISEL %s
8 ; RUN: llc -march=amdgcn -mcpu=gfx1010 -global-isel=0 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10DAGISEL,GFX1032DAGISEL %s
9 ; RUN: llc -march=amdgcn -mcpu=gfx1010 -global-isel=1 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX10GISEL,GFX1032GISEL %s
10 ; RUN: llc -march=amdgcn -mcpu=gfx1100 -global-isel=0 -mattr=+wavefrontsize64 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11DAGISEL,GFX1164DAGISEL %s
11 ; RUN: llc -march=amdgcn -mcpu=gfx1100 -global-isel=1 -mattr=+wavefrontsize64 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11GISEL,GFX1164GISEL %s
12 ; RUN: llc -march=amdgcn -mcpu=gfx1100 -global-isel=0 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11DAGISEL,GFX1132DAGISEL %s
13 ; RUN: llc -march=amdgcn -mcpu=gfx1100 -global-isel=1 -verify-machineinstrs < %s | FileCheck -check-prefixes=GFX11GISEL,GFX1132GISEL %s
16 declare i32 @llvm.amdgcn.wave.reduce.umin.i32(i32, i32 immarg)
17 declare i32 @llvm.amdgcn.workitem.id.x()
19 define amdgpu_kernel void @uniform_value(ptr addrspace(1) %out, i32 %in) {
20 ; GFX8DAGISEL-LABEL: uniform_value:
21 ; GFX8DAGISEL:       ; %bb.0: ; %entry
22 ; GFX8DAGISEL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
23 ; GFX8DAGISEL-NEXT:    s_load_dword s0, s[0:1], 0x2c
24 ; GFX8DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
25 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v0, s2
26 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v1, s3
27 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v2, s0
28 ; GFX8DAGISEL-NEXT:    flat_store_dword v[0:1], v2
29 ; GFX8DAGISEL-NEXT:    s_endpgm
31 ; GFX8GISEL-LABEL: uniform_value:
32 ; GFX8GISEL:       ; %bb.0: ; %entry
33 ; GFX8GISEL-NEXT:    s_load_dword s2, s[0:1], 0x2c
34 ; GFX8GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
35 ; GFX8GISEL-NEXT:    s_waitcnt lgkmcnt(0)
36 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v2, s2
37 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v0, s0
38 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v1, s1
39 ; GFX8GISEL-NEXT:    flat_store_dword v[0:1], v2
40 ; GFX8GISEL-NEXT:    s_endpgm
42 ; GFX9DAGISEL-LABEL: uniform_value:
43 ; GFX9DAGISEL:       ; %bb.0: ; %entry
44 ; GFX9DAGISEL-NEXT:    s_load_dword s4, s[0:1], 0x2c
45 ; GFX9DAGISEL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
46 ; GFX9DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
47 ; GFX9DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
48 ; GFX9DAGISEL-NEXT:    v_mov_b32_e32 v1, s4
49 ; GFX9DAGISEL-NEXT:    global_store_dword v0, v1, s[2:3]
50 ; GFX9DAGISEL-NEXT:    s_endpgm
52 ; GFX9GISEL-LABEL: uniform_value:
53 ; GFX9GISEL:       ; %bb.0: ; %entry
54 ; GFX9GISEL-NEXT:    s_load_dword s4, s[0:1], 0x2c
55 ; GFX9GISEL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
56 ; GFX9GISEL-NEXT:    v_mov_b32_e32 v1, 0
57 ; GFX9GISEL-NEXT:    s_waitcnt lgkmcnt(0)
58 ; GFX9GISEL-NEXT:    v_mov_b32_e32 v0, s4
59 ; GFX9GISEL-NEXT:    global_store_dword v1, v0, s[2:3]
60 ; GFX9GISEL-NEXT:    s_endpgm
62 ; GFX10DAGISEL-LABEL: uniform_value:
63 ; GFX10DAGISEL:       ; %bb.0: ; %entry
64 ; GFX10DAGISEL-NEXT:    s_clause 0x1
65 ; GFX10DAGISEL-NEXT:    s_load_dword s4, s[0:1], 0x2c
66 ; GFX10DAGISEL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
67 ; GFX10DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
68 ; GFX10DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
69 ; GFX10DAGISEL-NEXT:    v_mov_b32_e32 v1, s4
70 ; GFX10DAGISEL-NEXT:    global_store_dword v0, v1, s[2:3]
71 ; GFX10DAGISEL-NEXT:    s_endpgm
73 ; GFX10GISEL-LABEL: uniform_value:
74 ; GFX10GISEL:       ; %bb.0: ; %entry
75 ; GFX10GISEL-NEXT:    s_clause 0x1
76 ; GFX10GISEL-NEXT:    s_load_dword s4, s[0:1], 0x2c
77 ; GFX10GISEL-NEXT:    s_load_dwordx2 s[2:3], s[0:1], 0x24
78 ; GFX10GISEL-NEXT:    v_mov_b32_e32 v1, 0
79 ; GFX10GISEL-NEXT:    s_waitcnt lgkmcnt(0)
80 ; GFX10GISEL-NEXT:    v_mov_b32_e32 v0, s4
81 ; GFX10GISEL-NEXT:    global_store_dword v1, v0, s[2:3]
82 ; GFX10GISEL-NEXT:    s_endpgm
84 ; GFX1164DAGISEL-LABEL: uniform_value:
85 ; GFX1164DAGISEL:       ; %bb.0: ; %entry
86 ; GFX1164DAGISEL-NEXT:    s_clause 0x1
87 ; GFX1164DAGISEL-NEXT:    s_load_b32 s2, s[0:1], 0x2c
88 ; GFX1164DAGISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
89 ; GFX1164DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
90 ; GFX1164DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
91 ; GFX1164DAGISEL-NEXT:    v_mov_b32_e32 v1, s2
92 ; GFX1164DAGISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
93 ; GFX1164DAGISEL-NEXT:    s_nop 0
94 ; GFX1164DAGISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
95 ; GFX1164DAGISEL-NEXT:    s_endpgm
97 ; GFX1164GISEL-LABEL: uniform_value:
98 ; GFX1164GISEL:       ; %bb.0: ; %entry
99 ; GFX1164GISEL-NEXT:    s_clause 0x1
100 ; GFX1164GISEL-NEXT:    s_load_b32 s2, s[0:1], 0x2c
101 ; GFX1164GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
102 ; GFX1164GISEL-NEXT:    v_mov_b32_e32 v1, 0
103 ; GFX1164GISEL-NEXT:    s_waitcnt lgkmcnt(0)
104 ; GFX1164GISEL-NEXT:    v_mov_b32_e32 v0, s2
105 ; GFX1164GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
106 ; GFX1164GISEL-NEXT:    s_nop 0
107 ; GFX1164GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
108 ; GFX1164GISEL-NEXT:    s_endpgm
110 ; GFX1132DAGISEL-LABEL: uniform_value:
111 ; GFX1132DAGISEL:       ; %bb.0: ; %entry
112 ; GFX1132DAGISEL-NEXT:    s_clause 0x1
113 ; GFX1132DAGISEL-NEXT:    s_load_b32 s2, s[0:1], 0x2c
114 ; GFX1132DAGISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
115 ; GFX1132DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
116 ; GFX1132DAGISEL-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, s2
117 ; GFX1132DAGISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
118 ; GFX1132DAGISEL-NEXT:    s_nop 0
119 ; GFX1132DAGISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
120 ; GFX1132DAGISEL-NEXT:    s_endpgm
122 ; GFX1132GISEL-LABEL: uniform_value:
123 ; GFX1132GISEL:       ; %bb.0: ; %entry
124 ; GFX1132GISEL-NEXT:    s_clause 0x1
125 ; GFX1132GISEL-NEXT:    s_load_b32 s2, s[0:1], 0x2c
126 ; GFX1132GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
127 ; GFX1132GISEL-NEXT:    s_waitcnt lgkmcnt(0)
128 ; GFX1132GISEL-NEXT:    v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v0, s2
129 ; GFX1132GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
130 ; GFX1132GISEL-NEXT:    s_nop 0
131 ; GFX1132GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
132 ; GFX1132GISEL-NEXT:    s_endpgm
133 entry:
134     %result = call i32 @llvm.amdgcn.wave.reduce.umin.i32(i32 %in, i32 1)
135     store i32 %result, ptr addrspace(1) %out
136     ret void
139 define amdgpu_kernel void @const_value(ptr addrspace(1) %out) {
140 ; GFX8DAGISEL-LABEL: const_value:
141 ; GFX8DAGISEL:       ; %bb.0: ; %entry
142 ; GFX8DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
143 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v2, 0x7b
144 ; GFX8DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
145 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v0, s0
146 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v1, s1
147 ; GFX8DAGISEL-NEXT:    flat_store_dword v[0:1], v2
148 ; GFX8DAGISEL-NEXT:    s_endpgm
150 ; GFX8GISEL-LABEL: const_value:
151 ; GFX8GISEL:       ; %bb.0: ; %entry
152 ; GFX8GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
153 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v2, 0x7b
154 ; GFX8GISEL-NEXT:    s_waitcnt lgkmcnt(0)
155 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v0, s0
156 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v1, s1
157 ; GFX8GISEL-NEXT:    flat_store_dword v[0:1], v2
158 ; GFX8GISEL-NEXT:    s_endpgm
160 ; GFX9DAGISEL-LABEL: const_value:
161 ; GFX9DAGISEL:       ; %bb.0: ; %entry
162 ; GFX9DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
163 ; GFX9DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
164 ; GFX9DAGISEL-NEXT:    v_mov_b32_e32 v1, 0x7b
165 ; GFX9DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
166 ; GFX9DAGISEL-NEXT:    global_store_dword v0, v1, s[0:1]
167 ; GFX9DAGISEL-NEXT:    s_endpgm
169 ; GFX9GISEL-LABEL: const_value:
170 ; GFX9GISEL:       ; %bb.0: ; %entry
171 ; GFX9GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
172 ; GFX9GISEL-NEXT:    v_mov_b32_e32 v0, 0x7b
173 ; GFX9GISEL-NEXT:    v_mov_b32_e32 v1, 0
174 ; GFX9GISEL-NEXT:    s_waitcnt lgkmcnt(0)
175 ; GFX9GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
176 ; GFX9GISEL-NEXT:    s_endpgm
178 ; GFX10DAGISEL-LABEL: const_value:
179 ; GFX10DAGISEL:       ; %bb.0: ; %entry
180 ; GFX10DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
181 ; GFX10DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
182 ; GFX10DAGISEL-NEXT:    v_mov_b32_e32 v1, 0x7b
183 ; GFX10DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
184 ; GFX10DAGISEL-NEXT:    global_store_dword v0, v1, s[0:1]
185 ; GFX10DAGISEL-NEXT:    s_endpgm
187 ; GFX10GISEL-LABEL: const_value:
188 ; GFX10GISEL:       ; %bb.0: ; %entry
189 ; GFX10GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
190 ; GFX10GISEL-NEXT:    v_mov_b32_e32 v0, 0x7b
191 ; GFX10GISEL-NEXT:    v_mov_b32_e32 v1, 0
192 ; GFX10GISEL-NEXT:    s_waitcnt lgkmcnt(0)
193 ; GFX10GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
194 ; GFX10GISEL-NEXT:    s_endpgm
196 ; GFX1164DAGISEL-LABEL: const_value:
197 ; GFX1164DAGISEL:       ; %bb.0: ; %entry
198 ; GFX1164DAGISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
199 ; GFX1164DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
200 ; GFX1164DAGISEL-NEXT:    v_mov_b32_e32 v1, 0x7b
201 ; GFX1164DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
202 ; GFX1164DAGISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
203 ; GFX1164DAGISEL-NEXT:    s_nop 0
204 ; GFX1164DAGISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
205 ; GFX1164DAGISEL-NEXT:    s_endpgm
207 ; GFX1164GISEL-LABEL: const_value:
208 ; GFX1164GISEL:       ; %bb.0: ; %entry
209 ; GFX1164GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
210 ; GFX1164GISEL-NEXT:    v_mov_b32_e32 v0, 0x7b
211 ; GFX1164GISEL-NEXT:    v_mov_b32_e32 v1, 0
212 ; GFX1164GISEL-NEXT:    s_waitcnt lgkmcnt(0)
213 ; GFX1164GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
214 ; GFX1164GISEL-NEXT:    s_nop 0
215 ; GFX1164GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
216 ; GFX1164GISEL-NEXT:    s_endpgm
218 ; GFX1132DAGISEL-LABEL: const_value:
219 ; GFX1132DAGISEL:       ; %bb.0: ; %entry
220 ; GFX1132DAGISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
221 ; GFX1132DAGISEL-NEXT:    v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v1, 0x7b
222 ; GFX1132DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
223 ; GFX1132DAGISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
224 ; GFX1132DAGISEL-NEXT:    s_nop 0
225 ; GFX1132DAGISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
226 ; GFX1132DAGISEL-NEXT:    s_endpgm
228 ; GFX1132GISEL-LABEL: const_value:
229 ; GFX1132GISEL:       ; %bb.0: ; %entry
230 ; GFX1132GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
231 ; GFX1132GISEL-NEXT:    v_dual_mov_b32 v0, 0x7b :: v_dual_mov_b32 v1, 0
232 ; GFX1132GISEL-NEXT:    s_waitcnt lgkmcnt(0)
233 ; GFX1132GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
234 ; GFX1132GISEL-NEXT:    s_nop 0
235 ; GFX1132GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
236 ; GFX1132GISEL-NEXT:    s_endpgm
237 entry:
238     %result = call i32 @llvm.amdgcn.wave.reduce.umin.i32(i32 123, i32 1)
239     store i32 %result, ptr addrspace(1) %out
240     ret void
243 define amdgpu_kernel void @poison_value(ptr addrspace(1) %out) {
244 ; GFX8DAGISEL-LABEL: poison_value:
245 ; GFX8DAGISEL:       ; %bb.0: ; %entry
246 ; GFX8DAGISEL-NEXT:    s_endpgm
248 ; GFX8GISEL-LABEL: poison_value:
249 ; GFX8GISEL:       ; %bb.0: ; %entry
250 ; GFX8GISEL-NEXT:    s_endpgm
252 ; GFX9DAGISEL-LABEL: poison_value:
253 ; GFX9DAGISEL:       ; %bb.0: ; %entry
254 ; GFX9DAGISEL-NEXT:    s_endpgm
256 ; GFX9GISEL-LABEL: poison_value:
257 ; GFX9GISEL:       ; %bb.0: ; %entry
258 ; GFX9GISEL-NEXT:    s_endpgm
260 ; GFX10DAGISEL-LABEL: poison_value:
261 ; GFX10DAGISEL:       ; %bb.0: ; %entry
262 ; GFX10DAGISEL-NEXT:    s_endpgm
264 ; GFX10GISEL-LABEL: poison_value:
265 ; GFX10GISEL:       ; %bb.0: ; %entry
266 ; GFX10GISEL-NEXT:    s_endpgm
268 ; GFX11DAGISEL-LABEL: poison_value:
269 ; GFX11DAGISEL:       ; %bb.0: ; %entry
270 ; GFX11DAGISEL-NEXT:    s_endpgm
272 ; GFX11GISEL-LABEL: poison_value:
273 ; GFX11GISEL:       ; %bb.0: ; %entry
274 ; GFX11GISEL-NEXT:    s_endpgm
275 entry:
276     %result = call i32 @llvm.amdgcn.wave.reduce.umin.i32(i32 poison, i32 1)
277     store i32 %result, ptr addrspace(1) %out
278     ret void
281 define amdgpu_kernel void @divergent_value(ptr addrspace(1) %out) {
282 ; GFX8DAGISEL-LABEL: divergent_value:
283 ; GFX8DAGISEL:       ; %bb.0: ; %entry
284 ; GFX8DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
285 ; GFX8DAGISEL-NEXT:    s_mov_b64 s[2:3], exec
286 ; GFX8DAGISEL-NEXT:    s_mov_b32 s4, -1
287 ; GFX8DAGISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
288 ; GFX8DAGISEL-NEXT:    s_ff1_i32_b64 s5, s[2:3]
289 ; GFX8DAGISEL-NEXT:    v_readlane_b32 s6, v0, s5
290 ; GFX8DAGISEL-NEXT:    s_bitset0_b64 s[2:3], s5
291 ; GFX8DAGISEL-NEXT:    s_min_u32 s4, s4, s6
292 ; GFX8DAGISEL-NEXT:    s_cmp_lg_u64 s[2:3], 0
293 ; GFX8DAGISEL-NEXT:    s_cbranch_scc1 .LBB3_1
294 ; GFX8DAGISEL-NEXT:  ; %bb.2:
295 ; GFX8DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
296 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v0, s0
297 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v1, s1
298 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v2, s4
299 ; GFX8DAGISEL-NEXT:    flat_store_dword v[0:1], v2
300 ; GFX8DAGISEL-NEXT:    s_endpgm
302 ; GFX8GISEL-LABEL: divergent_value:
303 ; GFX8GISEL:       ; %bb.0: ; %entry
304 ; GFX8GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
305 ; GFX8GISEL-NEXT:    s_mov_b64 s[2:3], exec
306 ; GFX8GISEL-NEXT:    s_mov_b32 s4, -1
307 ; GFX8GISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
308 ; GFX8GISEL-NEXT:    s_ff1_i32_b64 s5, s[2:3]
309 ; GFX8GISEL-NEXT:    v_readlane_b32 s6, v0, s5
310 ; GFX8GISEL-NEXT:    s_bitset0_b64 s[2:3], s5
311 ; GFX8GISEL-NEXT:    s_min_u32 s4, s4, s6
312 ; GFX8GISEL-NEXT:    s_cmp_lg_u64 s[2:3], 0
313 ; GFX8GISEL-NEXT:    s_cbranch_scc1 .LBB3_1
314 ; GFX8GISEL-NEXT:  ; %bb.2:
315 ; GFX8GISEL-NEXT:    s_waitcnt lgkmcnt(0)
316 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v0, s0
317 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v2, s4
318 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v1, s1
319 ; GFX8GISEL-NEXT:    flat_store_dword v[0:1], v2
320 ; GFX8GISEL-NEXT:    s_endpgm
322 ; GFX9DAGISEL-LABEL: divergent_value:
323 ; GFX9DAGISEL:       ; %bb.0: ; %entry
324 ; GFX9DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
325 ; GFX9DAGISEL-NEXT:    v_mov_b32_e32 v1, 0
326 ; GFX9DAGISEL-NEXT:    s_mov_b64 s[2:3], exec
327 ; GFX9DAGISEL-NEXT:    s_mov_b32 s4, -1
328 ; GFX9DAGISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
329 ; GFX9DAGISEL-NEXT:    s_ff1_i32_b64 s5, s[2:3]
330 ; GFX9DAGISEL-NEXT:    v_readlane_b32 s6, v0, s5
331 ; GFX9DAGISEL-NEXT:    s_bitset0_b64 s[2:3], s5
332 ; GFX9DAGISEL-NEXT:    s_min_u32 s4, s4, s6
333 ; GFX9DAGISEL-NEXT:    s_cmp_lg_u64 s[2:3], 0
334 ; GFX9DAGISEL-NEXT:    s_cbranch_scc1 .LBB3_1
335 ; GFX9DAGISEL-NEXT:  ; %bb.2:
336 ; GFX9DAGISEL-NEXT:    v_mov_b32_e32 v0, s4
337 ; GFX9DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
338 ; GFX9DAGISEL-NEXT:    global_store_dword v1, v0, s[0:1]
339 ; GFX9DAGISEL-NEXT:    s_endpgm
341 ; GFX9GISEL-LABEL: divergent_value:
342 ; GFX9GISEL:       ; %bb.0: ; %entry
343 ; GFX9GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
344 ; GFX9GISEL-NEXT:    s_mov_b64 s[2:3], exec
345 ; GFX9GISEL-NEXT:    s_mov_b32 s4, -1
346 ; GFX9GISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
347 ; GFX9GISEL-NEXT:    s_ff1_i32_b64 s5, s[2:3]
348 ; GFX9GISEL-NEXT:    v_readlane_b32 s6, v0, s5
349 ; GFX9GISEL-NEXT:    s_bitset0_b64 s[2:3], s5
350 ; GFX9GISEL-NEXT:    s_min_u32 s4, s4, s6
351 ; GFX9GISEL-NEXT:    s_cmp_lg_u64 s[2:3], 0
352 ; GFX9GISEL-NEXT:    s_cbranch_scc1 .LBB3_1
353 ; GFX9GISEL-NEXT:  ; %bb.2:
354 ; GFX9GISEL-NEXT:    v_mov_b32_e32 v0, s4
355 ; GFX9GISEL-NEXT:    v_mov_b32_e32 v1, 0
356 ; GFX9GISEL-NEXT:    s_waitcnt lgkmcnt(0)
357 ; GFX9GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
358 ; GFX9GISEL-NEXT:    s_endpgm
360 ; GFX1064DAGISEL-LABEL: divergent_value:
361 ; GFX1064DAGISEL:       ; %bb.0: ; %entry
362 ; GFX1064DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
363 ; GFX1064DAGISEL-NEXT:    v_mov_b32_e32 v1, 0
364 ; GFX1064DAGISEL-NEXT:    s_mov_b64 s[2:3], exec
365 ; GFX1064DAGISEL-NEXT:    s_mov_b32 s4, -1
366 ; GFX1064DAGISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
367 ; GFX1064DAGISEL-NEXT:    s_ff1_i32_b64 s5, s[2:3]
368 ; GFX1064DAGISEL-NEXT:    v_readlane_b32 s6, v0, s5
369 ; GFX1064DAGISEL-NEXT:    s_bitset0_b64 s[2:3], s5
370 ; GFX1064DAGISEL-NEXT:    s_min_u32 s4, s4, s6
371 ; GFX1064DAGISEL-NEXT:    s_cmp_lg_u64 s[2:3], 0
372 ; GFX1064DAGISEL-NEXT:    s_cbranch_scc1 .LBB3_1
373 ; GFX1064DAGISEL-NEXT:  ; %bb.2:
374 ; GFX1064DAGISEL-NEXT:    v_mov_b32_e32 v0, s4
375 ; GFX1064DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
376 ; GFX1064DAGISEL-NEXT:    global_store_dword v1, v0, s[0:1]
377 ; GFX1064DAGISEL-NEXT:    s_endpgm
379 ; GFX1064GISEL-LABEL: divergent_value:
380 ; GFX1064GISEL:       ; %bb.0: ; %entry
381 ; GFX1064GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
382 ; GFX1064GISEL-NEXT:    s_mov_b64 s[2:3], exec
383 ; GFX1064GISEL-NEXT:    s_mov_b32 s4, -1
384 ; GFX1064GISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
385 ; GFX1064GISEL-NEXT:    s_ff1_i32_b64 s5, s[2:3]
386 ; GFX1064GISEL-NEXT:    v_readlane_b32 s6, v0, s5
387 ; GFX1064GISEL-NEXT:    s_bitset0_b64 s[2:3], s5
388 ; GFX1064GISEL-NEXT:    s_min_u32 s4, s4, s6
389 ; GFX1064GISEL-NEXT:    s_cmp_lg_u64 s[2:3], 0
390 ; GFX1064GISEL-NEXT:    s_cbranch_scc1 .LBB3_1
391 ; GFX1064GISEL-NEXT:  ; %bb.2:
392 ; GFX1064GISEL-NEXT:    v_mov_b32_e32 v0, s4
393 ; GFX1064GISEL-NEXT:    v_mov_b32_e32 v1, 0
394 ; GFX1064GISEL-NEXT:    s_waitcnt lgkmcnt(0)
395 ; GFX1064GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
396 ; GFX1064GISEL-NEXT:    s_endpgm
398 ; GFX1032DAGISEL-LABEL: divergent_value:
399 ; GFX1032DAGISEL:       ; %bb.0: ; %entry
400 ; GFX1032DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
401 ; GFX1032DAGISEL-NEXT:    v_mov_b32_e32 v1, 0
402 ; GFX1032DAGISEL-NEXT:    s_mov_b32 s3, exec_lo
403 ; GFX1032DAGISEL-NEXT:    s_mov_b32 s2, -1
404 ; GFX1032DAGISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
405 ; GFX1032DAGISEL-NEXT:    s_ff1_i32_b32 s4, s3
406 ; GFX1032DAGISEL-NEXT:    v_readlane_b32 s5, v0, s4
407 ; GFX1032DAGISEL-NEXT:    s_bitset0_b32 s3, s4
408 ; GFX1032DAGISEL-NEXT:    s_min_u32 s2, s2, s5
409 ; GFX1032DAGISEL-NEXT:    s_cmp_lg_u32 s3, 0
410 ; GFX1032DAGISEL-NEXT:    s_cbranch_scc1 .LBB3_1
411 ; GFX1032DAGISEL-NEXT:  ; %bb.2:
412 ; GFX1032DAGISEL-NEXT:    v_mov_b32_e32 v0, s2
413 ; GFX1032DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
414 ; GFX1032DAGISEL-NEXT:    global_store_dword v1, v0, s[0:1]
415 ; GFX1032DAGISEL-NEXT:    s_endpgm
417 ; GFX1032GISEL-LABEL: divergent_value:
418 ; GFX1032GISEL:       ; %bb.0: ; %entry
419 ; GFX1032GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
420 ; GFX1032GISEL-NEXT:    s_mov_b32 s3, exec_lo
421 ; GFX1032GISEL-NEXT:    s_mov_b32 s2, -1
422 ; GFX1032GISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
423 ; GFX1032GISEL-NEXT:    s_ff1_i32_b32 s4, s3
424 ; GFX1032GISEL-NEXT:    v_readlane_b32 s5, v0, s4
425 ; GFX1032GISEL-NEXT:    s_bitset0_b32 s3, s4
426 ; GFX1032GISEL-NEXT:    s_min_u32 s2, s2, s5
427 ; GFX1032GISEL-NEXT:    s_cmp_lg_u32 s3, 0
428 ; GFX1032GISEL-NEXT:    s_cbranch_scc1 .LBB3_1
429 ; GFX1032GISEL-NEXT:  ; %bb.2:
430 ; GFX1032GISEL-NEXT:    v_mov_b32_e32 v0, s2
431 ; GFX1032GISEL-NEXT:    v_mov_b32_e32 v1, 0
432 ; GFX1032GISEL-NEXT:    s_waitcnt lgkmcnt(0)
433 ; GFX1032GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
434 ; GFX1032GISEL-NEXT:    s_endpgm
436 ; GFX1164DAGISEL-LABEL: divergent_value:
437 ; GFX1164DAGISEL:       ; %bb.0: ; %entry
438 ; GFX1164DAGISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
439 ; GFX1164DAGISEL-NEXT:    v_mov_b32_e32 v1, 0
440 ; GFX1164DAGISEL-NEXT:    s_mov_b64 s[2:3], exec
441 ; GFX1164DAGISEL-NEXT:    s_mov_b32 s4, -1
442 ; GFX1164DAGISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
443 ; GFX1164DAGISEL-NEXT:    s_ctz_i32_b64 s5, s[2:3]
444 ; GFX1164DAGISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
445 ; GFX1164DAGISEL-NEXT:    v_readlane_b32 s6, v0, s5
446 ; GFX1164DAGISEL-NEXT:    s_bitset0_b64 s[2:3], s5
447 ; GFX1164DAGISEL-NEXT:    s_min_u32 s4, s4, s6
448 ; GFX1164DAGISEL-NEXT:    s_cmp_lg_u64 s[2:3], 0
449 ; GFX1164DAGISEL-NEXT:    s_cbranch_scc1 .LBB3_1
450 ; GFX1164DAGISEL-NEXT:  ; %bb.2:
451 ; GFX1164DAGISEL-NEXT:    v_mov_b32_e32 v0, s4
452 ; GFX1164DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
453 ; GFX1164DAGISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
454 ; GFX1164DAGISEL-NEXT:    s_nop 0
455 ; GFX1164DAGISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
456 ; GFX1164DAGISEL-NEXT:    s_endpgm
458 ; GFX1164GISEL-LABEL: divergent_value:
459 ; GFX1164GISEL:       ; %bb.0: ; %entry
460 ; GFX1164GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
461 ; GFX1164GISEL-NEXT:    s_mov_b64 s[2:3], exec
462 ; GFX1164GISEL-NEXT:    s_mov_b32 s4, -1
463 ; GFX1164GISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
464 ; GFX1164GISEL-NEXT:    s_ctz_i32_b64 s5, s[2:3]
465 ; GFX1164GISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
466 ; GFX1164GISEL-NEXT:    v_readlane_b32 s6, v0, s5
467 ; GFX1164GISEL-NEXT:    s_bitset0_b64 s[2:3], s5
468 ; GFX1164GISEL-NEXT:    s_min_u32 s4, s4, s6
469 ; GFX1164GISEL-NEXT:    s_cmp_lg_u64 s[2:3], 0
470 ; GFX1164GISEL-NEXT:    s_cbranch_scc1 .LBB3_1
471 ; GFX1164GISEL-NEXT:  ; %bb.2:
472 ; GFX1164GISEL-NEXT:    v_mov_b32_e32 v0, s4
473 ; GFX1164GISEL-NEXT:    v_mov_b32_e32 v1, 0
474 ; GFX1164GISEL-NEXT:    s_waitcnt lgkmcnt(0)
475 ; GFX1164GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
476 ; GFX1164GISEL-NEXT:    s_nop 0
477 ; GFX1164GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
478 ; GFX1164GISEL-NEXT:    s_endpgm
480 ; GFX1132DAGISEL-LABEL: divergent_value:
481 ; GFX1132DAGISEL:       ; %bb.0: ; %entry
482 ; GFX1132DAGISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
483 ; GFX1132DAGISEL-NEXT:    v_mov_b32_e32 v1, 0
484 ; GFX1132DAGISEL-NEXT:    s_mov_b32 s3, exec_lo
485 ; GFX1132DAGISEL-NEXT:    s_mov_b32 s2, -1
486 ; GFX1132DAGISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
487 ; GFX1132DAGISEL-NEXT:    s_ctz_i32_b32 s4, s3
488 ; GFX1132DAGISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
489 ; GFX1132DAGISEL-NEXT:    v_readlane_b32 s5, v0, s4
490 ; GFX1132DAGISEL-NEXT:    s_bitset0_b32 s3, s4
491 ; GFX1132DAGISEL-NEXT:    s_min_u32 s2, s2, s5
492 ; GFX1132DAGISEL-NEXT:    s_cmp_lg_u32 s3, 0
493 ; GFX1132DAGISEL-NEXT:    s_cbranch_scc1 .LBB3_1
494 ; GFX1132DAGISEL-NEXT:  ; %bb.2:
495 ; GFX1132DAGISEL-NEXT:    v_mov_b32_e32 v0, s2
496 ; GFX1132DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
497 ; GFX1132DAGISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
498 ; GFX1132DAGISEL-NEXT:    s_nop 0
499 ; GFX1132DAGISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
500 ; GFX1132DAGISEL-NEXT:    s_endpgm
502 ; GFX1132GISEL-LABEL: divergent_value:
503 ; GFX1132GISEL:       ; %bb.0: ; %entry
504 ; GFX1132GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
505 ; GFX1132GISEL-NEXT:    s_mov_b32 s3, exec_lo
506 ; GFX1132GISEL-NEXT:    s_mov_b32 s2, -1
507 ; GFX1132GISEL-NEXT:  .LBB3_1: ; =>This Inner Loop Header: Depth=1
508 ; GFX1132GISEL-NEXT:    s_ctz_i32_b32 s4, s3
509 ; GFX1132GISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
510 ; GFX1132GISEL-NEXT:    v_readlane_b32 s5, v0, s4
511 ; GFX1132GISEL-NEXT:    s_bitset0_b32 s3, s4
512 ; GFX1132GISEL-NEXT:    s_min_u32 s2, s2, s5
513 ; GFX1132GISEL-NEXT:    s_cmp_lg_u32 s3, 0
514 ; GFX1132GISEL-NEXT:    s_cbranch_scc1 .LBB3_1
515 ; GFX1132GISEL-NEXT:  ; %bb.2:
516 ; GFX1132GISEL-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, 0
517 ; GFX1132GISEL-NEXT:    s_waitcnt lgkmcnt(0)
518 ; GFX1132GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
519 ; GFX1132GISEL-NEXT:    s_nop 0
520 ; GFX1132GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
521 ; GFX1132GISEL-NEXT:    s_endpgm
522 entry:
523     %id.x = call i32 @llvm.amdgcn.workitem.id.x()
524     %result = call i32 @llvm.amdgcn.wave.reduce.umin.i32(i32 %id.x, i32 1)
525     store i32 %result, ptr addrspace(1) %out
526     ret void
529 define amdgpu_kernel void @divergent_cfg(ptr addrspace(1) %out, i32 %in) {
530 ; GFX8DAGISEL-LABEL: divergent_cfg:
531 ; GFX8DAGISEL:       ; %bb.0: ; %entry
532 ; GFX8DAGISEL-NEXT:    v_cmp_lt_u32_e32 vcc, 15, v0
533 ; GFX8DAGISEL-NEXT:    ; implicit-def: $sgpr4
534 ; GFX8DAGISEL-NEXT:    s_and_saveexec_b64 s[2:3], vcc
535 ; GFX8DAGISEL-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
536 ; GFX8DAGISEL-NEXT:    s_cbranch_execz .LBB4_2
537 ; GFX8DAGISEL-NEXT:  ; %bb.1: ; %else
538 ; GFX8DAGISEL-NEXT:    s_load_dword s4, s[0:1], 0x2c
539 ; GFX8DAGISEL-NEXT:    ; implicit-def: $vgpr0
540 ; GFX8DAGISEL-NEXT:  .LBB4_2: ; %Flow
541 ; GFX8DAGISEL-NEXT:    s_or_saveexec_b64 s[2:3], s[2:3]
542 ; GFX8DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
543 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v1, s4
544 ; GFX8DAGISEL-NEXT:    s_xor_b64 exec, exec, s[2:3]
545 ; GFX8DAGISEL-NEXT:    s_cbranch_execz .LBB4_6
546 ; GFX8DAGISEL-NEXT:  ; %bb.3: ; %if
547 ; GFX8DAGISEL-NEXT:    s_mov_b64 s[4:5], exec
548 ; GFX8DAGISEL-NEXT:    s_mov_b32 s6, -1
549 ; GFX8DAGISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
550 ; GFX8DAGISEL-NEXT:    s_ff1_i32_b64 s7, s[4:5]
551 ; GFX8DAGISEL-NEXT:    v_readlane_b32 s8, v0, s7
552 ; GFX8DAGISEL-NEXT:    s_bitset0_b64 s[4:5], s7
553 ; GFX8DAGISEL-NEXT:    s_min_u32 s6, s6, s8
554 ; GFX8DAGISEL-NEXT:    s_cmp_lg_u64 s[4:5], 0
555 ; GFX8DAGISEL-NEXT:    s_cbranch_scc1 .LBB4_4
556 ; GFX8DAGISEL-NEXT:  ; %bb.5:
557 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v1, s6
558 ; GFX8DAGISEL-NEXT:  .LBB4_6: ; %endif
559 ; GFX8DAGISEL-NEXT:    s_or_b64 exec, exec, s[2:3]
560 ; GFX8DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
561 ; GFX8DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
562 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v3, s1
563 ; GFX8DAGISEL-NEXT:    v_mov_b32_e32 v2, s0
564 ; GFX8DAGISEL-NEXT:    flat_store_dword v[2:3], v1
565 ; GFX8DAGISEL-NEXT:    s_endpgm
567 ; GFX8GISEL-LABEL: divergent_cfg:
568 ; GFX8GISEL:       ; %bb.0: ; %entry
569 ; GFX8GISEL-NEXT:    v_cmp_le_u32_e32 vcc, 16, v0
570 ; GFX8GISEL-NEXT:    ; implicit-def: $sgpr6
571 ; GFX8GISEL-NEXT:    s_and_saveexec_b64 s[2:3], vcc
572 ; GFX8GISEL-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
573 ; GFX8GISEL-NEXT:    s_cbranch_execz .LBB4_2
574 ; GFX8GISEL-NEXT:  ; %bb.1: ; %else
575 ; GFX8GISEL-NEXT:    s_load_dword s4, s[0:1], 0x2c
576 ; GFX8GISEL-NEXT:    ; implicit-def: $vgpr0
577 ; GFX8GISEL-NEXT:    s_waitcnt lgkmcnt(0)
578 ; GFX8GISEL-NEXT:    s_mov_b32 s6, s4
579 ; GFX8GISEL-NEXT:  .LBB4_2: ; %Flow
580 ; GFX8GISEL-NEXT:    s_andn2_saveexec_b64 s[2:3], s[2:3]
581 ; GFX8GISEL-NEXT:    s_cbranch_execz .LBB4_5
582 ; GFX8GISEL-NEXT:  ; %bb.3: ; %if
583 ; GFX8GISEL-NEXT:    s_mov_b64 s[4:5], exec
584 ; GFX8GISEL-NEXT:    s_mov_b32 s6, -1
585 ; GFX8GISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
586 ; GFX8GISEL-NEXT:    s_ff1_i32_b64 s7, s[4:5]
587 ; GFX8GISEL-NEXT:    v_readlane_b32 s8, v0, s7
588 ; GFX8GISEL-NEXT:    s_bitset0_b64 s[4:5], s7
589 ; GFX8GISEL-NEXT:    s_min_u32 s6, s6, s8
590 ; GFX8GISEL-NEXT:    s_cmp_lg_u64 s[4:5], 0
591 ; GFX8GISEL-NEXT:    s_cbranch_scc1 .LBB4_4
592 ; GFX8GISEL-NEXT:  .LBB4_5: ; %endif
593 ; GFX8GISEL-NEXT:    s_or_b64 exec, exec, s[2:3]
594 ; GFX8GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
595 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v2, s6
596 ; GFX8GISEL-NEXT:    s_waitcnt lgkmcnt(0)
597 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v0, s0
598 ; GFX8GISEL-NEXT:    v_mov_b32_e32 v1, s1
599 ; GFX8GISEL-NEXT:    flat_store_dword v[0:1], v2
600 ; GFX8GISEL-NEXT:    s_endpgm
602 ; GFX9DAGISEL-LABEL: divergent_cfg:
603 ; GFX9DAGISEL:       ; %bb.0: ; %entry
604 ; GFX9DAGISEL-NEXT:    v_cmp_lt_u32_e32 vcc, 15, v0
605 ; GFX9DAGISEL-NEXT:    ; implicit-def: $sgpr4
606 ; GFX9DAGISEL-NEXT:    s_and_saveexec_b64 s[2:3], vcc
607 ; GFX9DAGISEL-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
608 ; GFX9DAGISEL-NEXT:    s_cbranch_execz .LBB4_2
609 ; GFX9DAGISEL-NEXT:  ; %bb.1: ; %else
610 ; GFX9DAGISEL-NEXT:    s_load_dword s4, s[0:1], 0x2c
611 ; GFX9DAGISEL-NEXT:    ; implicit-def: $vgpr0
612 ; GFX9DAGISEL-NEXT:  .LBB4_2: ; %Flow
613 ; GFX9DAGISEL-NEXT:    s_or_saveexec_b64 s[2:3], s[2:3]
614 ; GFX9DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
615 ; GFX9DAGISEL-NEXT:    v_mov_b32_e32 v1, s4
616 ; GFX9DAGISEL-NEXT:    s_xor_b64 exec, exec, s[2:3]
617 ; GFX9DAGISEL-NEXT:    s_cbranch_execz .LBB4_6
618 ; GFX9DAGISEL-NEXT:  ; %bb.3: ; %if
619 ; GFX9DAGISEL-NEXT:    s_mov_b64 s[4:5], exec
620 ; GFX9DAGISEL-NEXT:    s_mov_b32 s6, -1
621 ; GFX9DAGISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
622 ; GFX9DAGISEL-NEXT:    s_ff1_i32_b64 s7, s[4:5]
623 ; GFX9DAGISEL-NEXT:    v_readlane_b32 s8, v0, s7
624 ; GFX9DAGISEL-NEXT:    s_bitset0_b64 s[4:5], s7
625 ; GFX9DAGISEL-NEXT:    s_min_u32 s6, s6, s8
626 ; GFX9DAGISEL-NEXT:    s_cmp_lg_u64 s[4:5], 0
627 ; GFX9DAGISEL-NEXT:    s_cbranch_scc1 .LBB4_4
628 ; GFX9DAGISEL-NEXT:  ; %bb.5:
629 ; GFX9DAGISEL-NEXT:    v_mov_b32_e32 v1, s6
630 ; GFX9DAGISEL-NEXT:  .LBB4_6: ; %endif
631 ; GFX9DAGISEL-NEXT:    s_or_b64 exec, exec, s[2:3]
632 ; GFX9DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
633 ; GFX9DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
634 ; GFX9DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
635 ; GFX9DAGISEL-NEXT:    global_store_dword v0, v1, s[0:1]
636 ; GFX9DAGISEL-NEXT:    s_endpgm
638 ; GFX9GISEL-LABEL: divergent_cfg:
639 ; GFX9GISEL:       ; %bb.0: ; %entry
640 ; GFX9GISEL-NEXT:    v_cmp_le_u32_e32 vcc, 16, v0
641 ; GFX9GISEL-NEXT:    ; implicit-def: $sgpr6
642 ; GFX9GISEL-NEXT:    s_and_saveexec_b64 s[2:3], vcc
643 ; GFX9GISEL-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
644 ; GFX9GISEL-NEXT:    s_cbranch_execz .LBB4_2
645 ; GFX9GISEL-NEXT:  ; %bb.1: ; %else
646 ; GFX9GISEL-NEXT:    s_load_dword s4, s[0:1], 0x2c
647 ; GFX9GISEL-NEXT:    ; implicit-def: $vgpr0
648 ; GFX9GISEL-NEXT:    s_waitcnt lgkmcnt(0)
649 ; GFX9GISEL-NEXT:    s_mov_b32 s6, s4
650 ; GFX9GISEL-NEXT:  .LBB4_2: ; %Flow
651 ; GFX9GISEL-NEXT:    s_andn2_saveexec_b64 s[2:3], s[2:3]
652 ; GFX9GISEL-NEXT:    s_cbranch_execz .LBB4_5
653 ; GFX9GISEL-NEXT:  ; %bb.3: ; %if
654 ; GFX9GISEL-NEXT:    s_mov_b64 s[4:5], exec
655 ; GFX9GISEL-NEXT:    s_mov_b32 s6, -1
656 ; GFX9GISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
657 ; GFX9GISEL-NEXT:    s_ff1_i32_b64 s7, s[4:5]
658 ; GFX9GISEL-NEXT:    v_readlane_b32 s8, v0, s7
659 ; GFX9GISEL-NEXT:    s_bitset0_b64 s[4:5], s7
660 ; GFX9GISEL-NEXT:    s_min_u32 s6, s6, s8
661 ; GFX9GISEL-NEXT:    s_cmp_lg_u64 s[4:5], 0
662 ; GFX9GISEL-NEXT:    s_cbranch_scc1 .LBB4_4
663 ; GFX9GISEL-NEXT:  .LBB4_5: ; %endif
664 ; GFX9GISEL-NEXT:    s_or_b64 exec, exec, s[2:3]
665 ; GFX9GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
666 ; GFX9GISEL-NEXT:    v_mov_b32_e32 v0, s6
667 ; GFX9GISEL-NEXT:    v_mov_b32_e32 v1, 0
668 ; GFX9GISEL-NEXT:    s_waitcnt lgkmcnt(0)
669 ; GFX9GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
670 ; GFX9GISEL-NEXT:    s_endpgm
672 ; GFX1064DAGISEL-LABEL: divergent_cfg:
673 ; GFX1064DAGISEL:       ; %bb.0: ; %entry
674 ; GFX1064DAGISEL-NEXT:    v_cmp_lt_u32_e32 vcc, 15, v0
675 ; GFX1064DAGISEL-NEXT:    ; implicit-def: $sgpr4
676 ; GFX1064DAGISEL-NEXT:    s_and_saveexec_b64 s[2:3], vcc
677 ; GFX1064DAGISEL-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
678 ; GFX1064DAGISEL-NEXT:    s_cbranch_execz .LBB4_2
679 ; GFX1064DAGISEL-NEXT:  ; %bb.1: ; %else
680 ; GFX1064DAGISEL-NEXT:    s_load_dword s4, s[0:1], 0x2c
681 ; GFX1064DAGISEL-NEXT:    ; implicit-def: $vgpr0
682 ; GFX1064DAGISEL-NEXT:  .LBB4_2: ; %Flow
683 ; GFX1064DAGISEL-NEXT:    s_or_saveexec_b64 s[2:3], s[2:3]
684 ; GFX1064DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
685 ; GFX1064DAGISEL-NEXT:    v_mov_b32_e32 v1, s4
686 ; GFX1064DAGISEL-NEXT:    s_xor_b64 exec, exec, s[2:3]
687 ; GFX1064DAGISEL-NEXT:    s_cbranch_execz .LBB4_6
688 ; GFX1064DAGISEL-NEXT:  ; %bb.3: ; %if
689 ; GFX1064DAGISEL-NEXT:    s_mov_b64 s[4:5], exec
690 ; GFX1064DAGISEL-NEXT:    s_mov_b32 s6, -1
691 ; GFX1064DAGISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
692 ; GFX1064DAGISEL-NEXT:    s_ff1_i32_b64 s7, s[4:5]
693 ; GFX1064DAGISEL-NEXT:    v_readlane_b32 s8, v0, s7
694 ; GFX1064DAGISEL-NEXT:    s_bitset0_b64 s[4:5], s7
695 ; GFX1064DAGISEL-NEXT:    s_min_u32 s6, s6, s8
696 ; GFX1064DAGISEL-NEXT:    s_cmp_lg_u64 s[4:5], 0
697 ; GFX1064DAGISEL-NEXT:    s_cbranch_scc1 .LBB4_4
698 ; GFX1064DAGISEL-NEXT:  ; %bb.5:
699 ; GFX1064DAGISEL-NEXT:    v_mov_b32_e32 v1, s6
700 ; GFX1064DAGISEL-NEXT:  .LBB4_6: ; %endif
701 ; GFX1064DAGISEL-NEXT:    s_or_b64 exec, exec, s[2:3]
702 ; GFX1064DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
703 ; GFX1064DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
704 ; GFX1064DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
705 ; GFX1064DAGISEL-NEXT:    global_store_dword v0, v1, s[0:1]
706 ; GFX1064DAGISEL-NEXT:    s_endpgm
708 ; GFX1064GISEL-LABEL: divergent_cfg:
709 ; GFX1064GISEL:       ; %bb.0: ; %entry
710 ; GFX1064GISEL-NEXT:    v_cmp_le_u32_e32 vcc, 16, v0
711 ; GFX1064GISEL-NEXT:    ; implicit-def: $sgpr6
712 ; GFX1064GISEL-NEXT:    s_and_saveexec_b64 s[2:3], vcc
713 ; GFX1064GISEL-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
714 ; GFX1064GISEL-NEXT:    s_cbranch_execz .LBB4_2
715 ; GFX1064GISEL-NEXT:  ; %bb.1: ; %else
716 ; GFX1064GISEL-NEXT:    s_load_dword s4, s[0:1], 0x2c
717 ; GFX1064GISEL-NEXT:    ; implicit-def: $vgpr0
718 ; GFX1064GISEL-NEXT:    s_waitcnt lgkmcnt(0)
719 ; GFX1064GISEL-NEXT:    s_mov_b32 s6, s4
720 ; GFX1064GISEL-NEXT:  .LBB4_2: ; %Flow
721 ; GFX1064GISEL-NEXT:    s_andn2_saveexec_b64 s[2:3], s[2:3]
722 ; GFX1064GISEL-NEXT:    s_cbranch_execz .LBB4_5
723 ; GFX1064GISEL-NEXT:  ; %bb.3: ; %if
724 ; GFX1064GISEL-NEXT:    s_mov_b64 s[4:5], exec
725 ; GFX1064GISEL-NEXT:    s_mov_b32 s6, -1
726 ; GFX1064GISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
727 ; GFX1064GISEL-NEXT:    s_ff1_i32_b64 s7, s[4:5]
728 ; GFX1064GISEL-NEXT:    v_readlane_b32 s8, v0, s7
729 ; GFX1064GISEL-NEXT:    s_bitset0_b64 s[4:5], s7
730 ; GFX1064GISEL-NEXT:    s_min_u32 s6, s6, s8
731 ; GFX1064GISEL-NEXT:    s_cmp_lg_u64 s[4:5], 0
732 ; GFX1064GISEL-NEXT:    s_cbranch_scc1 .LBB4_4
733 ; GFX1064GISEL-NEXT:  .LBB4_5: ; %endif
734 ; GFX1064GISEL-NEXT:    s_or_b64 exec, exec, s[2:3]
735 ; GFX1064GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
736 ; GFX1064GISEL-NEXT:    v_mov_b32_e32 v0, s6
737 ; GFX1064GISEL-NEXT:    v_mov_b32_e32 v1, 0
738 ; GFX1064GISEL-NEXT:    s_waitcnt lgkmcnt(0)
739 ; GFX1064GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
740 ; GFX1064GISEL-NEXT:    s_endpgm
742 ; GFX1032DAGISEL-LABEL: divergent_cfg:
743 ; GFX1032DAGISEL:       ; %bb.0: ; %entry
744 ; GFX1032DAGISEL-NEXT:    v_cmp_lt_u32_e32 vcc_lo, 15, v0
745 ; GFX1032DAGISEL-NEXT:    ; implicit-def: $sgpr3
746 ; GFX1032DAGISEL-NEXT:    s_and_saveexec_b32 s2, vcc_lo
747 ; GFX1032DAGISEL-NEXT:    s_xor_b32 s2, exec_lo, s2
748 ; GFX1032DAGISEL-NEXT:    s_cbranch_execz .LBB4_2
749 ; GFX1032DAGISEL-NEXT:  ; %bb.1: ; %else
750 ; GFX1032DAGISEL-NEXT:    s_load_dword s3, s[0:1], 0x2c
751 ; GFX1032DAGISEL-NEXT:    ; implicit-def: $vgpr0
752 ; GFX1032DAGISEL-NEXT:  .LBB4_2: ; %Flow
753 ; GFX1032DAGISEL-NEXT:    s_or_saveexec_b32 s2, s2
754 ; GFX1032DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
755 ; GFX1032DAGISEL-NEXT:    v_mov_b32_e32 v1, s3
756 ; GFX1032DAGISEL-NEXT:    s_xor_b32 exec_lo, exec_lo, s2
757 ; GFX1032DAGISEL-NEXT:    s_cbranch_execz .LBB4_6
758 ; GFX1032DAGISEL-NEXT:  ; %bb.3: ; %if
759 ; GFX1032DAGISEL-NEXT:    s_mov_b32 s4, exec_lo
760 ; GFX1032DAGISEL-NEXT:    s_mov_b32 s3, -1
761 ; GFX1032DAGISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
762 ; GFX1032DAGISEL-NEXT:    s_ff1_i32_b32 s5, s4
763 ; GFX1032DAGISEL-NEXT:    v_readlane_b32 s6, v0, s5
764 ; GFX1032DAGISEL-NEXT:    s_bitset0_b32 s4, s5
765 ; GFX1032DAGISEL-NEXT:    s_min_u32 s3, s3, s6
766 ; GFX1032DAGISEL-NEXT:    s_cmp_lg_u32 s4, 0
767 ; GFX1032DAGISEL-NEXT:    s_cbranch_scc1 .LBB4_4
768 ; GFX1032DAGISEL-NEXT:  ; %bb.5:
769 ; GFX1032DAGISEL-NEXT:    v_mov_b32_e32 v1, s3
770 ; GFX1032DAGISEL-NEXT:  .LBB4_6: ; %endif
771 ; GFX1032DAGISEL-NEXT:    s_or_b32 exec_lo, exec_lo, s2
772 ; GFX1032DAGISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
773 ; GFX1032DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
774 ; GFX1032DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
775 ; GFX1032DAGISEL-NEXT:    global_store_dword v0, v1, s[0:1]
776 ; GFX1032DAGISEL-NEXT:    s_endpgm
778 ; GFX1032GISEL-LABEL: divergent_cfg:
779 ; GFX1032GISEL:       ; %bb.0: ; %entry
780 ; GFX1032GISEL-NEXT:    v_cmp_le_u32_e32 vcc_lo, 16, v0
781 ; GFX1032GISEL-NEXT:    ; implicit-def: $sgpr2
782 ; GFX1032GISEL-NEXT:    s_and_saveexec_b32 s3, vcc_lo
783 ; GFX1032GISEL-NEXT:    s_xor_b32 s3, exec_lo, s3
784 ; GFX1032GISEL-NEXT:    s_cbranch_execz .LBB4_2
785 ; GFX1032GISEL-NEXT:  ; %bb.1: ; %else
786 ; GFX1032GISEL-NEXT:    s_load_dword s2, s[0:1], 0x2c
787 ; GFX1032GISEL-NEXT:    ; implicit-def: $vgpr0
788 ; GFX1032GISEL-NEXT:    s_waitcnt lgkmcnt(0)
789 ; GFX1032GISEL-NEXT:    s_mov_b32 s2, s2
790 ; GFX1032GISEL-NEXT:  .LBB4_2: ; %Flow
791 ; GFX1032GISEL-NEXT:    s_andn2_saveexec_b32 s3, s3
792 ; GFX1032GISEL-NEXT:    s_cbranch_execz .LBB4_5
793 ; GFX1032GISEL-NEXT:  ; %bb.3: ; %if
794 ; GFX1032GISEL-NEXT:    s_mov_b32 s4, exec_lo
795 ; GFX1032GISEL-NEXT:    s_mov_b32 s2, -1
796 ; GFX1032GISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
797 ; GFX1032GISEL-NEXT:    s_ff1_i32_b32 s5, s4
798 ; GFX1032GISEL-NEXT:    v_readlane_b32 s6, v0, s5
799 ; GFX1032GISEL-NEXT:    s_bitset0_b32 s4, s5
800 ; GFX1032GISEL-NEXT:    s_min_u32 s2, s2, s6
801 ; GFX1032GISEL-NEXT:    s_cmp_lg_u32 s4, 0
802 ; GFX1032GISEL-NEXT:    s_cbranch_scc1 .LBB4_4
803 ; GFX1032GISEL-NEXT:  .LBB4_5: ; %endif
804 ; GFX1032GISEL-NEXT:    s_or_b32 exec_lo, exec_lo, s3
805 ; GFX1032GISEL-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
806 ; GFX1032GISEL-NEXT:    v_mov_b32_e32 v0, s2
807 ; GFX1032GISEL-NEXT:    v_mov_b32_e32 v1, 0
808 ; GFX1032GISEL-NEXT:    s_waitcnt lgkmcnt(0)
809 ; GFX1032GISEL-NEXT:    global_store_dword v1, v0, s[0:1]
810 ; GFX1032GISEL-NEXT:    s_endpgm
812 ; GFX1164DAGISEL-LABEL: divergent_cfg:
813 ; GFX1164DAGISEL:       ; %bb.0: ; %entry
814 ; GFX1164DAGISEL-NEXT:    s_mov_b64 s[2:3], exec
815 ; GFX1164DAGISEL-NEXT:    ; implicit-def: $sgpr4
816 ; GFX1164DAGISEL-NEXT:    v_cmpx_lt_u32_e32 15, v0
817 ; GFX1164DAGISEL-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
818 ; GFX1164DAGISEL-NEXT:    s_cbranch_execz .LBB4_2
819 ; GFX1164DAGISEL-NEXT:  ; %bb.1: ; %else
820 ; GFX1164DAGISEL-NEXT:    s_load_b32 s4, s[0:1], 0x2c
821 ; GFX1164DAGISEL-NEXT:    ; implicit-def: $vgpr0
822 ; GFX1164DAGISEL-NEXT:  .LBB4_2: ; %Flow
823 ; GFX1164DAGISEL-NEXT:    s_or_saveexec_b64 s[2:3], s[2:3]
824 ; GFX1164DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
825 ; GFX1164DAGISEL-NEXT:    v_mov_b32_e32 v1, s4
826 ; GFX1164DAGISEL-NEXT:    s_xor_b64 exec, exec, s[2:3]
827 ; GFX1164DAGISEL-NEXT:    s_cbranch_execz .LBB4_6
828 ; GFX1164DAGISEL-NEXT:  ; %bb.3: ; %if
829 ; GFX1164DAGISEL-NEXT:    s_mov_b64 s[4:5], exec
830 ; GFX1164DAGISEL-NEXT:    s_mov_b32 s6, -1
831 ; GFX1164DAGISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
832 ; GFX1164DAGISEL-NEXT:    s_ctz_i32_b64 s7, s[4:5]
833 ; GFX1164DAGISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
834 ; GFX1164DAGISEL-NEXT:    v_readlane_b32 s8, v0, s7
835 ; GFX1164DAGISEL-NEXT:    s_bitset0_b64 s[4:5], s7
836 ; GFX1164DAGISEL-NEXT:    s_min_u32 s6, s6, s8
837 ; GFX1164DAGISEL-NEXT:    s_cmp_lg_u64 s[4:5], 0
838 ; GFX1164DAGISEL-NEXT:    s_cbranch_scc1 .LBB4_4
839 ; GFX1164DAGISEL-NEXT:  ; %bb.5:
840 ; GFX1164DAGISEL-NEXT:    v_mov_b32_e32 v1, s6
841 ; GFX1164DAGISEL-NEXT:  .LBB4_6: ; %endif
842 ; GFX1164DAGISEL-NEXT:    s_or_b64 exec, exec, s[2:3]
843 ; GFX1164DAGISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
844 ; GFX1164DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
845 ; GFX1164DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
846 ; GFX1164DAGISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
847 ; GFX1164DAGISEL-NEXT:    s_nop 0
848 ; GFX1164DAGISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
849 ; GFX1164DAGISEL-NEXT:    s_endpgm
851 ; GFX1164GISEL-LABEL: divergent_cfg:
852 ; GFX1164GISEL:       ; %bb.0: ; %entry
853 ; GFX1164GISEL-NEXT:    s_mov_b64 s[2:3], exec
854 ; GFX1164GISEL-NEXT:    ; implicit-def: $sgpr6
855 ; GFX1164GISEL-NEXT:    v_cmpx_le_u32_e32 16, v0
856 ; GFX1164GISEL-NEXT:    s_xor_b64 s[2:3], exec, s[2:3]
857 ; GFX1164GISEL-NEXT:    s_cbranch_execz .LBB4_2
858 ; GFX1164GISEL-NEXT:  ; %bb.1: ; %else
859 ; GFX1164GISEL-NEXT:    s_load_b32 s4, s[0:1], 0x2c
860 ; GFX1164GISEL-NEXT:    ; implicit-def: $vgpr0
861 ; GFX1164GISEL-NEXT:    s_waitcnt lgkmcnt(0)
862 ; GFX1164GISEL-NEXT:    s_mov_b32 s6, s4
863 ; GFX1164GISEL-NEXT:  .LBB4_2: ; %Flow
864 ; GFX1164GISEL-NEXT:    s_and_not1_saveexec_b64 s[2:3], s[2:3]
865 ; GFX1164GISEL-NEXT:    s_cbranch_execz .LBB4_5
866 ; GFX1164GISEL-NEXT:  ; %bb.3: ; %if
867 ; GFX1164GISEL-NEXT:    s_mov_b64 s[4:5], exec
868 ; GFX1164GISEL-NEXT:    s_mov_b32 s6, -1
869 ; GFX1164GISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
870 ; GFX1164GISEL-NEXT:    s_ctz_i32_b64 s7, s[4:5]
871 ; GFX1164GISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
872 ; GFX1164GISEL-NEXT:    v_readlane_b32 s8, v0, s7
873 ; GFX1164GISEL-NEXT:    s_bitset0_b64 s[4:5], s7
874 ; GFX1164GISEL-NEXT:    s_min_u32 s6, s6, s8
875 ; GFX1164GISEL-NEXT:    s_cmp_lg_u64 s[4:5], 0
876 ; GFX1164GISEL-NEXT:    s_cbranch_scc1 .LBB4_4
877 ; GFX1164GISEL-NEXT:  .LBB4_5: ; %endif
878 ; GFX1164GISEL-NEXT:    s_or_b64 exec, exec, s[2:3]
879 ; GFX1164GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
880 ; GFX1164GISEL-NEXT:    v_mov_b32_e32 v0, s6
881 ; GFX1164GISEL-NEXT:    v_mov_b32_e32 v1, 0
882 ; GFX1164GISEL-NEXT:    s_waitcnt lgkmcnt(0)
883 ; GFX1164GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
884 ; GFX1164GISEL-NEXT:    s_nop 0
885 ; GFX1164GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
886 ; GFX1164GISEL-NEXT:    s_endpgm
888 ; GFX1132DAGISEL-LABEL: divergent_cfg:
889 ; GFX1132DAGISEL:       ; %bb.0: ; %entry
890 ; GFX1132DAGISEL-NEXT:    s_mov_b32 s2, exec_lo
891 ; GFX1132DAGISEL-NEXT:    ; implicit-def: $sgpr3
892 ; GFX1132DAGISEL-NEXT:    v_cmpx_lt_u32_e32 15, v0
893 ; GFX1132DAGISEL-NEXT:    s_xor_b32 s2, exec_lo, s2
894 ; GFX1132DAGISEL-NEXT:    s_cbranch_execz .LBB4_2
895 ; GFX1132DAGISEL-NEXT:  ; %bb.1: ; %else
896 ; GFX1132DAGISEL-NEXT:    s_load_b32 s3, s[0:1], 0x2c
897 ; GFX1132DAGISEL-NEXT:    ; implicit-def: $vgpr0
898 ; GFX1132DAGISEL-NEXT:  .LBB4_2: ; %Flow
899 ; GFX1132DAGISEL-NEXT:    s_or_saveexec_b32 s2, s2
900 ; GFX1132DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
901 ; GFX1132DAGISEL-NEXT:    v_mov_b32_e32 v1, s3
902 ; GFX1132DAGISEL-NEXT:    s_xor_b32 exec_lo, exec_lo, s2
903 ; GFX1132DAGISEL-NEXT:    s_cbranch_execz .LBB4_6
904 ; GFX1132DAGISEL-NEXT:  ; %bb.3: ; %if
905 ; GFX1132DAGISEL-NEXT:    s_mov_b32 s4, exec_lo
906 ; GFX1132DAGISEL-NEXT:    s_mov_b32 s3, -1
907 ; GFX1132DAGISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
908 ; GFX1132DAGISEL-NEXT:    s_ctz_i32_b32 s5, s4
909 ; GFX1132DAGISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
910 ; GFX1132DAGISEL-NEXT:    v_readlane_b32 s6, v0, s5
911 ; GFX1132DAGISEL-NEXT:    s_bitset0_b32 s4, s5
912 ; GFX1132DAGISEL-NEXT:    s_min_u32 s3, s3, s6
913 ; GFX1132DAGISEL-NEXT:    s_cmp_lg_u32 s4, 0
914 ; GFX1132DAGISEL-NEXT:    s_cbranch_scc1 .LBB4_4
915 ; GFX1132DAGISEL-NEXT:  ; %bb.5:
916 ; GFX1132DAGISEL-NEXT:    v_mov_b32_e32 v1, s3
917 ; GFX1132DAGISEL-NEXT:  .LBB4_6: ; %endif
918 ; GFX1132DAGISEL-NEXT:    s_or_b32 exec_lo, exec_lo, s2
919 ; GFX1132DAGISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
920 ; GFX1132DAGISEL-NEXT:    v_mov_b32_e32 v0, 0
921 ; GFX1132DAGISEL-NEXT:    s_waitcnt lgkmcnt(0)
922 ; GFX1132DAGISEL-NEXT:    global_store_b32 v0, v1, s[0:1]
923 ; GFX1132DAGISEL-NEXT:    s_nop 0
924 ; GFX1132DAGISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
925 ; GFX1132DAGISEL-NEXT:    s_endpgm
927 ; GFX1132GISEL-LABEL: divergent_cfg:
928 ; GFX1132GISEL:       ; %bb.0: ; %entry
929 ; GFX1132GISEL-NEXT:    s_mov_b32 s3, exec_lo
930 ; GFX1132GISEL-NEXT:    ; implicit-def: $sgpr2
931 ; GFX1132GISEL-NEXT:    v_cmpx_le_u32_e32 16, v0
932 ; GFX1132GISEL-NEXT:    s_xor_b32 s3, exec_lo, s3
933 ; GFX1132GISEL-NEXT:    s_cbranch_execz .LBB4_2
934 ; GFX1132GISEL-NEXT:  ; %bb.1: ; %else
935 ; GFX1132GISEL-NEXT:    s_load_b32 s2, s[0:1], 0x2c
936 ; GFX1132GISEL-NEXT:    ; implicit-def: $vgpr0
937 ; GFX1132GISEL-NEXT:    s_waitcnt lgkmcnt(0)
938 ; GFX1132GISEL-NEXT:    s_mov_b32 s2, s2
939 ; GFX1132GISEL-NEXT:  .LBB4_2: ; %Flow
940 ; GFX1132GISEL-NEXT:    s_and_not1_saveexec_b32 s3, s3
941 ; GFX1132GISEL-NEXT:    s_cbranch_execz .LBB4_5
942 ; GFX1132GISEL-NEXT:  ; %bb.3: ; %if
943 ; GFX1132GISEL-NEXT:    s_mov_b32 s4, exec_lo
944 ; GFX1132GISEL-NEXT:    s_mov_b32 s2, -1
945 ; GFX1132GISEL-NEXT:  .LBB4_4: ; =>This Inner Loop Header: Depth=1
946 ; GFX1132GISEL-NEXT:    s_ctz_i32_b32 s5, s4
947 ; GFX1132GISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(SKIP_1) | instid1(VALU_DEP_1)
948 ; GFX1132GISEL-NEXT:    v_readlane_b32 s6, v0, s5
949 ; GFX1132GISEL-NEXT:    s_bitset0_b32 s4, s5
950 ; GFX1132GISEL-NEXT:    s_min_u32 s2, s2, s6
951 ; GFX1132GISEL-NEXT:    s_cmp_lg_u32 s4, 0
952 ; GFX1132GISEL-NEXT:    s_cbranch_scc1 .LBB4_4
953 ; GFX1132GISEL-NEXT:  .LBB4_5: ; %endif
954 ; GFX1132GISEL-NEXT:    s_or_b32 exec_lo, exec_lo, s3
955 ; GFX1132GISEL-NEXT:    s_load_b64 s[0:1], s[0:1], 0x24
956 ; GFX1132GISEL-NEXT:    v_dual_mov_b32 v0, s2 :: v_dual_mov_b32 v1, 0
957 ; GFX1132GISEL-NEXT:    s_waitcnt lgkmcnt(0)
958 ; GFX1132GISEL-NEXT:    global_store_b32 v1, v0, s[0:1]
959 ; GFX1132GISEL-NEXT:    s_nop 0
960 ; GFX1132GISEL-NEXT:    s_sendmsg sendmsg(MSG_DEALLOC_VGPRS)
961 ; GFX1132GISEL-NEXT:    s_endpgm
962 entry:
963   %tid = call i32 @llvm.amdgcn.workitem.id.x()
964   %d_cmp = icmp ult i32 %tid, 16
965   br i1 %d_cmp, label %if, label %else
968   %reducedValTid = call i32 @llvm.amdgcn.wave.reduce.umin.i32(i32 %tid, i32 1)
969   br label %endif
971 else:
972   %reducedValIn = call i32 @llvm.amdgcn.wave.reduce.umin.i32(i32 %in, i32 1)
973   br label %endif
975 endif:
976   %combine = phi i32 [%reducedValTid, %if], [%reducedValIn, %else]
977   store i32 %combine, ptr addrspace(1) %out
978   ret void