1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s 3 4; A collection of tests which exercise SCEV's ability to compute trip counts 5; for negative steps. 6 7; Unsigned Comparisons 8; -------------------- 9 10; Case where we wrap the induction variable (without generating poison), and 11; thus can't currently compute a trip count. 12define void @ult_wrap() { 13; CHECK-LABEL: 'ult_wrap' 14; CHECK-NEXT: Determining loop execution counts for: @ult_wrap 15; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count. 16; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. 17; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. 18; 19entry: 20 br label %for.body 21 22for.body: ; preds = %entry, %for.body 23 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 24 %add = add i8 %i.05, 254 25 %cmp = icmp ult i8 %add, 255 26 br i1 %cmp, label %for.body, label %for.end 27 28for.end: ; preds = %for.body, %entry 29 ret void 30} 31 32; This IV cycles between 0, and 128, never causing the loop to exit 33; (This is well defined.) 34define void @ult_infinite() { 35; CHECK-LABEL: 'ult_infinite' 36; CHECK-NEXT: Determining loop execution counts for: @ult_infinite 37; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count. 38; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. 39; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. 40; 41entry: 42 br label %for.body 43 44for.body: ; preds = %entry, %for.body 45 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 46 %add = add i8 %i.05, 128 47 %cmp = icmp ult i8 %add, 255 48 br i1 %cmp, label %for.body, label %for.end 49 50for.end: ; preds = %for.body, %entry 51 ret void 52} 53 54; Same as ult_infinite, except that the loop is ill defined due to the 55; must progress attribute 56define void @ult_infinite_ub() mustprogress { 57; CHECK-LABEL: 'ult_infinite_ub' 58; CHECK-NEXT: Determining loop execution counts for: @ult_infinite_ub 59; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 1 60; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 1 61; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 1 62; CHECK-NEXT: Loop %for.body: Trip multiple is 2 63; 64entry: 65 br label %for.body 66 67for.body: ; preds = %entry, %for.body 68 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 69 %add = add i8 %i.05, 128 70 %cmp = icmp ult i8 %add, 255 71 br i1 %cmp, label %for.body, label %for.end 72 73for.end: ; preds = %for.body, %entry 74 ret void 75} 76 77 78; Backedge is not taken 79define void @ult_129_not_taken() { 80; CHECK-LABEL: 'ult_129_not_taken' 81; CHECK-NEXT: Determining loop execution counts for: @ult_129_not_taken 82; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 0 83; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 0 84; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 0 85; CHECK-NEXT: Loop %for.body: Trip multiple is 1 86; 87entry: 88 br label %for.body 89 90for.body: ; preds = %entry, %for.body 91 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 92 %add = add i8 %i.05, 129 93 %cmp = icmp ult i8 %add, 128 94 br i1 %cmp, label %for.body, label %for.end 95 96for.end: ; preds = %for.body, %entry 97 ret void 98} 99 100define void @ult_129_unknown_start(i8 %start) mustprogress { 101; CHECK-LABEL: 'ult_129_unknown_start' 102; CHECK-NEXT: Determining loop execution counts for: @ult_129_unknown_start 103; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 0 104; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 0 105; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 0 106; CHECK-NEXT: Loop %for.body: Trip multiple is 1 107; 108entry: 109 br label %for.body 110 111for.body: ; preds = %entry, %for.body 112 %i.05 = phi i8 [ %add, %for.body ], [ %start, %entry ] 113 %add = add nuw i8 %i.05, 129 114 %cmp = icmp ult i8 %add, 128 115 br i1 %cmp, label %for.body, label %for.end 116 117for.end: ; preds = %for.body, %entry 118 ret void 119} 120 121 122; A case with a non-constant stride where the backedge is not taken 123define void @ult_not_taken(i8 %step) { 124; CHECK-LABEL: 'ult_not_taken' 125; CHECK-NEXT: Determining loop execution counts for: @ult_not_taken 126; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count. 127; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. 128; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. 129; 130entry: 131 %assume = icmp ult i8 128, %step 132 call void @llvm.assume(i1 %assume) 133 br label %for.body 134 135for.body: ; preds = %entry, %for.body 136 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 137 %add = add i8 %i.05, %step 138 %cmp = icmp ult i8 %add, 128 139 br i1 %cmp, label %for.body, label %for.end 140 141for.end: ; preds = %for.body, %entry 142 ret void 143} 144 145 146 147; IV does wrap, and thus causes us to branch on poison. This loop is 148; ill defined. 149define void @ult_ub1() { 150; CHECK-LABEL: 'ult_ub1' 151; CHECK-NEXT: Determining loop execution counts for: @ult_ub1 152; CHECK-NEXT: Loop %for.body: backedge-taken count is i32 2 153; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 2 154; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i32 2 155; CHECK-NEXT: Loop %for.body: Trip multiple is 3 156; 157entry: 158 br label %for.body 159 160for.body: ; preds = %entry, %for.body 161 %i.05 = phi i8 [ %add, %for.body ], [ 2, %entry ] 162 %add = add nuw i8 %i.05, 255 163 %cmp = icmp ult i8 %add, 128 164 br i1 %cmp, label %for.body, label %for.end 165 166for.end: ; preds = %for.body, %entry 167 ret void 168} 169 170; This loop is ill defined because we violate the nsw flag on the first 171; iteration. 172define void @ult_ub2() { 173; CHECK-LABEL: 'ult_ub2' 174; CHECK-NEXT: Determining loop execution counts for: @ult_ub2 175; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 0 176; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 0 177; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 0 178; CHECK-NEXT: Loop %for.body: Trip multiple is 1 179; 180entry: 181 br label %for.body 182 183for.body: ; preds = %entry, %for.body 184 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 185 %add = add nsw nuw i8 %i.05, 129 186 %cmp = icmp ult i8 %add, 128 187 br i1 %cmp, label %for.body, label %for.end 188 189for.end: ; preds = %for.body, %entry 190 ret void 191} 192 193; Large stride, poison produced for %add on second iteration, but not 194; branched on. 195define void @ult_129_preinc() { 196; CHECK-LABEL: 'ult_129_preinc' 197; CHECK-NEXT: Determining loop execution counts for: @ult_129_preinc 198; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 1 199; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 1 200; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 1 201; CHECK-NEXT: Loop %for.body: Trip multiple is 2 202; 203entry: 204 br label %for.body 205 206for.body: ; preds = %entry, %for.body 207 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 208 %add = add nuw i8 %i.05, 129 209 %cmp = icmp ult i8 %i.05, 128 210 br i1 %cmp, label %for.body, label %for.end 211 212for.end: ; preds = %for.body, %entry 213 ret void 214} 215 216define void @ult_preinc(i8 %step) { 217; CHECK-LABEL: 'ult_preinc' 218; CHECK-NEXT: Determining loop execution counts for: @ult_preinc 219; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 1 220; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 1 221; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 1 222; CHECK-NEXT: Loop %for.body: Trip multiple is 2 223; 224entry: 225 %assume = icmp ult i8 128, %step 226 call void @llvm.assume(i1 %assume) 227 br label %for.body 228 229for.body: ; preds = %entry, %for.body 230 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 231 %add = add nuw i8 %i.05, 129 232 %cmp = icmp ult i8 %i.05, 128 233 br i1 %cmp, label %for.body, label %for.end 234 235for.end: ; preds = %for.body, %entry 236 ret void 237} 238 239define void @ult_129_varying_rhs(ptr %n_p) { 240; CHECK-LABEL: 'ult_129_varying_rhs' 241; CHECK-NEXT: Determining loop execution counts for: @ult_129_varying_rhs 242; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count. 243; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. 244; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. 245; 246entry: 247 br label %for.body 248 249for.body: ; preds = %entry, %for.body 250 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 251 %add = add nuw i8 %i.05, 129 252 %n = load i8, ptr %n_p 253 %cmp = icmp ult i8 %add, %n 254 br i1 %cmp, label %for.body, label %for.end 255 256for.end: ; preds = %for.body, %entry 257 ret void 258} 259 260define void @ult_symbolic_varying_rhs(ptr %n_p, i8 %step) { 261; CHECK-LABEL: 'ult_symbolic_varying_rhs' 262; CHECK-NEXT: Determining loop execution counts for: @ult_symbolic_varying_rhs 263; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count. 264; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. 265; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. 266; 267entry: 268 %assume = icmp ult i8 128, %step 269 call void @llvm.assume(i1 %assume) 270 br label %for.body 271 272for.body: ; preds = %entry, %for.body 273 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 274 %add = add nuw i8 %i.05, %step 275 %n = load i8, ptr %n_p 276 %cmp = icmp ult i8 %add, %n 277 br i1 %cmp, label %for.body, label %for.end 278 279for.end: ; preds = %for.body, %entry 280 ret void 281} 282 283 284; Signed Comparisons 285; ------------------ 286 287; Case where we wrap the induction variable (without generating poison), and 288; thus can't currently compute a trip count. 289define void @slt_wrap() { 290; CHECK-LABEL: 'slt_wrap' 291; CHECK-NEXT: Determining loop execution counts for: @slt_wrap 292; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 63 293; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 63 294; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 63 295; CHECK-NEXT: Loop %for.body: Trip multiple is 64 296; 297entry: 298 br label %for.body 299 300for.body: ; preds = %entry, %for.body 301 %i.05 = phi i8 [ %add, %for.body ], [ 255, %entry ] 302 %add = add i8 %i.05, 254 303 %cmp = icmp slt i8 %add, 127 304 br i1 %cmp, label %for.body, label %for.end 305 306for.end: ; preds = %for.body, %entry 307 ret void 308} 309 310; This IV cycles between 0, and int_min (128), never causing the loop to exit 311; (This is well defined.) 312define void @slt_infinite() { 313; CHECK-LABEL: 'slt_infinite' 314; CHECK-NEXT: Determining loop execution counts for: @slt_infinite 315; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count. 316; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. 317; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. 318; 319entry: 320 br label %for.body 321 322for.body: ; preds = %entry, %for.body 323 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 324 %add = add i8 %i.05, 128 325 %cmp = icmp slt i8 %add, 127 326 br i1 %cmp, label %for.body, label %for.end 327 328for.end: ; preds = %for.body, %entry 329 ret void 330} 331 332; Same as slt_infinite, except that the loop is ill defined due to the 333; must progress attribute 334define void @slt_infinite_ub() mustprogress { 335; CHECK-LABEL: 'slt_infinite_ub' 336; CHECK-NEXT: Determining loop execution counts for: @slt_infinite_ub 337; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 0 338; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 0 339; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 0 340; CHECK-NEXT: Loop %for.body: Trip multiple is 1 341; 342entry: 343 br label %for.body 344 345for.body: ; preds = %entry, %for.body 346 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 347 %add = add i8 %i.05, 128 348 %cmp = icmp slt i8 %add, 127 349 br i1 %cmp, label %for.body, label %for.end 350 351for.end: ; preds = %for.body, %entry 352 ret void 353} 354 355 356; Backedge is not taken 357define void @slt_129_not_taken() { 358; CHECK-LABEL: 'slt_129_not_taken' 359; CHECK-NEXT: Determining loop execution counts for: @slt_129_not_taken 360; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 0 361; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 0 362; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 0 363; CHECK-NEXT: Loop %for.body: Trip multiple is 1 364; 365entry: 366 br label %for.body 367 368for.body: ; preds = %entry, %for.body 369 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ] 370 %add = add i8 %i.05, 129 371 %cmp = icmp slt i8 %add, 0 372 br i1 %cmp, label %for.body, label %for.end 373 374for.end: ; preds = %for.body, %entry 375 ret void 376} 377 378; A case with a non-constant stride where the backedge is not taken 379define void @slt_not_taken(i8 %step) { 380; CHECK-LABEL: 'slt_not_taken' 381; CHECK-NEXT: Determining loop execution counts for: @slt_not_taken 382; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count. 383; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. 384; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. 385; 386entry: 387 %assume = icmp ult i8 128, %step 388 call void @llvm.assume(i1 %assume) 389 br label %for.body 390 391for.body: ; preds = %entry, %for.body 392 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ] 393 %add = add i8 %i.05, %step 394 %cmp = icmp slt i8 %add, 0 395 br i1 %cmp, label %for.body, label %for.end 396 397for.end: ; preds = %for.body, %entry 398 ret void 399} 400 401define void @slt_129_unknown_start(i8 %start) mustprogress { 402; CHECK-LABEL: 'slt_129_unknown_start' 403; CHECK-NEXT: Determining loop execution counts for: @slt_129_unknown_start 404; CHECK-NEXT: Loop %for.body: backedge-taken count is (((127 + (-1 * (1 umin (127 + (-1 * %start) + (0 smax (-127 + %start)<nsw>))))<nuw><nsw> + (-1 * %start) + (0 smax (-127 + %start)<nsw>)) /u -127) + (1 umin (127 + (-1 * %start) + (0 smax (-127 + %start)<nsw>)))) 405; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 2 406; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (((127 + (-1 * (1 umin (127 + (-1 * %start) + (0 smax (-127 + %start)<nsw>))))<nuw><nsw> + (-1 * %start) + (0 smax (-127 + %start)<nsw>)) /u -127) + (1 umin (127 + (-1 * %start) + (0 smax (-127 + %start)<nsw>)))) 407; CHECK-NEXT: Loop %for.body: Trip multiple is 1 408; 409entry: 410 br label %for.body 411 412for.body: ; preds = %entry, %for.body 413 %i.05 = phi i8 [ %add, %for.body ], [ %start, %entry ] 414 %add = add nsw i8 %i.05, 129 415 %cmp = icmp slt i8 %add, 0 416 br i1 %cmp, label %for.body, label %for.end 417 418for.end: ; preds = %for.body, %entry 419 ret void 420} 421 422 423; IV does wrap, and thus causes us to branch on poison. This loop is 424; ill defined. 425define void @slt_ub1() { 426; CHECK-LABEL: 'slt_ub1' 427; CHECK-NEXT: Determining loop execution counts for: @slt_ub1 428; CHECK-NEXT: Loop %for.body: backedge-taken count is i1 false 429; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i1 false 430; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i1 false 431; CHECK-NEXT: Loop %for.body: Trip multiple is 1 432; 433entry: 434 br label %for.body 435 436for.body: ; preds = %entry, %for.body 437 %i.05 = phi i8 [ %add, %for.body ], [ 2, %entry ] 438 %add = add nuw i8 %i.05, 255 439 %cmp = icmp slt i8 %add, 128 440 br i1 %cmp, label %for.body, label %for.end 441 442for.end: ; preds = %for.body, %entry 443 ret void 444} 445 446; This loop is ill defined because we violate the nsw flag on the first 447; iteration. 448define void @slt_ub2() { 449; CHECK-LABEL: 'slt_ub2' 450; CHECK-NEXT: Determining loop execution counts for: @slt_ub2 451; CHECK-NEXT: Loop %for.body: backedge-taken count is i1 false 452; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i1 false 453; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i1 false 454; CHECK-NEXT: Loop %for.body: Trip multiple is 1 455; 456entry: 457 br label %for.body 458 459for.body: ; preds = %entry, %for.body 460 %i.05 = phi i8 [ %add, %for.body ], [ 0, %entry ] 461 %add = add nsw nuw i8 %i.05, 129 462 %cmp = icmp slt i8 %add, 128 463 br i1 %cmp, label %for.body, label %for.end 464 465for.end: ; preds = %for.body, %entry 466 ret void 467} 468 469; Large stride, poison produced for %add on second iteration, but not 470; branched on. 471define void @slt_129_preinc() { 472; CHECK-LABEL: 'slt_129_preinc' 473; CHECK-NEXT: Determining loop execution counts for: @slt_129_preinc 474; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 1 475; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 1 476; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 1 477; CHECK-NEXT: Loop %for.body: Trip multiple is 2 478; 479entry: 480 br label %for.body 481 482for.body: ; preds = %entry, %for.body 483 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ] 484 %add = add nuw i8 %i.05, 129 485 %cmp = icmp slt i8 %i.05, 0 486 br i1 %cmp, label %for.body, label %for.end 487 488for.end: ; preds = %for.body, %entry 489 ret void 490} 491 492define void @slt_preinc(i8 %step) { 493; CHECK-LABEL: 'slt_preinc' 494; CHECK-NEXT: Determining loop execution counts for: @slt_preinc 495; CHECK-NEXT: Loop %for.body: backedge-taken count is i8 1 496; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i8 1 497; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is i8 1 498; CHECK-NEXT: Loop %for.body: Trip multiple is 2 499; 500entry: 501 %assume = icmp ult i8 128, %step 502 call void @llvm.assume(i1 %assume) 503 br label %for.body 504 505for.body: ; preds = %entry, %for.body 506 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ] 507 %add = add nuw i8 %i.05, 129 508 %cmp = icmp slt i8 %i.05, 0 509 br i1 %cmp, label %for.body, label %for.end 510 511for.end: ; preds = %for.body, %entry 512 ret void 513} 514 515define void @slt_129_varying_rhs(ptr %n_p) { 516; CHECK-LABEL: 'slt_129_varying_rhs' 517; CHECK-NEXT: Determining loop execution counts for: @slt_129_varying_rhs 518; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count. 519; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. 520; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. 521; 522entry: 523 br label %for.body 524 525for.body: ; preds = %entry, %for.body 526 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ] 527 %add = add nsw i8 %i.05, 129 528 %n = load i8, ptr %n_p 529 %cmp = icmp slt i8 %add, %n 530 br i1 %cmp, label %for.body, label %for.end 531 532for.end: ; preds = %for.body, %entry 533 ret void 534} 535 536define void @slt_symbolic_varying_rhs(ptr %n_p, i8 %step) { 537; CHECK-LABEL: 'slt_symbolic_varying_rhs' 538; CHECK-NEXT: Determining loop execution counts for: @slt_symbolic_varying_rhs 539; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count. 540; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count. 541; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count. 542; 543entry: 544 %assume = icmp ult i8 128, %step 545 call void @llvm.assume(i1 %assume) 546 br label %for.body 547 548for.body: ; preds = %entry, %for.body 549 %i.05 = phi i8 [ %add, %for.body ], [ -128, %entry ] 550 %add = add nsw i8 %i.05, %step 551 %n = load i8, ptr %n_p 552 %cmp = icmp slt i8 %add, %n 553 br i1 %cmp, label %for.body, label %for.end 554 555for.end: ; preds = %for.body, %entry 556 ret void 557} 558 559declare void @llvm.assume(i1) 560 561; Test case for PR57818. 562define void @step_is_neg_addrec_slt_8(i64 %n) { 563; CHECK-LABEL: 'step_is_neg_addrec_slt_8' 564; CHECK-NEXT: Determining loop execution counts for: @step_is_neg_addrec_slt_8 565; CHECK-NEXT: Loop %inner: backedge-taken count is (7 /u {0,+,-1}<%outer.header>) 566; CHECK-NEXT: Loop %inner: constant max backedge-taken count is i32 8 567; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is (7 /u {0,+,-1}<%outer.header>) 568; CHECK-NEXT: Loop %inner: Trip multiple is 1 569; CHECK-NEXT: Loop %outer.header: backedge-taken count is i64 0 570; CHECK-NEXT: Loop %outer.header: constant max backedge-taken count is i64 0 571; CHECK-NEXT: Loop %outer.header: symbolic max backedge-taken count is i64 0 572; CHECK-NEXT: Loop %outer.header: Trip multiple is 1 573; 574entry: 575 br label %outer.header 576 577outer.header: 578 %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ] 579 %ec.1 = icmp eq i64 %outer.iv, 100 580 br i1 %ec.1, label %inner.ph, label %exit 581 582inner.ph: 583 %outer.trunc = trunc i64 %outer.iv to i32 584 br label %inner 585 586inner: 587 %inner.iv = phi i32 [ 0, %inner.ph ], [ %inner.iv.next, %inner ] 588 %inner.iv.next = add nsw i32 %inner.iv, %outer.trunc 589 %inner.c = icmp slt i32 %inner.iv.next, 8 590 br i1 %inner.c, label %inner, label %outer.latch, !llvm.loop !0 591 592outer.latch: 593 %outer.iv.next = add nsw i64 %outer.iv, -1 594 br label %outer.header 595 596exit: 597 ret void 598} 599 600define void @step_is_neg_addrec_slt_var(i32 %n) { 601; CHECK-LABEL: 'step_is_neg_addrec_slt_var' 602; CHECK-NEXT: Determining loop execution counts for: @step_is_neg_addrec_slt_var 603; CHECK-NEXT: Loop %inner: backedge-taken count is ({0,+,1}<nuw><nsw><%outer.header> + ({0,+,-1}<nsw><%outer.header> smax %n)) 604; CHECK-NEXT: Loop %inner: constant max backedge-taken count is i32 2147483647 605; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is ({0,+,1}<nuw><nsw><%outer.header> + ({0,+,-1}<nsw><%outer.header> smax %n)) 606; CHECK-NEXT: Loop %inner: Trip multiple is 1 607; CHECK-NEXT: Loop %outer.header: backedge-taken count is i64 0 608; CHECK-NEXT: Loop %outer.header: constant max backedge-taken count is i64 0 609; CHECK-NEXT: Loop %outer.header: symbolic max backedge-taken count is i64 0 610; CHECK-NEXT: Loop %outer.header: Trip multiple is 1 611; 612entry: 613 br label %outer.header 614 615outer.header: 616 %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ] 617 %ec.1 = icmp eq i64 %outer.iv, 100 618 br i1 %ec.1, label %inner.ph, label %exit 619 620inner.ph: 621 %outer.trunc = trunc i64 %outer.iv to i32 622 br label %inner 623 624inner: 625 %inner.iv = phi i32 [ 0, %inner.ph ], [ %inner.iv.next, %inner ] 626 %inner.iv.next = add nsw i32 %inner.iv, %outer.trunc 627 %inner.c = icmp slt i32 %inner.iv.next, %n 628 br i1 %inner.c, label %inner, label %outer.latch, !llvm.loop !0 629 630outer.latch: 631 %outer.iv.next = add nsw i64 %outer.iv, -1 632 br label %outer.header 633 634exit: 635 ret void 636} 637 638define void @step_is_neg_addrec_unknown_start(i32 %n) { 639; CHECK-LABEL: 'step_is_neg_addrec_unknown_start' 640; CHECK-NEXT: Determining loop execution counts for: @step_is_neg_addrec_unknown_start 641; CHECK-NEXT: Loop %inner: backedge-taken count is ({(-1 * %n),+,1}<nw><%outer.header> + (8 smax {%n,+,-1}<nsw><%outer.header>)) 642; CHECK-NEXT: Loop %inner: constant max backedge-taken count is i32 -2147483640 643; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is ({(-1 * %n),+,1}<nw><%outer.header> + (8 smax {%n,+,-1}<nsw><%outer.header>)) 644; CHECK-NEXT: Loop %inner: Trip multiple is 1 645; CHECK-NEXT: Loop %outer.header: backedge-taken count is i64 0 646; CHECK-NEXT: Loop %outer.header: constant max backedge-taken count is i64 0 647; CHECK-NEXT: Loop %outer.header: symbolic max backedge-taken count is i64 0 648; CHECK-NEXT: Loop %outer.header: Trip multiple is 1 649; 650entry: 651 br label %outer.header 652 653outer.header: 654 %outer.iv = phi i64 [ 0, %entry ], [ %outer.iv.next, %outer.latch ] 655 %ec.1 = icmp eq i64 %outer.iv, 100 656 br i1 %ec.1, label %inner.ph, label %exit 657 658inner.ph: 659 %outer.trunc = trunc i64 %outer.iv to i32 660 br label %inner 661 662inner: 663 %inner.iv = phi i32 [ %n, %inner.ph ], [ %inner.iv.next, %inner ] 664 %inner.iv.next = add nsw i32 %inner.iv, %outer.trunc 665 %inner.c = icmp slt i32 %inner.iv.next, 8 666 br i1 %inner.c, label %inner, label %outer.latch, !llvm.loop !0 667 668outer.latch: 669 %outer.iv.next = add nsw i64 %outer.iv, -1 670 br label %outer.header 671 672exit: 673 ret void 674} 675 676!0 = distinct !{!0, !1} 677!1 = !{!"llvm.loop.mustprogress"} 678