Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / wc-widen-block.ll
blob438fe619fb276c60bce7c56744384792a0f4299e
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S < %s | FileCheck %s
4 define i32 @basic(i1 %cond_0, ptr %p) {
5 ; CHECK-LABEL: @basic(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
8 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
9 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0:![0-9]+]]
10 ; CHECK:       deopt:
11 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
12 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
13 ; CHECK:       guarded:
14 ; CHECK-NEXT:    [[V:%.*]] = load i32, ptr [[P:%.*]], align 4
15 ; CHECK-NEXT:    [[COND_1:%.*]] = icmp eq i32 [[V]], 0
16 ; CHECK-NEXT:    br i1 [[COND_1]], label [[RETURN:%.*]], label [[DEOPT]], !prof [[PROF0]]
17 ; CHECK:       return:
18 ; CHECK-NEXT:    ret i32 0
20 entry:
21   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
22   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
23   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
25 deopt:
26   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
27   ret i32 %deoptret
29 guarded:
30   %v = load i32, ptr %p
31   %cond_1 = icmp eq i32 %v, 0
32   br i1 %cond_1, label %return, label %deopt2, !prof !0
34 deopt2:
35   %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
36   ret i32 %deoptret2
38 return:
39   ret i32 0
42 define i32 @mergeable(i1 %cond_0, i1 %cond_1) {
43 ; CHECK-LABEL: @mergeable(
44 ; CHECK-NEXT:  entry:
45 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
46 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
47 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND_NOT:%.*]] = xor i1 [[EXIPLICIT_GUARD_COND]], true
48 ; CHECK-NEXT:    [[COND_1_NOT:%.*]] = xor i1 [[COND_1:%.*]], true
49 ; CHECK-NEXT:    [[BRMERGE:%.*]] = select i1 [[EXIPLICIT_GUARD_COND_NOT]], i1 true, i1 [[COND_1_NOT]]
50 ; CHECK-NEXT:    br i1 [[BRMERGE]], label [[DEOPT:%.*]], label [[RETURN:%.*]], !prof [[PROF1:![0-9]+]]
51 ; CHECK:       deopt:
52 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
53 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
54 ; CHECK:       return:
55 ; CHECK-NEXT:    ret i32 0
57 entry:
58   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
59   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
60   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
62 deopt:
63   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
64   ret i32 %deoptret
66 guarded:
67   br i1 %cond_1, label %return, label %deopt2, !prof !0
69 deopt2:
70   %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
71   ret i32 %deoptret2
73 return:
74   ret i32 0
77 define i32 @basic_swapped_branch(i1 %cond_0, ptr %p) {
78 ; CHECK-LABEL: @basic_swapped_branch(
79 ; CHECK-NEXT:  entry:
80 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
81 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
82 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
83 ; CHECK:       deopt:
84 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
85 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
86 ; CHECK:       guarded:
87 ; CHECK-NEXT:    [[V:%.*]] = load i32, ptr [[P:%.*]], align 4
88 ; CHECK-NEXT:    [[COND_1:%.*]] = icmp eq i32 [[V]], 0
89 ; CHECK-NEXT:    br i1 [[COND_1]], label [[DEOPT]], label [[RETURN:%.*]], !prof [[PROF0]]
90 ; CHECK:       return:
91 ; CHECK-NEXT:    ret i32 0
93 entry:
94   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
95   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
96   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
98 deopt:
99   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
100   ret i32 %deoptret
102 guarded:
103   %v = load i32, ptr %p
104   %cond_1 = icmp eq i32 %v, 0
105   br i1 %cond_1, label %deopt2, label %return, !prof !0
107 deopt2:
108   %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
109   ret i32 %deoptret2
111 return:
112   ret i32 0
115 define i32 @todo_sink_side_effect(i1 %cond_0, i1 %cond_1) {
116 ; CHECK-LABEL: @todo_sink_side_effect(
117 ; CHECK-NEXT:  entry:
118 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
119 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
120 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
121 ; CHECK:       deopt:
122 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
123 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
124 ; CHECK:       guarded:
125 ; CHECK-NEXT:    call void @unknown()
126 ; CHECK-NEXT:    br i1 [[COND_1:%.*]], label [[RETURN:%.*]], label [[DEOPT2:%.*]], !prof [[PROF0]]
127 ; CHECK:       deopt2:
128 ; CHECK-NEXT:    [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
129 ; CHECK-NEXT:    ret i32 [[DEOPTRET2]]
130 ; CHECK:       return:
131 ; CHECK-NEXT:    ret i32 0
133 entry:
134   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
135   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
136   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
138 deopt:
139   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
140   ret i32 %deoptret
142 guarded:
143   call void @unknown()
144   br i1 %cond_1, label %return, label %deopt2, !prof !0
146 deopt2:
147   %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
148   ret i32 %deoptret2
150 return:
151   ret i32 0
154 define i32 @neg_unsinkable_side_effect(i1 %cond_0) {
155 ; CHECK-LABEL: @neg_unsinkable_side_effect(
156 ; CHECK-NEXT:  entry:
157 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
158 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
159 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
160 ; CHECK:       deopt:
161 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
162 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
163 ; CHECK:       guarded:
164 ; CHECK-NEXT:    [[V:%.*]] = call i32 @unknown_i32()
165 ; CHECK-NEXT:    [[COND_1:%.*]] = icmp eq i32 [[V]], 0
166 ; CHECK-NEXT:    br i1 [[COND_1]], label [[RETURN:%.*]], label [[DEOPT2:%.*]], !prof [[PROF0]]
167 ; CHECK:       deopt2:
168 ; CHECK-NEXT:    [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
169 ; CHECK-NEXT:    ret i32 [[DEOPTRET2]]
170 ; CHECK:       return:
171 ; CHECK-NEXT:    ret i32 0
173 entry:
174   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
175   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
176   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
178 deopt:
179   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
180   ret i32 %deoptret
182 guarded:
183   %v = call i32 @unknown_i32()
184   %cond_1 = icmp eq i32 %v, 0
185   br i1 %cond_1, label %return, label %deopt2, !prof !0
187 deopt2:
188   %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
189   ret i32 %deoptret2
191 return:
192   ret i32 0
196 define i32 @neg_inf_loop(i1 %cond_0, i1 %cond_1) {
197 ; CHECK-LABEL: @neg_inf_loop(
198 ; CHECK-NEXT:  entry:
199 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
200 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
201 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
202 ; CHECK:       deopt:
203 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
204 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
205 ; CHECK:       guarded:
206 ; CHECK-NEXT:    call void @unknown()
207 ; CHECK-NEXT:    br i1 [[COND_1:%.*]], label [[RETURN:%.*]], label [[DEOPT]], !prof [[PROF0]]
208 ; CHECK:       return:
209 ; CHECK-NEXT:    ret i32 0
211 entry:
212   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
213   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
214   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
216 deopt:
217   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
218   ret i32 %deoptret
220 guarded:
221   call void @unknown()
222   br i1 %cond_1, label %return, label %deopt, !prof !0
224 return:
225   ret i32 0
229 define i32 @todo_phi(i1 %cond_0, i1 %cond_1) {
230 ; CHECK-LABEL: @todo_phi(
231 ; CHECK-NEXT:  entry:
232 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
233 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
234 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
235 ; CHECK:       deopt:
236 ; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ]
237 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 [[PHI]]) ]
238 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
239 ; CHECK:       guarded:
240 ; CHECK-NEXT:    br i1 [[COND_1:%.*]], label [[RETURN:%.*]], label [[DEOPT2:%.*]], !prof [[PROF0]]
241 ; CHECK:       deopt2:
242 ; CHECK-NEXT:    [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
243 ; CHECK-NEXT:    ret i32 [[DEOPTRET2]]
244 ; CHECK:       return:
245 ; CHECK-NEXT:    ret i32 0
247 entry:
248   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
249   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
250   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
252 deopt:
253   %phi = phi i32 [0, %entry]
254   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"(i32 %phi) ]
255   ret i32 %deoptret
257 guarded:
258   br i1 %cond_1, label %return, label %deopt2, !prof !0
260 deopt2:
261   %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
262   ret i32 %deoptret2
264 return:
265   ret i32 0
269 define i32 @neg_loop(i1 %cond_0, i1 %cond_1) {
270 ; CHECK-LABEL: @neg_loop(
271 ; CHECK-NEXT:  entry:
272 ; CHECK-NEXT:    br label [[GUARDED:%.*]]
273 ; CHECK:       loop:
274 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
275 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
276 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED]], label [[DEOPT:%.*]], !prof [[PROF0]]
277 ; CHECK:       deopt:
278 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
279 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
280 ; CHECK:       guarded:
281 ; CHECK-NEXT:    call void @unknown()
282 ; CHECK-NEXT:    br i1 [[COND_1:%.*]], label [[LOOP:%.*]], label [[DEOPT2:%.*]], !prof [[PROF0]]
283 ; CHECK:       deopt2:
284 ; CHECK-NEXT:    [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
285 ; CHECK-NEXT:    ret i32 [[DEOPTRET2]]
287 entry:
288   br label %guarded
290 loop:
291   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
292   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
293   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
295 deopt:
296   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
297   ret i32 %deoptret
299 guarded:
300   call void @unknown()
301   br i1 %cond_1, label %loop, label %deopt2, !prof !0
303 deopt2:
304   %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
305   ret i32 %deoptret2
308 ; This one is subtle - We can't widen only one branch use of the
309 ; widenable condition as two branches are correlated.  We'd have to
310 ; widen them *both*.
311 define i32 @neg_correlated(i1 %cond_0, i1 %cond_1, ptr %p) {
312 ; CHECK-LABEL: @neg_correlated(
313 ; CHECK-NEXT:  entry:
314 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
315 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[COND_0:%.*]], [[WIDENABLE_COND]]
316 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
317 ; CHECK:       deopt:
318 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
319 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
320 ; CHECK:       guarded:
321 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND2:%.*]] = and i1 [[COND_1:%.*]], [[WIDENABLE_COND]]
322 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND2]], label [[GUARDED2:%.*]], label [[DEOPT2:%.*]], !prof [[PROF0]]
323 ; CHECK:       deopt2:
324 ; CHECK-NEXT:    [[DEOPTRET2:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
325 ; CHECK-NEXT:    ret i32 [[DEOPTRET2]]
326 ; CHECK:       guarded2:
327 ; CHECK-NEXT:    [[V:%.*]] = load i32, ptr [[P:%.*]], align 4
328 ; CHECK-NEXT:    [[COND_2:%.*]] = icmp eq i32 [[V]], 0
329 ; CHECK-NEXT:    br i1 [[COND_2]], label [[RETURN:%.*]], label [[DEOPT3:%.*]], !prof [[PROF0]]
330 ; CHECK:       deopt3:
331 ; CHECK-NEXT:    [[DEOPTRET3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
332 ; CHECK-NEXT:    ret i32 [[DEOPTRET3]]
333 ; CHECK:       return:
334 ; CHECK-NEXT:    ret i32 0
336 entry:
337   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
338   %exiplicit_guard_cond = and i1 %cond_0, %widenable_cond
339   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
341 deopt:
342   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
343   ret i32 %deoptret
345 guarded:
346   %exiplicit_guard_cond2 = and i1 %cond_1, %widenable_cond
347   br i1 %exiplicit_guard_cond2, label %guarded2, label %deopt2, !prof !0
349 deopt2:
350   %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
351   ret i32 %deoptret2
353 guarded2:
354   %v = load i32, ptr %p
355   %cond_2 = icmp eq i32 %v, 0
356   br i1 %cond_2, label %return, label %deopt3, !prof !0
358 deopt3:
359   %deoptret3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
360   ret i32 %deoptret3
362 return:
363   ret i32 0
366 define i32 @trivial_wb(i1 %cond_0, ptr %p) {
367 ; CHECK-LABEL: @trivial_wb(
368 ; CHECK-NEXT:  entry:
369 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
370 ; CHECK-NEXT:    br i1 [[WIDENABLE_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
371 ; CHECK:       deopt:
372 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
373 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
374 ; CHECK:       guarded:
375 ; CHECK-NEXT:    [[V:%.*]] = load i32, ptr [[P:%.*]], align 4
376 ; CHECK-NEXT:    [[COND_1:%.*]] = icmp eq i32 [[V]], 0
377 ; CHECK-NEXT:    br i1 [[COND_1]], label [[RETURN:%.*]], label [[DEOPT]], !prof [[PROF0]]
378 ; CHECK:       return:
379 ; CHECK-NEXT:    ret i32 0
381 entry:
382   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
383   br i1 %widenable_cond, label %guarded, label %deopt, !prof !0
385 deopt:
386   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
387   ret i32 %deoptret
389 guarded:
390   %v = load i32, ptr %p
391   %cond_1 = icmp eq i32 %v, 0
392   br i1 %cond_1, label %return, label %deopt2, !prof !0
394 deopt2:
395   %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
396   ret i32 %deoptret2
398 return:
399   ret i32 0
403 define i32 @swapped_wb(i1 %cond_0, ptr %p) {
404 ; CHECK-LABEL: @swapped_wb(
405 ; CHECK-NEXT:  entry:
406 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
407 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDENABLE_COND]], [[COND_0:%.*]]
408 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
409 ; CHECK:       deopt:
410 ; CHECK-NEXT:    [[DEOPTRET:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
411 ; CHECK-NEXT:    ret i32 [[DEOPTRET]]
412 ; CHECK:       guarded:
413 ; CHECK-NEXT:    [[V:%.*]] = load i32, ptr [[P:%.*]], align 4
414 ; CHECK-NEXT:    [[COND_1:%.*]] = icmp eq i32 [[V]], 0
415 ; CHECK-NEXT:    br i1 [[COND_1]], label [[RETURN:%.*]], label [[DEOPT]], !prof [[PROF0]]
416 ; CHECK:       return:
417 ; CHECK-NEXT:    ret i32 0
419 entry:
420   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
421   %exiplicit_guard_cond = and i1 %widenable_cond, %cond_0
422   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
424 deopt:
425   %deoptret = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
426   ret i32 %deoptret
428 guarded:
429   %v = load i32, ptr %p
430   %cond_1 = icmp eq i32 %v, 0
431   br i1 %cond_1, label %return, label %deopt2, !prof !0
433 deopt2:
434   %deoptret2 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
435   ret i32 %deoptret2
437 return:
438   ret i32 0
444 declare void @unknown()
445 declare i32 @unknown_i32()
447 declare i1 @llvm.experimental.widenable.condition()
448 declare i32 @llvm.experimental.deoptimize.i32(...)
450 !0 = !{!"branch_weights", i32 1048576, i32 1}
451 !1 = !{i32 1, i32 -2147483648}