830 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s3 4define void @test_lshr(i1 %arg) {5; CHECK-LABEL: 'test_lshr'6; CHECK-NEXT: Classifying expressions for: @test_lshr7; CHECK-NEXT: %iv.lshr = phi i64 [ 1023, %entry ], [ %iv.lshr.next, %loop ]8; CHECK-NEXT: --> %iv.lshr U: [0,1024) S: [0,1024) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }9; CHECK-NEXT: %iv.lshr.next = lshr i64 %iv.lshr, 110; CHECK-NEXT: --> (%iv.lshr /u 2) U: [0,512) S: [0,512) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }11; CHECK-NEXT: Determining loop execution counts for: @test_lshr12; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.13; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.14; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.15;16entry:17 br label %loop18loop:19 %iv.lshr = phi i64 [1023, %entry], [%iv.lshr.next, %loop]20 %iv.lshr.next = lshr i64 %iv.lshr, 121 br i1 %arg, label %exit, label %loop22exit:23 ret void24}25 26; Deliberate overflow doesn't change range27define void @test_lshr2(i1 %arg) {28; CHECK-LABEL: 'test_lshr2'29; CHECK-NEXT: Classifying expressions for: @test_lshr230; CHECK-NEXT: %iv.lshr = phi i64 [ 1023, %entry ], [ %iv.lshr.next, %loop ]31; CHECK-NEXT: --> %iv.lshr U: [0,1024) S: [0,1024) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }32; CHECK-NEXT: %iv.lshr.next = lshr i64 %iv.lshr, 433; CHECK-NEXT: --> (%iv.lshr /u 16) U: [0,64) S: [0,64) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }34; CHECK-NEXT: Determining loop execution counts for: @test_lshr235; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.36; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.37; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.38;39entry:40 br label %loop41loop:42 %iv.lshr = phi i64 [1023, %entry], [%iv.lshr.next, %loop]43 %iv.lshr.next = lshr i64 %iv.lshr, 444 br i1 %arg, label %exit, label %loop45exit:46 ret void47}48 49 50define void @test_ashr_zeros(i1 %arg) {51; CHECK-LABEL: 'test_ashr_zeros'52; CHECK-NEXT: Classifying expressions for: @test_ashr_zeros53; CHECK-NEXT: %iv.ashr = phi i64 [ 1023, %entry ], [ %iv.ashr.next, %loop ]54; CHECK-NEXT: --> %iv.ashr U: [0,1024) S: [0,1024) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }55; CHECK-NEXT: %iv.ashr.next = ashr i64 %iv.ashr, 156; CHECK-NEXT: --> %iv.ashr.next U: [0,512) S: [0,512) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }57; CHECK-NEXT: Determining loop execution counts for: @test_ashr_zeros58; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.59; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.60; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.61;62entry:63 br label %loop64loop:65 %iv.ashr = phi i64 [1023, %entry], [%iv.ashr.next, %loop]66 %iv.ashr.next = ashr i64 %iv.ashr, 167 br i1 %arg, label %exit, label %loop68exit:69 ret void70}71 72define void @test_ashr_ones(i1 %arg) {73; CHECK-LABEL: 'test_ashr_ones'74; CHECK-NEXT: Classifying expressions for: @test_ashr_ones75; CHECK-NEXT: %iv.ashr = phi i64 [ -1023, %entry ], [ %iv.ashr.next, %loop ]76; CHECK-NEXT: --> %iv.ashr U: [-1023,0) S: [-1023,0) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }77; CHECK-NEXT: %iv.ashr.next = ashr i64 %iv.ashr, 178; CHECK-NEXT: --> %iv.ashr.next U: [-512,0) S: [-512,0) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }79; CHECK-NEXT: Determining loop execution counts for: @test_ashr_ones80; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.81; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.82; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.83;84entry:85 br label %loop86loop:87 %iv.ashr = phi i64 [-1023, %entry], [%iv.ashr.next, %loop]88 %iv.ashr.next = ashr i64 %iv.ashr, 189 br i1 %arg, label %exit, label %loop90exit:91 ret void92}93 94; Same as previous, but swapped operands to phi95define void @test_ashr_ones2(i1 %arg) {96; CHECK-LABEL: 'test_ashr_ones2'97; CHECK-NEXT: Classifying expressions for: @test_ashr_ones298; CHECK-NEXT: %iv.ashr = phi i64 [ %iv.ashr.next, %loop ], [ -1023, %entry ]99; CHECK-NEXT: --> %iv.ashr U: [-1023,0) S: [-1023,0) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }100; CHECK-NEXT: %iv.ashr.next = ashr i64 %iv.ashr, 1101; CHECK-NEXT: --> %iv.ashr.next U: [-512,0) S: [-512,0) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }102; CHECK-NEXT: Determining loop execution counts for: @test_ashr_ones2103; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.104; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.105; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.106;107entry:108 br label %loop109loop:110 %iv.ashr = phi i64 [%iv.ashr.next, %loop], [-1023, %entry]111 %iv.ashr.next = ashr i64 %iv.ashr, 1112 br i1 %arg, label %exit, label %loop113exit:114 ret void115}116 117 118; negative case for when start is unknown119define void @test_ashr_unknown(i64 %start, i1 %arg) {120; CHECK-LABEL: 'test_ashr_unknown'121; CHECK-NEXT: Classifying expressions for: @test_ashr_unknown122; CHECK-NEXT: %iv.ashr = phi i64 [ %start, %entry ], [ %iv.ashr.next, %loop ]123; CHECK-NEXT: --> %iv.ashr U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }124; CHECK-NEXT: %iv.ashr.next = ashr i64 %iv.ashr, 1125; CHECK-NEXT: --> %iv.ashr.next U: [-4611686018427387904,4611686018427387904) S: [-4611686018427387904,4611686018427387904) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }126; CHECK-NEXT: Determining loop execution counts for: @test_ashr_unknown127; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.128; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.129; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.130;131entry:132 br label %loop133loop:134 %iv.ashr = phi i64 [%start, %entry], [%iv.ashr.next, %loop]135 %iv.ashr.next = ashr i64 %iv.ashr, 1136 br i1 %arg, label %exit, label %loop137exit:138 ret void139}140 141; Negative case where we don't have a (shift) recurrence because the operands142; of the ashr are swapped. (This does end up being a divide recurrence.)143define void @test_ashr_wrong_op(i64 %start, i1 %arg) {144; CHECK-LABEL: 'test_ashr_wrong_op'145; CHECK-NEXT: Classifying expressions for: @test_ashr_wrong_op146; CHECK-NEXT: %iv.ashr = phi i64 [ %start, %entry ], [ %iv.ashr.next, %loop ]147; CHECK-NEXT: --> %iv.ashr U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }148; CHECK-NEXT: %iv.ashr.next = ashr i64 1, %iv.ashr149; CHECK-NEXT: --> %iv.ashr.next U: [0,2) S: [0,2) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }150; CHECK-NEXT: Determining loop execution counts for: @test_ashr_wrong_op151; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.152; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.153; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.154;155entry:156 br label %loop157loop:158 %iv.ashr = phi i64 [%start, %entry], [%iv.ashr.next, %loop]159 %iv.ashr.next = ashr i64 1, %iv.ashr160 br i1 %arg, label %exit, label %loop161exit:162 ret void163}164 165 166define void @test_shl(i1 %arg) {167; CHECK-LABEL: 'test_shl'168; CHECK-NEXT: Classifying expressions for: @test_shl169; CHECK-NEXT: %iv.shl = phi i64 [ 8, %entry ], [ %iv.shl.next, %loop ]170; CHECK-NEXT: --> %iv.shl U: [0,-7) S: [-9223372036854775808,9223372036854775793) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }171; CHECK-NEXT: %iv.shl.next = shl i64 %iv.shl, 1172; CHECK-NEXT: --> (2 * %iv.shl) U: [0,-15) S: [-9223372036854775808,9223372036854775793) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }173; CHECK-NEXT: Determining loop execution counts for: @test_shl174; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.175; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.176; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.177;178entry:179 br label %loop180loop:181 %iv.shl = phi i64 [8, %entry], [%iv.shl.next, %loop]182 %iv.shl.next = shl i64 %iv.shl, 1183 br i1 %arg, label %exit, label %loop184exit:185 ret void186}187 188; use trip count to refine189define void @test_shl2(i1 %arg) {190; CHECK-LABEL: 'test_shl2'191; CHECK-NEXT: Classifying expressions for: @test_shl2192; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]193; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }194; CHECK-NEXT: %iv.shl = phi i64 [ 4, %entry ], [ %iv.shl.next, %loop ]195; CHECK-NEXT: --> %iv.shl U: [4,65) S: [4,65) Exits: 64 LoopDispositions: { %loop: Variant }196; CHECK-NEXT: %iv.next = add i64 %iv, 1197; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }198; CHECK-NEXT: %iv.shl.next = shl i64 %iv.shl, 1199; CHECK-NEXT: --> (2 * %iv.shl)<nuw><nsw> U: [8,129) S: [8,129) Exits: 128 LoopDispositions: { %loop: Variant }200; CHECK-NEXT: Determining loop execution counts for: @test_shl2201; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4202; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4203; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4204; CHECK-NEXT: Loop %loop: Trip multiple is 5205;206entry:207 br label %loop208loop:209 %iv = phi i64 [0, %entry], [%iv.next, %loop]210 %iv.shl = phi i64 [4, %entry], [%iv.shl.next, %loop]211 %iv.next = add i64 %iv, 1212 %iv.shl.next = shl i64 %iv.shl, 1213 %cmp = icmp eq i64 %iv, 4214 br i1 %cmp, label %exit, label %loop215exit:216 ret void217}218 219; Variable shift with a tight upper bound220define void @test_shl3(i1 %c) {221; CHECK-LABEL: 'test_shl3'222; CHECK-NEXT: Classifying expressions for: @test_shl3223; CHECK-NEXT: %shiftamt = select i1 %c, i64 1, i64 0224; CHECK-NEXT: --> %shiftamt U: [0,2) S: [0,2)225; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]226; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }227; CHECK-NEXT: %iv.shl = phi i64 [ 4, %entry ], [ %iv.shl.next, %loop ]228; CHECK-NEXT: --> %iv.shl U: [4,65) S: [4,65) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }229; CHECK-NEXT: %iv.next = add i64 %iv, 1230; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }231; CHECK-NEXT: %iv.shl.next = shl i64 %iv.shl, %shiftamt232; CHECK-NEXT: --> %iv.shl.next U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }233; CHECK-NEXT: Determining loop execution counts for: @test_shl3234; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4235; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4236; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4237; CHECK-NEXT: Loop %loop: Trip multiple is 5238;239entry:240 %shiftamt = select i1 %c, i64 1, i64 0241 br label %loop242loop:243 %iv = phi i64 [0, %entry], [%iv.next, %loop]244 %iv.shl = phi i64 [4, %entry], [%iv.shl.next, %loop]245 %iv.next = add i64 %iv, 1246 %iv.shl.next = shl i64 %iv.shl, %shiftamt247 %cmp = icmp eq i64 %iv, 4248 br i1 %cmp, label %exit, label %loop249exit:250 ret void251}252 253; edge case on max value not overflowing254define void @test_shl4(i1 %arg) {255; CHECK-LABEL: 'test_shl4'256; CHECK-NEXT: Classifying expressions for: @test_shl4257; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]258; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,61) S: [0,61) Exits: 60 LoopDispositions: { %loop: Computable }259; CHECK-NEXT: %iv.shl = phi i64 [ 4, %entry ], [ %iv.shl.next, %loop ]260; CHECK-NEXT: --> %iv.shl U: [4,4611686018427387905) S: [4,4611686018427387905) Exits: 4611686018427387904 LoopDispositions: { %loop: Variant }261; CHECK-NEXT: %iv.next = add i64 %iv, 1262; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,62) S: [1,62) Exits: 61 LoopDispositions: { %loop: Computable }263; CHECK-NEXT: %iv.shl.next = shl i64 %iv.shl, 1264; CHECK-NEXT: --> (2 * %iv.shl)<nuw> U: [8,-9223372036854775807) S: [-9223372036854775808,9223372036854775801) Exits: -9223372036854775808 LoopDispositions: { %loop: Variant }265; CHECK-NEXT: Determining loop execution counts for: @test_shl4266; CHECK-NEXT: Loop %loop: backedge-taken count is i64 60267; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 60268; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 60269; CHECK-NEXT: Loop %loop: Trip multiple is 61270;271entry:272 br label %loop273loop:274 %iv = phi i64 [0, %entry], [%iv.next, %loop]275 %iv.shl = phi i64 [4, %entry], [%iv.shl.next, %loop]276 %iv.next = add i64 %iv, 1277 %iv.shl.next = shl i64 %iv.shl, 1278 %cmp = icmp eq i64 %iv, 60279 br i1 %cmp, label %exit, label %loop280exit:281 ret void282}283 284; other side of edge case from previous test285define void @test_shl5(i1 %arg) {286; CHECK-LABEL: 'test_shl5'287; CHECK-NEXT: Classifying expressions for: @test_shl5288; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]289; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,62) S: [0,62) Exits: 61 LoopDispositions: { %loop: Computable }290; CHECK-NEXT: %iv.shl = phi i64 [ 4, %entry ], [ %iv.shl.next, %loop ]291; CHECK-NEXT: --> %iv.shl U: [0,-3) S: [-9223372036854775808,9223372036854775801) Exits: -9223372036854775808 LoopDispositions: { %loop: Variant }292; CHECK-NEXT: %iv.next = add i64 %iv, 1293; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,63) S: [1,63) Exits: 62 LoopDispositions: { %loop: Computable }294; CHECK-NEXT: %iv.shl.next = shl i64 %iv.shl, 1295; CHECK-NEXT: --> (2 * %iv.shl) U: [0,-7) S: [-9223372036854775808,9223372036854775801) Exits: 0 LoopDispositions: { %loop: Variant }296; CHECK-NEXT: Determining loop execution counts for: @test_shl5297; CHECK-NEXT: Loop %loop: backedge-taken count is i64 61298; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 61299; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 61300; CHECK-NEXT: Loop %loop: Trip multiple is 62301;302entry:303 br label %loop304loop:305 %iv = phi i64 [0, %entry], [%iv.next, %loop]306 %iv.shl = phi i64 [4, %entry], [%iv.shl.next, %loop]307 %iv.next = add i64 %iv, 1308 %iv.shl.next = shl i64 %iv.shl, 1309 %cmp = icmp eq i64 %iv, 61310 br i1 %cmp, label %exit, label %loop311exit:312 ret void313}314 315; Loop varying (but tightly bounded) shift amount316define void @test_shl6(i1 %c) {317; CHECK-LABEL: 'test_shl6'318; CHECK-NEXT: Classifying expressions for: @test_shl6319; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]320; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }321; CHECK-NEXT: %iv.shl = phi i64 [ 4, %entry ], [ %iv.shl.next, %loop ]322; CHECK-NEXT: --> %iv.shl U: [4,65) S: [4,65) Exits: 16 LoopDispositions: { %loop: Variant }323; CHECK-NEXT: %iv.next = add i64 %iv, 1324; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }325; CHECK-NEXT: %shiftamt = and i64 %iv, 1326; CHECK-NEXT: --> (zext i1 {false,+,true}<%loop> to i64) U: [0,2) S: [0,2) Exits: 0 LoopDispositions: { %loop: Computable }327; CHECK-NEXT: %iv.shl.next = shl i64 %iv.shl, %shiftamt328; CHECK-NEXT: --> %iv.shl.next U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: 16 LoopDispositions: { %loop: Variant }329; CHECK-NEXT: Determining loop execution counts for: @test_shl6330; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4331; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4332; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4333; CHECK-NEXT: Loop %loop: Trip multiple is 5334;335entry:336 br label %loop337loop:338 %iv = phi i64 [0, %entry], [%iv.next, %loop]339 %iv.shl = phi i64 [4, %entry], [%iv.shl.next, %loop]340 %iv.next = add i64 %iv, 1341 %shiftamt = and i64 %iv, 1342 %iv.shl.next = shl i64 %iv.shl, %shiftamt343 %cmp = icmp eq i64 %iv, 4344 br i1 %cmp, label %exit, label %loop345exit:346 ret void347}348 349; Unanalyzeable shift amount350define void @test_shl7(i1 %c, i64 %shiftamt) {351; CHECK-LABEL: 'test_shl7'352; CHECK-NEXT: Classifying expressions for: @test_shl7353; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]354; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }355; CHECK-NEXT: %iv.shl = phi i64 [ 4, %entry ], [ %iv.shl.next, %loop ]356; CHECK-NEXT: --> %iv.shl U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }357; CHECK-NEXT: %iv.next = add i64 %iv, 1358; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }359; CHECK-NEXT: %iv.shl.next = shl i64 %iv.shl, %shiftamt360; CHECK-NEXT: --> %iv.shl.next U: [0,-3) S: [-9223372036854775808,9223372036854775805) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }361; CHECK-NEXT: Determining loop execution counts for: @test_shl7362; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4363; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4364; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4365; CHECK-NEXT: Loop %loop: Trip multiple is 5366;367entry:368 br label %loop369loop:370 %iv = phi i64 [0, %entry], [%iv.next, %loop]371 %iv.shl = phi i64 [4, %entry], [%iv.shl.next, %loop]372 %iv.next = add i64 %iv, 1373 %iv.shl.next = shl i64 %iv.shl, %shiftamt374 %cmp = icmp eq i64 %iv, 4375 br i1 %cmp, label %exit, label %loop376exit:377 ret void378}379 380; Corner case where phi is not in a loop because it is in unreachable381; code (which loopinfo ignores, but simple recurrence matching does not).382define void @unreachable_phi(i1 %arg) {383; CHECK-LABEL: 'unreachable_phi'384; CHECK-NEXT: Classifying expressions for: @unreachable_phi385; CHECK-NEXT: %p_58.addr.1 = phi i32 [ undef, %unreachable1 ], [ %sub2629, %unreachable2 ]386; CHECK-NEXT: --> poison U: full-set S: full-set387; CHECK-NEXT: %sub2629 = sub i32 %p_58.addr.1, 1388; CHECK-NEXT: --> poison U: full-set S: full-set389; CHECK-NEXT: Determining loop execution counts for: @unreachable_phi390;391entry:392 ret void393 394unreachable1:395 br label %unreachable_nonloop396unreachable2:397 br label %unreachable_nonloop398unreachable_nonloop:399 %p_58.addr.1 = phi i32 [ undef, %unreachable1 ], [ %sub2629, %unreachable2 ]400 %sub2629 = sub i32 %p_58.addr.1, 1401 unreachable402}403 404; Corner case where phi is not in loop header because binop is in unreachable405; code (which loopinfo ignores, but simple recurrence matching does not).406define void @unreachable_binop(i1 %arg) {407; CHECK-LABEL: 'unreachable_binop'408; CHECK-NEXT: Classifying expressions for: @unreachable_binop409; CHECK-NEXT: %p_58.addr.1 = phi i32 [ undef, %header ], [ %sub2629, %unreachable ]410; CHECK-NEXT: --> %p_58.addr.1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %header: Variant }411; CHECK-NEXT: %sub2629 = sub i32 %p_58.addr.1, 1412; CHECK-NEXT: --> poison U: full-set S: full-set413; CHECK-NEXT: Determining loop execution counts for: @unreachable_binop414; CHECK-NEXT: Loop %header: Unpredictable backedge-taken count.415; CHECK-NEXT: Loop %header: Unpredictable constant max backedge-taken count.416; CHECK-NEXT: Loop %header: Unpredictable symbolic max backedge-taken count.417;418entry:419 br label %header420 421header:422 br label %for.cond2295423 424for.cond2295:425 %p_58.addr.1 = phi i32 [ undef, %header ], [ %sub2629, %unreachable ]426 br i1 %arg, label %if.then2321, label %header427 428if.then2321:429 ret void430 431unreachable:432 %sub2629 = sub i32 %p_58.addr.1, 1433 br label %for.cond2295434}435 436; Was pr49856. We can match the recurrence without a loop437; since dominance collapses in unreachable code. Conceptually,438; this is a recurrence which only executes one iteration.439define void @nonloop_recurrence() {440; CHECK-LABEL: 'nonloop_recurrence'441; CHECK-NEXT: Classifying expressions for: @nonloop_recurrence442; CHECK-NEXT: %tmp = phi i32 [ 2, %bb ], [ %tmp2, %bb3 ]443; CHECK-NEXT: --> %tmp U: [1,-2147483648) S: [0,-2147483648)444; CHECK-NEXT: %tmp2 = add nuw nsw i32 %tmp, 1445; CHECK-NEXT: --> (1 + %tmp)<nuw> U: [1,-2147483647) S: [1,-2147483647)446; CHECK-NEXT: Determining loop execution counts for: @nonloop_recurrence447;448bb:449 br label %bb1450 451bb1: ; preds = %bb3, %bb452 %tmp = phi i32 [ 2, %bb ], [ %tmp2, %bb3 ]453 %tmp2 = add nuw nsw i32 %tmp, 1454 ret void455 456bb3: ; No predecessors!457 br label %bb1458}459 460; Tweak of pr49856 test case - analogous, but there is a loop461; it's trip count simply doesn't relate to the single iteration462; "recurrence" we found.463define void @nonloop_recurrence_2() {464; CHECK-LABEL: 'nonloop_recurrence_2'465; CHECK-NEXT: Classifying expressions for: @nonloop_recurrence_2466; CHECK-NEXT: %tmp = phi i32 [ 2, %loop ], [ %tmp2, %bb3 ]467; CHECK-NEXT: --> %tmp U: [1,-2147483648) S: [0,-2147483648) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }468; CHECK-NEXT: %tmp2 = add nuw nsw i32 %tmp, 1469; CHECK-NEXT: --> (1 + %tmp)<nuw> U: [1,-2147483647) S: [1,-2147483647) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }470; CHECK-NEXT: Determining loop execution counts for: @nonloop_recurrence_2471; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.472; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.473; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.474;475bb:476 br label %loop477 478loop:479 br label %bb1480bb1: ; preds = %bb3, %loop481 %tmp = phi i32 [ 2, %loop ], [ %tmp2, %bb3 ]482 %tmp2 = add nuw nsw i32 %tmp, 1483 br label %loop484 485bb3: ; No predecessors!486 br label %bb1487}488 489 490; Next batch of tests show where we can get tighter ranges on ashr/lshr491; by using the trip count information on the loop.492 493define void @test_ashr_tc_positive() {494; CHECK-LABEL: 'test_ashr_tc_positive'495; CHECK-NEXT: Classifying expressions for: @test_ashr_tc_positive496; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]497; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }498; CHECK-NEXT: %iv.ashr = phi i64 [ 1023, %entry ], [ %iv.ashr.next, %loop ]499; CHECK-NEXT: --> %iv.ashr U: [63,1024) S: [63,1024) Exits: 63 LoopDispositions: { %loop: Variant }500; CHECK-NEXT: %iv.next = add i64 %iv, 1501; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }502; CHECK-NEXT: %iv.ashr.next = ashr i64 %iv.ashr, 1503; CHECK-NEXT: --> %iv.ashr.next U: [0,512) S: [0,512) Exits: 31 LoopDispositions: { %loop: Variant }504; CHECK-NEXT: Determining loop execution counts for: @test_ashr_tc_positive505; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4506; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4507; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4508; CHECK-NEXT: Loop %loop: Trip multiple is 5509;510entry:511 br label %loop512loop:513 %iv = phi i64 [0, %entry], [%iv.next, %loop]514 %iv.ashr = phi i64 [1023, %entry], [%iv.ashr.next, %loop]515 %iv.next = add i64 %iv, 1516 %iv.ashr.next = ashr i64 %iv.ashr, 1517 %cmp = icmp eq i64 %iv, 4518 br i1 %cmp, label %exit, label %loop519exit:520 ret void521}522 523define void @test_ashr_tc_negative() {524; CHECK-LABEL: 'test_ashr_tc_negative'525; CHECK-NEXT: Classifying expressions for: @test_ashr_tc_negative526; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]527; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }528; CHECK-NEXT: %iv.ashr = phi i8 [ -128, %entry ], [ %iv.ashr.next, %loop ]529; CHECK-NEXT: --> %iv.ashr U: [-128,-7) S: [-128,-7) Exits: -8 LoopDispositions: { %loop: Variant }530; CHECK-NEXT: %iv.next = add i64 %iv, 1531; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }532; CHECK-NEXT: %iv.ashr.next = ashr i8 %iv.ashr, 1533; CHECK-NEXT: --> %iv.ashr.next U: [-64,0) S: [-64,0) Exits: -4 LoopDispositions: { %loop: Variant }534; CHECK-NEXT: Determining loop execution counts for: @test_ashr_tc_negative535; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4536; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4537; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4538; CHECK-NEXT: Loop %loop: Trip multiple is 5539;540entry:541 br label %loop542loop:543 %iv = phi i64 [0, %entry], [%iv.next, %loop]544 %iv.ashr = phi i8 [128, %entry], [%iv.ashr.next, %loop]545 %iv.next = add i64 %iv, 1546 %iv.ashr.next = ashr i8 %iv.ashr, 1547 %cmp = icmp eq i64 %iv, 4548 br i1 %cmp, label %exit, label %loop549exit:550 ret void551}552 553define void @test_ashr_tc_either(i1 %a) {554; CHECK-LABEL: 'test_ashr_tc_either'555; CHECK-NEXT: Classifying expressions for: @test_ashr_tc_either556; CHECK-NEXT: %start = sext i1 %a to i8557; CHECK-NEXT: --> (sext i1 %a to i8) U: [-1,1) S: [-1,1)558; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]559; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,61) S: [0,61) Exits: 60 LoopDispositions: { %loop: Computable }560; CHECK-NEXT: %iv.ashr = phi i8 [ %start, %entry ], [ %iv.ashr.next, %loop ]561; CHECK-NEXT: --> %iv.ashr U: [-16,16) S: [-16,16) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }562; CHECK-NEXT: %iv.next = add i64 %iv, 1563; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,62) S: [1,62) Exits: 61 LoopDispositions: { %loop: Computable }564; CHECK-NEXT: %iv.ashr.next = ashr i8 %iv.ashr, 1565; CHECK-NEXT: --> %iv.ashr.next U: [-16,16) S: [-16,16) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }566; CHECK-NEXT: Determining loop execution counts for: @test_ashr_tc_either567; CHECK-NEXT: Loop %loop: backedge-taken count is i64 60568; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 60569; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 60570; CHECK-NEXT: Loop %loop: Trip multiple is 61571;572entry:573 %start = sext i1 %a to i8574 br label %loop575loop:576 %iv = phi i64 [0, %entry], [%iv.next, %loop]577 %iv.ashr = phi i8 [%start, %entry], [%iv.ashr.next, %loop]578 %iv.next = add i64 %iv, 1579 %iv.ashr.next = ashr i8 %iv.ashr, 1580 %cmp = icmp eq i64 %iv, 60581 br i1 %cmp, label %exit, label %loop582exit:583 ret void584}585 586define void @test_ashr_zero_shift() {587; CHECK-LABEL: 'test_ashr_zero_shift'588; CHECK-NEXT: Classifying expressions for: @test_ashr_zero_shift589; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]590; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }591; CHECK-NEXT: %iv.ashr = phi i64 [ 1023, %entry ], [ %iv.ashr.next, %loop ]592; CHECK-NEXT: --> %iv.ashr U: [1023,1024) S: [1023,1024) Exits: 1023 LoopDispositions: { %loop: Variant }593; CHECK-NEXT: %iv.next = add i64 %iv, 1594; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }595; CHECK-NEXT: %iv.ashr.next = ashr i64 %iv.ashr, 0596; CHECK-NEXT: --> %iv.ashr U: [1023,1024) S: [1023,1024) Exits: 1023 LoopDispositions: { %loop: Variant }597; CHECK-NEXT: Determining loop execution counts for: @test_ashr_zero_shift598; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4599; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4600; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4601; CHECK-NEXT: Loop %loop: Trip multiple is 5602;603entry:604 br label %loop605loop:606 %iv = phi i64 [0, %entry], [%iv.next, %loop]607 %iv.ashr = phi i64 [1023, %entry], [%iv.ashr.next, %loop]608 %iv.next = add i64 %iv, 1609 %iv.ashr.next = ashr i64 %iv.ashr, 0610 %cmp = icmp eq i64 %iv, 4611 br i1 %cmp, label %exit, label %loop612exit:613 ret void614}615 616define void @test_lshr_tc_positive() {617; CHECK-LABEL: 'test_lshr_tc_positive'618; CHECK-NEXT: Classifying expressions for: @test_lshr_tc_positive619; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]620; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }621; CHECK-NEXT: %iv.lshr = phi i64 [ 1023, %entry ], [ %iv.lshr.next, %loop ]622; CHECK-NEXT: --> %iv.lshr U: [63,1024) S: [63,1024) Exits: 63 LoopDispositions: { %loop: Variant }623; CHECK-NEXT: %iv.next = add i64 %iv, 1624; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }625; CHECK-NEXT: %iv.lshr.next = lshr i64 %iv.lshr, 1626; CHECK-NEXT: --> (%iv.lshr /u 2) U: [31,512) S: [31,512) Exits: 31 LoopDispositions: { %loop: Variant }627; CHECK-NEXT: Determining loop execution counts for: @test_lshr_tc_positive628; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4629; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4630; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4631; CHECK-NEXT: Loop %loop: Trip multiple is 5632;633entry:634 br label %loop635loop:636 %iv = phi i64 [0, %entry], [%iv.next, %loop]637 %iv.lshr = phi i64 [1023, %entry], [%iv.lshr.next, %loop]638 %iv.next = add i64 %iv, 1639 %iv.lshr.next = lshr i64 %iv.lshr, 1640 %cmp = icmp eq i64 %iv, 4641 br i1 %cmp, label %exit, label %loop642exit:643 ret void644}645 646define void @test_lshr_tc_negative() {647; CHECK-LABEL: 'test_lshr_tc_negative'648; CHECK-NEXT: Classifying expressions for: @test_lshr_tc_negative649; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]650; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }651; CHECK-NEXT: %iv.lshr = phi i8 [ -1, %entry ], [ %iv.lshr.next, %loop ]652; CHECK-NEXT: --> %iv.lshr U: [15,0) S: [-1,-128) Exits: 15 LoopDispositions: { %loop: Variant }653; CHECK-NEXT: %iv.next = add i64 %iv, 1654; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }655; CHECK-NEXT: %iv.lshr.next = lshr i8 %iv.lshr, 1656; CHECK-NEXT: --> (%iv.lshr /u 2) U: [7,-128) S: [7,-128) Exits: 7 LoopDispositions: { %loop: Variant }657; CHECK-NEXT: Determining loop execution counts for: @test_lshr_tc_negative658; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4659; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4660; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4661; CHECK-NEXT: Loop %loop: Trip multiple is 5662;663entry:664 br label %loop665loop:666 %iv = phi i64 [0, %entry], [%iv.next, %loop]667 %iv.lshr = phi i8 [-1, %entry], [%iv.lshr.next, %loop]668 %iv.next = add i64 %iv, 1669 %iv.lshr.next = lshr i8 %iv.lshr, 1670 %cmp = icmp eq i64 %iv, 4671 br i1 %cmp, label %exit, label %loop672exit:673 ret void674}675 676define void @test_lshr_tc_either(i1 %a) {677; CHECK-LABEL: 'test_lshr_tc_either'678; CHECK-NEXT: Classifying expressions for: @test_lshr_tc_either679; CHECK-NEXT: %start = sext i1 %a to i8680; CHECK-NEXT: --> (sext i1 %a to i8) U: [-1,1) S: [-1,1)681; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]682; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }683; CHECK-NEXT: %iv.lshr = phi i8 [ %start, %entry ], [ %iv.lshr.next, %loop ]684; CHECK-NEXT: --> %iv.lshr U: [-1,-128) S: [-1,-128) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }685; CHECK-NEXT: %iv.next = add i64 %iv, 1686; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }687; CHECK-NEXT: %iv.lshr.next = lshr i8 %iv.lshr, 1688; CHECK-NEXT: --> (%iv.lshr /u 2) U: [0,-128) S: [0,-128) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }689; CHECK-NEXT: Determining loop execution counts for: @test_lshr_tc_either690; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4691; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4692; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4693; CHECK-NEXT: Loop %loop: Trip multiple is 5694;695entry:696 %start = sext i1 %a to i8697 br label %loop698loop:699 %iv = phi i64 [0, %entry], [%iv.next, %loop]700 %iv.lshr = phi i8 [%start, %entry], [%iv.lshr.next, %loop]701 %iv.next = add i64 %iv, 1702 %iv.lshr.next = lshr i8 %iv.lshr, 1703 %cmp = icmp eq i64 %iv, 4704 br i1 %cmp, label %exit, label %loop705exit:706 ret void707}708 709define void @test_lshr_zero_shift() {710; CHECK-LABEL: 'test_lshr_zero_shift'711; CHECK-NEXT: Classifying expressions for: @test_lshr_zero_shift712; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]713; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }714; CHECK-NEXT: %iv.lshr = phi i64 [ 1023, %entry ], [ %iv.lshr.next, %loop ]715; CHECK-NEXT: --> %iv.lshr U: [1023,1024) S: [1023,1024) Exits: 1023 LoopDispositions: { %loop: Variant }716; CHECK-NEXT: %iv.next = add i64 %iv, 1717; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }718; CHECK-NEXT: %iv.lshr.next = lshr i64 %iv.lshr, 0719; CHECK-NEXT: --> %iv.lshr U: [1023,1024) S: [1023,1024) Exits: 1023 LoopDispositions: { %loop: Variant }720; CHECK-NEXT: Determining loop execution counts for: @test_lshr_zero_shift721; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4722; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4723; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4724; CHECK-NEXT: Loop %loop: Trip multiple is 5725;726entry:727 br label %loop728loop:729 %iv = phi i64 [0, %entry], [%iv.next, %loop]730 %iv.lshr = phi i64 [1023, %entry], [%iv.lshr.next, %loop]731 %iv.next = add i64 %iv, 1732 %iv.lshr.next = lshr i64 %iv.lshr, 0733 %cmp = icmp eq i64 %iv, 4734 br i1 %cmp, label %exit, label %loop735exit:736 ret void737}738 739 740define void @test_lshr_power_of_2_start() {741; CHECK-LABEL: 'test_lshr_power_of_2_start'742; CHECK-NEXT: Classifying expressions for: @test_lshr_power_of_2_start743; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]744; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }745; CHECK-NEXT: %iv.lshr = phi i64 [ 1024, %entry ], [ %iv.lshr.next, %loop ]746; CHECK-NEXT: --> %iv.lshr U: [4,1025) S: [4,1025) Exits: 4 LoopDispositions: { %loop: Variant }747; CHECK-NEXT: %iv.next = add i64 %iv, 1748; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }749; CHECK-NEXT: %iv.lshr.next = lshr i64 %iv.lshr, 2750; CHECK-NEXT: --> (%iv.lshr /u 4) U: [1,257) S: [1,257) Exits: 1 LoopDispositions: { %loop: Variant }751; CHECK-NEXT: Determining loop execution counts for: @test_lshr_power_of_2_start752; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4753; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4754; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4755; CHECK-NEXT: Loop %loop: Trip multiple is 5756;757entry:758 br label %loop759loop:760 %iv = phi i64 [0, %entry], [%iv.next, %loop]761 %iv.lshr = phi i64 [1024, %entry], [%iv.lshr.next, %loop]762 %iv.next = add i64 %iv, 1763 %iv.lshr.next = lshr i64 %iv.lshr, 2764 %cmp = icmp eq i64 %iv, 4765 br i1 %cmp, label %exit, label %loop766exit:767 ret void768}769 770; Starting value is chosen not to be near power of 2771define void @test_lshr_arbitrary_start() {772; CHECK-LABEL: 'test_lshr_arbitrary_start'773; CHECK-NEXT: Classifying expressions for: @test_lshr_arbitrary_start774; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]775; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }776; CHECK-NEXT: %iv.lshr = phi i64 [ 957, %entry ], [ %iv.lshr.next, %loop ]777; CHECK-NEXT: --> %iv.lshr U: [3,958) S: [3,958) Exits: 3 LoopDispositions: { %loop: Variant }778; CHECK-NEXT: %iv.next = add i64 %iv, 1779; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }780; CHECK-NEXT: %iv.lshr.next = lshr i64 %iv.lshr, 2781; CHECK-NEXT: --> (%iv.lshr /u 4) U: [0,240) S: [0,240) Exits: 0 LoopDispositions: { %loop: Variant }782; CHECK-NEXT: Determining loop execution counts for: @test_lshr_arbitrary_start783; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4784; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4785; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4786; CHECK-NEXT: Loop %loop: Trip multiple is 5787;788entry:789 br label %loop790loop:791 %iv = phi i64 [0, %entry], [%iv.next, %loop]792 %iv.lshr = phi i64 [957, %entry], [%iv.lshr.next, %loop]793 %iv.next = add i64 %iv, 1794 %iv.lshr.next = lshr i64 %iv.lshr, 2795 %cmp = icmp eq i64 %iv, 4796 br i1 %cmp, label %exit, label %loop797exit:798 ret void799}800 801define void @test_lshr_start_power_of_2_plus_one() {802; CHECK-LABEL: 'test_lshr_start_power_of_2_plus_one'803; CHECK-NEXT: Classifying expressions for: @test_lshr_start_power_of_2_plus_one804; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]805; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,5) S: [0,5) Exits: 4 LoopDispositions: { %loop: Computable }806; CHECK-NEXT: %iv.lshr = phi i64 [ 1025, %entry ], [ %iv.lshr.next, %loop ]807; CHECK-NEXT: --> %iv.lshr U: [4,1026) S: [4,1026) Exits: 4 LoopDispositions: { %loop: Variant }808; CHECK-NEXT: %iv.next = add i64 %iv, 1809; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,6) S: [1,6) Exits: 5 LoopDispositions: { %loop: Computable }810; CHECK-NEXT: %iv.lshr.next = lshr i64 %iv.lshr, 2811; CHECK-NEXT: --> (%iv.lshr /u 4) U: [1,257) S: [1,257) Exits: 1 LoopDispositions: { %loop: Variant }812; CHECK-NEXT: Determining loop execution counts for: @test_lshr_start_power_of_2_plus_one813; CHECK-NEXT: Loop %loop: backedge-taken count is i64 4814; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4815; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 4816; CHECK-NEXT: Loop %loop: Trip multiple is 5817;818entry:819 br label %loop820loop:821 %iv = phi i64 [0, %entry], [%iv.next, %loop]822 %iv.lshr = phi i64 [1025, %entry], [%iv.lshr.next, %loop]823 %iv.next = add i64 %iv, 1824 %iv.lshr.next = lshr i64 %iv.lshr, 2825 %cmp = icmp eq i64 %iv, 4826 br i1 %cmp, label %exit, label %loop827exit:828 ret void829}830