1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4 2; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s 3 4define void @ule_from_zero(i32 %M, i32 %N) { 5; CHECK-LABEL: 'ule_from_zero' 6; CHECK-NEXT: Determining loop execution counts for: @ule_from_zero 7; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 8; CHECK-NEXT: exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 9; CHECK-NEXT: exit count for latch: %N 10; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 11; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 12; CHECK-NEXT: symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 13; CHECK-NEXT: symbolic max exit count for latch: %N 14; CHECK-NEXT: Loop %loop: Trip multiple is 1 15; 16entry: 17 br label %loop 18 19loop: 20 %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] 21 %cmp1 = icmp ule i32 %iv, %M 22 br i1 %cmp1, label %latch, label %exit 23 24latch: 25 %iv.next = add nuw i32 %iv, 1 26 %exitcond.not = icmp eq i32 %iv, %N 27 br i1 %exitcond.not, label %exit, label %loop 28 29exit: 30 ret void 31} 32 33define void @le_from_zero(i32 %M, i32 %N) { 34; CHECK-LABEL: 'le_from_zero' 35; CHECK-NEXT: Determining loop execution counts for: @le_from_zero 36; 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; CHECK-NEXT: exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 38; CHECK-NEXT: exit count for latch: %N 39; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 40; 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; CHECK-NEXT: symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 42; CHECK-NEXT: symbolic max exit count for latch: %N 43; CHECK-NEXT: Loop %loop: Trip multiple is 1 44; 45entry: 46 br label %loop 47 48loop: 49 %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] 50 %cmp1 = icmp samesign ule i32 %iv, %M 51 br i1 %cmp1, label %latch, label %exit 52 53latch: 54 %iv.next = add nuw i32 %iv, 1 55 %exitcond.not = icmp eq i32 %iv, %N 56 br i1 %exitcond.not, label %exit, label %loop 57 58exit: 59 ret void 60} 61 62define void @ule_from_one(i32 %M, i32 %N) { 63; CHECK-LABEL: 'ule_from_one' 64; CHECK-NEXT: Determining loop execution counts for: @ule_from_one 65; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N)) 66; CHECK-NEXT: exit count for loop: %M 67; CHECK-NEXT: exit count for latch: (-1 + %N) 68; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 69; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N)) 70; CHECK-NEXT: symbolic max exit count for loop: %M 71; CHECK-NEXT: symbolic max exit count for latch: (-1 + %N) 72; CHECK-NEXT: Loop %loop: Trip multiple is 1 73; 74entry: 75 br label %loop 76 77loop: 78 %iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ] 79 %cmp1 = icmp ule i32 %iv, %M 80 br i1 %cmp1, label %latch, label %exit 81 82latch: 83 %iv.next = add nuw i32 %iv, 1 84 %exitcond.not = icmp eq i32 %iv, %N 85 br i1 %exitcond.not, label %exit, label %loop 86 87exit: 88 ret void 89} 90 91define void @le_from_one(i32 %M, i32 %N) { 92; CHECK-LABEL: 'le_from_one' 93; CHECK-NEXT: Determining loop execution counts for: @le_from_one 94; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N)) 95; CHECK-NEXT: exit count for loop: %M 96; CHECK-NEXT: exit count for latch: (-1 + %N) 97; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 98; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N)) 99; CHECK-NEXT: symbolic max exit count for loop: %M 100; CHECK-NEXT: symbolic max exit count for latch: (-1 + %N) 101; CHECK-NEXT: Loop %loop: Trip multiple is 1 102; 103entry: 104 br label %loop 105 106loop: 107 %iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ] 108 %cmp1 = icmp samesign ule i32 %iv, %M 109 br i1 %cmp1, label %latch, label %exit 110 111latch: 112 %iv.next = add nuw i32 %iv, 1 113 %exitcond.not = icmp eq i32 %iv, %N 114 br i1 %exitcond.not, label %exit, label %loop 115 116exit: 117 ret void 118} 119 120define void @ule_from_unknown(i32 %M, i32 %N, i32 %S) { 121; CHECK-LABEL: 'ule_from_unknown' 122; CHECK-NEXT: Determining loop execution counts for: @ule_from_unknown 123; 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)) 124; 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>)) 125; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N) 126; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 127; 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)) 128; 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>)) 129; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N) 130; CHECK-NEXT: Loop %loop: Trip multiple is 1 131; 132entry: 133 br label %loop 134 135loop: 136 %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ] 137 %cmp1 = icmp ule i32 %iv, %M 138 br i1 %cmp1, label %latch, label %exit 139 140latch: 141 %iv.next = add nuw i32 %iv, 1 142 %exitcond.not = icmp eq i32 %iv, %N 143 br i1 %exitcond.not, label %exit, label %loop 144 145exit: 146 ret void 147} 148 149define void @ule_from_zero_no_nuw(i32 %M, i32 %N) { 150; CHECK-LABEL: 'ule_from_zero_no_nuw' 151; CHECK-NEXT: Determining loop execution counts for: @ule_from_zero_no_nuw 152; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 153; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 154; CHECK-NEXT: predicated exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 155; CHECK-NEXT: Predicates: 156; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 157; CHECK-EMPTY: 158; CHECK-NEXT: exit count for latch: %N 159; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 160; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %N 161; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 162; CHECK-NEXT: predicated symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 163; CHECK-NEXT: Predicates: 164; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 165; CHECK-EMPTY: 166; CHECK-NEXT: symbolic max exit count for latch: %N 167; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 168; CHECK-NEXT: Predicates: 169; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 170; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4294967295 171; CHECK-NEXT: Predicates: 172; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 173; 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>) 174; CHECK-NEXT: Predicates: 175; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 176; 177entry: 178 br label %loop 179 180loop: 181 %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] 182 %cmp1 = icmp ule i32 %iv, %M 183 br i1 %cmp1, label %latch, label %exit 184 185latch: 186 %iv.next = add i32 %iv, 1 187 %exitcond.not = icmp eq i32 %iv, %N 188 br i1 %exitcond.not, label %exit, label %loop 189 190exit: 191 ret void 192} 193 194define void @le_from_zero_no_nuw(i32 %M, i32 %N) { 195; CHECK-LABEL: 'le_from_zero_no_nuw' 196; CHECK-NEXT: Determining loop execution counts for: @le_from_zero_no_nuw 197; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 198; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 199; CHECK-NEXT: predicated exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 200; CHECK-NEXT: Predicates: 201; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 202; CHECK-EMPTY: 203; CHECK-NEXT: exit count for latch: %N 204; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 205; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %N 206; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 207; CHECK-NEXT: predicated symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw> 208; CHECK-NEXT: Predicates: 209; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 210; CHECK-EMPTY: 211; CHECK-NEXT: symbolic max exit count for latch: %N 212; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>) 213; CHECK-NEXT: Predicates: 214; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 215; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4294967295 216; CHECK-NEXT: Predicates: 217; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 218; 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; CHECK-NEXT: Predicates: 220; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw> 221; 222entry: 223 br label %loop 224 225loop: 226 %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ] 227 %cmp1 = icmp samesign ule i32 %iv, %M 228 br i1 %cmp1, label %latch, label %exit 229 230latch: 231 %iv.next = add i32 %iv, 1 232 %exitcond.not = icmp eq i32 %iv, %N 233 br i1 %exitcond.not, label %exit, label %loop 234 235exit: 236 ret void 237} 238 239define void @sle_from_int_min(i32 %M, i32 %N) { 240; CHECK-LABEL: 'sle_from_int_min' 241; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min 242; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>) 243; CHECK-NEXT: exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw> 244; CHECK-NEXT: exit count for latch: (-2147483648 + %N) 245; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 246; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>) 247; CHECK-NEXT: symbolic max exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw> 248; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N) 249; CHECK-NEXT: Loop %loop: Trip multiple is 1 250; 251entry: 252 br label %loop 253 254loop: 255 %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ] 256 %cmp1 = icmp sle i32 %iv, %M 257 br i1 %cmp1, label %latch, label %exit 258 259latch: 260 %iv.next = add nsw i32 %iv, 1 261 %exitcond.not = icmp eq i32 %iv, %N 262 br i1 %exitcond.not, label %exit, label %loop 263 264exit: 265 ret void 266} 267 268define void @le_from_int_min(i32 %M, i32 %N) { 269; CHECK-LABEL: 'le_from_int_min' 270; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min 271; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483647 + (2147483647 umax %M)) umin_seq (-2147483648 + %N)) 272; CHECK-NEXT: exit count for loop: (-2147483647 + (2147483647 umax %M)) 273; CHECK-NEXT: exit count for latch: (-2147483648 + %N) 274; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -2147483648 275; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483647 + (2147483647 umax %M)) umin_seq (-2147483648 + %N)) 276; CHECK-NEXT: symbolic max exit count for loop: (-2147483647 + (2147483647 umax %M)) 277; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N) 278; CHECK-NEXT: Loop %loop: Trip multiple is 1 279; 280entry: 281 br label %loop 282 283loop: 284 %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ] 285 %cmp1 = icmp samesign ule i32 %iv, %M 286 br i1 %cmp1, label %latch, label %exit 287 288latch: 289 %iv.next = add nuw nsw i32 %iv, 1 290 %exitcond.not = icmp eq i32 %iv, %N 291 br i1 %exitcond.not, label %exit, label %loop 292 293exit: 294 ret void 295} 296 297define void @sle_from_int_min_plus_one(i32 %M, i32 %N) { 298; CHECK-LABEL: 'sle_from_int_min_plus_one' 299; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min_plus_one 300; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N)) 301; CHECK-NEXT: exit count for loop: (-2147483648 + %M) 302; CHECK-NEXT: exit count for latch: (2147483647 + %N) 303; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 304; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N)) 305; CHECK-NEXT: symbolic max exit count for loop: (-2147483648 + %M) 306; CHECK-NEXT: symbolic max exit count for latch: (2147483647 + %N) 307; CHECK-NEXT: Loop %loop: Trip multiple is 1 308; 309entry: 310 br label %loop 311 312loop: 313 %iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ] 314 %cmp1 = icmp sle i32 %iv, %M 315 br i1 %cmp1, label %latch, label %exit 316 317latch: 318 %iv.next = add nsw i32 %iv, 1 319 %exitcond.not = icmp eq i32 %iv, %N 320 br i1 %exitcond.not, label %exit, label %loop 321 322exit: 323 ret void 324} 325 326define void @le_from_int_min_plus_one(i32 %M, i32 %N) { 327; CHECK-LABEL: 'le_from_int_min_plus_one' 328; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min_plus_one 329; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + (-2147483648 umax %M)) umin_seq (2147483647 + %N)) 330; CHECK-NEXT: exit count for loop: (-2147483648 + (-2147483648 umax %M)) 331; CHECK-NEXT: exit count for latch: (2147483647 + %N) 332; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 2147483647 333; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483648 + (-2147483648 umax %M)) umin_seq (2147483647 + %N)) 334; CHECK-NEXT: symbolic max exit count for loop: (-2147483648 + (-2147483648 umax %M)) 335; CHECK-NEXT: symbolic max exit count for latch: (2147483647 + %N) 336; CHECK-NEXT: Loop %loop: Trip multiple is 1 337; 338entry: 339 br label %loop 340 341loop: 342 %iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ] 343 %cmp1 = icmp samesign ule i32 %iv, %M 344 br i1 %cmp1, label %latch, label %exit 345 346latch: 347 %iv.next = add nuw nsw i32 %iv, 1 348 %exitcond.not = icmp eq i32 %iv, %N 349 br i1 %exitcond.not, label %exit, label %loop 350 351exit: 352 ret void 353} 354 355define void @sle_from_unknown(i32 %M, i32 %N, i32 %S) { 356; CHECK-LABEL: 'sle_from_unknown' 357; CHECK-NEXT: Determining loop execution counts for: @sle_from_unknown 358; 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)) 359; 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>)) 360; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N) 361; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 362; 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)) 363; 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>)) 364; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N) 365; CHECK-NEXT: Loop %loop: Trip multiple is 1 366; 367entry: 368 br label %loop 369 370loop: 371 %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ] 372 %cmp1 = icmp sle i32 %iv, %M 373 br i1 %cmp1, label %latch, label %exit 374 375latch: 376 %iv.next = add nsw i32 %iv, 1 377 %exitcond.not = icmp eq i32 %iv, %N 378 br i1 %exitcond.not, label %exit, label %loop 379 380exit: 381 ret void 382} 383 384define void @le_from_unknown(i32 %M, i32 %N, i32 %S) { 385; CHECK-LABEL: 'le_from_unknown' 386; CHECK-NEXT: Determining loop execution counts for: @le_from_unknown 387; 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; 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; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N) 390; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295 391; 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; 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; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N) 394; CHECK-NEXT: Loop %loop: Trip multiple is 1 395; 396entry: 397 br label %loop 398 399loop: 400 %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ] 401 %cmp1 = icmp samesign ule i32 %iv, %M 402 br i1 %cmp1, label %latch, label %exit 403 404latch: 405 %iv.next = add nuw nsw i32 %iv, 1 406 %exitcond.not = icmp eq i32 %iv, %N 407 br i1 %exitcond.not, label %exit, label %loop 408 409exit: 410 ret void 411} 412 413define void @sle_from_int_min_no_nsw(i32 %M, i32 %N) { 414; CHECK-LABEL: 'sle_from_int_min_no_nsw' 415; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min_no_nsw 416; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 417; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 418; CHECK-NEXT: predicated exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw> 419; CHECK-NEXT: Predicates: 420; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw> 421; CHECK-EMPTY: 422; CHECK-NEXT: exit count for latch: (-2147483648 + %N) 423; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 424; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N) 425; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 426; CHECK-NEXT: predicated symbolic max exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw> 427; CHECK-NEXT: Predicates: 428; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw> 429; CHECK-EMPTY: 430; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N) 431; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>) 432; CHECK-NEXT: Predicates: 433; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw> 434; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4294967295 435; CHECK-NEXT: Predicates: 436; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw> 437; 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>) 438; CHECK-NEXT: Predicates: 439; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw> 440; 441entry: 442 br label %loop 443 444loop: 445 %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ] 446 %cmp1 = icmp sle i32 %iv, %M 447 br i1 %cmp1, label %latch, label %exit 448 449latch: 450 %iv.next = add i32 %iv, 1 451 %exitcond.not = icmp eq i32 %iv, %N 452 br i1 %exitcond.not, label %exit, label %loop 453 454exit: 455 ret void 456} 457 458define void @le_from_int_min_no_nuw_nsw(i32 %M, i32 %N) { 459; CHECK-LABEL: 'le_from_int_min_no_nuw_nsw' 460; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min_no_nuw_nsw 461; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 462; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 463; CHECK-NEXT: predicated exit count for loop: (-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw> 464; CHECK-NEXT: Predicates: 465; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw> 466; CHECK-EMPTY: 467; CHECK-NEXT: exit count for latch: (-2147483648 + %N) 468; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 469; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N) 470; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 471; CHECK-NEXT: predicated symbolic max exit count for loop: (-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw> 472; CHECK-NEXT: Predicates: 473; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw> 474; CHECK-EMPTY: 475; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N) 476; 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; CHECK-NEXT: Predicates: 478; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw> 479; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 2147483648 480; CHECK-NEXT: Predicates: 481; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw> 482; 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; CHECK-NEXT: Predicates: 484; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw> 485; 486entry: 487 br label %loop 488 489loop: 490 %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ] 491 %cmp1 = icmp samesign ule i32 %iv, %M 492 br i1 %cmp1, label %latch, label %exit 493 494latch: 495 %iv.next = add i32 %iv, 1 496 %exitcond.not = icmp eq i32 %iv, %N 497 br i1 %exitcond.not, label %exit, label %loop 498 499exit: 500 ret void 501} 502