315 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 52; RUN: opt -disable-output -passes='print<scalar-evolution>' %s 2>&1 | FileCheck %s3 4; Check that assumes/guards guarding the backedge are taken into account5; when inferring no-wrap flags.6 7declare void @llvm.experimental.guard(i1, ...)8declare void @llvm.assume(i1)9 10define void @s_0(i32 %n, ptr %cond) {11; CHECK-LABEL: 's_0'12; CHECK-NEXT: Classifying expressions for: @s_013; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]14; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }15; CHECK-NEXT: %iv.inc = add i32 %iv, 116; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }17; CHECK-NEXT: %iv.sext = sext i32 %iv to i6418; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }19; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 120; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }21; CHECK-NEXT: Determining loop execution counts for: @s_022; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.23; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.24; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.25;26entry:27 br label %loop28 29loop:30 %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]31 %iv.inc = add i32 %iv, 132 %iv.sext = sext i32 %iv to i6433 %cmp = icmp slt i32 %iv, %n34 call void(i1, ...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]35 %c = load volatile i1, ptr %cond36 br i1 %c, label %loop, label %leave37 38leave:39 ret void40}41 42define void @s_1(ptr %cond) {43; CHECK-LABEL: 's_1'44; CHECK-NEXT: Classifying expressions for: @s_145; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]46; CHECK-NEXT: --> {0,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }47; CHECK-NEXT: %iv.inc = add i32 %iv, 348; CHECK-NEXT: --> {3,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }49; CHECK-NEXT: %iv.sext = sext i32 %iv to i6450; CHECK-NEXT: --> {0,+,3}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }51; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 152; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }53; CHECK-NEXT: Determining loop execution counts for: @s_154; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.55; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.56; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.57;58entry:59 br label %loop60 61loop:62 %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]63 %iv.inc = add i32 %iv, 364 %iv.sext = sext i32 %iv to i6465 %cmp = icmp slt i32 %iv, 1000066 call void(i1, ...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]67 %c = load volatile i1, ptr %cond68 br i1 %c, label %loop, label %leave69 70leave:71 ret void72}73 74define void @s_2(ptr %cond) {75; CHECK-LABEL: 's_2'76; CHECK-NEXT: Classifying expressions for: @s_277; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]78; CHECK-NEXT: --> {0,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }79; CHECK-NEXT: %iv.inc = add i32 %iv, 380; CHECK-NEXT: --> {3,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }81; CHECK-NEXT: %iv.sext = sext i32 %iv to i6482; CHECK-NEXT: --> {0,+,3}<nuw><nsw><%loop> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }83; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 184; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }85; CHECK-NEXT: Determining loop execution counts for: @s_286; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.87; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.88; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.89;90entry:91 br label %loop92 93loop:94 %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]95 %iv.inc = add i32 %iv, 396 %iv.sext = sext i32 %iv to i6497 %cmp = icmp slt i32 %iv, 1000098 call void @llvm.assume(i1 %cmp)99 %c = load volatile i1, ptr %cond100 br i1 %c, label %loop, label %leave101 102leave:103 ret void104}105 106define void @s_3(i32 %start, ptr %cond) {107; CHECK-LABEL: 's_3'108; CHECK-NEXT: Classifying expressions for: @s_3109; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.inc, %be ]110; CHECK-NEXT: --> {%start,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }111; CHECK-NEXT: %iv.inc = add i32 %iv, 3112; CHECK-NEXT: --> {(3 + %start),+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }113; CHECK-NEXT: %iv.inc.sext = sext i32 %iv.inc to i64114; CHECK-NEXT: --> {(sext i32 (3 + %start) to i64),+,3}<nsw><%loop> U: [-2147483648,4294977296) S: [-2147483648,4294977296) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }115; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1116; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }117; CHECK-NEXT: Determining loop execution counts for: @s_3118; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.119; CHECK-NEXT: exit count for loop: ((((-1 * (1 umin ((-1 * %start) + (10000 smax %start))))<nuw><nsw> + (-1 * %start) + (10000 smax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 smax %start))))120; CHECK-NEXT: exit count for be: ***COULDNOTCOMPUTE***121; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 715831216122; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((((-1 * (1 umin ((-1 * %start) + (10000 smax %start))))<nuw><nsw> + (-1 * %start) + (10000 smax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 smax %start))))123; CHECK-NEXT: symbolic max exit count for loop: ((((-1 * (1 umin ((-1 * %start) + (10000 smax %start))))<nuw><nsw> + (-1 * %start) + (10000 smax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 smax %start))))124; CHECK-NEXT: symbolic max exit count for be: ***COULDNOTCOMPUTE***125;126entry:127 br label %loop128 129loop:130 %iv = phi i32 [ %start, %entry ], [ %iv.inc, %be ]131 %cmp = icmp slt i32 %iv, 10000132 br i1 %cmp, label %be, label %leave133 134be:135 %iv.inc = add i32 %iv, 3136 %iv.inc.sext = sext i32 %iv.inc to i64137 %c = load volatile i1, ptr %cond138 br i1 %c, label %loop, label %leave139 140leave:141 ret void142}143 144define void @s_4(i32 %start, ptr %cond) {145; CHECK-LABEL: 's_4'146; CHECK-NEXT: Classifying expressions for: @s_4147; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.inc, %be ]148; CHECK-NEXT: --> {%start,+,-3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }149; CHECK-NEXT: %iv.inc = add i32 %iv, -3150; CHECK-NEXT: --> {(-3 + %start),+,-3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }151; CHECK-NEXT: %iv.inc.sext = sext i32 %iv.inc to i64152; CHECK-NEXT: --> {(sext i32 (-3 + %start) to i64),+,-3}<nsw><%loop> U: [-4294968296,2147483648) S: [-4294968296,2147483648) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }153; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1154; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }155; CHECK-NEXT: Determining loop execution counts for: @s_4156; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.157; CHECK-NEXT: exit count for loop: ((2 + (-1 * (-1000 smin %start)) + %start) /u 3)158; CHECK-NEXT: exit count for be: ***COULDNOTCOMPUTE***159; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 715828216160; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((2 + (-1 * (-1000 smin %start)) + %start) /u 3)161; CHECK-NEXT: symbolic max exit count for loop: ((2 + (-1 * (-1000 smin %start)) + %start) /u 3)162; CHECK-NEXT: symbolic max exit count for be: ***COULDNOTCOMPUTE***163;164entry:165 br label %loop166 167loop:168 %iv = phi i32 [ %start, %entry ], [ %iv.inc, %be ]169 %cmp = icmp sgt i32 %iv, -1000170 br i1 %cmp, label %be, label %leave171 172be:173 %iv.inc = add i32 %iv, -3174 %iv.inc.sext = sext i32 %iv.inc to i64175 %c = load volatile i1, ptr %cond176 br i1 %c, label %loop, label %leave177 178leave:179 ret void180}181 182define void @u_0(i32 %n, ptr %cond) {183; CHECK-LABEL: 'u_0'184; CHECK-NEXT: Classifying expressions for: @u_0185; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]186; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }187; CHECK-NEXT: %iv.inc = add i32 %iv, 1188; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }189; CHECK-NEXT: %iv.zext = zext i32 %iv to i64190; CHECK-NEXT: --> {0,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }191; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1192; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }193; CHECK-NEXT: Determining loop execution counts for: @u_0194; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.195; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.196; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.197;198entry:199 br label %loop200 201loop:202 %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]203 %iv.inc = add i32 %iv, 1204 %iv.zext = zext i32 %iv to i64205 %cmp = icmp ult i32 %iv, %n206 call void(i1, ...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]207 %c = load volatile i1, ptr %cond208 br i1 %c, label %loop, label %leave209 210leave:211 ret void212}213 214define void @u_1(ptr %cond) {215; CHECK-LABEL: 'u_1'216; CHECK-NEXT: Classifying expressions for: @u_1217; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]218; CHECK-NEXT: --> {0,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }219; CHECK-NEXT: %iv.inc = add i32 %iv, 3220; CHECK-NEXT: --> {3,+,3}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }221; CHECK-NEXT: %iv.zext = zext i32 %iv to i64222; CHECK-NEXT: --> {0,+,3}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }223; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1224; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }225; CHECK-NEXT: Determining loop execution counts for: @u_1226; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.227; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.228; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.229;230entry:231 br label %loop232 233loop:234 %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]235 %iv.inc = add i32 %iv, 3236 %iv.zext = zext i32 %iv to i64237 %cmp = icmp ult i32 %iv, 10000238 call void(i1, ...) @llvm.experimental.guard(i1 %cmp) [ "deopt"() ]239 %c = load volatile i1, ptr %cond240 br i1 %c, label %loop, label %leave241 242leave:243 ret void244}245 246define void @u_2(ptr %cond) {247; CHECK-LABEL: 'u_2'248; CHECK-NEXT: Classifying expressions for: @u_2249; CHECK-NEXT: %iv = phi i32 [ 30000, %entry ], [ %iv.inc, %loop ]250; CHECK-NEXT: --> {30000,+,-2}<%loop> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }251; CHECK-NEXT: %iv.inc = add i32 %iv, -2252; CHECK-NEXT: --> {29998,+,-2}<%loop> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }253; CHECK-NEXT: %iv.zext = zext i32 %iv to i64254; CHECK-NEXT: --> {30000,+,-2}<nw><%loop> U: [0,-1) S: [-9223372036854775808,9223372036854775807) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }255; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1256; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }257; CHECK-NEXT: Determining loop execution counts for: @u_2258; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.259; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.260; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.261;262entry:263 br label %loop264 265loop:266 %iv = phi i32 [ 30000, %entry ], [ %iv.inc, %loop ]267 %iv.inc = add i32 %iv, -2268 %iv.zext = zext i32 %iv to i64269 %cmp = icmp ugt i32 %iv.inc, -10000270 call void @llvm.assume(i1 %cmp)271 %c = load volatile i1, ptr %cond272 br i1 %c, label %loop, label %leave273 274leave:275 ret void276}277 278define void @u_3(i32 %start, ptr %cond) {279; CHECK-LABEL: 'u_3'280; CHECK-NEXT: Classifying expressions for: @u_3281; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.inc, %be ]282; CHECK-NEXT: --> {%start,+,3}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }283; CHECK-NEXT: %iv.inc = add i32 %iv, 3284; CHECK-NEXT: --> {(3 + %start),+,3}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }285; CHECK-NEXT: %iv.inc.zext = zext i32 %iv.inc to i64286; CHECK-NEXT: --> {(zext i32 (3 + %start) to i64),+,3}<nuw><%loop> U: [0,4294977298) S: [0,4294977298) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }287; CHECK-NEXT: %c = load volatile i1, ptr %cond, align 1288; CHECK-NEXT: --> %c U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }289; CHECK-NEXT: Determining loop execution counts for: @u_3290; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.291; CHECK-NEXT: exit count for loop: ((((-1 * (1 umin ((-1 * %start) + (10000 umax %start))))<nuw><nsw> + (-1 * %start) + (10000 umax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 umax %start))))292; CHECK-NEXT: exit count for be: ***COULDNOTCOMPUTE***293; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 3334294; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((((-1 * (1 umin ((-1 * %start) + (10000 umax %start))))<nuw><nsw> + (-1 * %start) + (10000 umax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 umax %start))))295; CHECK-NEXT: symbolic max exit count for loop: ((((-1 * (1 umin ((-1 * %start) + (10000 umax %start))))<nuw><nsw> + (-1 * %start) + (10000 umax %start)) /u 3) + (1 umin ((-1 * %start) + (10000 umax %start))))296; CHECK-NEXT: symbolic max exit count for be: ***COULDNOTCOMPUTE***297;298entry:299 br label %loop300 301loop:302 %iv = phi i32 [ %start, %entry ], [ %iv.inc, %be ]303 %cmp = icmp ult i32 %iv, 10000304 br i1 %cmp, label %be, label %leave305 306be:307 %iv.inc = add i32 %iv, 3308 %iv.inc.zext = zext i32 %iv.inc to i64309 %c = load volatile i1, ptr %cond310 br i1 %c, label %loop, label %leave311 312leave:313 ret void314}315