16642cc60SNikita Popov; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4 26642cc60SNikita Popov; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s 36642cc60SNikita Popov 46642cc60SNikita Popovdefine void @ule_from_zero(i32 %M, i32 %N) { 56642cc60SNikita Popov; CHECK-LABEL: 'ule_from_zero' 66642cc60SNikita Popov; CHECK-NEXT: Determining loop execution counts for: @ule_from_zero 7ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 8ca478bc6SNikita Popov; CHECK-NEXT: exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 96642cc60SNikita Popov; CHECK-NEXT: exit count for latch: %N 10ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 11ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 12ca478bc6SNikita Popov; CHECK-NEXT: symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 136642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for latch: %N 14ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: Trip multiple is 1 156642cc60SNikita Popov; 166642cc60SNikita Popoventry: 176642cc60SNikita Popov br label %loop 186642cc60SNikita Popov 196642cc60SNikita Popovloop: 206642cc60SNikita Popov %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] 216642cc60SNikita Popov %cmp1 = icmp ule i32 %iv, %M 226642cc60SNikita Popov br i1 %cmp1, label %latch, label %exit 236642cc60SNikita Popov 246642cc60SNikita Popovlatch: 256642cc60SNikita Popov %iv.next = add nuw i32 %iv, 1 266642cc60SNikita Popov %exitcond.not = icmp eq i32 %iv, %N 276642cc60SNikita Popov br i1 %exitcond.not, label %exit, label %loop 286642cc60SNikita Popov 296642cc60SNikita Popovexit: 306642cc60SNikita Popov ret void 316642cc60SNikita Popov} 326642cc60SNikita Popov 33*e5b0132dSRamkumar Ramachandradefine void @le_from_zero(i32 %M, i32 %N) { 34*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_zero' 35*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Determining loop execution counts for: @le_from_zero 36*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 37*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 38*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for latch: %N 39*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 40*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 41*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 42*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for latch: %N 43*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Trip multiple is 1 44*e5b0132dSRamkumar Ramachandra; 45*e5b0132dSRamkumar Ramachandraentry: 46*e5b0132dSRamkumar Ramachandra br label %loop 47*e5b0132dSRamkumar Ramachandra 48*e5b0132dSRamkumar Ramachandraloop: 49*e5b0132dSRamkumar Ramachandra %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] 50*e5b0132dSRamkumar Ramachandra %cmp1 = icmp samesign ule i32 %iv, %M 51*e5b0132dSRamkumar Ramachandra br i1 %cmp1, label %latch, label %exit 52*e5b0132dSRamkumar Ramachandra 53*e5b0132dSRamkumar Ramachandralatch: 54*e5b0132dSRamkumar Ramachandra %iv.next = add nuw i32 %iv, 1 55*e5b0132dSRamkumar Ramachandra %exitcond.not = icmp eq i32 %iv, %N 56*e5b0132dSRamkumar Ramachandra br i1 %exitcond.not, label %exit, label %loop 57*e5b0132dSRamkumar Ramachandra 58*e5b0132dSRamkumar Ramachandraexit: 59*e5b0132dSRamkumar Ramachandra ret void 60*e5b0132dSRamkumar Ramachandra} 61*e5b0132dSRamkumar Ramachandra 626642cc60SNikita Popovdefine void @ule_from_one(i32 %M, i32 %N) { 636642cc60SNikita Popov; CHECK-LABEL: 'ule_from_one' 646642cc60SNikita Popov; CHECK-NEXT: Determining loop execution counts for: @ule_from_one 656642cc60SNikita Popov; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N)) 666642cc60SNikita Popov; CHECK-NEXT: exit count for loop: %M 676642cc60SNikita Popov; CHECK-NEXT: exit count for latch: (-1 + %N) 686642cc60SNikita Popov; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 696642cc60SNikita Popov; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N)) 706642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for loop: %M 716642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for latch: (-1 + %N) 726642cc60SNikita Popov; CHECK-NEXT: Loop %loop: Trip multiple is 1 736642cc60SNikita Popov; 746642cc60SNikita Popoventry: 756642cc60SNikita Popov br label %loop 766642cc60SNikita Popov 776642cc60SNikita Popovloop: 786642cc60SNikita Popov %iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ] 796642cc60SNikita Popov %cmp1 = icmp ule i32 %iv, %M 806642cc60SNikita Popov br i1 %cmp1, label %latch, label %exit 816642cc60SNikita Popov 826642cc60SNikita Popovlatch: 836642cc60SNikita Popov %iv.next = add nuw i32 %iv, 1 846642cc60SNikita Popov %exitcond.not = icmp eq i32 %iv, %N 856642cc60SNikita Popov br i1 %exitcond.not, label %exit, label %loop 866642cc60SNikita Popov 876642cc60SNikita Popovexit: 886642cc60SNikita Popov ret void 896642cc60SNikita Popov} 906642cc60SNikita Popov 91*e5b0132dSRamkumar Ramachandradefine void @le_from_one(i32 %M, i32 %N) { 92*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_one' 93*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Determining loop execution counts for: @le_from_one 94*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N)) 95*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for loop: %M 96*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for latch: (-1 + %N) 97*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 98*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N)) 99*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for loop: %M 100*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for latch: (-1 + %N) 101*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Trip multiple is 1 102*e5b0132dSRamkumar Ramachandra; 103*e5b0132dSRamkumar Ramachandraentry: 104*e5b0132dSRamkumar Ramachandra br label %loop 105*e5b0132dSRamkumar Ramachandra 106*e5b0132dSRamkumar Ramachandraloop: 107*e5b0132dSRamkumar Ramachandra %iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ] 108*e5b0132dSRamkumar Ramachandra %cmp1 = icmp samesign ule i32 %iv, %M 109*e5b0132dSRamkumar Ramachandra br i1 %cmp1, label %latch, label %exit 110*e5b0132dSRamkumar Ramachandra 111*e5b0132dSRamkumar Ramachandralatch: 112*e5b0132dSRamkumar Ramachandra %iv.next = add nuw i32 %iv, 1 113*e5b0132dSRamkumar Ramachandra %exitcond.not = icmp eq i32 %iv, %N 114*e5b0132dSRamkumar Ramachandra br i1 %exitcond.not, label %exit, label %loop 115*e5b0132dSRamkumar Ramachandra 116*e5b0132dSRamkumar Ramachandraexit: 117*e5b0132dSRamkumar Ramachandra ret void 118*e5b0132dSRamkumar Ramachandra} 119*e5b0132dSRamkumar Ramachandra 1206642cc60SNikita Popovdefine void @ule_from_unknown(i32 %M, i32 %N, i32 %S) { 1216642cc60SNikita Popov; CHECK-LABEL: 'ule_from_unknown' 1226642cc60SNikita Popov; CHECK-NEXT: Determining loop execution counts for: @ule_from_unknown 123ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64)) 124ca478bc6SNikita Popov; CHECK-NEXT: exit count for loop: ((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) 1256642cc60SNikita Popov; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N) 126ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 127ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64)) 128ca478bc6SNikita Popov; CHECK-NEXT: symbolic max exit count for loop: ((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) 1296642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N) 130ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: Trip multiple is 1 1316642cc60SNikita Popov; 1326642cc60SNikita Popoventry: 1336642cc60SNikita Popov br label %loop 1346642cc60SNikita Popov 1356642cc60SNikita Popovloop: 1366642cc60SNikita Popov %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ] 1376642cc60SNikita Popov %cmp1 = icmp ule i32 %iv, %M 1386642cc60SNikita Popov br i1 %cmp1, label %latch, label %exit 1396642cc60SNikita Popov 1406642cc60SNikita Popovlatch: 1416642cc60SNikita Popov %iv.next = add nuw i32 %iv, 1 1426642cc60SNikita Popov %exitcond.not = icmp eq i32 %iv, %N 1436642cc60SNikita Popov br i1 %exitcond.not, label %exit, label %loop 1446642cc60SNikita Popov 1456642cc60SNikita Popovexit: 1466642cc60SNikita Popov ret void 1476642cc60SNikita Popov} 1486642cc60SNikita Popov 1496642cc60SNikita Popovdefine void @ule_from_zero_no_nuw(i32 %M, i32 %N) { 1506642cc60SNikita Popov; CHECK-LABEL: 'ule_from_zero_no_nuw' 1516642cc60SNikita Popov; CHECK-NEXT: Determining loop execution counts for: @ule_from_zero_no_nuw 1526642cc60SNikita Popov; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 1536642cc60SNikita Popov; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 154df3d70b5SDavid Sherwood; CHECK-NEXT: predicated exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 155df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 156df3d70b5SDavid Sherwood; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 157df3d70b5SDavid Sherwood; CHECK-EMPTY: 1586642cc60SNikita Popov; CHECK-NEXT: exit count for latch: %N 1596642cc60SNikita Popov; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 1606642cc60SNikita Popov; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %N 1616642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 162df3d70b5SDavid Sherwood; CHECK-NEXT: predicated symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 163df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 164df3d70b5SDavid Sherwood; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 165df3d70b5SDavid Sherwood; CHECK-EMPTY: 1666642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for latch: %N 167ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 168ca478bc6SNikita Popov; CHECK-NEXT: Predicates: 169ca478bc6SNikita Popov; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 17002ee96ecSDavid Sherwood; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4294967295 17102ee96ecSDavid Sherwood; CHECK-NEXT: Predicates: 17202ee96ecSDavid Sherwood; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 173df3d70b5SDavid Sherwood; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 174df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 175df3d70b5SDavid Sherwood; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 1766642cc60SNikita Popov; 1776642cc60SNikita Popoventry: 1786642cc60SNikita Popov br label %loop 1796642cc60SNikita Popov 1806642cc60SNikita Popovloop: 1816642cc60SNikita Popov %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] 1826642cc60SNikita Popov %cmp1 = icmp ule i32 %iv, %M 1836642cc60SNikita Popov br i1 %cmp1, label %latch, label %exit 1846642cc60SNikita Popov 1856642cc60SNikita Popovlatch: 1866642cc60SNikita Popov %iv.next = add i32 %iv, 1 1876642cc60SNikita Popov %exitcond.not = icmp eq i32 %iv, %N 1886642cc60SNikita Popov br i1 %exitcond.not, label %exit, label %loop 1896642cc60SNikita Popov 1906642cc60SNikita Popovexit: 1916642cc60SNikita Popov ret void 1926642cc60SNikita Popov} 1936642cc60SNikita Popov 194*e5b0132dSRamkumar Ramachandradefine void @le_from_zero_no_nuw(i32 %M, i32 %N) { 195*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_zero_no_nuw' 196*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Determining loop execution counts for: @le_from_zero_no_nuw 197*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 198*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 199*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: predicated exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 200*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Predicates: 201*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 202*e5b0132dSRamkumar Ramachandra; CHECK-EMPTY: 203*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for latch: %N 204*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 205*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %N 206*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 207*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: predicated symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 208*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Predicates: 209*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 210*e5b0132dSRamkumar Ramachandra; CHECK-EMPTY: 211*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for latch: %N 212*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 213*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Predicates: 214*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 215*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4294967295 216*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Predicates: 217*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 218*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 219*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Predicates: 220*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 221*e5b0132dSRamkumar Ramachandra; 222*e5b0132dSRamkumar Ramachandraentry: 223*e5b0132dSRamkumar Ramachandra br label %loop 224*e5b0132dSRamkumar Ramachandra 225*e5b0132dSRamkumar Ramachandraloop: 226*e5b0132dSRamkumar Ramachandra %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] 227*e5b0132dSRamkumar Ramachandra %cmp1 = icmp samesign ule i32 %iv, %M 228*e5b0132dSRamkumar Ramachandra br i1 %cmp1, label %latch, label %exit 229*e5b0132dSRamkumar Ramachandra 230*e5b0132dSRamkumar Ramachandralatch: 231*e5b0132dSRamkumar Ramachandra %iv.next = add i32 %iv, 1 232*e5b0132dSRamkumar Ramachandra %exitcond.not = icmp eq i32 %iv, %N 233*e5b0132dSRamkumar Ramachandra br i1 %exitcond.not, label %exit, label %loop 234*e5b0132dSRamkumar Ramachandra 235*e5b0132dSRamkumar Ramachandraexit: 236*e5b0132dSRamkumar Ramachandra ret void 237*e5b0132dSRamkumar Ramachandra} 238*e5b0132dSRamkumar Ramachandra 2396642cc60SNikita Popovdefine void @sle_from_int_min(i32 %M, i32 %N) { 2406642cc60SNikita Popov; CHECK-LABEL: 'sle_from_int_min' 2416642cc60SNikita Popov; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min 242ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>) 243ca478bc6SNikita Popov; CHECK-NEXT: exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw> 2446642cc60SNikita Popov; CHECK-NEXT: exit count for latch: (-2147483648 + %N) 245ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 246ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>) 247ca478bc6SNikita Popov; CHECK-NEXT: symbolic max exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw> 2486642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N) 249ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: Trip multiple is 1 2506642cc60SNikita Popov; 2516642cc60SNikita Popoventry: 2526642cc60SNikita Popov br label %loop 2536642cc60SNikita Popov 2546642cc60SNikita Popovloop: 2556642cc60SNikita Popov %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ] 2566642cc60SNikita Popov %cmp1 = icmp sle i32 %iv, %M 2576642cc60SNikita Popov br i1 %cmp1, label %latch, label %exit 2586642cc60SNikita Popov 2596642cc60SNikita Popovlatch: 2606642cc60SNikita Popov %iv.next = add nsw i32 %iv, 1 2616642cc60SNikita Popov %exitcond.not = icmp eq i32 %iv, %N 2626642cc60SNikita Popov br i1 %exitcond.not, label %exit, label %loop 2636642cc60SNikita Popov 2646642cc60SNikita Popovexit: 2656642cc60SNikita Popov ret void 2666642cc60SNikita Popov} 2676642cc60SNikita Popov 268*e5b0132dSRamkumar Ramachandradefine void @le_from_int_min(i32 %M, i32 %N) { 269*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_int_min' 270*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min 271*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483647 + (2147483647 umax %M)) umin_seq (-2147483648 + %N)) 272*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for loop: (-2147483647 + (2147483647 umax %M)) 273*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for latch: (-2147483648 + %N) 274*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -2147483648 275*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483647 + (2147483647 umax %M)) umin_seq (-2147483648 + %N)) 276*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for loop: (-2147483647 + (2147483647 umax %M)) 277*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N) 278*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Trip multiple is 1 279*e5b0132dSRamkumar Ramachandra; 280*e5b0132dSRamkumar Ramachandraentry: 281*e5b0132dSRamkumar Ramachandra br label %loop 282*e5b0132dSRamkumar Ramachandra 283*e5b0132dSRamkumar Ramachandraloop: 284*e5b0132dSRamkumar Ramachandra %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ] 285*e5b0132dSRamkumar Ramachandra %cmp1 = icmp samesign ule i32 %iv, %M 286*e5b0132dSRamkumar Ramachandra br i1 %cmp1, label %latch, label %exit 287*e5b0132dSRamkumar Ramachandra 288*e5b0132dSRamkumar Ramachandralatch: 289*e5b0132dSRamkumar Ramachandra %iv.next = add nuw nsw i32 %iv, 1 290*e5b0132dSRamkumar Ramachandra %exitcond.not = icmp eq i32 %iv, %N 291*e5b0132dSRamkumar Ramachandra br i1 %exitcond.not, label %exit, label %loop 292*e5b0132dSRamkumar Ramachandra 293*e5b0132dSRamkumar Ramachandraexit: 294*e5b0132dSRamkumar Ramachandra ret void 295*e5b0132dSRamkumar Ramachandra} 296*e5b0132dSRamkumar Ramachandra 2976642cc60SNikita Popovdefine void @sle_from_int_min_plus_one(i32 %M, i32 %N) { 2986642cc60SNikita Popov; CHECK-LABEL: 'sle_from_int_min_plus_one' 2996642cc60SNikita Popov; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min_plus_one 3006642cc60SNikita Popov; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N)) 3016642cc60SNikita Popov; CHECK-NEXT: exit count for loop: (-2147483648 + %M) 3026642cc60SNikita Popov; CHECK-NEXT: exit count for latch: (2147483647 + %N) 3036642cc60SNikita Popov; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 3046642cc60SNikita Popov; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N)) 3056642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for loop: (-2147483648 + %M) 3066642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for latch: (2147483647 + %N) 3076642cc60SNikita Popov; CHECK-NEXT: Loop %loop: Trip multiple is 1 3086642cc60SNikita Popov; 3096642cc60SNikita Popoventry: 3106642cc60SNikita Popov br label %loop 3116642cc60SNikita Popov 3126642cc60SNikita Popovloop: 3136642cc60SNikita Popov %iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ] 3146642cc60SNikita Popov %cmp1 = icmp sle i32 %iv, %M 3156642cc60SNikita Popov br i1 %cmp1, label %latch, label %exit 3166642cc60SNikita Popov 3176642cc60SNikita Popovlatch: 3186642cc60SNikita Popov %iv.next = add nsw i32 %iv, 1 3196642cc60SNikita Popov %exitcond.not = icmp eq i32 %iv, %N 3206642cc60SNikita Popov br i1 %exitcond.not, label %exit, label %loop 3216642cc60SNikita Popov 3226642cc60SNikita Popovexit: 3236642cc60SNikita Popov ret void 3246642cc60SNikita Popov} 3256642cc60SNikita Popov 326*e5b0132dSRamkumar Ramachandradefine void @le_from_int_min_plus_one(i32 %M, i32 %N) { 327*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_int_min_plus_one' 328*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min_plus_one 329*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + (-2147483648 umax %M)) umin_seq (2147483647 + %N)) 330*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for loop: (-2147483648 + (-2147483648 umax %M)) 331*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for latch: (2147483647 + %N) 332*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 2147483647 333*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483648 + (-2147483648 umax %M)) umin_seq (2147483647 + %N)) 334*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for loop: (-2147483648 + (-2147483648 umax %M)) 335*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for latch: (2147483647 + %N) 336*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Trip multiple is 1 337*e5b0132dSRamkumar Ramachandra; 338*e5b0132dSRamkumar Ramachandraentry: 339*e5b0132dSRamkumar Ramachandra br label %loop 340*e5b0132dSRamkumar Ramachandra 341*e5b0132dSRamkumar Ramachandraloop: 342*e5b0132dSRamkumar Ramachandra %iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ] 343*e5b0132dSRamkumar Ramachandra %cmp1 = icmp samesign ule i32 %iv, %M 344*e5b0132dSRamkumar Ramachandra br i1 %cmp1, label %latch, label %exit 345*e5b0132dSRamkumar Ramachandra 346*e5b0132dSRamkumar Ramachandralatch: 347*e5b0132dSRamkumar Ramachandra %iv.next = add nuw nsw i32 %iv, 1 348*e5b0132dSRamkumar Ramachandra %exitcond.not = icmp eq i32 %iv, %N 349*e5b0132dSRamkumar Ramachandra br i1 %exitcond.not, label %exit, label %loop 350*e5b0132dSRamkumar Ramachandra 351*e5b0132dSRamkumar Ramachandraexit: 352*e5b0132dSRamkumar Ramachandra ret void 353*e5b0132dSRamkumar Ramachandra} 354*e5b0132dSRamkumar Ramachandra 3556642cc60SNikita Popovdefine void @sle_from_unknown(i32 %M, i32 %N, i32 %S) { 3566642cc60SNikita Popov; CHECK-LABEL: 'sle_from_unknown' 3576642cc60SNikita Popov; CHECK-NEXT: Determining loop execution counts for: @sle_from_unknown 358ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64)) 359ca478bc6SNikita Popov; CHECK-NEXT: exit count for loop: ((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>)) 3606642cc60SNikita Popov; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N) 361ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 362ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64)) 363ca478bc6SNikita Popov; CHECK-NEXT: symbolic max exit count for loop: ((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>)) 3646642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N) 365ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: Trip multiple is 1 3666642cc60SNikita Popov; 3676642cc60SNikita Popoventry: 3686642cc60SNikita Popov br label %loop 3696642cc60SNikita Popov 3706642cc60SNikita Popovloop: 3716642cc60SNikita Popov %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ] 3726642cc60SNikita Popov %cmp1 = icmp sle i32 %iv, %M 3736642cc60SNikita Popov br i1 %cmp1, label %latch, label %exit 3746642cc60SNikita Popov 3756642cc60SNikita Popovlatch: 3766642cc60SNikita Popov %iv.next = add nsw i32 %iv, 1 3776642cc60SNikita Popov %exitcond.not = icmp eq i32 %iv, %N 3786642cc60SNikita Popov br i1 %exitcond.not, label %exit, label %loop 3796642cc60SNikita Popov 3806642cc60SNikita Popovexit: 3816642cc60SNikita Popov ret void 3826642cc60SNikita Popov} 3836642cc60SNikita Popov 384*e5b0132dSRamkumar Ramachandradefine void @le_from_unknown(i32 %M, i32 %N, i32 %S) { 385*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_unknown' 386*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Determining loop execution counts for: @le_from_unknown 387*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64)) 388*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for loop: ((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) 389*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N) 390*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 391*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64)) 392*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for loop: ((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) 393*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N) 394*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Trip multiple is 1 395*e5b0132dSRamkumar Ramachandra; 396*e5b0132dSRamkumar Ramachandraentry: 397*e5b0132dSRamkumar Ramachandra br label %loop 398*e5b0132dSRamkumar Ramachandra 399*e5b0132dSRamkumar Ramachandraloop: 400*e5b0132dSRamkumar Ramachandra %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ] 401*e5b0132dSRamkumar Ramachandra %cmp1 = icmp samesign ule i32 %iv, %M 402*e5b0132dSRamkumar Ramachandra br i1 %cmp1, label %latch, label %exit 403*e5b0132dSRamkumar Ramachandra 404*e5b0132dSRamkumar Ramachandralatch: 405*e5b0132dSRamkumar Ramachandra %iv.next = add nuw nsw i32 %iv, 1 406*e5b0132dSRamkumar Ramachandra %exitcond.not = icmp eq i32 %iv, %N 407*e5b0132dSRamkumar Ramachandra br i1 %exitcond.not, label %exit, label %loop 408*e5b0132dSRamkumar Ramachandra 409*e5b0132dSRamkumar Ramachandraexit: 410*e5b0132dSRamkumar Ramachandra ret void 411*e5b0132dSRamkumar Ramachandra} 412*e5b0132dSRamkumar Ramachandra 4136642cc60SNikita Popovdefine void @sle_from_int_min_no_nsw(i32 %M, i32 %N) { 4146642cc60SNikita Popov; CHECK-LABEL: 'sle_from_int_min_no_nsw' 4156642cc60SNikita Popov; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min_no_nsw 4166642cc60SNikita Popov; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 4176642cc60SNikita Popov; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 418df3d70b5SDavid Sherwood; CHECK-NEXT: predicated exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw> 419df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 420df3d70b5SDavid Sherwood; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw> 421df3d70b5SDavid Sherwood; CHECK-EMPTY: 4226642cc60SNikita Popov; CHECK-NEXT: exit count for latch: (-2147483648 + %N) 4236642cc60SNikita Popov; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 4246642cc60SNikita Popov; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N) 4256642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 426df3d70b5SDavid Sherwood; CHECK-NEXT: predicated symbolic max exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw> 427df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 428df3d70b5SDavid Sherwood; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw> 429df3d70b5SDavid Sherwood; CHECK-EMPTY: 4306642cc60SNikita Popov; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N) 431ca478bc6SNikita Popov; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>) 432ca478bc6SNikita Popov; CHECK-NEXT: Predicates: 433ca478bc6SNikita Popov; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw> 43402ee96ecSDavid Sherwood; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4294967295 43502ee96ecSDavid Sherwood; CHECK-NEXT: Predicates: 43602ee96ecSDavid Sherwood; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw> 437df3d70b5SDavid Sherwood; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>) 438df3d70b5SDavid Sherwood; CHECK-NEXT: Predicates: 439df3d70b5SDavid Sherwood; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw> 4406642cc60SNikita Popov; 4416642cc60SNikita Popoventry: 4426642cc60SNikita Popov br label %loop 4436642cc60SNikita Popov 4446642cc60SNikita Popovloop: 4456642cc60SNikita Popov %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ] 4466642cc60SNikita Popov %cmp1 = icmp sle i32 %iv, %M 4476642cc60SNikita Popov br i1 %cmp1, label %latch, label %exit 4486642cc60SNikita Popov 4496642cc60SNikita Popovlatch: 4506642cc60SNikita Popov %iv.next = add i32 %iv, 1 4516642cc60SNikita Popov %exitcond.not = icmp eq i32 %iv, %N 4526642cc60SNikita Popov br i1 %exitcond.not, label %exit, label %loop 4536642cc60SNikita Popov 4546642cc60SNikita Popovexit: 4556642cc60SNikita Popov ret void 4566642cc60SNikita Popov} 457*e5b0132dSRamkumar Ramachandra 458*e5b0132dSRamkumar Ramachandradefine void @le_from_int_min_no_nuw_nsw(i32 %M, i32 %N) { 459*e5b0132dSRamkumar Ramachandra; CHECK-LABEL: 'le_from_int_min_no_nuw_nsw' 460*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min_no_nuw_nsw 461*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 462*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 463*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: predicated exit count for loop: (-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw> 464*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Predicates: 465*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw> 466*e5b0132dSRamkumar Ramachandra; CHECK-EMPTY: 467*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: exit count for latch: (-2147483648 + %N) 468*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 469*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N) 470*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 471*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: predicated symbolic max exit count for loop: (-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw> 472*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Predicates: 473*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw> 474*e5b0132dSRamkumar Ramachandra; CHECK-EMPTY: 475*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N) 476*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw> umin_seq (zext i32 (-2147483648 + %N) to i64)) 477*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Predicates: 478*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw> 479*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 2147483648 480*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Predicates: 481*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw> 482*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw> umin_seq (zext i32 (-2147483648 + %N) to i64)) 483*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: Predicates: 484*e5b0132dSRamkumar Ramachandra; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw> 485*e5b0132dSRamkumar Ramachandra; 486*e5b0132dSRamkumar Ramachandraentry: 487*e5b0132dSRamkumar Ramachandra br label %loop 488*e5b0132dSRamkumar Ramachandra 489*e5b0132dSRamkumar Ramachandraloop: 490*e5b0132dSRamkumar Ramachandra %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ] 491*e5b0132dSRamkumar Ramachandra %cmp1 = icmp samesign ule i32 %iv, %M 492*e5b0132dSRamkumar Ramachandra br i1 %cmp1, label %latch, label %exit 493*e5b0132dSRamkumar Ramachandra 494*e5b0132dSRamkumar Ramachandralatch: 495*e5b0132dSRamkumar Ramachandra %iv.next = add i32 %iv, 1 496*e5b0132dSRamkumar Ramachandra %exitcond.not = icmp eq i32 %iv, %N 497*e5b0132dSRamkumar Ramachandra br i1 %exitcond.not, label %exit, label %loop 498*e5b0132dSRamkumar Ramachandra 499*e5b0132dSRamkumar Ramachandraexit: 500*e5b0132dSRamkumar Ramachandra ret void 501*e5b0132dSRamkumar Ramachandra} 502