Follow up to d0858bffa11, add missing REQUIRES x86
[llvm-project.git] / llvm / test / Transforms / GuardWidening / profile-based-profitability_explicit.ll
blob0114a6e64a8c5a0357fb068d9215f52d34989353
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2
2 ; RUN: opt -S -passes=guard-widening < %s | FileCheck %s
4 ; Hot loop, frequently entered, should widen.
5 define i32 @test_intrinsic_very_profitable(i32 %n, i1 %cond.1, i1 %cond.2) {
6 ; CHECK-LABEL: define i32 @test_intrinsic_very_profitable
7 ; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND_1:%.*]], i1 [[COND_2:%.*]]) {
8 ; CHECK-NEXT:  entry:
9 ; CHECK-NEXT:    [[COND_2_GW_FR:%.*]] = freeze i1 [[COND_2]]
10 ; CHECK-NEXT:    [[WIDE_CHK:%.*]] = and i1 [[COND_1]], [[COND_2_GW_FR]]
11 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
12 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]]
13 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0:![0-9]+]]
14 ; CHECK:       deopt:
15 ; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
16 ; CHECK-NEXT:    ret i32 [[DEOPTCALL]]
17 ; CHECK:       guarded:
18 ; CHECK-NEXT:    [[LOOP_PRECONDITION:%.*]] = icmp uge i32 [[N]], 100
19 ; CHECK-NEXT:    br i1 [[LOOP_PRECONDITION]], label [[LOOP:%.*]], label [[FAILED:%.*]], !prof [[PROF0]]
20 ; CHECK:       loop:
21 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[GUARDED]] ], [ [[IV_NEXT:%.*]], [[GUARDED1:%.*]] ]
22 ; CHECK-NEXT:    [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition()
23 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND5:%.*]] = and i1 [[COND_2_GW_FR]], [[WIDENABLE_COND4]]
24 ; CHECK-NEXT:    br i1 true, label [[GUARDED1]], label [[DEOPT2:%.*]], !prof [[PROF0]]
25 ; CHECK:       deopt2:
26 ; CHECK-NEXT:    [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
27 ; CHECK-NEXT:    ret i32 [[DEOPTCALL3]]
28 ; CHECK:       guarded1:
29 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
30 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 100
31 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]], !prof [[PROF1:![0-9]+]]
32 ; CHECK:       exit:
33 ; CHECK-NEXT:    ret i32 0
34 ; CHECK:       failed:
35 ; CHECK-NEXT:    ret i32 -1
37 entry:
38   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
39   %exiplicit_guard_cond = and i1 %cond.1, %widenable_cond
40   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
42 deopt:                                            ; preds = %entry
43   %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
44   ret i32 %deoptcall
46 guarded:                                          ; preds = %entry
47   %loop.precondition = icmp uge i32 %n, 100
48   br i1 %loop.precondition, label %loop, label %failed, !prof !0
50 loop:                                             ; preds = %guarded1, %guarded
51   %iv = phi i32 [ 0, %guarded ], [ %iv.next, %guarded1 ]
52   %widenable_cond4 = call i1 @llvm.experimental.widenable.condition()
53   %exiplicit_guard_cond5 = and i1 %cond.2, %widenable_cond4
54   br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !0
56 deopt2:                                           ; preds = %loop
57   %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
58   ret i32 %deoptcall3
60 guarded1:                                         ; preds = %loop
61   %iv.next = add nuw nsw i32 %iv, 1
62   %loop.cond = icmp ult i32 %iv.next, 100
63   br i1 %loop.cond, label %loop, label %exit, !prof !1
65 exit:                                             ; preds = %guarded1
66   ret i32 0
68 failed:                                           ; preds = %guarded
69   ret i32 -1
72 ; Even though the loop is rarely entered, it has so many iterations that the widening
73 ; is still profitable.
74 define i32 @test_intrinsic_profitable(i32 %n, i1 %cond.1, i1 %cond.2) {
75 ; CHECK-LABEL: define i32 @test_intrinsic_profitable
76 ; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND_1:%.*]], i1 [[COND_2:%.*]]) {
77 ; CHECK-NEXT:  entry:
78 ; CHECK-NEXT:    [[COND_2_GW_FR:%.*]] = freeze i1 [[COND_2]]
79 ; CHECK-NEXT:    [[WIDE_CHK:%.*]] = and i1 [[COND_1]], [[COND_2_GW_FR]]
80 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
81 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]]
82 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
83 ; CHECK:       deopt:
84 ; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
85 ; CHECK-NEXT:    ret i32 [[DEOPTCALL]]
86 ; CHECK:       guarded:
87 ; CHECK-NEXT:    [[LOOP_PRECONDITION:%.*]] = icmp uge i32 [[N]], 100
88 ; CHECK-NEXT:    br i1 [[LOOP_PRECONDITION]], label [[LOOP:%.*]], label [[FAILED:%.*]], !prof [[PROF2:![0-9]+]]
89 ; CHECK:       loop:
90 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[GUARDED]] ], [ [[IV_NEXT:%.*]], [[GUARDED1:%.*]] ]
91 ; CHECK-NEXT:    [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition()
92 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND5:%.*]] = and i1 [[COND_2_GW_FR]], [[WIDENABLE_COND4]]
93 ; CHECK-NEXT:    br i1 true, label [[GUARDED1]], label [[DEOPT2:%.*]], !prof [[PROF0]]
94 ; CHECK:       deopt2:
95 ; CHECK-NEXT:    [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
96 ; CHECK-NEXT:    ret i32 [[DEOPTCALL3]]
97 ; CHECK:       guarded1:
98 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
99 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 100
100 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]], !prof [[PROF1]]
101 ; CHECK:       exit:
102 ; CHECK-NEXT:    ret i32 0
103 ; CHECK:       failed:
104 ; CHECK-NEXT:    ret i32 -1
106 entry:
107   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
108   %exiplicit_guard_cond = and i1 %cond.1, %widenable_cond
109   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
111 deopt:                                            ; preds = %entry
112   %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
113   ret i32 %deoptcall
115 guarded:                                          ; preds = %entry
116   %loop.precondition = icmp uge i32 %n, 100
117   br i1 %loop.precondition, label %loop, label %failed, !prof !2
119 loop:                                             ; preds = %guarded1, %guarded
120   %iv = phi i32 [ 0, %guarded ], [ %iv.next, %guarded1 ]
121   %widenable_cond4 = call i1 @llvm.experimental.widenable.condition()
122   %exiplicit_guard_cond5 = and i1 %cond.2, %widenable_cond4
123   br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !0
125 deopt2:                                           ; preds = %loop
126   %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
127   ret i32 %deoptcall3
129 guarded1:                                         ; preds = %loop
130   %iv.next = add nuw nsw i32 %iv, 1
131   %loop.cond = icmp ult i32 %iv.next, 100
132   br i1 %loop.cond, label %loop, label %exit, !prof !1
134 exit:                                             ; preds = %guarded1
135   ret i32 0
137 failed:                                           ; preds = %guarded
138   ret i32 -1
141 ; Loop's hotness compensates rareness of its entrance. We still want to widen, because
142 ; it may open up some optimization opportunities.
143 define i32 @test_intrinsic_neutral(i32 %n, i1 %cond.1, i1 %cond.2) {
144 ; CHECK-LABEL: define i32 @test_intrinsic_neutral
145 ; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND_1:%.*]], i1 [[COND_2:%.*]]) {
146 ; CHECK-NEXT:  entry:
147 ; CHECK-NEXT:    [[COND_2_GW_FR:%.*]] = freeze i1 [[COND_2]]
148 ; CHECK-NEXT:    [[WIDE_CHK:%.*]] = and i1 [[COND_1]], [[COND_2_GW_FR]]
149 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
150 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]]
151 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
152 ; CHECK:       deopt:
153 ; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
154 ; CHECK-NEXT:    ret i32 [[DEOPTCALL]]
155 ; CHECK:       guarded:
156 ; CHECK-NEXT:    [[LOOP_PRECONDITION:%.*]] = icmp uge i32 [[N]], 100
157 ; CHECK-NEXT:    br i1 [[LOOP_PRECONDITION]], label [[LOOP:%.*]], label [[FAILED:%.*]], !prof [[PROF3:![0-9]+]]
158 ; CHECK:       loop:
159 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[GUARDED]] ], [ [[IV_NEXT:%.*]], [[GUARDED1:%.*]] ]
160 ; CHECK-NEXT:    [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition()
161 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND5:%.*]] = and i1 [[COND_2_GW_FR]], [[WIDENABLE_COND4]]
162 ; CHECK-NEXT:    br i1 true, label [[GUARDED1]], label [[DEOPT2:%.*]], !prof [[PROF0]]
163 ; CHECK:       deopt2:
164 ; CHECK-NEXT:    [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
165 ; CHECK-NEXT:    ret i32 [[DEOPTCALL3]]
166 ; CHECK:       guarded1:
167 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
168 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 100
169 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]], !prof [[PROF1]]
170 ; CHECK:       exit:
171 ; CHECK-NEXT:    ret i32 0
172 ; CHECK:       failed:
173 ; CHECK-NEXT:    ret i32 -1
175 entry:
176   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
177   %exiplicit_guard_cond = and i1 %cond.1, %widenable_cond
178   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
180 deopt:                                            ; preds = %entry
181   %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
182   ret i32 %deoptcall
184 guarded:                                          ; preds = %entry
185   %loop.precondition = icmp uge i32 %n, 100
186   br i1 %loop.precondition, label %loop, label %failed, !prof !3
188 loop:                                             ; preds = %guarded1, %guarded
189   %iv = phi i32 [ 0, %guarded ], [ %iv.next, %guarded1 ]
190   %widenable_cond4 = call i1 @llvm.experimental.widenable.condition()
191   %exiplicit_guard_cond5 = and i1 %cond.2, %widenable_cond4
192   br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !0
194 deopt2:                                           ; preds = %loop
195   %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
196   ret i32 %deoptcall3
198 guarded1:                                         ; preds = %loop
199   %iv.next = add nuw nsw i32 %iv, 1
200   %loop.cond = icmp ult i32 %iv.next, 100
201   br i1 %loop.cond, label %loop, label %exit, !prof !1
203 exit:                                             ; preds = %guarded1
204   ret i32 0
206 failed:                                           ; preds = %guarded
207   ret i32 -1
210 ; FIXME: This loop is so rarely entered, that we don't want to widen here.
211 define i32 @test_intrinsic_very_unprofitable(i32 %n, i1 %cond.1, i1 %cond.2) {
212 ; CHECK-LABEL: define i32 @test_intrinsic_very_unprofitable
213 ; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND_1:%.*]], i1 [[COND_2:%.*]]) {
214 ; CHECK-NEXT:  entry:
215 ; CHECK-NEXT:    [[COND_2_GW_FR:%.*]] = freeze i1 [[COND_2]]
216 ; CHECK-NEXT:    [[WIDE_CHK:%.*]] = and i1 [[COND_1]], [[COND_2_GW_FR]]
217 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
218 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]]
219 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
220 ; CHECK:       deopt:
221 ; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
222 ; CHECK-NEXT:    ret i32 [[DEOPTCALL]]
223 ; CHECK:       guarded:
224 ; CHECK-NEXT:    [[LOOP_PRECONDITION:%.*]] = icmp uge i32 [[N]], 100
225 ; CHECK-NEXT:    br i1 [[LOOP_PRECONDITION]], label [[LOOP:%.*]], label [[FAILED:%.*]], !prof [[PROF4:![0-9]+]]
226 ; CHECK:       loop:
227 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[GUARDED]] ], [ [[IV_NEXT:%.*]], [[GUARDED1:%.*]] ]
228 ; CHECK-NEXT:    [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition()
229 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND5:%.*]] = and i1 [[COND_2_GW_FR]], [[WIDENABLE_COND4]]
230 ; CHECK-NEXT:    br i1 true, label [[GUARDED1]], label [[DEOPT2:%.*]], !prof [[PROF0]]
231 ; CHECK:       deopt2:
232 ; CHECK-NEXT:    [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
233 ; CHECK-NEXT:    ret i32 [[DEOPTCALL3]]
234 ; CHECK:       guarded1:
235 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
236 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 100
237 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]], !prof [[PROF1]]
238 ; CHECK:       exit:
239 ; CHECK-NEXT:    ret i32 0
240 ; CHECK:       failed:
241 ; CHECK-NEXT:    ret i32 -1
243 entry:
244   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
245   %exiplicit_guard_cond = and i1 %cond.1, %widenable_cond
246   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
248 deopt:                                            ; preds = %entry
249   %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
250   ret i32 %deoptcall
252 guarded:                                          ; preds = %entry
253   %loop.precondition = icmp uge i32 %n, 100
254   br i1 %loop.precondition, label %loop, label %failed, !prof !4
256 loop:                                             ; preds = %guarded1, %guarded
257   %iv = phi i32 [ 0, %guarded ], [ %iv.next, %guarded1 ]
258   %widenable_cond4 = call i1 @llvm.experimental.widenable.condition()
259   %exiplicit_guard_cond5 = and i1 %cond.2, %widenable_cond4
260   br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !0
262 deopt2:                                           ; preds = %loop
263   %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
264   ret i32 %deoptcall3
266 guarded1:                                         ; preds = %loop
267   %iv.next = add nuw nsw i32 %iv, 1
268   %loop.cond = icmp ult i32 %iv.next, 100
269   br i1 %loop.cond, label %loop, label %exit, !prof !1
271 exit:                                             ; preds = %guarded1
272   ret i32 0
274 failed:                                           ; preds = %guarded
275   ret i32 -1
278 ; FIXME: This loop is so rarely entered, that we don't want to widen here.
279 define i32 @test_intrinsic_unprofitable(i32 %n, i1 %cond.1, i1 %cond.2) {
280 ; CHECK-LABEL: define i32 @test_intrinsic_unprofitable
281 ; CHECK-SAME: (i32 [[N:%.*]], i1 [[COND_1:%.*]], i1 [[COND_2:%.*]]) {
282 ; CHECK-NEXT:  entry:
283 ; CHECK-NEXT:    [[COND_2_GW_FR:%.*]] = freeze i1 [[COND_2]]
284 ; CHECK-NEXT:    [[WIDE_CHK:%.*]] = and i1 [[COND_1]], [[COND_2_GW_FR]]
285 ; CHECK-NEXT:    [[WIDENABLE_COND:%.*]] = call i1 @llvm.experimental.widenable.condition()
286 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND:%.*]] = and i1 [[WIDE_CHK]], [[WIDENABLE_COND]]
287 ; CHECK-NEXT:    br i1 [[EXIPLICIT_GUARD_COND]], label [[GUARDED:%.*]], label [[DEOPT:%.*]], !prof [[PROF0]]
288 ; CHECK:       deopt:
289 ; CHECK-NEXT:    [[DEOPTCALL:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
290 ; CHECK-NEXT:    ret i32 [[DEOPTCALL]]
291 ; CHECK:       guarded:
292 ; CHECK-NEXT:    [[LOOP_PRECONDITION:%.*]] = icmp uge i32 [[N]], 100
293 ; CHECK-NEXT:    br i1 [[LOOP_PRECONDITION]], label [[LOOP:%.*]], label [[FAILED:%.*]], !prof [[PROF5:![0-9]+]]
294 ; CHECK:       loop:
295 ; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, [[GUARDED]] ], [ [[IV_NEXT:%.*]], [[GUARDED1:%.*]] ]
296 ; CHECK-NEXT:    [[WIDENABLE_COND4:%.*]] = call i1 @llvm.experimental.widenable.condition()
297 ; CHECK-NEXT:    [[EXIPLICIT_GUARD_COND5:%.*]] = and i1 [[COND_2_GW_FR]], [[WIDENABLE_COND4]]
298 ; CHECK-NEXT:    br i1 true, label [[GUARDED1]], label [[DEOPT2:%.*]], !prof [[PROF0]]
299 ; CHECK:       deopt2:
300 ; CHECK-NEXT:    [[DEOPTCALL3:%.*]] = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
301 ; CHECK-NEXT:    ret i32 [[DEOPTCALL3]]
302 ; CHECK:       guarded1:
303 ; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
304 ; CHECK-NEXT:    [[LOOP_COND:%.*]] = icmp ult i32 [[IV_NEXT]], 100
305 ; CHECK-NEXT:    br i1 [[LOOP_COND]], label [[LOOP]], label [[EXIT:%.*]], !prof [[PROF1]]
306 ; CHECK:       exit:
307 ; CHECK-NEXT:    ret i32 0
308 ; CHECK:       failed:
309 ; CHECK-NEXT:    ret i32 -1
311 entry:
312   %widenable_cond = call i1 @llvm.experimental.widenable.condition()
313   %exiplicit_guard_cond = and i1 %cond.1, %widenable_cond
314   br i1 %exiplicit_guard_cond, label %guarded, label %deopt, !prof !0
316 deopt:                                            ; preds = %entry
317   %deoptcall = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
318   ret i32 %deoptcall
320 guarded:                                          ; preds = %entry
321   %loop.precondition = icmp uge i32 %n, 100
322   br i1 %loop.precondition, label %loop, label %failed, !prof !5
324 loop:                                             ; preds = %guarded1, %guarded
325   %iv = phi i32 [ 0, %guarded ], [ %iv.next, %guarded1 ]
326   %widenable_cond4 = call i1 @llvm.experimental.widenable.condition()
327   %exiplicit_guard_cond5 = and i1 %cond.2, %widenable_cond4
328   br i1 %exiplicit_guard_cond5, label %guarded1, label %deopt2, !prof !0
330 deopt2:                                           ; preds = %loop
331   %deoptcall3 = call i32 (...) @llvm.experimental.deoptimize.i32() [ "deopt"() ]
332   ret i32 %deoptcall3
334 guarded1:                                         ; preds = %loop
335   %iv.next = add nuw nsw i32 %iv, 1
336   %loop.cond = icmp ult i32 %iv.next, 100
337   br i1 %loop.cond, label %loop, label %exit, !prof !1
339 exit:                                             ; preds = %guarded1
340   ret i32 0
342 failed:                                           ; preds = %guarded
343   ret i32 -1
346 declare i32 @llvm.experimental.deoptimize.i32(...)
348 ; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(inaccessiblemem: readwrite)
349 declare noundef i1 @llvm.experimental.widenable.condition() #1
351 attributes #0 = { nocallback nofree nosync willreturn }
352 attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(inaccessiblemem: readwrite) }
354 !0 = !{!"branch_weights", i32 1048576, i32 1}
355 !1 = !{!"branch_weights", i32 99, i32 1}
356 !2 = !{!"branch_weights", i32 1, i32 10}
357 !3 = !{!"branch_weights", i32 1, i32 99}
358 !4 = !{!"branch_weights", i32 1, i32 1048576}
359 !5 = !{!"branch_weights", i32 1, i32 1000}