678 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s3 4; A collection of tests which exercise SCEV's ability to compute trip counts5; for negative steps.6 7; Unsigned Comparisons8; --------------------9 10; Case where we wrap the induction variable (without generating poison), and11; thus can't currently compute a trip count.12define void @ult_wrap() {13; CHECK-LABEL: 'ult_wrap'14; CHECK-NEXT: Determining loop execution counts for: @ult_wrap15; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.16; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.17; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.18;19entry:20 br label %for.body21 22for.body: ; preds = %entry, %for.body23 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]24 %add = add i8 %i.05, 25425 %cmp = icmp ult i8 %add, 25526 br i1 %cmp, label %for.body, label %for.end27 28for.end: ; preds = %for.body, %entry29 ret void30}31 32; This IV cycles between 0, and 128, never causing the loop to exit33; (This is well defined.)34define void @ult_infinite() {35; CHECK-LABEL: 'ult_infinite'36; CHECK-NEXT: Determining loop execution counts for: @ult_infinite37; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.38; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.39; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.40;41entry:42 br label %for.body43 44for.body: ; preds = %entry, %for.body45 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]46 %add = add i8 %i.05, 12847 %cmp = icmp ult i8 %add, 25548 br i1 %cmp, label %for.body, label %for.end49 50for.end: ; preds = %for.body, %entry51 ret void52}53 54; Same as ult_infinite, except that the loop is ill defined due to the55; must progress attribute56define void @ult_infinite_ub() mustprogress {57; CHECK-LABEL: 'ult_infinite_ub'58; CHECK-NEXT: Determining loop execution counts for: @ult_infinite_ub59; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 160; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 161; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 162; CHECK-NEXT: Loop %for.body: Trip multiple is 263;64entry:65 br label %for.body66 67for.body: ; preds = %entry, %for.body68 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]69 %add = add i8 %i.05, 12870 %cmp = icmp ult i8 %add, 25571 br i1 %cmp, label %for.body, label %for.end72 73for.end: ; preds = %for.body, %entry74 ret void75}76 77 78; Backedge is not taken79define void @ult_129_not_taken() {80; CHECK-LABEL: 'ult_129_not_taken'81; CHECK-NEXT: Determining loop execution counts for: @ult_129_not_taken82; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 083; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 084; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 085; CHECK-NEXT: Loop %for.body: Trip multiple is 186;87entry:88 br label %for.body89 90for.body: ; preds = %entry, %for.body91 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]92 %add = add i8 %i.05, 12993 %cmp = icmp ult i8 %add, 12894 br i1 %cmp, label %for.body, label %for.end95 96for.end: ; preds = %for.body, %entry97 ret void98}99 100define void @ult_129_unknown_start(i8 %start) mustprogress {101; CHECK-LABEL: 'ult_129_unknown_start'102; CHECK-NEXT: Determining loop execution counts for: @ult_129_unknown_start103; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 0104; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 0105; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 0106; CHECK-NEXT: Loop %for.body: Trip multiple is 1107;108entry:109 br label %for.body110 111for.body: ; preds = %entry, %for.body112 %i.05 = phi i8 [ %add, %for.body ], [ %start, %entry ]113 %add = add nuw i8 %i.05, 129114 %cmp = icmp ult i8 %add, 128115 br i1 %cmp, label %for.body, label %for.end116 117for.end: ; preds = %for.body, %entry118 ret void119}120 121 122; A case with a non-constant stride where the backedge is not taken123define void @ult_not_taken(i8 %step) {124; CHECK-LABEL: 'ult_not_taken'125; CHECK-NEXT: Determining loop execution counts for: @ult_not_taken126; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.127; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.128; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.129;130entry:131 %assume = icmp ult i8 128, %step132 call void @llvm.assume(i1 %assume)133 br label %for.body134 135for.body: ; preds = %entry, %for.body136 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]137 %add = add i8 %i.05, %step138 %cmp = icmp ult i8 %add, 128139 br i1 %cmp, label %for.body, label %for.end140 141for.end: ; preds = %for.body, %entry142 ret void143}144 145 146 147; IV does wrap, and thus causes us to branch on poison. This loop is148; ill defined.149define void @ult_ub1() {150; CHECK-LABEL: 'ult_ub1'151; CHECK-NEXT: Determining loop execution counts for: @ult_ub1152; CHECK-NEXT: Loop %for.body: backedge-taken count is i32 2153; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 2154; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i32 2155; CHECK-NEXT: Loop %for.body: Trip multiple is 3156;157entry:158 br label %for.body159 160for.body: ; preds = %entry, %for.body161 %i.05 = phi i8 [ %add, %for.body ], [ 2, %entry ]162 %add = add nuw i8 %i.05, 255163 %cmp = icmp ult i8 %add, 128164 br i1 %cmp, label %for.body, label %for.end165 166for.end: ; preds = %for.body, %entry167 ret void168}169 170; This loop is ill defined because we violate the nsw flag on the first171; iteration.172define void @ult_ub2() {173; CHECK-LABEL: 'ult_ub2'174; CHECK-NEXT: Determining loop execution counts for: @ult_ub2175; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 0176; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 0177; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 0178; CHECK-NEXT: Loop %for.body: Trip multiple is 1179;180entry:181 br label %for.body182 183for.body: ; preds = %entry, %for.body184 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]185 %add = add nsw nuw i8 %i.05, 129186 %cmp = icmp ult i8 %add, 128187 br i1 %cmp, label %for.body, label %for.end188 189for.end: ; preds = %for.body, %entry190 ret void191}192 193; Large stride, poison produced for %add on second iteration, but not194; branched on.195define void @ult_129_preinc() {196; CHECK-LABEL: 'ult_129_preinc'197; CHECK-NEXT: Determining loop execution counts for: @ult_129_preinc198; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 1199; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 1200; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 1201; CHECK-NEXT: Loop %for.body: Trip multiple is 2202;203entry:204 br label %for.body205 206for.body: ; preds = %entry, %for.body207 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]208 %add = add nuw i8 %i.05, 129209 %cmp = icmp ult i8 %i.05, 128210 br i1 %cmp, label %for.body, label %for.end211 212for.end: ; preds = %for.body, %entry213 ret void214}215 216define void @ult_preinc(i8 %step) {217; CHECK-LABEL: 'ult_preinc'218; CHECK-NEXT: Determining loop execution counts for: @ult_preinc219; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 1220; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 1221; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 1222; CHECK-NEXT: Loop %for.body: Trip multiple is 2223;224entry:225 %assume = icmp ult i8 128, %step226 call void @llvm.assume(i1 %assume)227 br label %for.body228 229for.body: ; preds = %entry, %for.body230 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]231 %add = add nuw i8 %i.05, 129232 %cmp = icmp ult i8 %i.05, 128233 br i1 %cmp, label %for.body, label %for.end234 235for.end: ; preds = %for.body, %entry236 ret void237}238 239define void @ult_129_varying_rhs(ptr %n_p) {240; CHECK-LABEL: 'ult_129_varying_rhs'241; CHECK-NEXT: Determining loop execution counts for: @ult_129_varying_rhs242; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.243; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.244; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.245;246entry:247 br label %for.body248 249for.body: ; preds = %entry, %for.body250 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]251 %add = add nuw i8 %i.05, 129252 %n = load i8, ptr %n_p253 %cmp = icmp ult i8 %add, %n254 br i1 %cmp, label %for.body, label %for.end255 256for.end: ; preds = %for.body, %entry257 ret void258}259 260define void @ult_symbolic_varying_rhs(ptr %n_p, i8 %step) {261; CHECK-LABEL: 'ult_symbolic_varying_rhs'262; CHECK-NEXT: Determining loop execution counts for: @ult_symbolic_varying_rhs263; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.264; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.265; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.266;267entry:268 %assume = icmp ult i8 128, %step269 call void @llvm.assume(i1 %assume)270 br label %for.body271 272for.body: ; preds = %entry, %for.body273 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]274 %add = add nuw i8 %i.05, %step275 %n = load i8, ptr %n_p276 %cmp = icmp ult i8 %add, %n277 br i1 %cmp, label %for.body, label %for.end278 279for.end: ; preds = %for.body, %entry280 ret void281}282 283 284; Signed Comparisons285; ------------------286 287; Case where we wrap the induction variable (without generating poison), and288; thus can't currently compute a trip count.289define void @slt_wrap() {290; CHECK-LABEL: 'slt_wrap'291; CHECK-NEXT: Determining loop execution counts for: @slt_wrap292; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 63293; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 63294; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 63295; CHECK-NEXT: Loop %for.body: Trip multiple is 64296;297entry:298 br label %for.body299 300for.body: ; preds = %entry, %for.body301 %i.05 = phi i8 [ %add, %for.body ], [ 255, %entry ]302 %add = add i8 %i.05, 254303 %cmp = icmp slt i8 %add, 127304 br i1 %cmp, label %for.body, label %for.end305 306for.end: ; preds = %for.body, %entry307 ret void308}309 310; This IV cycles between 0, and int_min (128), never causing the loop to exit311; (This is well defined.)312define void @slt_infinite() {313; CHECK-LABEL: 'slt_infinite'314; CHECK-NEXT: Determining loop execution counts for: @slt_infinite315; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.316; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.317; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.318;319entry:320 br label %for.body321 322for.body: ; preds = %entry, %for.body323 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]324 %add = add i8 %i.05, 128325 %cmp = icmp slt i8 %add, 127326 br i1 %cmp, label %for.body, label %for.end327 328for.end: ; preds = %for.body, %entry329 ret void330}331 332; Same as slt_infinite, except that the loop is ill defined due to the333; must progress attribute334define void @slt_infinite_ub() mustprogress {335; CHECK-LABEL: 'slt_infinite_ub'336; CHECK-NEXT: Determining loop execution counts for: @slt_infinite_ub337; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 0338; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 0339; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 0340; CHECK-NEXT: Loop %for.body: Trip multiple is 1341;342entry:343 br label %for.body344 345for.body: ; preds = %entry, %for.body346 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]347 %add = add i8 %i.05, 128348 %cmp = icmp slt i8 %add, 127349 br i1 %cmp, label %for.body, label %for.end350 351for.end: ; preds = %for.body, %entry352 ret void353}354 355 356; Backedge is not taken357define void @slt_129_not_taken() {358; CHECK-LABEL: 'slt_129_not_taken'359; CHECK-NEXT: Determining loop execution counts for: @slt_129_not_taken360; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 0361; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 0362; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 0363; CHECK-NEXT: Loop %for.body: Trip multiple is 1364;365entry:366 br label %for.body367 368for.body: ; preds = %entry, %for.body369 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ]370 %add = add i8 %i.05, 129371 %cmp = icmp slt i8 %add, 0372 br i1 %cmp, label %for.body, label %for.end373 374for.end: ; preds = %for.body, %entry375 ret void376}377 378; A case with a non-constant stride where the backedge is not taken379define void @slt_not_taken(i8 %step) {380; CHECK-LABEL: 'slt_not_taken'381; CHECK-NEXT: Determining loop execution counts for: @slt_not_taken382; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.383; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.384; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.385;386entry:387 %assume = icmp ult i8 128, %step388 call void @llvm.assume(i1 %assume)389 br label %for.body390 391for.body: ; preds = %entry, %for.body392 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ]393 %add = add i8 %i.05, %step394 %cmp = icmp slt i8 %add, 0395 br i1 %cmp, label %for.body, label %for.end396 397for.end: ; preds = %for.body, %entry398 ret void399}400 401define void @slt_129_unknown_start(i8 %start) mustprogress {402; CHECK-LABEL: 'slt_129_unknown_start'403; CHECK-NEXT: Determining loop execution counts for: @slt_129_unknown_start404; CHECK-NEXT: Loop %for.body: backedge-taken count is (((127 + (-1 * (1 umin (127 + (-1 * %start) + (0 smax (-127 + %start)<nsw>))))<nuw><nsw> + (-1 * %start) + (0 smax (-127 + %start)<nsw>)) /u -127) + (1 umin (127 + (-1 * %start) + (0 smax (-127 + %start)<nsw>))))405; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 2406; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (((127 + (-1 * (1 umin (127 + (-1 * %start) + (0 smax (-127 + %start)<nsw>))))<nuw><nsw> + (-1 * %start) + (0 smax (-127 + %start)<nsw>)) /u -127) + (1 umin (127 + (-1 * %start) + (0 smax (-127 + %start)<nsw>))))407; CHECK-NEXT: Loop %for.body: Trip multiple is 1408;409entry:410 br label %for.body411 412for.body: ; preds = %entry, %for.body413 %i.05 = phi i8 [ %add, %for.body ], [ %start, %entry ]414 %add = add nsw i8 %i.05, 129415 %cmp = icmp slt i8 %add, 0416 br i1 %cmp, label %for.body, label %for.end417 418for.end: ; preds = %for.body, %entry419 ret void420}421 422 423; IV does wrap, and thus causes us to branch on poison. This loop is424; ill defined.425define void @slt_ub1() {426; CHECK-LABEL: 'slt_ub1'427; CHECK-NEXT: Determining loop execution counts for: @slt_ub1428; CHECK-NEXT: Loop %for.body: backedge-taken count is i1 false429; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i1 false430; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i1 false431; CHECK-NEXT: Loop %for.body: Trip multiple is 1432;433entry:434 br label %for.body435 436for.body: ; preds = %entry, %for.body437 %i.05 = phi i8 [ %add, %for.body ], [ 2, %entry ]438 %add = add nuw i8 %i.05, 255439 %cmp = icmp slt i8 %add, 128440 br i1 %cmp, label %for.body, label %for.end441 442for.end: ; preds = %for.body, %entry443 ret void444}445 446; This loop is ill defined because we violate the nsw flag on the first447; iteration.448define void @slt_ub2() {449; CHECK-LABEL: 'slt_ub2'450; CHECK-NEXT: Determining loop execution counts for: @slt_ub2451; CHECK-NEXT: Loop %for.body: backedge-taken count is i1 false452; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i1 false453; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i1 false454; CHECK-NEXT: Loop %for.body: Trip multiple is 1455;456entry:457 br label %for.body458 459for.body: ; preds = %entry, %for.body460 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ]461 %add = add nsw nuw i8 %i.05, 129462 %cmp = icmp slt i8 %add, 128463 br i1 %cmp, label %for.body, label %for.end464 465for.end: ; preds = %for.body, %entry466 ret void467}468 469; Large stride, poison produced for %add on second iteration, but not470; branched on.471define void @slt_129_preinc() {472; CHECK-LABEL: 'slt_129_preinc'473; CHECK-NEXT: Determining loop execution counts for: @slt_129_preinc474; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 1475; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 1476; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 1477; CHECK-NEXT: Loop %for.body: Trip multiple is 2478;479entry:480 br label %for.body481 482for.body: ; preds = %entry, %for.body483 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ]484 %add = add nuw i8 %i.05, 129485 %cmp = icmp slt i8 %i.05, 0486 br i1 %cmp, label %for.body, label %for.end487 488for.end: ; preds = %for.body, %entry489 ret void490}491 492define void @slt_preinc(i8 %step) {493; CHECK-LABEL: 'slt_preinc'494; CHECK-NEXT: Determining loop execution counts for: @slt_preinc495; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 1496; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 1497; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 1498; CHECK-NEXT: Loop %for.body: Trip multiple is 2499;500entry:501 %assume = icmp ult i8 128, %step502 call void @llvm.assume(i1 %assume)503 br label %for.body504 505for.body: ; preds = %entry, %for.body506 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ]507 %add = add nuw i8 %i.05, 129508 %cmp = icmp slt i8 %i.05, 0509 br i1 %cmp, label %for.body, label %for.end510 511for.end: ; preds = %for.body, %entry512 ret void513}514 515define void @slt_129_varying_rhs(ptr %n_p) {516; CHECK-LABEL: 'slt_129_varying_rhs'517; CHECK-NEXT: Determining loop execution counts for: @slt_129_varying_rhs518; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.519; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.520; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.521;522entry:523 br label %for.body524 525for.body: ; preds = %entry, %for.body526 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ]527 %add = add nsw i8 %i.05, 129528 %n = load i8, ptr %n_p529 %cmp = icmp slt i8 %add, %n530 br i1 %cmp, label %for.body, label %for.end531 532for.end: ; preds = %for.body, %entry533 ret void534}535 536define void @slt_symbolic_varying_rhs(ptr %n_p, i8 %step) {537; CHECK-LABEL: 'slt_symbolic_varying_rhs'538; CHECK-NEXT: Determining loop execution counts for: @slt_symbolic_varying_rhs539; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.540; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.541; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.542;543entry:544 %assume = icmp ult i8 128, %step545 call void @llvm.assume(i1 %assume)546 br label %for.body547 548for.body: ; preds = %entry, %for.body549 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ]550 %add = add nsw i8 %i.05, %step551 %n = load i8, ptr %n_p552 %cmp = icmp slt i8 %add, %n553 br i1 %cmp, label %for.body, label %for.end554 555for.end: ; preds = %for.body, %entry556 ret void557}558 559declare void @llvm.assume(i1)560 561; Test case for PR57818.562define void @step_is_neg_addrec_slt_8(i64 %n) {563; CHECK-LABEL: 'step_is_neg_addrec_slt_8'564; CHECK-NEXT: Determining loop execution counts for: @step_is_neg_addrec_slt_8565; CHECK-NEXT: Loop %inner: backedge-taken count is (7 /u {0,+,-1}<%outer.header>)566; CHECK-NEXT: Loop %inner: constant max backedge-taken count is i32 8567; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is (7 /u {0,+,-1}<%outer.header>)568; CHECK-NEXT: Loop %inner: Trip multiple is 1569; CHECK-NEXT: Loop %outer.header: backedge-taken count is i64 0570; CHECK-NEXT: Loop %outer.header: constant max backedge-taken count is i64 0571; CHECK-NEXT: Loop %outer.header: symbolic max backedge-taken count is i64 0572; CHECK-NEXT: Loop %outer.header: Trip multiple is 1573;574entry:575 br label %outer.header576 577outer.header:578 %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]579 %ec.1 = icmp eq i64 %outer.iv, 100580 br i1 %ec.1, label %inner.ph, label %exit581 582inner.ph:583 %outer.trunc = trunc i64 %outer.iv to i32584 br label %inner585 586inner:587 %inner.iv = phi i32 [ 0, %inner.ph ], [ %inner.iv.next, %inner ]588 %inner.iv.next = add nsw i32 %inner.iv, %outer.trunc589 %inner.c = icmp slt i32 %inner.iv.next, 8590 br i1 %inner.c, label %inner, label %outer.latch, !llvm.loop !0591 592outer.latch:593 %outer.iv.next = add nsw i64 %outer.iv, -1594 br label %outer.header595 596exit:597 ret void598}599 600define void @step_is_neg_addrec_slt_var(i32 %n) {601; CHECK-LABEL: 'step_is_neg_addrec_slt_var'602; CHECK-NEXT: Determining loop execution counts for: @step_is_neg_addrec_slt_var603; CHECK-NEXT: Loop %inner: backedge-taken count is ({0,+,1}<nuw><nsw><%outer.header> + ({0,+,-1}<nsw><%outer.header> smax %n))604; CHECK-NEXT: Loop %inner: constant max backedge-taken count is i32 2147483647605; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is ({0,+,1}<nuw><nsw><%outer.header> + ({0,+,-1}<nsw><%outer.header> smax %n))606; CHECK-NEXT: Loop %inner: Trip multiple is 1607; CHECK-NEXT: Loop %outer.header: backedge-taken count is i64 0608; CHECK-NEXT: Loop %outer.header: constant max backedge-taken count is i64 0609; CHECK-NEXT: Loop %outer.header: symbolic max backedge-taken count is i64 0610; CHECK-NEXT: Loop %outer.header: Trip multiple is 1611;612entry:613 br label %outer.header614 615outer.header:616 %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]617 %ec.1 = icmp eq i64 %outer.iv, 100618 br i1 %ec.1, label %inner.ph, label %exit619 620inner.ph:621 %outer.trunc = trunc i64 %outer.iv to i32622 br label %inner623 624inner:625 %inner.iv = phi i32 [ 0, %inner.ph ], [ %inner.iv.next, %inner ]626 %inner.iv.next = add nsw i32 %inner.iv, %outer.trunc627 %inner.c = icmp slt i32 %inner.iv.next, %n628 br i1 %inner.c, label %inner, label %outer.latch, !llvm.loop !0629 630outer.latch:631 %outer.iv.next = add nsw i64 %outer.iv, -1632 br label %outer.header633 634exit:635 ret void636}637 638define void @step_is_neg_addrec_unknown_start(i32 %n) {639; CHECK-LABEL: 'step_is_neg_addrec_unknown_start'640; CHECK-NEXT: Determining loop execution counts for: @step_is_neg_addrec_unknown_start641; CHECK-NEXT: Loop %inner: backedge-taken count is ({(-1 * %n),+,1}<nw><%outer.header> + (8 smax {%n,+,-1}<nsw><%outer.header>))642; CHECK-NEXT: Loop %inner: constant max backedge-taken count is i32 -2147483640643; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is ({(-1 * %n),+,1}<nw><%outer.header> + (8 smax {%n,+,-1}<nsw><%outer.header>))644; CHECK-NEXT: Loop %inner: Trip multiple is 1645; CHECK-NEXT: Loop %outer.header: backedge-taken count is i64 0646; CHECK-NEXT: Loop %outer.header: constant max backedge-taken count is i64 0647; CHECK-NEXT: Loop %outer.header: symbolic max backedge-taken count is i64 0648; CHECK-NEXT: Loop %outer.header: Trip multiple is 1649;650entry:651 br label %outer.header652 653outer.header:654 %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ]655 %ec.1 = icmp eq i64 %outer.iv, 100656 br i1 %ec.1, label %inner.ph, label %exit657 658inner.ph:659 %outer.trunc = trunc i64 %outer.iv to i32660 br label %inner661 662inner:663 %inner.iv = phi i32 [ %n, %inner.ph ], [ %inner.iv.next, %inner ]664 %inner.iv.next = add nsw i32 %inner.iv, %outer.trunc665 %inner.c = icmp slt i32 %inner.iv.next, 8666 br i1 %inner.c, label %inner, label %outer.latch, !llvm.loop !0667 668outer.latch:669 %outer.iv.next = add nsw i64 %outer.iv, -1670 br label %outer.header671 672exit:673 ret void674}675 676!0 = distinct !{!0, !1}677!1 = !{!"llvm.loop.mustprogress"}678