xref: /llvm-project/llvm/test/Transforms/LoopPredication/scale.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
2; RUN: opt -S -loop-predication-skip-profitability-checks=false -passes='require<scalar-evolution>,loop-mssa(loop-predication)' -verify-memoryssa -loop-predication-latch-probability-scale=2 %s 2>&1 | FileCheck %s --check-prefixes=CHECK-PROF
3; RUN: opt -S -loop-predication-skip-profitability-checks=false -passes='require<scalar-evolution>,loop-mssa(loop-predication)' -verify-memoryssa -loop-predication-latch-probability-scale=1.9 %s 2>&1 | FileCheck %s --check-prefixes=CHECK-NOTPROF
4
5; LatchExitProbability: 0x20000000 / 0x80000000 = 25.00%
6; ExitingBlockProbability: 0x40000000 / 0x80000000 = 50.00%
7; Predicate is profitable when the scale factor is 2 and not profitable if it's less than 2.
8define i64 @predicate_eq_ones(ptr nocapture readonly %arg, i32 %length, ptr nocapture readonly %arg2, ptr nocapture readonly %n_addr, i64 %i) !prof !21 {
9; CHECK-PROF-LABEL: define i64 @predicate_eq_ones(
10; CHECK-PROF-SAME: ptr readonly captures(none) [[ARG:%.*]], i32 [[LENGTH:%.*]], ptr readonly captures(none) [[ARG2:%.*]], ptr readonly captures(none) [[N_ADDR:%.*]], i64 [[I:%.*]]) !prof [[PROF0:![0-9]+]] {
11; CHECK-PROF-NEXT:  entry:
12; CHECK-PROF-NEXT:    [[LENGTH_EXT:%.*]] = zext i32 [[LENGTH]] to i64
13; CHECK-PROF-NEXT:    [[N_PRE:%.*]] = load i64, ptr [[N_ADDR]], align 4
14; CHECK-PROF-NEXT:    [[TMP0:%.*]] = icmp ule i64 1048576, [[LENGTH_EXT]]
15; CHECK-PROF-NEXT:    [[TMP1:%.*]] = icmp ult i64 0, [[LENGTH_EXT]]
16; CHECK-PROF-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]
17; CHECK-PROF-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]
18; CHECK-PROF-NEXT:    br label [[HEADER:%.*]]
19; CHECK-PROF:       Header:
20; CHECK-PROF-NEXT:    [[RESULT_IN3:%.*]] = phi ptr [ [[ARG2]], [[ENTRY:%.*]] ], [ [[ARG]], [[LATCH:%.*]] ]
21; CHECK-PROF-NEXT:    [[J2:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LATCH]] ]
22; CHECK-PROF-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i64 [[J2]], [[LENGTH_EXT]]
23; CHECK-PROF-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[TMP3]], i32 9) [ "deopt"() ]
24; CHECK-PROF-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])
25; CHECK-PROF-NEXT:    [[INNERCMP:%.*]] = icmp eq i64 [[J2]], [[N_PRE]]
26; CHECK-PROF-NEXT:    [[J_NEXT]] = add nuw nsw i64 [[J2]], 1
27; CHECK-PROF-NEXT:    br i1 [[INNERCMP]], label [[LATCH]], label [[EXIT:%.*]], !prof [[PROF1:![0-9]+]]
28; CHECK-PROF:       Latch:
29; CHECK-PROF-NEXT:    [[SPECULATE_TRIP_COUNT:%.*]] = icmp ult i64 [[J_NEXT]], 1048576
30; CHECK-PROF-NEXT:    br i1 [[SPECULATE_TRIP_COUNT]], label [[HEADER]], label [[EXITLATCH:%.*]], !prof [[PROF2:![0-9]+]]
31; CHECK-PROF:       exitLatch:
32; CHECK-PROF-NEXT:    ret i64 1
33; CHECK-PROF:       exit:
34; CHECK-PROF-NEXT:    [[RESULT_IN3_LCSSA:%.*]] = phi ptr [ [[RESULT_IN3]], [[HEADER]] ]
35; CHECK-PROF-NEXT:    [[RESULT_LE:%.*]] = load i64, ptr [[RESULT_IN3_LCSSA]], align 8
36; CHECK-PROF-NEXT:    ret i64 [[RESULT_LE]]
37;
38; CHECK-NOTPROF-LABEL: define i64 @predicate_eq_ones(
39; CHECK-NOTPROF-SAME: ptr readonly captures(none) [[ARG:%.*]], i32 [[LENGTH:%.*]], ptr readonly captures(none) [[ARG2:%.*]], ptr readonly captures(none) [[N_ADDR:%.*]], i64 [[I:%.*]]) !prof [[PROF0:![0-9]+]] {
40; CHECK-NOTPROF-NEXT:  entry:
41; CHECK-NOTPROF-NEXT:    [[LENGTH_EXT:%.*]] = zext i32 [[LENGTH]] to i64
42; CHECK-NOTPROF-NEXT:    [[N_PRE:%.*]] = load i64, ptr [[N_ADDR]], align 4
43; CHECK-NOTPROF-NEXT:    br label [[HEADER:%.*]]
44; CHECK-NOTPROF:       Header:
45; CHECK-NOTPROF-NEXT:    [[RESULT_IN3:%.*]] = phi ptr [ [[ARG2]], [[ENTRY:%.*]] ], [ [[ARG]], [[LATCH:%.*]] ]
46; CHECK-NOTPROF-NEXT:    [[J2:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LATCH]] ]
47; CHECK-NOTPROF-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i64 [[J2]], [[LENGTH_EXT]]
48; CHECK-NOTPROF-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[WITHIN_BOUNDS]], i32 9) [ "deopt"() ]
49; CHECK-NOTPROF-NEXT:    [[INNERCMP:%.*]] = icmp eq i64 [[J2]], [[N_PRE]]
50; CHECK-NOTPROF-NEXT:    [[J_NEXT]] = add nuw nsw i64 [[J2]], 1
51; CHECK-NOTPROF-NEXT:    br i1 [[INNERCMP]], label [[LATCH]], label [[EXIT:%.*]], !prof [[PROF1:![0-9]+]]
52; CHECK-NOTPROF:       Latch:
53; CHECK-NOTPROF-NEXT:    [[SPECULATE_TRIP_COUNT:%.*]] = icmp ult i64 [[J_NEXT]], 1048576
54; CHECK-NOTPROF-NEXT:    br i1 [[SPECULATE_TRIP_COUNT]], label [[HEADER]], label [[EXITLATCH:%.*]], !prof [[PROF2:![0-9]+]]
55; CHECK-NOTPROF:       exitLatch:
56; CHECK-NOTPROF-NEXT:    ret i64 1
57; CHECK-NOTPROF:       exit:
58; CHECK-NOTPROF-NEXT:    [[RESULT_IN3_LCSSA:%.*]] = phi ptr [ [[RESULT_IN3]], [[HEADER]] ]
59; CHECK-NOTPROF-NEXT:    [[RESULT_LE:%.*]] = load i64, ptr [[RESULT_IN3_LCSSA]], align 8
60; CHECK-NOTPROF-NEXT:    ret i64 [[RESULT_LE]]
61;
62entry:
63  %length.ext = zext i32 %length to i64
64  %n.pre = load i64, ptr %n_addr, align 4
65  br label %Header
66
67Header:                                          ; preds = %entry, %Latch
68  %result.in3 = phi ptr [ %arg2, %entry ], [ %arg, %Latch ]
69  %j2 = phi i64 [ 0, %entry ], [ %j.next, %Latch ]
70  %within.bounds = icmp ult i64 %j2, %length.ext
71  call void (i1, ...) @llvm.experimental.guard(i1 %within.bounds, i32 9) [ "deopt"() ]
72  %innercmp = icmp eq i64 %j2, %n.pre
73  %j.next = add nuw nsw i64 %j2, 1
74  br i1 %innercmp, label %Latch, label %exit, !prof !0
75
76Latch:                                           ; preds = %Header
77  %speculate_trip_count = icmp ult i64 %j.next, 1048576
78  br i1 %speculate_trip_count, label %Header, label %exitLatch, !prof !2
79
80exitLatch:                                            ; preds = %Latch
81  ret i64 1
82
83exit:                                             ; preds = %Header
84  %result.in3.lcssa = phi ptr [ %result.in3, %Header ]
85  %result.le = load i64, ptr %result.in3.lcssa, align 8
86  ret i64 %result.le
87}
88!0 = !{!"branch_weights", i32 1, i32 1}
89
90; Same as the previous one, but with zero weights (should be treated as if no profile - equal probability)
91define i64 @predicate_eq_zeroes(ptr nocapture readonly %arg, i32 %length, ptr nocapture readonly %arg2, ptr nocapture readonly %n_addr, i64 %i) !prof !21 {
92; CHECK-PROF-LABEL: define i64 @predicate_eq_zeroes(
93; CHECK-PROF-SAME: ptr readonly captures(none) [[ARG:%.*]], i32 [[LENGTH:%.*]], ptr readonly captures(none) [[ARG2:%.*]], ptr readonly captures(none) [[N_ADDR:%.*]], i64 [[I:%.*]]) !prof [[PROF0]] {
94; CHECK-PROF-NEXT:  entry:
95; CHECK-PROF-NEXT:    [[LENGTH_EXT:%.*]] = zext i32 [[LENGTH]] to i64
96; CHECK-PROF-NEXT:    [[N_PRE:%.*]] = load i64, ptr [[N_ADDR]], align 4
97; CHECK-PROF-NEXT:    [[TMP0:%.*]] = icmp ule i64 1048576, [[LENGTH_EXT]]
98; CHECK-PROF-NEXT:    [[TMP1:%.*]] = icmp ult i64 0, [[LENGTH_EXT]]
99; CHECK-PROF-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]
100; CHECK-PROF-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]
101; CHECK-PROF-NEXT:    br label [[HEADER:%.*]]
102; CHECK-PROF:       Header:
103; CHECK-PROF-NEXT:    [[RESULT_IN3:%.*]] = phi ptr [ [[ARG2]], [[ENTRY:%.*]] ], [ [[ARG]], [[LATCH:%.*]] ]
104; CHECK-PROF-NEXT:    [[J2:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LATCH]] ]
105; CHECK-PROF-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i64 [[J2]], [[LENGTH_EXT]]
106; CHECK-PROF-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[TMP3]], i32 9) [ "deopt"() ]
107; CHECK-PROF-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])
108; CHECK-PROF-NEXT:    [[INNERCMP:%.*]] = icmp eq i64 [[J2]], [[N_PRE]]
109; CHECK-PROF-NEXT:    [[J_NEXT]] = add nuw nsw i64 [[J2]], 1
110; CHECK-PROF-NEXT:    br i1 [[INNERCMP]], label [[LATCH]], label [[EXIT:%.*]], !prof [[PROF3:![0-9]+]]
111; CHECK-PROF:       Latch:
112; CHECK-PROF-NEXT:    [[SPECULATE_TRIP_COUNT:%.*]] = icmp ult i64 [[J_NEXT]], 1048576
113; CHECK-PROF-NEXT:    br i1 [[SPECULATE_TRIP_COUNT]], label [[HEADER]], label [[EXITLATCH:%.*]], !prof [[PROF2]]
114; CHECK-PROF:       exitLatch:
115; CHECK-PROF-NEXT:    ret i64 1
116; CHECK-PROF:       exit:
117; CHECK-PROF-NEXT:    [[RESULT_IN3_LCSSA:%.*]] = phi ptr [ [[RESULT_IN3]], [[HEADER]] ]
118; CHECK-PROF-NEXT:    [[RESULT_LE:%.*]] = load i64, ptr [[RESULT_IN3_LCSSA]], align 8
119; CHECK-PROF-NEXT:    ret i64 [[RESULT_LE]]
120;
121; CHECK-NOTPROF-LABEL: define i64 @predicate_eq_zeroes(
122; CHECK-NOTPROF-SAME: ptr readonly captures(none) [[ARG:%.*]], i32 [[LENGTH:%.*]], ptr readonly captures(none) [[ARG2:%.*]], ptr readonly captures(none) [[N_ADDR:%.*]], i64 [[I:%.*]]) !prof [[PROF0]] {
123; CHECK-NOTPROF-NEXT:  entry:
124; CHECK-NOTPROF-NEXT:    [[LENGTH_EXT:%.*]] = zext i32 [[LENGTH]] to i64
125; CHECK-NOTPROF-NEXT:    [[N_PRE:%.*]] = load i64, ptr [[N_ADDR]], align 4
126; CHECK-NOTPROF-NEXT:    br label [[HEADER:%.*]]
127; CHECK-NOTPROF:       Header:
128; CHECK-NOTPROF-NEXT:    [[RESULT_IN3:%.*]] = phi ptr [ [[ARG2]], [[ENTRY:%.*]] ], [ [[ARG]], [[LATCH:%.*]] ]
129; CHECK-NOTPROF-NEXT:    [[J2:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LATCH]] ]
130; CHECK-NOTPROF-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i64 [[J2]], [[LENGTH_EXT]]
131; CHECK-NOTPROF-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[WITHIN_BOUNDS]], i32 9) [ "deopt"() ]
132; CHECK-NOTPROF-NEXT:    [[INNERCMP:%.*]] = icmp eq i64 [[J2]], [[N_PRE]]
133; CHECK-NOTPROF-NEXT:    [[J_NEXT]] = add nuw nsw i64 [[J2]], 1
134; CHECK-NOTPROF-NEXT:    br i1 [[INNERCMP]], label [[LATCH]], label [[EXIT:%.*]], !prof [[PROF3:![0-9]+]]
135; CHECK-NOTPROF:       Latch:
136; CHECK-NOTPROF-NEXT:    [[SPECULATE_TRIP_COUNT:%.*]] = icmp ult i64 [[J_NEXT]], 1048576
137; CHECK-NOTPROF-NEXT:    br i1 [[SPECULATE_TRIP_COUNT]], label [[HEADER]], label [[EXITLATCH:%.*]], !prof [[PROF2]]
138; CHECK-NOTPROF:       exitLatch:
139; CHECK-NOTPROF-NEXT:    ret i64 1
140; CHECK-NOTPROF:       exit:
141; CHECK-NOTPROF-NEXT:    [[RESULT_IN3_LCSSA:%.*]] = phi ptr [ [[RESULT_IN3]], [[HEADER]] ]
142; CHECK-NOTPROF-NEXT:    [[RESULT_LE:%.*]] = load i64, ptr [[RESULT_IN3_LCSSA]], align 8
143; CHECK-NOTPROF-NEXT:    ret i64 [[RESULT_LE]]
144;
145entry:
146  %length.ext = zext i32 %length to i64
147  %n.pre = load i64, ptr %n_addr, align 4
148  br label %Header
149
150Header:                                          ; preds = %entry, %Latch
151  %result.in3 = phi ptr [ %arg2, %entry ], [ %arg, %Latch ]
152  %j2 = phi i64 [ 0, %entry ], [ %j.next, %Latch ]
153  %within.bounds = icmp ult i64 %j2, %length.ext
154  call void (i1, ...) @llvm.experimental.guard(i1 %within.bounds, i32 9) [ "deopt"() ]
155  %innercmp = icmp eq i64 %j2, %n.pre
156  %j.next = add nuw nsw i64 %j2, 1
157  br i1 %innercmp, label %Latch, label %exit, !prof !1
158
159Latch:                                           ; preds = %Header
160  %speculate_trip_count = icmp ult i64 %j.next, 1048576
161  br i1 %speculate_trip_count, label %Header, label %exitLatch, !prof !2
162
163exitLatch:                                            ; preds = %Latch
164  ret i64 1
165
166exit:                                             ; preds = %Header
167  %result.in3.lcssa = phi ptr [ %result.in3, %Header ]
168  %result.le = load i64, ptr %result.in3.lcssa, align 8
169  ret i64 %result.le
170}
171!1 = !{!"branch_weights", i32 0, i32 0}
172
173; No profile on br in Header
174define i64 @predicate_eq_none(ptr nocapture readonly %arg, i32 %length, ptr nocapture readonly %arg2, ptr nocapture readonly %n_addr, i64 %i) !prof !21 {
175; CHECK-PROF-LABEL: define i64 @predicate_eq_none(
176; CHECK-PROF-SAME: ptr readonly captures(none) [[ARG:%.*]], i32 [[LENGTH:%.*]], ptr readonly captures(none) [[ARG2:%.*]], ptr readonly captures(none) [[N_ADDR:%.*]], i64 [[I:%.*]]) !prof [[PROF0]] {
177; CHECK-PROF-NEXT:  entry:
178; CHECK-PROF-NEXT:    [[LENGTH_EXT:%.*]] = zext i32 [[LENGTH]] to i64
179; CHECK-PROF-NEXT:    [[N_PRE:%.*]] = load i64, ptr [[N_ADDR]], align 4
180; CHECK-PROF-NEXT:    [[TMP0:%.*]] = icmp ule i64 1048576, [[LENGTH_EXT]]
181; CHECK-PROF-NEXT:    [[TMP1:%.*]] = icmp ult i64 0, [[LENGTH_EXT]]
182; CHECK-PROF-NEXT:    [[TMP2:%.*]] = and i1 [[TMP1]], [[TMP0]]
183; CHECK-PROF-NEXT:    [[TMP3:%.*]] = freeze i1 [[TMP2]]
184; CHECK-PROF-NEXT:    br label [[HEADER:%.*]]
185; CHECK-PROF:       Header:
186; CHECK-PROF-NEXT:    [[RESULT_IN3:%.*]] = phi ptr [ [[ARG2]], [[ENTRY:%.*]] ], [ [[ARG]], [[LATCH:%.*]] ]
187; CHECK-PROF-NEXT:    [[J2:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LATCH]] ]
188; CHECK-PROF-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i64 [[J2]], [[LENGTH_EXT]]
189; CHECK-PROF-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[TMP3]], i32 9) [ "deopt"() ]
190; CHECK-PROF-NEXT:    call void @llvm.assume(i1 [[WITHIN_BOUNDS]])
191; CHECK-PROF-NEXT:    [[INNERCMP:%.*]] = icmp eq i64 [[J2]], [[N_PRE]]
192; CHECK-PROF-NEXT:    [[J_NEXT]] = add nuw nsw i64 [[J2]], 1
193; CHECK-PROF-NEXT:    br i1 [[INNERCMP]], label [[LATCH]], label [[EXIT:%.*]]
194; CHECK-PROF:       Latch:
195; CHECK-PROF-NEXT:    [[SPECULATE_TRIP_COUNT:%.*]] = icmp ult i64 [[J_NEXT]], 1048576
196; CHECK-PROF-NEXT:    br i1 [[SPECULATE_TRIP_COUNT]], label [[HEADER]], label [[EXITLATCH:%.*]], !prof [[PROF2]]
197; CHECK-PROF:       exitLatch:
198; CHECK-PROF-NEXT:    ret i64 1
199; CHECK-PROF:       exit:
200; CHECK-PROF-NEXT:    [[RESULT_IN3_LCSSA:%.*]] = phi ptr [ [[RESULT_IN3]], [[HEADER]] ]
201; CHECK-PROF-NEXT:    [[RESULT_LE:%.*]] = load i64, ptr [[RESULT_IN3_LCSSA]], align 8
202; CHECK-PROF-NEXT:    ret i64 [[RESULT_LE]]
203;
204; CHECK-NOTPROF-LABEL: define i64 @predicate_eq_none(
205; CHECK-NOTPROF-SAME: ptr readonly captures(none) [[ARG:%.*]], i32 [[LENGTH:%.*]], ptr readonly captures(none) [[ARG2:%.*]], ptr readonly captures(none) [[N_ADDR:%.*]], i64 [[I:%.*]]) !prof [[PROF0]] {
206; CHECK-NOTPROF-NEXT:  entry:
207; CHECK-NOTPROF-NEXT:    [[LENGTH_EXT:%.*]] = zext i32 [[LENGTH]] to i64
208; CHECK-NOTPROF-NEXT:    [[N_PRE:%.*]] = load i64, ptr [[N_ADDR]], align 4
209; CHECK-NOTPROF-NEXT:    br label [[HEADER:%.*]]
210; CHECK-NOTPROF:       Header:
211; CHECK-NOTPROF-NEXT:    [[RESULT_IN3:%.*]] = phi ptr [ [[ARG2]], [[ENTRY:%.*]] ], [ [[ARG]], [[LATCH:%.*]] ]
212; CHECK-NOTPROF-NEXT:    [[J2:%.*]] = phi i64 [ 0, [[ENTRY]] ], [ [[J_NEXT:%.*]], [[LATCH]] ]
213; CHECK-NOTPROF-NEXT:    [[WITHIN_BOUNDS:%.*]] = icmp ult i64 [[J2]], [[LENGTH_EXT]]
214; CHECK-NOTPROF-NEXT:    call void (i1, ...) @llvm.experimental.guard(i1 [[WITHIN_BOUNDS]], i32 9) [ "deopt"() ]
215; CHECK-NOTPROF-NEXT:    [[INNERCMP:%.*]] = icmp eq i64 [[J2]], [[N_PRE]]
216; CHECK-NOTPROF-NEXT:    [[J_NEXT]] = add nuw nsw i64 [[J2]], 1
217; CHECK-NOTPROF-NEXT:    br i1 [[INNERCMP]], label [[LATCH]], label [[EXIT:%.*]]
218; CHECK-NOTPROF:       Latch:
219; CHECK-NOTPROF-NEXT:    [[SPECULATE_TRIP_COUNT:%.*]] = icmp ult i64 [[J_NEXT]], 1048576
220; CHECK-NOTPROF-NEXT:    br i1 [[SPECULATE_TRIP_COUNT]], label [[HEADER]], label [[EXITLATCH:%.*]], !prof [[PROF2]]
221; CHECK-NOTPROF:       exitLatch:
222; CHECK-NOTPROF-NEXT:    ret i64 1
223; CHECK-NOTPROF:       exit:
224; CHECK-NOTPROF-NEXT:    [[RESULT_IN3_LCSSA:%.*]] = phi ptr [ [[RESULT_IN3]], [[HEADER]] ]
225; CHECK-NOTPROF-NEXT:    [[RESULT_LE:%.*]] = load i64, ptr [[RESULT_IN3_LCSSA]], align 8
226; CHECK-NOTPROF-NEXT:    ret i64 [[RESULT_LE]]
227;
228entry:
229  %length.ext = zext i32 %length to i64
230  %n.pre = load i64, ptr %n_addr, align 4
231  br label %Header
232
233Header:                                          ; preds = %entry, %Latch
234  %result.in3 = phi ptr [ %arg2, %entry ], [ %arg, %Latch ]
235  %j2 = phi i64 [ 0, %entry ], [ %j.next, %Latch ]
236  %within.bounds = icmp ult i64 %j2, %length.ext
237  call void (i1, ...) @llvm.experimental.guard(i1 %within.bounds, i32 9) [ "deopt"() ]
238  %innercmp = icmp eq i64 %j2, %n.pre
239  %j.next = add nuw nsw i64 %j2, 1
240  br i1 %innercmp, label %Latch, label %exit
241
242Latch:                                           ; preds = %Header
243  %speculate_trip_count = icmp ult i64 %j.next, 1048576
244  br i1 %speculate_trip_count, label %Header, label %exitLatch, !prof !2
245
246exitLatch:                                            ; preds = %Latch
247  ret i64 1
248
249exit:                                             ; preds = %Header
250  %result.in3.lcssa = phi ptr [ %result.in3, %Header ]
251  %result.le = load i64, ptr %result.in3.lcssa, align 8
252  ret i64 %result.le
253}
254
255!2 = !{!"branch_weights", i32 3, i32 1}
256!21 = !{!"function_entry_count", i64 20000}
257
258declare i64 @llvm.experimental.deoptimize.i64(...)
259declare void @llvm.experimental.guard(i1, ...)
260