1*7e59b200Svaibhav; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2*7e59b200Svaibhav; RUN: opt -S -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s 3*7e59b200Svaibhav 4*7e59b200Svaibhavdefine dso_local void @simple(i32 noundef %n) local_unnamed_addr { 5*7e59b200Svaibhav; CHECK-LABEL: 'simple' 6*7e59b200Svaibhav; CHECK-NEXT: Classifying expressions for: @simple 7*7e59b200Svaibhav; CHECK-NEXT: %right.06 = phi i32 [ %dec, %while.body ], [ %n, %entry ] 8*7e59b200Svaibhav; CHECK-NEXT: --> {%n,+,-4}<nsw><%while.body> U: full-set S: full-set Exits: ((-4 * (((-4 + (-1 * (1 umin (-4 + (4 smax (-4 + %n)))<nsw>))<nuw><nsw> + (4 smax (-4 + %n))) /u 8) + (1 umin (-4 + (4 smax (-4 + %n)))<nsw>)))<nsw> + %n) LoopDispositions: { %while.body: Computable } 9*7e59b200Svaibhav; CHECK-NEXT: %left.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ] 10*7e59b200Svaibhav; CHECK-NEXT: --> {0,+,4}<nuw><nsw><%while.body> U: [0,2147483641) S: [0,2147483641) Exits: (4 * (((-4 + (-1 * (1 umin (-4 + (4 smax (-4 + %n)))<nsw>))<nuw><nsw> + (4 smax (-4 + %n))) /u 8) + (1 umin (-4 + (4 smax (-4 + %n)))<nsw>)))<nuw> LoopDispositions: { %while.body: Computable } 11*7e59b200Svaibhav; CHECK-NEXT: %inc = add nuw nsw i32 %left.05, 4 12*7e59b200Svaibhav; CHECK-NEXT: --> {4,+,4}<nuw><nsw><%while.body> U: [4,2147483645) S: [4,2147483645) Exits: (4 + (4 * (((-4 + (-1 * (1 umin (-4 + (4 smax (-4 + %n)))<nsw>))<nuw><nsw> + (4 smax (-4 + %n))) /u 8) + (1 umin (-4 + (4 smax (-4 + %n)))<nsw>)))<nuw>)<nuw> LoopDispositions: { %while.body: Computable } 13*7e59b200Svaibhav; CHECK-NEXT: %dec = add nsw i32 %right.06, -4 14*7e59b200Svaibhav; CHECK-NEXT: --> {(-4 + %n),+,-4}<nsw><%while.body> U: full-set S: full-set Exits: (-4 + (-4 * (((-4 + (-1 * (1 umin (-4 + (4 smax (-4 + %n)))<nsw>))<nuw><nsw> + (4 smax (-4 + %n))) /u 8) + (1 umin (-4 + (4 smax (-4 + %n)))<nsw>)))<nsw> + %n) LoopDispositions: { %while.body: Computable } 15*7e59b200Svaibhav; CHECK-NEXT: Determining loop execution counts for: @simple 16*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: backedge-taken count is (((-4 + (-1 * (1 umin (-4 + (4 smax (-4 + %n)))<nsw>))<nuw><nsw> + (4 smax (-4 + %n))) /u 8) + (1 umin (-4 + (4 smax (-4 + %n)))<nsw>)) 17*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: constant max backedge-taken count is i32 536870910 18*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: symbolic max backedge-taken count is (((-4 + (-1 * (1 umin (-4 + (4 smax (-4 + %n)))<nsw>))<nuw><nsw> + (4 smax (-4 + %n))) /u 8) + (1 umin (-4 + (4 smax (-4 + %n)))<nsw>)) 19*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: Trip multiple is 1 20*7e59b200Svaibhav; 21*7e59b200Svaibhaventry: 22*7e59b200Svaibhav %cmp4 = icmp sgt i32 %n, 0 23*7e59b200Svaibhav br i1 %cmp4, label %while.body, label %while.end 24*7e59b200Svaibhav 25*7e59b200Svaibhavwhile.body: 26*7e59b200Svaibhav %right.06 = phi i32 [ %dec, %while.body ], [ %n, %entry ] 27*7e59b200Svaibhav %left.05 = phi i32 [ %inc, %while.body ], [ 0, %entry ] 28*7e59b200Svaibhav %inc = add nuw nsw i32 %left.05, 4 29*7e59b200Svaibhav %dec = add nsw i32 %right.06, -4 30*7e59b200Svaibhav %cmp = icmp slt i32 %inc, %dec 31*7e59b200Svaibhav br i1 %cmp, label %while.body, label %while.end 32*7e59b200Svaibhav 33*7e59b200Svaibhavwhile.end: 34*7e59b200Svaibhav ret void 35*7e59b200Svaibhav} 36*7e59b200Svaibhav 37*7e59b200Svaibhav; Cannot find backedge-count because subtraction of strides is wrapping. 38*7e59b200Svaibhavdefine dso_local void @stride_overflow(i32 noundef %n) local_unnamed_addr { 39*7e59b200Svaibhav; CHECK-LABEL: 'stride_overflow' 40*7e59b200Svaibhav; CHECK-NEXT: Classifying expressions for: @stride_overflow 41*7e59b200Svaibhav; CHECK-NEXT: %right.06 = phi i32 [ %dec, %while.body ], [ %n, %entry ] 42*7e59b200Svaibhav; CHECK-NEXT: --> {%n,+,-1}<nsw><%while.body> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %while.body: Computable } 43*7e59b200Svaibhav; CHECK-NEXT: %left.05 = phi i32 [ %inc, %while.body ], [ 2147483647, %entry ] 44*7e59b200Svaibhav; CHECK-NEXT: --> {2147483647,+,2147483647}<nuw><nsw><%while.body> U: [2147483647,-2147483648) S: [2147483647,-2147483648) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable } 45*7e59b200Svaibhav; CHECK-NEXT: %inc = add nuw nsw i32 %left.05, 2147483647 46*7e59b200Svaibhav; CHECK-NEXT: --> {-2,+,2147483647}<nuw><nsw><%while.body> U: [-2,-1) S: [-2,0) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable } 47*7e59b200Svaibhav; CHECK-NEXT: %dec = add nsw i32 %right.06, -1 48*7e59b200Svaibhav; CHECK-NEXT: --> {(-1 + %n),+,-1}<nsw><%while.body> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %while.body: Computable } 49*7e59b200Svaibhav; CHECK-NEXT: Determining loop execution counts for: @stride_overflow 50*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: Unpredictable backedge-taken count. 51*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: constant max backedge-taken count is i32 1 52*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: symbolic max backedge-taken count is i32 1 53*7e59b200Svaibhav; 54*7e59b200Svaibhaventry: 55*7e59b200Svaibhav %cmp4 = icmp sgt i32 %n, 0 56*7e59b200Svaibhav br i1 %cmp4, label %while.body, label %while.end 57*7e59b200Svaibhav 58*7e59b200Svaibhavwhile.body: 59*7e59b200Svaibhav %right.06 = phi i32 [ %dec, %while.body ], [ %n, %entry ] 60*7e59b200Svaibhav %left.05 = phi i32 [ %inc, %while.body ], [ 2147483647, %entry ] 61*7e59b200Svaibhav %inc = add nuw nsw i32 %left.05, 2147483647 62*7e59b200Svaibhav %dec = add nsw i32 %right.06, -1 63*7e59b200Svaibhav %cmp = icmp slt i32 %inc, %dec 64*7e59b200Svaibhav br i1 %cmp, label %while.body, label %while.end 65*7e59b200Svaibhav 66*7e59b200Svaibhavwhile.end: 67*7e59b200Svaibhav ret void 68*7e59b200Svaibhav} 69*7e59b200Svaibhav 70*7e59b200Svaibhav; Cannot find backedge-count because %conv110 is wrapping 71*7e59b200Svaibhavdefine dso_local void @rhs_wrapping() local_unnamed_addr { 72*7e59b200Svaibhav; CHECK-LABEL: 'rhs_wrapping' 73*7e59b200Svaibhav; CHECK-NEXT: Classifying expressions for: @rhs_wrapping 74*7e59b200Svaibhav; CHECK-NEXT: %a = alloca i8, align 1 75*7e59b200Svaibhav; CHECK-NEXT: --> %a U: full-set S: full-set 76*7e59b200Svaibhav; CHECK-NEXT: %conv110 = phi i32 [ 0, %entry ], [ %sext8, %while.body ] 77*7e59b200Svaibhav; CHECK-NEXT: --> {0,+,-1090519040}<%while.body> U: [0,-16777215) S: [-2147483648,2130706433) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable } 78*7e59b200Svaibhav; CHECK-NEXT: %conv9 = phi i32 [ -2147483648, %entry ], [ %sext, %while.body ] 79*7e59b200Svaibhav; CHECK-NEXT: --> {-2147483648,+,16777216}<nsw><%while.body> U: [0,-16777215) S: [-2147483648,2113929217) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable } 80*7e59b200Svaibhav; CHECK-NEXT: %sext = add nsw i32 %conv9, 16777216 81*7e59b200Svaibhav; CHECK-NEXT: --> {-2130706432,+,16777216}<nsw><%while.body> U: [0,-16777215) S: [-2130706432,2130706433) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable } 82*7e59b200Svaibhav; CHECK-NEXT: %sext8 = add i32 %conv110, -1090519040 83*7e59b200Svaibhav; CHECK-NEXT: --> {-1090519040,+,-1090519040}<%while.body> U: [0,-16777215) S: [-2147483648,2130706433) Exits: <<Unknown>> LoopDispositions: { %while.body: Computable } 84*7e59b200Svaibhav; CHECK-NEXT: Determining loop execution counts for: @rhs_wrapping 85*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: Unpredictable backedge-taken count. 86*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: constant max backedge-taken count is i32 254 87*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: symbolic max backedge-taken count is i32 254 88*7e59b200Svaibhav; 89*7e59b200Svaibhaventry: 90*7e59b200Svaibhav %a = alloca i8, align 1 91*7e59b200Svaibhav br label %while.body 92*7e59b200Svaibhav 93*7e59b200Svaibhavwhile.body: 94*7e59b200Svaibhav %conv110 = phi i32 [ 0, %entry ], [ %sext8, %while.body ] 95*7e59b200Svaibhav %conv9 = phi i32 [ -2147483648, %entry ], [ %sext, %while.body ] 96*7e59b200Svaibhav %sext = add nsw i32 %conv9, 16777216 97*7e59b200Svaibhav %sext8 = add i32 %conv110, -1090519040 98*7e59b200Svaibhav %cmp = icmp slt i32 %sext, %sext8 99*7e59b200Svaibhav br i1 %cmp, label %while.body, label %while.end 100*7e59b200Svaibhav 101*7e59b200Svaibhavwhile.end: 102*7e59b200Svaibhav ret void 103*7e59b200Svaibhav} 104*7e59b200Svaibhav 105*7e59b200Svaibhav; abs(left_stride) != abs(right_stride) 106*7e59b200Svaibhavdefine dso_local void @simple2() local_unnamed_addr { 107*7e59b200Svaibhav; CHECK-LABEL: 'simple2' 108*7e59b200Svaibhav; CHECK-NEXT: Classifying expressions for: @simple2 109*7e59b200Svaibhav; CHECK-NEXT: %right.08 = phi i32 [ 50, %entry ], [ %add2, %while.body ] 110*7e59b200Svaibhav; CHECK-NEXT: --> {50,+,-5}<nsw><%while.body> U: [25,51) S: [25,51) Exits: 25 LoopDispositions: { %while.body: Computable } 111*7e59b200Svaibhav; CHECK-NEXT: %left.07 = phi i32 [ 0, %entry ], [ %add, %while.body ] 112*7e59b200Svaibhav; CHECK-NEXT: --> {0,+,4}<nuw><nsw><%while.body> U: [0,21) S: [0,21) Exits: 20 LoopDispositions: { %while.body: Computable } 113*7e59b200Svaibhav; CHECK-NEXT: %add = add nuw nsw i32 %left.07, 4 114*7e59b200Svaibhav; CHECK-NEXT: --> {4,+,4}<nuw><nsw><%while.body> U: [4,25) S: [4,25) Exits: 24 LoopDispositions: { %while.body: Computable } 115*7e59b200Svaibhav; CHECK-NEXT: %add2 = add nsw i32 %right.08, -5 116*7e59b200Svaibhav; CHECK-NEXT: --> {45,+,-5}<nsw><%while.body> U: [20,46) S: [20,46) Exits: 20 LoopDispositions: { %while.body: Computable } 117*7e59b200Svaibhav; CHECK-NEXT: Determining loop execution counts for: @simple2 118*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: backedge-taken count is i32 5 119*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: constant max backedge-taken count is i32 5 120*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: symbolic max backedge-taken count is i32 5 121*7e59b200Svaibhav; CHECK-NEXT: Loop %while.body: Trip multiple is 6 122*7e59b200Svaibhav; 123*7e59b200Svaibhaventry: 124*7e59b200Svaibhav br label %while.body 125*7e59b200Svaibhav 126*7e59b200Svaibhavwhile.body: 127*7e59b200Svaibhav %right.08 = phi i32 [ 50, %entry ], [ %add2, %while.body ] 128*7e59b200Svaibhav %left.07 = phi i32 [ 0, %entry ], [ %add, %while.body ] 129*7e59b200Svaibhav %add = add nuw nsw i32 %left.07, 4 130*7e59b200Svaibhav %add2 = add nsw i32 %right.08, -5 131*7e59b200Svaibhav %cmp = icmp slt i32 %add, %add2 132*7e59b200Svaibhav br i1 %cmp, label %while.body, label %while.end 133*7e59b200Svaibhav 134*7e59b200Svaibhavwhile.end: 135*7e59b200Svaibhav ret void 136*7e59b200Svaibhav} 137