1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2; RUN: opt -S -passes='print<scalar-evolution>' -disable-output < %s 2>&1 | FileCheck %s 3 4; Test non-unit strides in multiple-exit loops, and the interaction with 5; nowrap flags. 6 7define void @test_preinc_ult(i64 %len) { 8; CHECK-LABEL: 'test_preinc_ult' 9; CHECK-NEXT: Classifying expressions for: @test_preinc_ult 10; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 11; CHECK-NEXT: --> {0,+,2}<nuw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 12; CHECK-NEXT: %iv.inc2 = add nuw i64 %iv, 2 13; CHECK-NEXT: --> {2,+,2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 14; CHECK-NEXT: Determining loop execution counts for: @test_preinc_ult 15; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 16; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 17; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** 18; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 19; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 20; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 21; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE*** 22; 23start: 24 br label %loop 25 26loop: 27 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 28 %cmp1 = icmp ult i64 %iv, %len 29 br i1 %cmp1, label %latch, label %exit 30 31latch: 32 %iv.inc2 = add nuw i64 %iv, 2 33 %cmp2 = icmp ult i64 %iv.inc2, %len 34 br i1 %cmp2, label %loop, label %exit 35 36exit: 37 ret void 38} 39 40define void @test_postinc_ult(i64 %len) { 41; CHECK-LABEL: 'test_postinc_ult' 42; CHECK-NEXT: Classifying expressions for: @test_postinc_ult 43; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 44; CHECK-NEXT: --> {0,+,2}<nuw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 45; CHECK-NEXT: %iv.inc = add nuw i64 %iv, 1 46; CHECK-NEXT: --> {1,+,2}<nuw><%loop> U: [1,0) S: [1,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 47; CHECK-NEXT: %iv.inc2 = add nuw i64 %iv, 2 48; CHECK-NEXT: --> {2,+,2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 49; CHECK-NEXT: Determining loop execution counts for: @test_postinc_ult 50; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 51; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 52; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** 53; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 54; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 55; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 56; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE*** 57; 58start: 59 br label %loop 60 61loop: 62 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 63 %iv.inc = add nuw i64 %iv, 1 64 %cmp1 = icmp ult i64 %iv.inc, %len 65 br i1 %cmp1, label %latch, label %exit 66 67latch: 68 %iv.inc2 = add nuw i64 %iv, 2 69 %cmp2 = icmp ult i64 %iv.inc2, %len 70 br i1 %cmp2, label %loop, label %exit 71 72exit: 73 ret void 74} 75 76define void @test_preinc_slt(i64 %len) { 77; CHECK-LABEL: 'test_preinc_slt' 78; CHECK-NEXT: Classifying expressions for: @test_preinc_slt 79; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 80; CHECK-NEXT: --> {0,+,2}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 81; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, 2 82; CHECK-NEXT: --> {2,+,2}<nuw><%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 83; CHECK-NEXT: Determining loop execution counts for: @test_preinc_slt 84; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 85; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 86; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** 87; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 88; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 89; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 90; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE*** 91; 92start: 93 br label %loop 94 95loop: 96 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 97 %cmp1 = icmp slt i64 %iv, %len 98 br i1 %cmp1, label %latch, label %exit 99 100latch: 101 %iv.inc2 = add nsw i64 %iv, 2 102 %cmp2 = icmp slt i64 %iv.inc2, %len 103 br i1 %cmp2, label %loop, label %exit 104 105exit: 106 ret void 107} 108 109define void @test_postinc_slt(i64 %len) { 110; CHECK-LABEL: 'test_postinc_slt' 111; CHECK-NEXT: Classifying expressions for: @test_postinc_slt 112; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 113; CHECK-NEXT: --> {0,+,2}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 114; CHECK-NEXT: %iv.inc = add nsw i64 %iv, 1 115; CHECK-NEXT: --> {1,+,2}<nuw><nsw><%loop> U: [1,-9223372036854775808) S: [1,-9223372036854775808) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 116; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, 2 117; CHECK-NEXT: --> {2,+,2}<nuw><%loop> U: [2,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 118; CHECK-NEXT: Determining loop execution counts for: @test_postinc_slt 119; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 120; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 121; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** 122; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 123; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 124; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 125; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE*** 126; 127start: 128 br label %loop 129 130loop: 131 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 132 %iv.inc = add nsw i64 %iv, 1 133 %cmp1 = icmp slt i64 %iv.inc, %len 134 br i1 %cmp1, label %latch, label %exit 135 136latch: 137 %iv.inc2 = add nsw i64 %iv, 2 138 %cmp2 = icmp slt i64 %iv.inc2, %len 139 br i1 %cmp2, label %loop, label %exit 140 141exit: 142 ret void 143} 144 145define void @test_preinc_sgt(i64 %lim) { 146; CHECK-LABEL: 'test_preinc_sgt' 147; CHECK-NEXT: Classifying expressions for: @test_preinc_sgt 148; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 149; CHECK-NEXT: --> {0,+,-2}<nsw><%loop> U: [0,-1) S: [-9223372036854775808,1) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 150; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, -2 151; CHECK-NEXT: --> {-2,+,-2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 152; CHECK-NEXT: Determining loop execution counts for: @test_preinc_sgt 153; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 154; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 155; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** 156; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 157; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 158; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 159; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE*** 160; 161start: 162 br label %loop 163 164loop: 165 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 166 %cmp1 = icmp sgt i64 %iv, %lim 167 br i1 %cmp1, label %latch, label %exit 168 169latch: 170 %iv.inc2 = add nsw i64 %iv, -2 171 %cmp2 = icmp sgt i64 %iv.inc2, %lim 172 br i1 %cmp2, label %loop, label %exit 173 174exit: 175 ret void 176} 177 178define void @test_postinc_sgt(i64 %lim) { 179; CHECK-LABEL: 'test_postinc_sgt' 180; CHECK-NEXT: Classifying expressions for: @test_postinc_sgt 181; CHECK-NEXT: %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 182; CHECK-NEXT: --> {0,+,-2}<nsw><%loop> U: [0,-1) S: [-9223372036854775808,1) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 183; CHECK-NEXT: %iv.inc = add nsw i64 %iv, -1 184; CHECK-NEXT: --> {-1,+,-2}<nsw><%loop> U: [-9223372036854775808,0) S: [-9223372036854775808,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 185; CHECK-NEXT: %iv.inc2 = add nsw i64 %iv, -2 186; CHECK-NEXT: --> {-2,+,-2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 187; CHECK-NEXT: Determining loop execution counts for: @test_postinc_sgt 188; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 189; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 190; CHECK-NEXT: exit count for latch: ***COULDNOTCOMPUTE*** 191; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 192; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 193; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 194; CHECK-NEXT: symbolic max exit count for latch: ***COULDNOTCOMPUTE*** 195; 196start: 197 br label %loop 198 199loop: 200 %iv = phi i64 [ 0, %start ], [ %iv.inc2, %latch ] 201 %iv.inc = add nsw i64 %iv, -1 202 %cmp1 = icmp sgt i64 %iv.inc, %lim 203 br i1 %cmp1, label %latch, label %exit 204 205latch: 206 %iv.inc2 = add nsw i64 %iv, -2 207 %cmp2 = icmp sgt i64 %iv.inc2, %lim 208 br i1 %cmp2, label %loop, label %exit 209 210exit: 211 ret void 212} 213