brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.5 KiB · 5a35179 Raw
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