519 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 42; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s3 4; ScalarEvolution should be able to compute trip count of the loop by proving5; that this is not an infinite loop with side effects.6 7 8; We should have a conservative estimate for the max backedge taken count for9; loops with unknown stride.10 11target datalayout = "e-m:e-p:32:32-f64:32:64-f80:32-n8:16:32-S128"12 13define void @foo1(ptr nocapture %A, i32 %n, i32 %s) mustprogress {14;15; CHECK-LABEL: 'foo1'16; CHECK-NEXT: Determining loop execution counts for: @foo117; CHECK-NEXT: Loop %for.body: backedge-taken count is ((-1 + (%n smax %s)) /u %s)18; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -119; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is ((-1 + (%n smax %s)) /u %s)20; CHECK-NEXT: Loop %for.body: Trip multiple is 121;22entry:23 %cmp4 = icmp sgt i32 %n, 024 br i1 %cmp4, label %for.body, label %for.end25 26for.body: ; preds = %entry, %for.body27 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]28 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.0529 %0 = load i32, ptr %arrayidx, align 430 %inc = add nsw i32 %0, 131 store i32 %inc, ptr %arrayidx, align 432 %add = add nsw i32 %i.05, %s33 %cmp = icmp slt i32 %add, %n34 br i1 %cmp, label %for.body, label %for.end35 36for.end: ; preds = %for.body, %entry37 ret void38}39 40 41; Check that we are able to compute trip count of a loop without an entry guard.42 43; We should have a conservative estimate for the max backedge taken count for44; loops with unknown stride.45 46define void @foo2(ptr nocapture %A, i32 %n, i32 %s) mustprogress {47;48; CHECK-LABEL: 'foo2'49; CHECK-NEXT: Determining loop execution counts for: @foo250; CHECK-NEXT: Loop %for.body: backedge-taken count is ((((-1 * (1 umin ((-1 * %s) + (%n smax %s))))<nuw><nsw> + (-1 * %s) + (%n smax %s)) /u (1 umax %s)) + (1 umin ((-1 * %s) + (%n smax %s))))51; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -152; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is ((((-1 * (1 umin ((-1 * %s) + (%n smax %s))))<nuw><nsw> + (-1 * %s) + (%n smax %s)) /u (1 umax %s)) + (1 umin ((-1 * %s) + (%n smax %s))))53; CHECK-NEXT: Loop %for.body: Trip multiple is 154;55entry:56 br label %for.body57 58for.body: ; preds = %entry, %for.body59 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]60 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.0561 %0 = load i32, ptr %arrayidx, align 462 %inc = add nsw i32 %0, 163 store i32 %inc, ptr %arrayidx, align 464 %add = add nsw i32 %i.05, %s65 %cmp = icmp slt i32 %add, %n66 br i1 %cmp, label %for.body, label %for.end67 68for.end: ; preds = %for.body, %entry69 ret void70}71 72; Check that without mustprogress we don't make assumptions about infinite73; loops being UB.74 75define void @foo3(ptr nocapture %A, i32 %n, i32 %s) {76;77; CHECK-LABEL: 'foo3'78; CHECK-NEXT: Determining loop execution counts for: @foo379; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.80; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.81; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.82;83entry:84 br label %for.body85 86for.body: ; preds = %entry, %for.body87 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]88 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.0589 %0 = load i32, ptr %arrayidx, align 490 %inc = add nsw i32 %0, 191 store i32 %inc, ptr %arrayidx, align 492 %add = add nsw i32 %i.05, %s93 %cmp = icmp slt i32 %add, %n94 br i1 %cmp, label %for.body, label %for.end95 96for.end: ; preds = %for.body, %entry97 ret void98}99 100; Same as foo2, but with mustprogress on loop, not function101 102define void @foo4(ptr nocapture %A, i32 %n, i32 %s) {103;104; CHECK-LABEL: 'foo4'105; CHECK-NEXT: Determining loop execution counts for: @foo4106; CHECK-NEXT: Loop %for.body: backedge-taken count is ((((-1 * (1 umin ((-1 * %s) + (%n smax %s))))<nuw><nsw> + (-1 * %s) + (%n smax %s)) /u (1 umax %s)) + (1 umin ((-1 * %s) + (%n smax %s))))107; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -1108; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is ((((-1 * (1 umin ((-1 * %s) + (%n smax %s))))<nuw><nsw> + (-1 * %s) + (%n smax %s)) /u (1 umax %s)) + (1 umin ((-1 * %s) + (%n smax %s))))109; CHECK-NEXT: Loop %for.body: Trip multiple is 1110;111entry:112 br label %for.body113 114for.body: ; preds = %entry, %for.body115 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]116 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05117 %0 = load i32, ptr %arrayidx, align 4118 %inc = add nsw i32 %0, 1119 store i32 %inc, ptr %arrayidx, align 4120 %add = add nsw i32 %i.05, %s121 %cmp = icmp slt i32 %add, %n122 br i1 %cmp, label %for.body, label %for.end, !llvm.loop !8123 124for.end: ; preds = %for.body, %entry125 ret void126}127 128; A more complex case with pre-increment compare instead of post-increment.129 130; We should have a conservative estimate for the max backedge taken count for131; loops with unknown stride.132 133define void @foo5(ptr nocapture %A, i32 %n, i32 %s, i32 %start) mustprogress {134;135; CHECK-LABEL: 'foo5'136; CHECK-NEXT: Determining loop execution counts for: @foo5137; CHECK-NEXT: Loop %for.body: backedge-taken count is ((((-1 * (1 umin ((-1 * %start) + (%n smax %start))))<nuw><nsw> + (-1 * %start) + (%n smax %start)) /u (1 umax %s)) + (1 umin ((-1 * %start) + (%n smax %start))))138; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -1139; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is ((((-1 * (1 umin ((-1 * %start) + (%n smax %start))))<nuw><nsw> + (-1 * %start) + (%n smax %start)) /u (1 umax %s)) + (1 umin ((-1 * %start) + (%n smax %start))))140; CHECK-NEXT: Loop %for.body: Trip multiple is 1141;142entry:143 br label %for.body144 145for.body: ; preds = %entry, %for.body146 %i.05 = phi i32 [ %add, %for.body ], [ %start, %entry ]147 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05148 %0 = load i32, ptr %arrayidx, align 4149 %inc = add nsw i32 %0, 1150 store i32 %inc, ptr %arrayidx, align 4151 %add = add nsw i32 %i.05, %s152 %cmp = icmp slt i32 %i.05, %n153 br i1 %cmp, label %for.body, label %for.end154 155for.end: ; preds = %for.body, %entry156 ret void157}158 159; FIXME: Currently we are more conservative for known zero stride than160; for unknown but potentially zero stride.161; Note that this function is well defined only when %n <=s 0162define void @zero_stride(ptr nocapture %A, i32 %n) {163;164; CHECK-LABEL: 'zero_stride'165; CHECK-NEXT: Determining loop execution counts for: @zero_stride166; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.167; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.168; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.169;170entry:171 br label %for.body172 173for.body: ; preds = %entry, %for.body174 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]175 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05176 %0 = load i32, ptr %arrayidx, align 4177 %inc = add nsw i32 %0, 1178 store i32 %inc, ptr %arrayidx, align 4179 %add = add nsw i32 %i.05, 0180 %cmp = icmp slt i32 %add, %n181 br i1 %cmp, label %for.body, label %for.end, !llvm.loop !8182 183for.end: ; preds = %for.body, %entry184 ret void185}186 187; Note that this function will always execute undefined behavior and thus188; any value is valid for a backedge taken count.189define void @zero_stride_ub(ptr nocapture %A) {190;191; CHECK-LABEL: 'zero_stride_ub'192; CHECK-NEXT: Determining loop execution counts for: @zero_stride_ub193; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.194; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.195; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.196;197entry:198 br label %for.body199 200for.body: ; preds = %entry, %for.body201 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]202 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05203 %0 = load i32, ptr %arrayidx, align 4204 %inc = add nsw i32 %0, 1205 store i32 %inc, ptr %arrayidx, align 4206 %add = add nsw i32 %i.05, 0207 %cmp = icmp slt i32 %add, 2208 br i1 %cmp, label %for.body, label %for.end, !llvm.loop !8209 210for.end: ; preds = %for.body, %entry211 ret void212}213 214; When %zero = 0, this loop is only well defined if %n < 0 and thus BTC = 0.215 216define void @zero_stride_symbolic(ptr nocapture %A, i32 %n, i32 %zero) {217;218; CHECK-LABEL: 'zero_stride_symbolic'219; CHECK-NEXT: Determining loop execution counts for: @zero_stride_symbolic220; CHECK-NEXT: Loop %for.body: backedge-taken count is ((((-1 * (1 umin ((-1 * %zero) + (%n smax %zero))))<nuw><nsw> + (-1 * %zero) + (%n smax %zero)) /u (1 umax %zero)) + (1 umin ((-1 * %zero) + (%n smax %zero))))221; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -1222; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is ((((-1 * (1 umin ((-1 * %zero) + (%n smax %zero))))<nuw><nsw> + (-1 * %zero) + (%n smax %zero)) /u (1 umax %zero)) + (1 umin ((-1 * %zero) + (%n smax %zero))))223; CHECK-NEXT: Loop %for.body: Trip multiple is 1224;225entry:226 br label %for.body227 228for.body: ; preds = %entry, %for.body229 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]230 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05231 %0 = load i32, ptr %arrayidx, align 4232 %inc = add nsw i32 %0, 1233 store i32 %inc, ptr %arrayidx, align 4234 %add = add nsw i32 %i.05, %zero235 %cmp = icmp slt i32 %add, %n236 br i1 %cmp, label %for.body, label %for.end, !llvm.loop !8237 238for.end: ; preds = %for.body, %entry239 ret void240}241 242 243 244define void @zero_stride_varying_rhs(ptr nocapture %A, ptr %n_p, i32 %zero) {245;246; CHECK-LABEL: 'zero_stride_varying_rhs'247; CHECK-NEXT: Determining loop execution counts for: @zero_stride_varying_rhs248; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.249; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.250; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.251;252entry:253 br label %for.body254 255for.body: ; preds = %entry, %for.body256 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]257 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05258 %0 = load i32, ptr %arrayidx, align 4259 %inc = add nsw i32 %0, 1260 store i32 %inc, ptr %arrayidx, align 4261 %add = add nsw i32 %i.05, %zero262 %n = load i32, ptr %n_p263 %cmp = icmp slt i32 %add, %n264 br i1 %cmp, label %for.body, label %for.end, !llvm.loop !8265 266for.end: ; preds = %for.body, %entry267 ret void268}269 270define void @ne_nsw_pos_step(ptr nocapture %A, i32 %n, i32 %s) mustprogress {271;272; CHECK-LABEL: 'ne_nsw_pos_step'273; CHECK-NEXT: Determining loop execution counts for: @ne_nsw_pos_step274; CHECK-NEXT: Loop %for.body: backedge-taken count is (((-1 * %s) + %n) /u %s)275; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -1276; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (((-1 * %s) + %n) /u %s)277; CHECK-NEXT: Loop %for.body: Trip multiple is 1278;279entry:280 %pos_step = icmp sgt i32 %s, 0281 call void @llvm.assume(i1 %pos_step)282 %cmp4 = icmp sgt i32 %n, 0283 br i1 %cmp4, label %for.body, label %for.end284 285for.body: ; preds = %entry, %for.body286 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]287 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05288 %0 = load i32, ptr %arrayidx, align 4289 %inc = add nsw i32 %0, 1290 store i32 %inc, ptr %arrayidx, align 4291 %add = add nsw i32 %i.05, %s292 %cmp = icmp ne i32 %add, %n293 br i1 %cmp, label %for.body, label %for.end294 295for.end: ; preds = %for.body, %entry296 ret void297}298 299define void @ne_nsw_neg_step(ptr nocapture %A, i32 %n, i32 %s) mustprogress {300;301; CHECK-LABEL: 'ne_nsw_neg_step'302; CHECK-NEXT: Determining loop execution counts for: @ne_nsw_neg_step303; CHECK-NEXT: Loop %for.body: backedge-taken count is (((-1 * %n) + %s) /u (-1 * %s))304; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2305; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (((-1 * %n) + %s) /u (-1 * %s))306; CHECK-NEXT: Loop %for.body: Trip multiple is 1307;308entry:309 %neg_step = icmp slt i32 %s, 0310 call void @llvm.assume(i1 %neg_step)311 %cmp4 = icmp sgt i32 %n, 0312 br i1 %cmp4, label %for.body, label %for.end313 314for.body: ; preds = %entry, %for.body315 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]316 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05317 %0 = load i32, ptr %arrayidx, align 4318 %inc = add nsw i32 %0, 1319 store i32 %inc, ptr %arrayidx, align 4320 %add = add nsw i32 %i.05, %s321 %cmp = icmp ne i32 %add, %n322 br i1 %cmp, label %for.body, label %for.end323 324for.end: ; preds = %for.body, %entry325 ret void326}327 328define void @ne_nsw_nonneg_step(ptr nocapture %A, i32 %n, i32 %s) mustprogress {329;330; CHECK-LABEL: 'ne_nsw_nonneg_step'331; CHECK-NEXT: Determining loop execution counts for: @ne_nsw_nonneg_step332; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.333; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.334; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.335;336entry:337 %nonneg_step = icmp sge i32 %s, 0338 call void @llvm.assume(i1 %nonneg_step)339 %cmp4 = icmp sgt i32 %n, 0340 br i1 %cmp4, label %for.body, label %for.end341 342for.body: ; preds = %entry, %for.body343 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]344 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05345 %0 = load i32, ptr %arrayidx, align 4346 %inc = add nsw i32 %0, 1347 store i32 %inc, ptr %arrayidx, align 4348 %add = add nsw i32 %i.05, %s349 %cmp = icmp ne i32 %add, %n350 br i1 %cmp, label %for.body, label %for.end351 352for.end: ; preds = %for.body, %entry353 ret void354}355 356define void @ne_nsw_unknown_step(ptr nocapture %A, i32 %n, i32 %s) mustprogress {357;358; CHECK-LABEL: 'ne_nsw_unknown_step'359; CHECK-NEXT: Determining loop execution counts for: @ne_nsw_unknown_step360; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.361; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.362; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.363;364entry:365 %cmp4 = icmp sgt i32 %n, 0366 br i1 %cmp4, label %for.body, label %for.end367 368for.body: ; preds = %entry, %for.body369 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]370 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05371 %0 = load i32, ptr %arrayidx, align 4372 %inc = add nsw i32 %0, 1373 store i32 %inc, ptr %arrayidx, align 4374 %add = add nsw i32 %i.05, %s375 %cmp = icmp ne i32 %add, %n376 br i1 %cmp, label %for.body, label %for.end377 378for.end: ; preds = %for.body, %entry379 ret void380}381 382define void @ne_nuw_pos_step(ptr nocapture %A, i32 %n, i32 %s) mustprogress {383;384; CHECK-LABEL: 'ne_nuw_pos_step'385; CHECK-NEXT: Determining loop execution counts for: @ne_nuw_pos_step386; CHECK-NEXT: Loop %for.body: backedge-taken count is (((-1 * %s) + %n) /u %s)387; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -1388; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (((-1 * %s) + %n) /u %s)389; CHECK-NEXT: Loop %for.body: Trip multiple is 1390;391entry:392 %pos_step = icmp sgt i32 %s, 0393 call void @llvm.assume(i1 %pos_step)394 %cmp4 = icmp sgt i32 %n, 0395 br i1 %cmp4, label %for.body, label %for.end396 397for.body: ; preds = %entry, %for.body398 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]399 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05400 %0 = load i32, ptr %arrayidx, align 4401 %inc = add nuw i32 %0, 1402 store i32 %inc, ptr %arrayidx, align 4403 %add = add nuw i32 %i.05, %s404 %cmp = icmp ne i32 %add, %n405 br i1 %cmp, label %for.body, label %for.end406 407for.end: ; preds = %for.body, %entry408 ret void409}410 411define void @ne_nuw_neg_step(ptr nocapture %A, i32 %n, i32 %s) mustprogress {412;413; CHECK-LABEL: 'ne_nuw_neg_step'414; CHECK-NEXT: Determining loop execution counts for: @ne_nuw_neg_step415; CHECK-NEXT: Loop %for.body: backedge-taken count is (((-1 * %n) + %s) /u (-1 * %s))416; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2417; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (((-1 * %n) + %s) /u (-1 * %s))418; CHECK-NEXT: Loop %for.body: Trip multiple is 1419;420entry:421 %neg_step = icmp slt i32 %s, 0422 call void @llvm.assume(i1 %neg_step)423 %cmp4 = icmp sgt i32 %n, 0424 br i1 %cmp4, label %for.body, label %for.end425 426for.body: ; preds = %entry, %for.body427 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]428 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05429 %0 = load i32, ptr %arrayidx, align 4430 %inc = add nuw i32 %0, 1431 store i32 %inc, ptr %arrayidx, align 4432 %add = add nuw i32 %i.05, %s433 %cmp = icmp ne i32 %add, %n434 br i1 %cmp, label %for.body, label %for.end435 436for.end: ; preds = %for.body, %entry437 ret void438}439 440define void @ne_nuw_nonneg_step(ptr nocapture %A, i32 %n, i32 %s) mustprogress {441;442; CHECK-LABEL: 'ne_nuw_nonneg_step'443; CHECK-NEXT: Determining loop execution counts for: @ne_nuw_nonneg_step444; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.445; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.446; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.447;448entry:449 %nonneg_step = icmp sge i32 %s, 0450 call void @llvm.assume(i1 %nonneg_step)451 %cmp4 = icmp sgt i32 %n, 0452 br i1 %cmp4, label %for.body, label %for.end453 454for.body: ; preds = %entry, %for.body455 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]456 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05457 %0 = load i32, ptr %arrayidx, align 4458 %inc = add nuw i32 %0, 1459 store i32 %inc, ptr %arrayidx, align 4460 %add = add nuw i32 %i.05, %s461 %cmp = icmp ne i32 %add, %n462 br i1 %cmp, label %for.body, label %for.end463 464for.end: ; preds = %for.body, %entry465 ret void466}467 468define void @ne_nuw_unknown_step(ptr nocapture %A, i32 %n, i32 %s) mustprogress {469;470; CHECK-LABEL: 'ne_nuw_unknown_step'471; CHECK-NEXT: Determining loop execution counts for: @ne_nuw_unknown_step472; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.473; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.474; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.475;476entry:477 %cmp4 = icmp sgt i32 %n, 0478 br i1 %cmp4, label %for.body, label %for.end479 480for.body: ; preds = %entry, %for.body481 %i.05 = phi i32 [ %add, %for.body ], [ 0, %entry ]482 %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.05483 %0 = load i32, ptr %arrayidx, align 4484 %inc = add nuw i32 %0, 1485 store i32 %inc, ptr %arrayidx, align 4486 %add = add nuw i32 %i.05, %s487 %cmp = icmp ne i32 %add, %n488 br i1 %cmp, label %for.body, label %for.end489 490for.end: ; preds = %for.body, %entry491 ret void492}493 494define i32 @pr131465(i1 %x) mustprogress {495; CHECK-LABEL: 'pr131465'496; CHECK-NEXT: Determining loop execution counts for: @pr131465497; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.498; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.499; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.500;501entry:502 %inc = zext i1 %x to i32503 br label %for.body504 505for.body:506 %indvar = phi i32 [ 2, %entry ], [ %next, %for.body ]507 %next = add nsw i32 %indvar, %inc508 %exitcond = icmp eq i32 %next, 2509 br i1 %exitcond, label %for.end, label %for.body510 511for.end:512 ret i32 0513}514 515declare void @llvm.assume(i1)516 517!8 = distinct !{!8, !9}518!9 = !{!"llvm.loop.mustprogress"}519