brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.2 KiB · 1f08a62 Raw
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