brintos

brintos / llvm-project-archived public Read only

0
0
Text · 37.2 KiB · 6cd709b Raw
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