Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / unstructured-cfg-def-use-issue.ll
blob86e2822a3e5b164dae117fe0a8efeed84254b478
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amdhsa -verify-machineinstrs -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck -check-prefix=GCN %s
3 ; RUN: opt -S -si-annotate-control-flow -mtriple=amdgcn-amdhsa -verify-machineinstrs -simplifycfg-require-and-preserve-domtree=1 < %s | FileCheck -check-prefix=SI-OPT %s
5 define hidden void @widget() {
6 ; GCN-LABEL: widget:
7 ; GCN:       ; %bb.0: ; %bb
8 ; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
9 ; GCN-NEXT:    s_mov_b32 s16, s33
10 ; GCN-NEXT:    s_mov_b32 s33, s32
11 ; GCN-NEXT:    s_or_saveexec_b64 s[18:19], -1
12 ; GCN-NEXT:    buffer_store_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill
13 ; GCN-NEXT:    s_mov_b64 exec, s[18:19]
14 ; GCN-NEXT:    v_writelane_b32 v40, s16, 16
15 ; GCN-NEXT:    s_addk_i32 s32, 0x400
16 ; GCN-NEXT:    buffer_store_dword v41, off, s[0:3], s33 ; 4-byte Folded Spill
17 ; GCN-NEXT:    v_writelane_b32 v40, s30, 0
18 ; GCN-NEXT:    v_writelane_b32 v40, s31, 1
19 ; GCN-NEXT:    v_writelane_b32 v40, s34, 2
20 ; GCN-NEXT:    v_writelane_b32 v40, s35, 3
21 ; GCN-NEXT:    v_writelane_b32 v40, s36, 4
22 ; GCN-NEXT:    v_writelane_b32 v40, s37, 5
23 ; GCN-NEXT:    v_writelane_b32 v40, s38, 6
24 ; GCN-NEXT:    v_writelane_b32 v40, s39, 7
25 ; GCN-NEXT:    v_writelane_b32 v40, s40, 8
26 ; GCN-NEXT:    v_writelane_b32 v40, s41, 9
27 ; GCN-NEXT:    v_writelane_b32 v40, s42, 10
28 ; GCN-NEXT:    v_writelane_b32 v40, s43, 11
29 ; GCN-NEXT:    v_writelane_b32 v40, s44, 12
30 ; GCN-NEXT:    v_writelane_b32 v40, s45, 13
31 ; GCN-NEXT:    v_writelane_b32 v40, s46, 14
32 ; GCN-NEXT:    v_writelane_b32 v40, s47, 15
33 ; GCN-NEXT:    v_mov_b32_e32 v0, 0
34 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
35 ; GCN-NEXT:    flat_load_dword v0, v[0:1]
36 ; GCN-NEXT:    s_mov_b64 s[20:21], -1
37 ; GCN-NEXT:    s_mov_b64 s[16:17], 0
38 ; GCN-NEXT:    s_waitcnt vmcnt(0)
39 ; GCN-NEXT:    v_cmp_gt_i32_e32 vcc, 21, v0
40 ; GCN-NEXT:    s_mov_b64 s[46:47], 0
41 ; GCN-NEXT:    s_mov_b64 s[18:19], 0
42 ; GCN-NEXT:    s_cbranch_vccz .LBB0_9
43 ; GCN-NEXT:  ; %bb.1: ; %Flow
44 ; GCN-NEXT:    s_andn2_b64 vcc, exec, s[20:21]
45 ; GCN-NEXT:    s_cbranch_vccz .LBB0_10
46 ; GCN-NEXT:  .LBB0_2: ; %Flow1
47 ; GCN-NEXT:    s_andn2_b64 vcc, exec, s[18:19]
48 ; GCN-NEXT:    s_cbranch_vccnz .LBB0_4
49 ; GCN-NEXT:  .LBB0_3: ; %bb9
50 ; GCN-NEXT:    s_getpc_b64 s[16:17]
51 ; GCN-NEXT:    s_add_u32 s16, s16, wibble@rel32@lo+4
52 ; GCN-NEXT:    s_addc_u32 s17, s17, wibble@rel32@hi+12
53 ; GCN-NEXT:    s_mov_b64 s[34:35], s[4:5]
54 ; GCN-NEXT:    s_mov_b64 s[36:37], s[6:7]
55 ; GCN-NEXT:    s_mov_b64 s[38:39], s[8:9]
56 ; GCN-NEXT:    s_mov_b64 s[40:41], s[10:11]
57 ; GCN-NEXT:    s_mov_b32 s42, s12
58 ; GCN-NEXT:    s_mov_b32 s43, s13
59 ; GCN-NEXT:    s_mov_b32 s44, s14
60 ; GCN-NEXT:    s_mov_b32 s45, s15
61 ; GCN-NEXT:    v_mov_b32_e32 v41, v31
62 ; GCN-NEXT:    s_swappc_b64 s[30:31], s[16:17]
63 ; GCN-NEXT:    v_mov_b32_e32 v31, v41
64 ; GCN-NEXT:    s_mov_b32 s12, s42
65 ; GCN-NEXT:    s_mov_b32 s13, s43
66 ; GCN-NEXT:    s_mov_b32 s14, s44
67 ; GCN-NEXT:    s_mov_b32 s15, s45
68 ; GCN-NEXT:    s_mov_b64 s[4:5], s[34:35]
69 ; GCN-NEXT:    s_mov_b64 s[6:7], s[36:37]
70 ; GCN-NEXT:    s_mov_b64 s[8:9], s[38:39]
71 ; GCN-NEXT:    s_mov_b64 s[10:11], s[40:41]
72 ; GCN-NEXT:    v_cmp_nlt_f32_e32 vcc, 0, v0
73 ; GCN-NEXT:    s_mov_b64 s[16:17], 0
74 ; GCN-NEXT:    s_andn2_b64 s[18:19], s[46:47], exec
75 ; GCN-NEXT:    s_and_b64 s[20:21], vcc, exec
76 ; GCN-NEXT:    s_or_b64 s[46:47], s[18:19], s[20:21]
77 ; GCN-NEXT:  .LBB0_4: ; %Flow2
78 ; GCN-NEXT:    s_and_saveexec_b64 s[18:19], s[46:47]
79 ; GCN-NEXT:    s_xor_b64 s[18:19], exec, s[18:19]
80 ; GCN-NEXT:    s_cbranch_execz .LBB0_6
81 ; GCN-NEXT:  ; %bb.5: ; %bb12
82 ; GCN-NEXT:    v_mov_b32_e32 v2, 0
83 ; GCN-NEXT:    v_mov_b32_e32 v0, 0
84 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
85 ; GCN-NEXT:    flat_store_dword v[0:1], v2
86 ; GCN-NEXT:  .LBB0_6: ; %Flow3
87 ; GCN-NEXT:    s_or_b64 exec, exec, s[18:19]
88 ; GCN-NEXT:    s_andn2_b64 vcc, exec, s[16:17]
89 ; GCN-NEXT:    s_cbranch_vccnz .LBB0_8
90 ; GCN-NEXT:  ; %bb.7: ; %bb7
91 ; GCN-NEXT:    s_getpc_b64 s[16:17]
92 ; GCN-NEXT:    s_add_u32 s16, s16, wibble@rel32@lo+4
93 ; GCN-NEXT:    s_addc_u32 s17, s17, wibble@rel32@hi+12
94 ; GCN-NEXT:    s_swappc_b64 s[30:31], s[16:17]
95 ; GCN-NEXT:  .LBB0_8: ; %UnifiedReturnBlock
96 ; GCN-NEXT:    v_readlane_b32 s47, v40, 15
97 ; GCN-NEXT:    v_readlane_b32 s46, v40, 14
98 ; GCN-NEXT:    v_readlane_b32 s45, v40, 13
99 ; GCN-NEXT:    v_readlane_b32 s44, v40, 12
100 ; GCN-NEXT:    v_readlane_b32 s43, v40, 11
101 ; GCN-NEXT:    v_readlane_b32 s42, v40, 10
102 ; GCN-NEXT:    v_readlane_b32 s41, v40, 9
103 ; GCN-NEXT:    v_readlane_b32 s40, v40, 8
104 ; GCN-NEXT:    v_readlane_b32 s39, v40, 7
105 ; GCN-NEXT:    v_readlane_b32 s38, v40, 6
106 ; GCN-NEXT:    v_readlane_b32 s37, v40, 5
107 ; GCN-NEXT:    v_readlane_b32 s36, v40, 4
108 ; GCN-NEXT:    v_readlane_b32 s35, v40, 3
109 ; GCN-NEXT:    v_readlane_b32 s34, v40, 2
110 ; GCN-NEXT:    v_readlane_b32 s31, v40, 1
111 ; GCN-NEXT:    v_readlane_b32 s30, v40, 0
112 ; GCN-NEXT:    buffer_load_dword v41, off, s[0:3], s33 ; 4-byte Folded Reload
113 ; GCN-NEXT:    v_readlane_b32 s4, v40, 16
114 ; GCN-NEXT:    s_or_saveexec_b64 s[6:7], -1
115 ; GCN-NEXT:    buffer_load_dword v40, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload
116 ; GCN-NEXT:    s_mov_b64 exec, s[6:7]
117 ; GCN-NEXT:    s_addk_i32 s32, 0xfc00
118 ; GCN-NEXT:    s_mov_b32 s33, s4
119 ; GCN-NEXT:    s_waitcnt vmcnt(0)
120 ; GCN-NEXT:    s_setpc_b64 s[30:31]
121 ; GCN-NEXT:  .LBB0_9: ; %bb2
122 ; GCN-NEXT:    v_cmp_eq_u32_e64 s[46:47], 21, v0
123 ; GCN-NEXT:    v_cmp_ne_u32_e64 s[18:19], 21, v0
124 ; GCN-NEXT:    s_mov_b64 vcc, exec
125 ; GCN-NEXT:    s_cbranch_execnz .LBB0_2
126 ; GCN-NEXT:  .LBB0_10: ; %bb4
127 ; GCN-NEXT:    s_mov_b64 s[16:17], -1
128 ; GCN-NEXT:    v_cmp_ne_u32_e64 s[18:19], 9, v0
129 ; GCN-NEXT:    s_andn2_b64 vcc, exec, s[18:19]
130 ; GCN-NEXT:    s_cbranch_vccz .LBB0_3
131 ; GCN-NEXT:    s_branch .LBB0_4
132 ; SI-OPT-LABEL: @widget(
133 ; SI-OPT-NEXT:  bb:
134 ; SI-OPT-NEXT:    [[TMP:%.*]] = load i32, ptr addrspace(1) null, align 16
135 ; SI-OPT-NEXT:    [[TMP1:%.*]] = icmp slt i32 [[TMP]], 21
136 ; SI-OPT-NEXT:    br i1 [[TMP1]], label [[BB4:%.*]], label [[BB2:%.*]]
137 ; SI-OPT:       bb2:
138 ; SI-OPT-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP]], 21
139 ; SI-OPT-NEXT:    br i1 [[TMP3]], label [[BB12:%.*]], label [[BB9:%.*]]
140 ; SI-OPT:       bb4:
141 ; SI-OPT-NEXT:    [[TMP5:%.*]] = icmp eq i32 [[TMP]], 9
142 ; SI-OPT-NEXT:    br i1 [[TMP5]], label [[BB7:%.*]], label [[BB9]]
143 ; SI-OPT:       bb6:
144 ; SI-OPT-NEXT:    ret void
145 ; SI-OPT:       bb7:
146 ; SI-OPT-NEXT:    [[TMP8:%.*]] = call float @wibble()
147 ; SI-OPT-NEXT:    ret void
148 ; SI-OPT:       bb9:
149 ; SI-OPT-NEXT:    [[TMP10:%.*]] = call float @wibble()
150 ; SI-OPT-NEXT:    [[TMP11:%.*]] = fcmp nsz ogt float [[TMP10]], 0.000000e+00
151 ; SI-OPT-NEXT:    [[TMP0:%.*]] = call { i1, i64 } @llvm.amdgcn.if.i64(i1 [[TMP11]])
152 ; SI-OPT-NEXT:    [[TMP1:%.*]] = extractvalue { i1, i64 } [[TMP0]], 0
153 ; SI-OPT-NEXT:    [[TMP2:%.*]] = extractvalue { i1, i64 } [[TMP0]], 1
154 ; SI-OPT-NEXT:    br i1 [[TMP1]], label [[BB6:%.*]], label [[BB9_BB12_CRIT_EDGE:%.*]]
155 ; SI-OPT:       bb9.bb12_crit_edge:
156 ; SI-OPT-NEXT:    call void @llvm.amdgcn.end.cf.i64(i64 [[TMP2]])
157 ; SI-OPT-NEXT:    br label [[BB12]]
158 ; SI-OPT:       bb12:
159 ; SI-OPT-NEXT:    store float 0.000000e+00, ptr addrspace(1) null, align 8
160 ; SI-OPT-NEXT:    ret void
162   %tmp = load i32, ptr addrspace(1) null, align 16
163   %tmp1 = icmp slt i32 %tmp, 21
164   br i1 %tmp1, label %bb4, label %bb2
166 bb2:                                              ; preds = %bb
167   %tmp3 = icmp eq i32 %tmp, 21
168   br i1 %tmp3, label %bb12, label %bb9
170 bb4:                                              ; preds = %bb
171   %tmp5 = icmp eq i32 %tmp, 9
172   br i1 %tmp5, label %bb7, label %bb9
174 bb6:                                              ; preds = %bb9
175   ret void
177 bb7:                                              ; preds = %bb4
178   %tmp8 = call float @wibble()
179   ret void
181 bb9:                                              ; preds = %bb4, %bb2
182   %tmp10 = call float @wibble()
183   %tmp11 = fcmp nsz ogt float %tmp10, 0.000000e+00
184   br i1 %tmp11, label %bb6, label %bb12
186 bb12:                                             ; preds = %bb9, %bb2
187   store float 0.000000e+00, ptr addrspace(1) null, align 8
188   ret void
191 declare hidden float @wibble() local_unnamed_addr
194 define hidden void @blam() {
195 ; SI-OPT-LABEL: @blam(
196 ; SI-OPT-NEXT:  bb:
197 ; SI-OPT-NEXT:    [[TMP:%.*]] = load float, ptr null, align 16
198 ; SI-OPT-NEXT:    br label [[BB2:%.*]]
199 ; SI-OPT:       bb1:
200 ; SI-OPT-NEXT:    br label [[BB2]]
201 ; SI-OPT:       bb2:
202 ; SI-OPT-NEXT:    [[TID:%.*]] = call i32 @llvm.amdgcn.workitem.id.x()
203 ; SI-OPT-NEXT:    [[GEP:%.*]] = getelementptr inbounds i32, ptr addrspace(1) null, i32 [[TID]]
204 ; SI-OPT-NEXT:    [[TMP3:%.*]] = load i32, ptr addrspace(1) [[GEP]], align 16
205 ; SI-OPT-NEXT:    store float 0.000000e+00, ptr addrspace(5) null, align 8
206 ; SI-OPT-NEXT:    br label [[BB4:%.*]]
207 ; SI-OPT:       bb4:
208 ; SI-OPT-NEXT:    [[TMP5:%.*]] = icmp slt i32 [[TMP3]], 3
209 ; SI-OPT-NEXT:    [[TMP0:%.*]] = call { i1, i64 } @llvm.amdgcn.if.i64(i1 [[TMP5]])
210 ; SI-OPT-NEXT:    [[TMP1:%.*]] = extractvalue { i1, i64 } [[TMP0]], 0
211 ; SI-OPT-NEXT:    [[TMP2:%.*]] = extractvalue { i1, i64 } [[TMP0]], 1
212 ; SI-OPT-NEXT:    br i1 [[TMP1]], label [[BB8:%.*]], label [[BB6:%.*]]
213 ; SI-OPT:       bb6:
214 ; SI-OPT-NEXT:    call void @llvm.amdgcn.end.cf.i64(i64 [[TMP2]])
215 ; SI-OPT-NEXT:    [[TMP7:%.*]] = icmp eq i32 [[TMP3]], 3
216 ; SI-OPT-NEXT:    br i1 [[TMP7]], label [[BB11:%.*]], label [[BB1:%.*]]
217 ; SI-OPT:       bb8:
218 ; SI-OPT-NEXT:    [[TMP9:%.*]] = icmp eq i32 [[TMP3]], 1
219 ; SI-OPT-NEXT:    [[TMP3:%.*]] = call { i1, i64 } @llvm.amdgcn.if.i64(i1 [[TMP9]])
220 ; SI-OPT-NEXT:    [[TMP4:%.*]] = extractvalue { i1, i64 } [[TMP3]], 0
221 ; SI-OPT-NEXT:    [[TMP5:%.*]] = extractvalue { i1, i64 } [[TMP3]], 1
222 ; SI-OPT-NEXT:    br i1 [[TMP4]], label [[BB10:%.*]], label [[BB8_BB1_CRIT_EDGE:%.*]]
223 ; SI-OPT:       bb8.bb1_crit_edge:
224 ; SI-OPT-NEXT:    call void @llvm.amdgcn.end.cf.i64(i64 [[TMP5]])
225 ; SI-OPT-NEXT:    br label [[BB1]]
226 ; SI-OPT:       bb10:
227 ; SI-OPT-NEXT:    store float 0x7FF8000000000000, ptr addrspace(5) null, align 16
228 ; SI-OPT-NEXT:    br label [[BB18:%.*]]
229 ; SI-OPT:       bb11:
230 ; SI-OPT-NEXT:    [[TMP12:%.*]] = call float @spam()
231 ; SI-OPT-NEXT:    [[TMP13:%.*]] = fcmp nsz oeq float [[TMP12]], 0.000000e+00
232 ; SI-OPT-NEXT:    [[TMP6:%.*]] = call { i1, i64 } @llvm.amdgcn.if.i64(i1 [[TMP13]])
233 ; SI-OPT-NEXT:    [[TMP7:%.*]] = extractvalue { i1, i64 } [[TMP6]], 0
234 ; SI-OPT-NEXT:    [[TMP8:%.*]] = extractvalue { i1, i64 } [[TMP6]], 1
235 ; SI-OPT-NEXT:    br i1 [[TMP7]], label [[BB2]], label [[BB14:%.*]]
236 ; SI-OPT:       bb14:
237 ; SI-OPT-NEXT:    call void @llvm.amdgcn.end.cf.i64(i64 [[TMP8]])
238 ; SI-OPT-NEXT:    [[TMP15:%.*]] = fcmp nsz oeq float [[TMP]], 0.000000e+00
239 ; SI-OPT-NEXT:    [[TMP9:%.*]] = call { i1, i64 } @llvm.amdgcn.if.i64(i1 [[TMP15]])
240 ; SI-OPT-NEXT:    [[TMP10:%.*]] = extractvalue { i1, i64 } [[TMP9]], 0
241 ; SI-OPT-NEXT:    [[TMP11:%.*]] = extractvalue { i1, i64 } [[TMP9]], 1
242 ; SI-OPT-NEXT:    br i1 [[TMP10]], label [[BB17:%.*]], label [[BB16:%.*]]
243 ; SI-OPT:       bb16:
244 ; SI-OPT-NEXT:    call void @llvm.amdgcn.end.cf.i64(i64 [[TMP11]])
245 ; SI-OPT-NEXT:    store float 0x7FF8000000000000, ptr addrspace(5) null, align 16
246 ; SI-OPT-NEXT:    br label [[BB17]]
247 ; SI-OPT:       bb17:
248 ; SI-OPT-NEXT:    store float [[TMP]], ptr addrspace(5) null, align 16
249 ; SI-OPT-NEXT:    br label [[BB18]]
250 ; SI-OPT:       bb18:
251 ; SI-OPT-NEXT:    store float 0x7FF8000000000000, ptr addrspace(5) null, align 4
252 ; SI-OPT-NEXT:    br label [[BB2]]
254 ; GCN-LABEL: blam:
255 ; GCN:       ; %bb.0: ; %bb
256 ; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
257 ; GCN-NEXT:    s_mov_b32 s16, s33
258 ; GCN-NEXT:    s_mov_b32 s33, s32
259 ; GCN-NEXT:    s_or_saveexec_b64 s[18:19], -1
260 ; GCN-NEXT:    buffer_store_dword v40, off, s[0:3], s33 offset:20 ; 4-byte Folded Spill
261 ; GCN-NEXT:    s_mov_b64 exec, s[18:19]
262 ; GCN-NEXT:    v_writelane_b32 v40, s16, 28
263 ; GCN-NEXT:    s_addk_i32 s32, 0x800
264 ; GCN-NEXT:    buffer_store_dword v41, off, s[0:3], s33 offset:16 ; 4-byte Folded Spill
265 ; GCN-NEXT:    buffer_store_dword v42, off, s[0:3], s33 offset:12 ; 4-byte Folded Spill
266 ; GCN-NEXT:    buffer_store_dword v43, off, s[0:3], s33 offset:8 ; 4-byte Folded Spill
267 ; GCN-NEXT:    buffer_store_dword v44, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill
268 ; GCN-NEXT:    buffer_store_dword v45, off, s[0:3], s33 ; 4-byte Folded Spill
269 ; GCN-NEXT:    v_writelane_b32 v40, s30, 0
270 ; GCN-NEXT:    v_writelane_b32 v40, s31, 1
271 ; GCN-NEXT:    v_writelane_b32 v40, s34, 2
272 ; GCN-NEXT:    v_writelane_b32 v40, s35, 3
273 ; GCN-NEXT:    v_writelane_b32 v40, s36, 4
274 ; GCN-NEXT:    v_writelane_b32 v40, s37, 5
275 ; GCN-NEXT:    v_writelane_b32 v40, s38, 6
276 ; GCN-NEXT:    v_writelane_b32 v40, s39, 7
277 ; GCN-NEXT:    v_writelane_b32 v40, s40, 8
278 ; GCN-NEXT:    v_writelane_b32 v40, s41, 9
279 ; GCN-NEXT:    v_writelane_b32 v40, s42, 10
280 ; GCN-NEXT:    v_writelane_b32 v40, s43, 11
281 ; GCN-NEXT:    v_writelane_b32 v40, s44, 12
282 ; GCN-NEXT:    v_writelane_b32 v40, s45, 13
283 ; GCN-NEXT:    v_writelane_b32 v40, s46, 14
284 ; GCN-NEXT:    v_writelane_b32 v40, s47, 15
285 ; GCN-NEXT:    v_writelane_b32 v40, s48, 16
286 ; GCN-NEXT:    v_writelane_b32 v40, s49, 17
287 ; GCN-NEXT:    v_writelane_b32 v40, s50, 18
288 ; GCN-NEXT:    v_writelane_b32 v40, s51, 19
289 ; GCN-NEXT:    v_writelane_b32 v40, s52, 20
290 ; GCN-NEXT:    v_writelane_b32 v40, s53, 21
291 ; GCN-NEXT:    v_writelane_b32 v40, s54, 22
292 ; GCN-NEXT:    v_writelane_b32 v40, s55, 23
293 ; GCN-NEXT:    v_writelane_b32 v40, s56, 24
294 ; GCN-NEXT:    v_writelane_b32 v40, s57, 25
295 ; GCN-NEXT:    v_writelane_b32 v40, s58, 26
296 ; GCN-NEXT:    v_writelane_b32 v40, s59, 27
297 ; GCN-NEXT:    v_mov_b32_e32 v41, v31
298 ; GCN-NEXT:    s_mov_b32 s46, s15
299 ; GCN-NEXT:    s_mov_b32 s47, s14
300 ; GCN-NEXT:    s_mov_b32 s48, s13
301 ; GCN-NEXT:    s_mov_b32 s49, s12
302 ; GCN-NEXT:    s_mov_b64 s[34:35], s[10:11]
303 ; GCN-NEXT:    s_mov_b64 s[36:37], s[8:9]
304 ; GCN-NEXT:    s_mov_b64 s[38:39], s[6:7]
305 ; GCN-NEXT:    s_mov_b64 s[40:41], s[4:5]
306 ; GCN-NEXT:    v_mov_b32_e32 v0, 0
307 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
308 ; GCN-NEXT:    v_and_b32_e32 v2, 0x3ff, v41
309 ; GCN-NEXT:    v_mov_b32_e32 v43, 0
310 ; GCN-NEXT:    flat_load_dword v44, v[0:1]
311 ; GCN-NEXT:    s_mov_b64 s[50:51], 0
312 ; GCN-NEXT:    s_getpc_b64 s[52:53]
313 ; GCN-NEXT:    s_add_u32 s52, s52, spam@rel32@lo+4
314 ; GCN-NEXT:    s_addc_u32 s53, s53, spam@rel32@hi+12
315 ; GCN-NEXT:    v_lshlrev_b32_e32 v42, 2, v2
316 ; GCN-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
317 ; GCN-NEXT:    v_cmp_eq_f32_e64 s[54:55], 0, v44
318 ; GCN-NEXT:    v_cmp_neq_f32_e64 s[42:43], 0, v44
319 ; GCN-NEXT:    v_mov_b32_e32 v45, 0x7fc00000
320 ; GCN-NEXT:    s_branch .LBB1_2
321 ; GCN-NEXT:  .LBB1_1: ; %Flow7
322 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
323 ; GCN-NEXT:    s_or_b64 exec, exec, s[8:9]
324 ; GCN-NEXT:    s_and_b64 s[4:5], exec, s[4:5]
325 ; GCN-NEXT:    s_or_b64 s[50:51], s[4:5], s[50:51]
326 ; GCN-NEXT:    s_andn2_b64 exec, exec, s[50:51]
327 ; GCN-NEXT:    s_cbranch_execz .LBB1_18
328 ; GCN-NEXT:  .LBB1_2: ; %bb2
329 ; GCN-NEXT:    ; =>This Inner Loop Header: Depth=1
330 ; GCN-NEXT:    flat_load_dword v0, v[42:43]
331 ; GCN-NEXT:    buffer_store_dword v43, off, s[0:3], 0
332 ; GCN-NEXT:    s_mov_b64 s[6:7], 0
333 ; GCN-NEXT:    s_waitcnt vmcnt(1)
334 ; GCN-NEXT:    v_cmp_lt_i32_e32 vcc, 2, v0
335 ; GCN-NEXT:    s_mov_b64 s[4:5], -1
336 ; GCN-NEXT:    s_and_saveexec_b64 s[8:9], vcc
337 ; GCN-NEXT:    s_xor_b64 s[56:57], exec, s[8:9]
338 ; GCN-NEXT:    s_cbranch_execz .LBB1_12
339 ; GCN-NEXT:  ; %bb.3: ; %bb6
340 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
341 ; GCN-NEXT:    v_cmp_eq_u32_e64 s[44:45], 3, v0
342 ; GCN-NEXT:    s_and_saveexec_b64 s[58:59], s[44:45]
343 ; GCN-NEXT:    s_cbranch_execz .LBB1_11
344 ; GCN-NEXT:  ; %bb.4: ; %bb11
345 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
346 ; GCN-NEXT:    s_mov_b64 s[4:5], s[40:41]
347 ; GCN-NEXT:    s_mov_b64 s[6:7], s[38:39]
348 ; GCN-NEXT:    s_mov_b64 s[8:9], s[36:37]
349 ; GCN-NEXT:    s_mov_b64 s[10:11], s[34:35]
350 ; GCN-NEXT:    s_mov_b32 s12, s49
351 ; GCN-NEXT:    s_mov_b32 s13, s48
352 ; GCN-NEXT:    s_mov_b32 s14, s47
353 ; GCN-NEXT:    s_mov_b32 s15, s46
354 ; GCN-NEXT:    v_mov_b32_e32 v31, v41
355 ; GCN-NEXT:    s_swappc_b64 s[30:31], s[52:53]
356 ; GCN-NEXT:    v_cmp_neq_f32_e32 vcc, 0, v0
357 ; GCN-NEXT:    s_mov_b64 s[6:7], 0
358 ; GCN-NEXT:    s_and_saveexec_b64 s[4:5], vcc
359 ; GCN-NEXT:    s_cbranch_execz .LBB1_10
360 ; GCN-NEXT:  ; %bb.5: ; %bb14
361 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
362 ; GCN-NEXT:    s_mov_b64 s[8:9], s[54:55]
363 ; GCN-NEXT:    s_and_saveexec_b64 s[6:7], s[42:43]
364 ; GCN-NEXT:    s_cbranch_execz .LBB1_7
365 ; GCN-NEXT:  ; %bb.6: ; %bb16
366 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
367 ; GCN-NEXT:    buffer_store_dword v45, off, s[0:3], 0
368 ; GCN-NEXT:    s_or_b64 s[8:9], s[54:55], exec
369 ; GCN-NEXT:  .LBB1_7: ; %Flow3
370 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
371 ; GCN-NEXT:    s_or_b64 exec, exec, s[6:7]
372 ; GCN-NEXT:    s_mov_b64 s[6:7], 0
373 ; GCN-NEXT:    s_and_saveexec_b64 s[10:11], s[8:9]
374 ; GCN-NEXT:    s_xor_b64 s[8:9], exec, s[10:11]
375 ; GCN-NEXT:    s_cbranch_execz .LBB1_9
376 ; GCN-NEXT:  ; %bb.8: ; %bb17
377 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
378 ; GCN-NEXT:    s_mov_b64 s[6:7], exec
379 ; GCN-NEXT:    buffer_store_dword v44, off, s[0:3], 0
380 ; GCN-NEXT:  .LBB1_9: ; %Flow4
381 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
382 ; GCN-NEXT:    s_or_b64 exec, exec, s[8:9]
383 ; GCN-NEXT:    s_and_b64 s[6:7], s[6:7], exec
384 ; GCN-NEXT:  .LBB1_10: ; %Flow2
385 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
386 ; GCN-NEXT:    s_or_b64 exec, exec, s[4:5]
387 ; GCN-NEXT:    s_andn2_b64 s[4:5], s[44:45], exec
388 ; GCN-NEXT:    s_and_b64 s[8:9], vcc, exec
389 ; GCN-NEXT:    s_or_b64 s[44:45], s[4:5], s[8:9]
390 ; GCN-NEXT:    s_and_b64 s[6:7], s[6:7], exec
391 ; GCN-NEXT:  .LBB1_11: ; %Flow1
392 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
393 ; GCN-NEXT:    s_or_b64 exec, exec, s[58:59]
394 ; GCN-NEXT:    s_orn2_b64 s[4:5], s[44:45], exec
395 ; GCN-NEXT:    s_and_b64 s[6:7], s[6:7], exec
396 ; GCN-NEXT:    ; implicit-def: $vgpr0
397 ; GCN-NEXT:  .LBB1_12: ; %Flow
398 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
399 ; GCN-NEXT:    s_andn2_saveexec_b64 s[8:9], s[56:57]
400 ; GCN-NEXT:    s_cbranch_execz .LBB1_16
401 ; GCN-NEXT:  ; %bb.13: ; %bb8
402 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
403 ; GCN-NEXT:    v_cmp_eq_u32_e32 vcc, 1, v0
404 ; GCN-NEXT:    s_mov_b64 s[10:11], s[6:7]
405 ; GCN-NEXT:    s_and_saveexec_b64 s[12:13], vcc
406 ; GCN-NEXT:    s_cbranch_execz .LBB1_15
407 ; GCN-NEXT:  ; %bb.14: ; %bb10
408 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
409 ; GCN-NEXT:    buffer_store_dword v45, off, s[0:3], 0
410 ; GCN-NEXT:    s_or_b64 s[10:11], s[6:7], exec
411 ; GCN-NEXT:  .LBB1_15: ; %Flow6
412 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
413 ; GCN-NEXT:    s_or_b64 exec, exec, s[12:13]
414 ; GCN-NEXT:    s_andn2_b64 s[4:5], s[4:5], exec
415 ; GCN-NEXT:    s_and_b64 s[12:13], vcc, exec
416 ; GCN-NEXT:    s_andn2_b64 s[6:7], s[6:7], exec
417 ; GCN-NEXT:    s_and_b64 s[10:11], s[10:11], exec
418 ; GCN-NEXT:    s_or_b64 s[4:5], s[4:5], s[12:13]
419 ; GCN-NEXT:    s_or_b64 s[6:7], s[6:7], s[10:11]
420 ; GCN-NEXT:  .LBB1_16: ; %Flow5
421 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
422 ; GCN-NEXT:    s_or_b64 exec, exec, s[8:9]
423 ; GCN-NEXT:    s_and_saveexec_b64 s[8:9], s[6:7]
424 ; GCN-NEXT:    s_cbranch_execz .LBB1_1
425 ; GCN-NEXT:  ; %bb.17: ; %bb18
426 ; GCN-NEXT:    ; in Loop: Header=BB1_2 Depth=1
427 ; GCN-NEXT:    buffer_store_dword v45, off, s[0:3], 0
428 ; GCN-NEXT:    s_andn2_b64 s[4:5], s[4:5], exec
429 ; GCN-NEXT:    s_branch .LBB1_1
430 ; GCN-NEXT:  .LBB1_18: ; %DummyReturnBlock
431 ; GCN-NEXT:    s_or_b64 exec, exec, s[50:51]
432 ; GCN-NEXT:    v_readlane_b32 s59, v40, 27
433 ; GCN-NEXT:    v_readlane_b32 s58, v40, 26
434 ; GCN-NEXT:    v_readlane_b32 s57, v40, 25
435 ; GCN-NEXT:    v_readlane_b32 s56, v40, 24
436 ; GCN-NEXT:    v_readlane_b32 s55, v40, 23
437 ; GCN-NEXT:    v_readlane_b32 s54, v40, 22
438 ; GCN-NEXT:    v_readlane_b32 s53, v40, 21
439 ; GCN-NEXT:    v_readlane_b32 s52, v40, 20
440 ; GCN-NEXT:    v_readlane_b32 s51, v40, 19
441 ; GCN-NEXT:    v_readlane_b32 s50, v40, 18
442 ; GCN-NEXT:    v_readlane_b32 s49, v40, 17
443 ; GCN-NEXT:    v_readlane_b32 s48, v40, 16
444 ; GCN-NEXT:    v_readlane_b32 s47, v40, 15
445 ; GCN-NEXT:    v_readlane_b32 s46, v40, 14
446 ; GCN-NEXT:    v_readlane_b32 s45, v40, 13
447 ; GCN-NEXT:    v_readlane_b32 s44, v40, 12
448 ; GCN-NEXT:    v_readlane_b32 s43, v40, 11
449 ; GCN-NEXT:    v_readlane_b32 s42, v40, 10
450 ; GCN-NEXT:    v_readlane_b32 s41, v40, 9
451 ; GCN-NEXT:    v_readlane_b32 s40, v40, 8
452 ; GCN-NEXT:    v_readlane_b32 s39, v40, 7
453 ; GCN-NEXT:    v_readlane_b32 s38, v40, 6
454 ; GCN-NEXT:    v_readlane_b32 s37, v40, 5
455 ; GCN-NEXT:    v_readlane_b32 s36, v40, 4
456 ; GCN-NEXT:    v_readlane_b32 s35, v40, 3
457 ; GCN-NEXT:    v_readlane_b32 s34, v40, 2
458 ; GCN-NEXT:    v_readlane_b32 s31, v40, 1
459 ; GCN-NEXT:    v_readlane_b32 s30, v40, 0
460 ; GCN-NEXT:    buffer_load_dword v45, off, s[0:3], s33 ; 4-byte Folded Reload
461 ; GCN-NEXT:    buffer_load_dword v44, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload
462 ; GCN-NEXT:    buffer_load_dword v43, off, s[0:3], s33 offset:8 ; 4-byte Folded Reload
463 ; GCN-NEXT:    buffer_load_dword v42, off, s[0:3], s33 offset:12 ; 4-byte Folded Reload
464 ; GCN-NEXT:    buffer_load_dword v41, off, s[0:3], s33 offset:16 ; 4-byte Folded Reload
465 ; GCN-NEXT:    v_readlane_b32 s4, v40, 28
466 ; GCN-NEXT:    s_or_saveexec_b64 s[6:7], -1
467 ; GCN-NEXT:    buffer_load_dword v40, off, s[0:3], s33 offset:20 ; 4-byte Folded Reload
468 ; GCN-NEXT:    s_mov_b64 exec, s[6:7]
469 ; GCN-NEXT:    s_addk_i32 s32, 0xf800
470 ; GCN-NEXT:    s_mov_b32 s33, s4
471 ; GCN-NEXT:    s_waitcnt vmcnt(0)
472 ; GCN-NEXT:    s_setpc_b64 s[30:31]
474   %tmp = load float, ptr null, align 16
475   br label %bb2
477 bb1:                                              ; preds = %bb8, %bb6
478   br label %bb2
480 bb2:
481   %tid = call i32 @llvm.amdgcn.workitem.id.x()
482   %gep  = getelementptr inbounds i32, ptr addrspace(1) null, i32 %tid
483   %tmp3 = load i32, ptr addrspace(1) %gep, align 16
484   store float 0.000000e+00, ptr addrspace(5) null, align 8
485   br label %bb4
487 bb4:                                              ; preds = %bb2
488   %tmp5 = icmp slt i32 %tmp3, 3
489   br i1 %tmp5, label %bb8, label %bb6
491 bb6:                                              ; preds = %bb4
492   %tmp7 = icmp eq i32 %tmp3, 3
493   br i1 %tmp7, label %bb11, label %bb1
495 bb8:                                              ; preds = %bb4
496   %tmp9 = icmp eq i32 %tmp3, 1
497   br i1 %tmp9, label %bb10, label %bb1
499 bb10:                                             ; preds = %bb8
500   store float 0x7FF8000000000000, ptr addrspace(5) null, align 16
501   br label %bb18
503 bb11:                                             ; preds = %bb6
504   %tmp12 = call float @spam()
505   %tmp13 = fcmp nsz oeq float %tmp12, 0.000000e+00
506   br i1 %tmp13, label %bb2, label %bb14
508 bb14:                                             ; preds = %bb11
509   %tmp15 = fcmp nsz oeq float %tmp, 0.000000e+00
510   br i1 %tmp15, label %bb17, label %bb16
512 bb16:                                             ; preds = %bb14
513   store float 0x7FF8000000000000, ptr addrspace(5) null, align 16
514   br label %bb17
516 bb17:                                             ; preds = %bb16, %bb14
517   store float %tmp, ptr addrspace(5) null, align 16
518   br label %bb18
520 bb18:                                             ; preds = %bb17, %bb10
521   store float 0x7FF8000000000000, ptr addrspace(5) null, align 4
522   br label %bb2
525 declare i32 @llvm.amdgcn.workitem.id.x()
527 declare hidden float @spam()