1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -passes=loop-deletion -S | FileCheck %s 3; RUN: opt < %s -passes='loop(loop-deletion)' -S | FileCheck %s 4 5; The idea is that we know that %is.positive is true on the 1st iteration, 6; it means that we can evaluate %merge.phi = %sub on the 1st iteration, 7; and therefore prove that %sum.next = %sum + %sub = %sum + %limit - %sum = %limit, 8; and predicate is false. 9 10; TODO: We can break the backedge here. 11define i32 @test_ne(i32 %limit) { 12; CHECK-LABEL: @test_ne( 13; CHECK-NEXT: entry: 14; CHECK-NEXT: [[LOOP_GUARD:%.*]] = icmp sgt i32 [[LIMIT:%.*]], 0 15; CHECK-NEXT: br i1 [[LOOP_GUARD]], label [[LOOP_PREHEADER:%.*]], label [[FAILURE:%.*]] 16; CHECK: loop.preheader: 17; CHECK-NEXT: br label [[LOOP:%.*]] 18; CHECK: loop: 19; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] 20; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT]], [[SUM]] 21; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 22; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]] 23; CHECK: if.false: 24; CHECK-NEXT: br label [[BACKEDGE]] 25; CHECK: backedge: 26; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 27; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]] 28; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], [[LIMIT]] 29; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]] 30; CHECK: done: 31; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 32; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 33; CHECK: failure: 34; CHECK-NEXT: unreachable 35; 36entry: 37 %loop_guard = icmp sgt i32 %limit, 0 38 br i1 %loop_guard, label %loop, label %failure 39 40loop: ; preds = %backedge, %entry 41 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 42 %sub = sub i32 %limit, %sum 43 %is.positive = icmp sgt i32 %sub, 0 44 br i1 %is.positive, label %backedge, label %if.false 45 46if.false: ; preds = %loop 47 br label %backedge 48 49backedge: ; preds = %if.false, %loop 50 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 51 %sum.next = add i32 %sum, %merge.phi 52 %loop.cond = icmp ne i32 %sum.next, %limit 53 br i1 %loop.cond, label %loop, label %done 54 55done: ; preds = %backedge 56 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 57 ret i32 %sum.next.lcssa 58 59failure: 60 unreachable 61} 62 63; TODO: We can break the backedge here. 64define i32 @test_slt(i32 %limit) { 65; CHECK-LABEL: @test_slt( 66; CHECK-NEXT: entry: 67; CHECK-NEXT: [[LOOP_GUARD:%.*]] = icmp sgt i32 [[LIMIT:%.*]], 0 68; CHECK-NEXT: br i1 [[LOOP_GUARD]], label [[LOOP_PREHEADER:%.*]], label [[FAILURE:%.*]] 69; CHECK: loop.preheader: 70; CHECK-NEXT: br label [[LOOP:%.*]] 71; CHECK: loop: 72; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] 73; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT]], [[SUM]] 74; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 75; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]] 76; CHECK: if.false: 77; CHECK-NEXT: br label [[BACKEDGE]] 78; CHECK: backedge: 79; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 80; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]] 81; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[SUM_NEXT]], [[LIMIT]] 82; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]] 83; CHECK: done: 84; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 85; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 86; CHECK: failure: 87; CHECK-NEXT: unreachable 88; 89entry: 90 %loop_guard = icmp sgt i32 %limit, 0 91 br i1 %loop_guard, label %loop, label %failure 92 93loop: ; preds = %backedge, %entry 94 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 95 %sub = sub i32 %limit, %sum 96 %is.positive = icmp sgt i32 %sub, 0 97 br i1 %is.positive, label %backedge, label %if.false 98 99if.false: ; preds = %loop 100 br label %backedge 101 102backedge: ; preds = %if.false, %loop 103 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 104 %sum.next = add i32 %sum, %merge.phi 105 %loop.cond = icmp slt i32 %sum.next, %limit 106 br i1 %loop.cond, label %loop, label %done 107 108done: ; preds = %backedge 109 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 110 ret i32 %sum.next.lcssa 111 112failure: 113 unreachable 114} 115 116; TODO: We can break the backedge here. 117define i32 @test_ult(i32 %limit) { 118; CHECK-LABEL: @test_ult( 119; CHECK-NEXT: entry: 120; CHECK-NEXT: [[LOOP_GUARD:%.*]] = icmp sgt i32 [[LIMIT:%.*]], 0 121; CHECK-NEXT: br i1 [[LOOP_GUARD]], label [[LOOP_PREHEADER:%.*]], label [[FAILURE:%.*]] 122; CHECK: loop.preheader: 123; CHECK-NEXT: br label [[LOOP:%.*]] 124; CHECK: loop: 125; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] 126; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT]], [[SUM]] 127; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 128; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]] 129; CHECK: if.false: 130; CHECK-NEXT: br label [[BACKEDGE]] 131; CHECK: backedge: 132; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 133; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]] 134; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ult i32 [[SUM_NEXT]], [[LIMIT]] 135; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]] 136; CHECK: done: 137; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 138; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 139; CHECK: failure: 140; CHECK-NEXT: unreachable 141; 142entry: 143 %loop_guard = icmp sgt i32 %limit, 0 144 br i1 %loop_guard, label %loop, label %failure 145 146loop: ; preds = %backedge, %entry 147 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 148 %sub = sub i32 %limit, %sum 149 %is.positive = icmp sgt i32 %sub, 0 150 br i1 %is.positive, label %backedge, label %if.false 151 152if.false: ; preds = %loop 153 br label %backedge 154 155backedge: ; preds = %if.false, %loop 156 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 157 %sum.next = add i32 %sum, %merge.phi 158 %loop.cond = icmp ult i32 %sum.next, %limit 159 br i1 %loop.cond, label %loop, label %done 160 161done: ; preds = %backedge 162 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 163 ret i32 %sum.next.lcssa 164 165failure: 166 unreachable 167} 168 169; TODO: We can break the backedge here. 170define i32 @test_sgt(i32 %limit) { 171; CHECK-LABEL: @test_sgt( 172; CHECK-NEXT: entry: 173; CHECK-NEXT: [[LOOP_GUARD:%.*]] = icmp sgt i32 [[LIMIT:%.*]], 0 174; CHECK-NEXT: br i1 [[LOOP_GUARD]], label [[LOOP_PREHEADER:%.*]], label [[FAILURE:%.*]] 175; CHECK: loop.preheader: 176; CHECK-NEXT: br label [[LOOP:%.*]] 177; CHECK: loop: 178; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] 179; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT]], [[SUM]] 180; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 181; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]] 182; CHECK: if.false: 183; CHECK-NEXT: br label [[BACKEDGE]] 184; CHECK: backedge: 185; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 186; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]] 187; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp sgt i32 [[SUM_NEXT]], [[LIMIT]] 188; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]] 189; CHECK: done: 190; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 191; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 192; CHECK: failure: 193; CHECK-NEXT: unreachable 194; 195entry: 196 %loop_guard = icmp sgt i32 %limit, 0 197 br i1 %loop_guard, label %loop, label %failure 198 199loop: ; preds = %backedge, %entry 200 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 201 %sub = sub i32 %limit, %sum 202 %is.positive = icmp sgt i32 %sub, 0 203 br i1 %is.positive, label %backedge, label %if.false 204 205if.false: ; preds = %loop 206 br label %backedge 207 208backedge: ; preds = %if.false, %loop 209 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 210 %sum.next = add i32 %sum, %merge.phi 211 %loop.cond = icmp sgt i32 %sum.next, %limit 212 br i1 %loop.cond, label %loop, label %done 213 214done: ; preds = %backedge 215 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 216 ret i32 %sum.next.lcssa 217 218failure: 219 unreachable 220} 221 222; TODO: We can break the backedge here. 223define i32 @test_ugt(i32 %limit) { 224; CHECK-LABEL: @test_ugt( 225; CHECK-NEXT: entry: 226; CHECK-NEXT: [[LOOP_GUARD:%.*]] = icmp sgt i32 [[LIMIT:%.*]], 0 227; CHECK-NEXT: br i1 [[LOOP_GUARD]], label [[LOOP_PREHEADER:%.*]], label [[FAILURE:%.*]] 228; CHECK: loop.preheader: 229; CHECK-NEXT: br label [[LOOP:%.*]] 230; CHECK: loop: 231; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] 232; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT]], [[SUM]] 233; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 234; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE]], label [[IF_FALSE:%.*]] 235; CHECK: if.false: 236; CHECK-NEXT: br label [[BACKEDGE]] 237; CHECK: backedge: 238; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 239; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]] 240; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ugt i32 [[SUM_NEXT]], [[LIMIT]] 241; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]] 242; CHECK: done: 243; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 244; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 245; CHECK: failure: 246; CHECK-NEXT: unreachable 247; 248entry: 249 %loop_guard = icmp sgt i32 %limit, 0 250 br i1 %loop_guard, label %loop, label %failure 251 252loop: ; preds = %backedge, %entry 253 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 254 %sub = sub i32 %limit, %sum 255 %is.positive = icmp sgt i32 %sub, 0 256 br i1 %is.positive, label %backedge, label %if.false 257 258if.false: ; preds = %loop 259 br label %backedge 260 261backedge: ; preds = %if.false, %loop 262 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 263 %sum.next = add i32 %sum, %merge.phi 264 %loop.cond = icmp ugt i32 %sum.next, %limit 265 br i1 %loop.cond, label %loop, label %done 266 267done: ; preds = %backedge 268 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 269 ret i32 %sum.next.lcssa 270 271failure: 272 unreachable 273} 274 275; TODO: We can break the backedge here. 276define i32 @test_multiple_pred(i32 %limit) { 277; CHECK-LABEL: @test_multiple_pred( 278; CHECK-NEXT: entry: 279; CHECK-NEXT: [[LOOP_GUARD:%.*]] = icmp sgt i32 [[LIMIT:%.*]], 0 280; CHECK-NEXT: br i1 [[LOOP_GUARD]], label [[LOOP_PREHEADER:%.*]], label [[FAILURE:%.*]] 281; CHECK: loop.preheader: 282; CHECK-NEXT: br label [[LOOP:%.*]] 283; CHECK: loop: 284; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[BACKEDGE:%.*]] ], [ 0, [[LOOP_PREHEADER]] ] 285; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT]], [[SUM]] 286; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 287; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 288; CHECK: if.true: 289; CHECK-NEXT: switch i32 [[LIMIT]], label [[FAILURE_LOOPEXIT:%.*]] [ 290; CHECK-NEXT: i32 100, label [[BACKEDGE]] 291; CHECK-NEXT: i32 200, label [[BACKEDGE]] 292; CHECK-NEXT: ] 293; CHECK: if.false: 294; CHECK-NEXT: br label [[BACKEDGE]] 295; CHECK: backedge: 296; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[IF_TRUE]] ], [ [[SUB]], [[IF_TRUE]] ] 297; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[MERGE_PHI]] 298; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], [[LIMIT]] 299; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]] 300; CHECK: done: 301; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 302; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 303; CHECK: failure.loopexit: 304; CHECK-NEXT: br label [[FAILURE]] 305; CHECK: failure: 306; CHECK-NEXT: unreachable 307; 308entry: 309 %loop_guard = icmp sgt i32 %limit, 0 310 br i1 %loop_guard, label %loop, label %failure 311 312loop: ; preds = %backedge, %entry 313 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 314 %sub = sub i32 %limit, %sum 315 %is.positive = icmp sgt i32 %sub, 0 316 br i1 %is.positive, label %if.true, label %if.false 317 318if.true: 319 switch i32 %limit, label %failure [ 320 i32 100, label %backedge 321 i32 200, label %backedge 322 ] 323 324if.false: ; preds = %loop 325 br label %backedge 326 327backedge: 328 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %if.true ], [ %sub, %if.true ] 329 %sum.next = add i32 %sum, %merge.phi 330 %loop.cond = icmp ne i32 %sum.next, %limit 331 br i1 %loop.cond, label %loop, label %done 332 333done: ; preds = %backedge 334 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 335 ret i32 %sum.next.lcssa 336 337failure: 338 unreachable 339} 340 341define i32 @test_ne_const() { 342; CHECK-LABEL: @test_ne_const( 343; CHECK-NEXT: entry: 344; CHECK-NEXT: br label [[LOOP:%.*]] 345; CHECK: loop: 346; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 347; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 348; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 349; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]] 350; CHECK: if.false: 351; CHECK-NEXT: br label [[BACKEDGE]] 352; CHECK: backedge: 353; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 354; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 355; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4 356; CHECK-NEXT: br label [[DONE:%.*]] 357; CHECK: done: 358; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 359; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 360; CHECK: failure: 361; CHECK-NEXT: unreachable 362; 363entry: 364 365 br label %loop 366 367loop: ; preds = %backedge, %entry 368 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 369 %sub = sub i32 4, %sum 370 %is.positive = icmp sgt i32 %sub, 0 371 br i1 %is.positive, label %backedge, label %if.false 372 373if.false: ; preds = %loop 374 br label %backedge 375 376backedge: ; preds = %if.false, %loop 377 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 378 %sum.next = add i32 %sum, %merge.phi 379 %loop.cond = icmp ne i32 %sum.next, 4 380 br i1 %loop.cond, label %loop, label %done 381 382done: ; preds = %backedge 383 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 384 ret i32 %sum.next.lcssa 385 386failure: 387 unreachable 388} 389 390define i32 @test_slt_const() { 391; CHECK-LABEL: @test_slt_const( 392; CHECK-NEXT: entry: 393; CHECK-NEXT: br label [[LOOP:%.*]] 394; CHECK: loop: 395; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 396; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 397; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 398; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]] 399; CHECK: if.false: 400; CHECK-NEXT: br label [[BACKEDGE]] 401; CHECK: backedge: 402; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 403; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 404; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp slt i32 [[SUM_NEXT]], 4 405; CHECK-NEXT: br label [[DONE:%.*]] 406; CHECK: done: 407; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 408; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 409; CHECK: failure: 410; CHECK-NEXT: unreachable 411; 412entry: 413 414 br label %loop 415 416loop: ; preds = %backedge, %entry 417 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 418 %sub = sub i32 4, %sum 419 %is.positive = icmp sgt i32 %sub, 0 420 br i1 %is.positive, label %backedge, label %if.false 421 422if.false: ; preds = %loop 423 br label %backedge 424 425backedge: ; preds = %if.false, %loop 426 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 427 %sum.next = add i32 %sum, %merge.phi 428 %loop.cond = icmp slt i32 %sum.next, 4 429 br i1 %loop.cond, label %loop, label %done 430 431done: ; preds = %backedge 432 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 433 ret i32 %sum.next.lcssa 434 435failure: 436 unreachable 437} 438 439define i32 @test_ult_const() { 440; CHECK-LABEL: @test_ult_const( 441; CHECK-NEXT: entry: 442; CHECK-NEXT: br label [[LOOP:%.*]] 443; CHECK: loop: 444; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 445; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 446; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 447; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]] 448; CHECK: if.false: 449; CHECK-NEXT: br label [[BACKEDGE]] 450; CHECK: backedge: 451; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 452; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 453; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ult i32 [[SUM_NEXT]], 4 454; CHECK-NEXT: br label [[DONE:%.*]] 455; CHECK: done: 456; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 457; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 458; CHECK: failure: 459; CHECK-NEXT: unreachable 460; 461entry: 462 463 br label %loop 464 465loop: ; preds = %backedge, %entry 466 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 467 %sub = sub i32 4, %sum 468 %is.positive = icmp sgt i32 %sub, 0 469 br i1 %is.positive, label %backedge, label %if.false 470 471if.false: ; preds = %loop 472 br label %backedge 473 474backedge: ; preds = %if.false, %loop 475 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 476 %sum.next = add i32 %sum, %merge.phi 477 %loop.cond = icmp ult i32 %sum.next, 4 478 br i1 %loop.cond, label %loop, label %done 479 480done: ; preds = %backedge 481 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 482 ret i32 %sum.next.lcssa 483 484failure: 485 unreachable 486} 487 488define i32 @test_sgt_const() { 489; CHECK-LABEL: @test_sgt_const( 490; CHECK-NEXT: entry: 491; CHECK-NEXT: br label [[LOOP:%.*]] 492; CHECK: loop: 493; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 494; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 495; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 496; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]] 497; CHECK: if.false: 498; CHECK-NEXT: br label [[BACKEDGE]] 499; CHECK: backedge: 500; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 501; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 502; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp sgt i32 [[SUM_NEXT]], 4 503; CHECK-NEXT: br label [[DONE:%.*]] 504; CHECK: done: 505; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 506; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 507; CHECK: failure: 508; CHECK-NEXT: unreachable 509; 510entry: 511 512 br label %loop 513 514loop: ; preds = %backedge, %entry 515 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 516 %sub = sub i32 4, %sum 517 %is.positive = icmp sgt i32 %sub, 0 518 br i1 %is.positive, label %backedge, label %if.false 519 520if.false: ; preds = %loop 521 br label %backedge 522 523backedge: ; preds = %if.false, %loop 524 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 525 %sum.next = add i32 %sum, %merge.phi 526 %loop.cond = icmp sgt i32 %sum.next, 4 527 br i1 %loop.cond, label %loop, label %done 528 529done: ; preds = %backedge 530 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 531 ret i32 %sum.next.lcssa 532 533failure: 534 unreachable 535} 536 537define i32 @test_ugt_const() { 538; CHECK-LABEL: @test_ugt_const( 539; CHECK-NEXT: entry: 540; CHECK-NEXT: br label [[LOOP:%.*]] 541; CHECK: loop: 542; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 543; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 544; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 545; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]] 546; CHECK: if.false: 547; CHECK-NEXT: br label [[BACKEDGE]] 548; CHECK: backedge: 549; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 550; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 551; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ugt i32 [[SUM_NEXT]], 4 552; CHECK-NEXT: br label [[DONE:%.*]] 553; CHECK: done: 554; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 555; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 556; CHECK: failure: 557; CHECK-NEXT: unreachable 558; 559entry: 560 561 br label %loop 562 563loop: ; preds = %backedge, %entry 564 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 565 %sub = sub i32 4, %sum 566 %is.positive = icmp sgt i32 %sub, 0 567 br i1 %is.positive, label %backedge, label %if.false 568 569if.false: ; preds = %loop 570 br label %backedge 571 572backedge: ; preds = %if.false, %loop 573 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 574 %sum.next = add i32 %sum, %merge.phi 575 %loop.cond = icmp ugt i32 %sum.next, 4 576 br i1 %loop.cond, label %loop, label %done 577 578done: ; preds = %backedge 579 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 580 ret i32 %sum.next.lcssa 581 582failure: 583 unreachable 584} 585 586define i32 @test_multiple_pred_const() { 587; CHECK-LABEL: @test_multiple_pred_const( 588; CHECK-NEXT: entry: 589; CHECK-NEXT: br label [[LOOP:%.*]] 590; CHECK: loop: 591; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 592; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 593; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 594; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 595; CHECK: if.true: 596; CHECK-NEXT: switch i32 4, label [[FAILURE:%.*]] [ 597; CHECK-NEXT: i32 100, label [[BACKEDGE:%.*]] 598; CHECK-NEXT: i32 200, label [[BACKEDGE]] 599; CHECK-NEXT: ] 600; CHECK: if.false: 601; CHECK-NEXT: br label [[BACKEDGE]] 602; CHECK: backedge: 603; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[IF_TRUE]] ], [ [[SUB]], [[IF_TRUE]] ] 604; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 605; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4 606; CHECK-NEXT: br label [[DONE:%.*]] 607; CHECK: done: 608; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 609; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 610; CHECK: failure: 611; CHECK-NEXT: unreachable 612; 613entry: 614 615 br label %loop 616 617loop: ; preds = %backedge, %entry 618 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 619 %sub = sub i32 4, %sum 620 %is.positive = icmp sgt i32 %sub, 0 621 br i1 %is.positive, label %if.true, label %if.false 622 623if.true: 624 switch i32 4, label %failure [ 625 i32 100, label %backedge 626 i32 200, label %backedge 627 ] 628 629if.false: ; preds = %loop 630 br label %backedge 631 632backedge: 633 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %if.true ], [ %sub, %if.true ] 634 %sum.next = add i32 %sum, %merge.phi 635 %loop.cond = icmp ne i32 %sum.next, 4 636 br i1 %loop.cond, label %loop, label %done 637 638done: ; preds = %backedge 639 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 640 ret i32 %sum.next.lcssa 641 642failure: 643 unreachable 644} 645 646define i32 @test_multiple_pred_2(i1 %cond, i1 %cond2) { 647; CHECK-LABEL: @test_multiple_pred_2( 648; CHECK-NEXT: entry: 649; CHECK-NEXT: br label [[LOOP:%.*]] 650; CHECK: loop: 651; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 652; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 653; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 654; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 655; CHECK: if.true: 656; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]] 657; CHECK: if.true.1: 658; CHECK-NEXT: br label [[BACKEDGE:%.*]] 659; CHECK: if.true.2: 660; CHECK-NEXT: br label [[BACKEDGE]] 661; CHECK: if.false: 662; CHECK-NEXT: br i1 [[COND2:%.*]], label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]] 663; CHECK: if.false.1: 664; CHECK-NEXT: br label [[BACKEDGE]] 665; CHECK: if.false.2: 666; CHECK-NEXT: br label [[BACKEDGE]] 667; CHECK: backedge: 668; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ [[SUB]], [[IF_TRUE_1]] ], [ [[SUB]], [[IF_TRUE_2]] ] 669; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 670; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4 671; CHECK-NEXT: br label [[DONE:%.*]] 672; CHECK: done: 673; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 674; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 675; CHECK: failure: 676; CHECK-NEXT: unreachable 677; 678entry: 679 680 br label %loop 681 682loop: ; preds = %backedge, %entry 683 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 684 %sub = sub i32 4, %sum 685 %is.positive = icmp sgt i32 %sub, 0 686 br i1 %is.positive, label %if.true, label %if.false 687 688if.true: 689 br i1 %cond, label %if.true.1, label %if.true.2 690 691if.true.1: 692 br label %backedge 693 694if.true.2: 695 br label %backedge 696 697if.false: ; preds = %loop 698 br i1 %cond2, label %if.false.1, label %if.false.2 699 700if.false.1: 701 br label %backedge 702 703if.false.2: 704 br label %backedge 705 706backedge: 707 %merge.phi = phi i32 [ 0, %if.false.1 ], [ 0, %if.false.2 ], [ %sub, %if.true.1 ], [ %sub, %if.true.2 ] 708 %sum.next = add i32 %sum, %merge.phi 709 %loop.cond = icmp ne i32 %sum.next, 4 710 br i1 %loop.cond, label %loop, label %done 711 712done: ; preds = %backedge 713 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 714 ret i32 %sum.next.lcssa 715 716failure: 717 unreachable 718} 719 720define i32 @test_multiple_pred_poison_1(i1 %cond, i1 %cond2) { 721; CHECK-LABEL: @test_multiple_pred_poison_1( 722; CHECK-NEXT: entry: 723; CHECK-NEXT: br label [[LOOP:%.*]] 724; CHECK: loop: 725; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 726; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 727; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 728; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 729; CHECK: if.true: 730; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]] 731; CHECK: if.true.1: 732; CHECK-NEXT: br label [[BACKEDGE:%.*]] 733; CHECK: if.true.2: 734; CHECK-NEXT: br label [[BACKEDGE]] 735; CHECK: if.false: 736; CHECK-NEXT: br i1 [[COND2:%.*]], label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]] 737; CHECK: if.false.1: 738; CHECK-NEXT: br label [[BACKEDGE]] 739; CHECK: if.false.2: 740; CHECK-NEXT: br label [[BACKEDGE]] 741; CHECK: backedge: 742; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ [[SUB]], [[IF_TRUE_1]] ], [ poison, [[IF_TRUE_2]] ] 743; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 744; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4 745; CHECK-NEXT: br label [[DONE:%.*]] 746; CHECK: done: 747; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 748; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 749; CHECK: failure: 750; CHECK-NEXT: unreachable 751; 752entry: 753 br label %loop 754 755loop: ; preds = %backedge, %entry 756 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 757 %sub = sub i32 4, %sum 758 %is.positive = icmp sgt i32 %sub, 0 759 br i1 %is.positive, label %if.true, label %if.false 760 761if.true: 762 br i1 %cond, label %if.true.1, label %if.true.2 763 764if.true.1: 765 br label %backedge 766 767if.true.2: 768 br label %backedge 769 770if.false: ; preds = %loop 771 br i1 %cond2, label %if.false.1, label %if.false.2 772 773if.false.1: 774 br label %backedge 775 776if.false.2: 777 br label %backedge 778 779backedge: 780 %merge.phi = phi i32 [ 0, %if.false.1 ], [ 0, %if.false.2 ], [ %sub, %if.true.1 ], [ poison, %if.true.2 ] 781 %sum.next = add i32 %sum, %merge.phi 782 %loop.cond = icmp ne i32 %sum.next, 4 783 br i1 %loop.cond, label %loop, label %done 784 785done: ; preds = %backedge 786 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 787 ret i32 %sum.next.lcssa 788 789failure: 790 unreachable 791} 792 793define i32 @test_multiple_pred_poison_2(i1 %cond, i1 %cond2) { 794; CHECK-LABEL: @test_multiple_pred_poison_2( 795; CHECK-NEXT: entry: 796; CHECK-NEXT: br label [[LOOP:%.*]] 797; CHECK: loop: 798; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 799; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 800; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 801; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 802; CHECK: if.true: 803; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]] 804; CHECK: if.true.1: 805; CHECK-NEXT: br label [[BACKEDGE:%.*]] 806; CHECK: if.true.2: 807; CHECK-NEXT: br label [[BACKEDGE]] 808; CHECK: if.false: 809; CHECK-NEXT: br i1 [[COND2:%.*]], label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]] 810; CHECK: if.false.1: 811; CHECK-NEXT: br label [[BACKEDGE]] 812; CHECK: if.false.2: 813; CHECK-NEXT: br label [[BACKEDGE]] 814; CHECK: backedge: 815; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ poison, [[IF_TRUE_1]] ], [ [[SUB]], [[IF_TRUE_2]] ] 816; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 817; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4 818; CHECK-NEXT: br label [[DONE:%.*]] 819; CHECK: done: 820; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 821; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 822; CHECK: failure: 823; CHECK-NEXT: unreachable 824; 825entry: 826 br label %loop 827 828loop: ; preds = %backedge, %entry 829 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 830 %sub = sub i32 4, %sum 831 %is.positive = icmp sgt i32 %sub, 0 832 br i1 %is.positive, label %if.true, label %if.false 833 834if.true: 835 br i1 %cond, label %if.true.1, label %if.true.2 836 837if.true.1: 838 br label %backedge 839 840if.true.2: 841 br label %backedge 842 843if.false: ; preds = %loop 844 br i1 %cond2, label %if.false.1, label %if.false.2 845 846if.false.1: 847 br label %backedge 848 849if.false.2: 850 br label %backedge 851 852backedge: 853 %merge.phi = phi i32 [ 0, %if.false.1 ], [ 0, %if.false.2 ], [ poison, %if.true.1 ], [ %sub, %if.true.2 ] 854 %sum.next = add i32 %sum, %merge.phi 855 %loop.cond = icmp ne i32 %sum.next, 4 856 br i1 %loop.cond, label %loop, label %done 857 858done: ; preds = %backedge 859 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 860 ret i32 %sum.next.lcssa 861 862failure: 863 unreachable 864} 865 866define i32 @test_multiple_pred_poison_3(i1 %cond, i1 %cond2) { 867; CHECK-LABEL: @test_multiple_pred_poison_3( 868; CHECK-NEXT: entry: 869; CHECK-NEXT: br label [[LOOP:%.*]] 870; CHECK: loop: 871; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 872; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 873; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 874; CHECK-NEXT: br i1 [[IS_POSITIVE]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]] 875; CHECK: if.true: 876; CHECK-NEXT: br i1 [[COND:%.*]], label [[IF_TRUE_1:%.*]], label [[IF_TRUE_2:%.*]] 877; CHECK: if.true.1: 878; CHECK-NEXT: br label [[BACKEDGE:%.*]] 879; CHECK: if.true.2: 880; CHECK-NEXT: br label [[BACKEDGE]] 881; CHECK: if.false: 882; CHECK-NEXT: br i1 [[COND2:%.*]], label [[IF_FALSE_1:%.*]], label [[IF_FALSE_2:%.*]] 883; CHECK: if.false.1: 884; CHECK-NEXT: br label [[BACKEDGE]] 885; CHECK: if.false.2: 886; CHECK-NEXT: br label [[BACKEDGE]] 887; CHECK: backedge: 888; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE_1]] ], [ 0, [[IF_FALSE_2]] ], [ poison, [[IF_TRUE_1]] ], [ poison, [[IF_TRUE_2]] ] 889; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 890; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4 891; CHECK-NEXT: br label [[DONE:%.*]] 892; CHECK: done: 893; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 894; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 895; CHECK: failure: 896; CHECK-NEXT: unreachable 897; 898entry: 899 br label %loop 900 901loop: ; preds = %backedge, %entry 902 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 903 %sub = sub i32 4, %sum 904 %is.positive = icmp sgt i32 %sub, 0 905 br i1 %is.positive, label %if.true, label %if.false 906 907if.true: 908 br i1 %cond, label %if.true.1, label %if.true.2 909 910if.true.1: 911 br label %backedge 912 913if.true.2: 914 br label %backedge 915 916if.false: ; preds = %loop 917 br i1 %cond2, label %if.false.1, label %if.false.2 918 919if.false.1: 920 br label %backedge 921 922if.false.2: 923 br label %backedge 924 925backedge: 926 %merge.phi = phi i32 [ 0, %if.false.1 ], [ 0, %if.false.2 ], [ poison, %if.true.1 ], [ poison, %if.true.2 ] 927 %sum.next = add i32 %sum, %merge.phi 928 %loop.cond = icmp ne i32 %sum.next, 4 929 br i1 %loop.cond, label %loop, label %done 930 931done: ; preds = %backedge 932 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 933 ret i32 %sum.next.lcssa 934 935failure: 936 unreachable 937} 938 939; TODO: We can break the backedge here. 940define i32 @test_select(i32 %limit) { 941; CHECK-LABEL: @test_select( 942; CHECK-NEXT: entry: 943; CHECK-NEXT: [[LOOP_GUARD:%.*]] = icmp sgt i32 [[LIMIT:%.*]], 0 944; CHECK-NEXT: br i1 [[LOOP_GUARD]], label [[LOOP_PREHEADER:%.*]], label [[FAILURE:%.*]] 945; CHECK: loop.preheader: 946; CHECK-NEXT: br label [[LOOP:%.*]] 947; CHECK: loop: 948; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ [[SUM_NEXT:%.*]], [[LOOP]] ], [ 0, [[LOOP_PREHEADER]] ] 949; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[LIMIT]], [[SUM]] 950; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 951; CHECK-NEXT: [[SEL:%.*]] = select i1 [[IS_POSITIVE]], i32 [[SUB]], i32 0 952; CHECK-NEXT: [[SUM_NEXT]] = add i32 [[SUM]], [[SEL]] 953; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], [[LIMIT]] 954; CHECK-NEXT: br i1 [[LOOP_COND]], label [[LOOP]], label [[DONE:%.*]] 955; CHECK: done: 956; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[LOOP]] ] 957; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 958; CHECK: failure: 959; CHECK-NEXT: unreachable 960; 961entry: 962 %loop_guard = icmp sgt i32 %limit, 0 963 br i1 %loop_guard, label %loop, label %failure 964 965loop: ; preds = %backedge, %entry 966 %sum = phi i32 [ 0, %entry ], [ %sum.next, %loop ] 967 %sub = sub i32 %limit, %sum 968 %is.positive = icmp sgt i32 %sub, 0 969 %sel = select i1 %is.positive, i32 %sub, i32 0 970 %sum.next = add i32 %sum, %sel 971 %loop.cond = icmp ne i32 %sum.next, %limit 972 br i1 %loop.cond, label %loop, label %done 973 974done: ; preds = %backedge 975 %sum.next.lcssa = phi i32 [ %sum.next, %loop ] 976 ret i32 %sum.next.lcssa 977 978failure: 979 unreachable 980} 981 982define i32 @test_select_const(i32 %x) { 983; CHECK-LABEL: @test_select_const( 984; CHECK-NEXT: entry: 985; CHECK-NEXT: br label [[LOOP:%.*]] 986; CHECK: loop: 987; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 988; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 989; CHECK-NEXT: [[IS_POSITIVE:%.*]] = icmp sgt i32 [[SUB]], 0 990; CHECK-NEXT: [[SEL:%.*]] = select i1 [[IS_POSITIVE]], i32 [[SUB]], i32 [[X:%.*]] 991; CHECK-NEXT: [[SEL_COND:%.*]] = icmp sgt i32 [[SEL]], 0 992; CHECK-NEXT: br i1 [[SEL_COND]], label [[BACKEDGE:%.*]], label [[IF_FALSE:%.*]] 993; CHECK: if.false: 994; CHECK-NEXT: br label [[BACKEDGE]] 995; CHECK: backedge: 996; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[IF_FALSE]] ], [ [[SUB]], [[LOOP]] ] 997; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 998; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4 999; CHECK-NEXT: br label [[DONE:%.*]] 1000; CHECK: done: 1001; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 1002; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 1003; 1004entry: 1005 br label %loop 1006 1007loop: ; preds = %backedge, %entry 1008 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 1009 %sub = sub i32 4, %sum 1010 %is.positive = icmp sgt i32 %sub, 0 1011 %sel = select i1 %is.positive, i32 %sub, i32 %x 1012 %sel.cond = icmp sgt i32 %sel, 0 1013 br i1 %sel.cond, label %backedge, label %if.false 1014 1015if.false: ; preds = %loop 1016 br label %backedge 1017 1018backedge: ; preds = %if.false, %loop 1019 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ] 1020 %sum.next = add i32 %sum, %merge.phi 1021 %loop.cond = icmp ne i32 %sum.next, 4 1022 br i1 %loop.cond, label %loop, label %done 1023 1024done: ; preds = %backedge 1025 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 1026 ret i32 %sum.next.lcssa 1027} 1028 1029 1030 1031; Switch tests 1032 1033; Here switch will always jump to the default label 1034define i32 @test_switch_ne_default() { 1035; CHECK-LABEL: @test_switch_ne_default( 1036; CHECK-NEXT: entry: 1037; CHECK-NEXT: br label [[LOOP:%.*]] 1038; CHECK: loop: 1039; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 1040; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 1041; CHECK-NEXT: switch i32 [[SUB]], label [[DEFAULT:%.*]] [ 1042; CHECK-NEXT: i32 0, label [[ONZERO:%.*]] 1043; CHECK-NEXT: i32 1, label [[ONONE:%.*]] 1044; CHECK-NEXT: i32 2, label [[ONTWO:%.*]] 1045; CHECK-NEXT: ] 1046; CHECK: default: 1047; CHECK-NEXT: br label [[BACKEDGE:%.*]] 1048; CHECK: onzero: 1049; CHECK-NEXT: br label [[BACKEDGE]] 1050; CHECK: onone: 1051; CHECK-NEXT: br label [[BACKEDGE]] 1052; CHECK: ontwo: 1053; CHECK-NEXT: br label [[BACKEDGE]] 1054; CHECK: backedge: 1055; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ [[SUB]], [[DEFAULT]] ], [ 0, [[ONZERO]] ], [ 1, [[ONONE]] ], [ 2, [[ONTWO]] ] 1056; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 1057; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4 1058; CHECK-NEXT: br label [[DONE:%.*]] 1059; CHECK: done: 1060; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 1061; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 1062; 1063entry: 1064 br label %loop 1065 1066loop: ; preds = %backedge, %entry 1067 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 1068 %sub = sub i32 4, %sum 1069 switch i32 %sub, label %default [ 1070 i32 0, label %onzero 1071 i32 1, label %onone 1072 i32 2, label %ontwo 1073 ] 1074 1075default: ; preds = %loop 1076 br label %backedge 1077 1078onzero: ; preds = %loop 1079 br label %backedge 1080 1081onone: ; preds = %loop 1082 br label %backedge 1083 1084ontwo: ; preds = %loop 1085 br label %backedge 1086 1087backedge: ; preds = %ontwo, %onone, %onzero, %default 1088 %merge.phi = phi i32 [ %sub, %default ], [ 0, %onzero ], [ 1, %onone ], [ 2, %ontwo ] 1089 %sum.next = add i32 %sum, %merge.phi 1090 %loop.cond = icmp ne i32 %sum.next, 4 1091 br i1 %loop.cond, label %loop, label %done 1092 1093done: ; preds = %backedge 1094 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 1095 ret i32 %sum.next.lcssa 1096} 1097 1098; Here switch will always jump to the %ontwo label 1099define i32 @test_switch_ne_one_case() { 1100; CHECK-LABEL: @test_switch_ne_one_case( 1101; CHECK-NEXT: entry: 1102; CHECK-NEXT: br label [[LOOP:%.*]] 1103; CHECK: loop: 1104; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 1105; CHECK-NEXT: [[SUB:%.*]] = sub i32 4, [[SUM]] 1106; CHECK-NEXT: switch i32 [[SUB]], label [[DEFAULT:%.*]] [ 1107; CHECK-NEXT: i32 0, label [[ONZERO:%.*]] 1108; CHECK-NEXT: i32 1, label [[ONONE:%.*]] 1109; CHECK-NEXT: i32 4, label [[ONTWO:%.*]] 1110; CHECK-NEXT: ] 1111; CHECK: default: 1112; CHECK-NEXT: br label [[BACKEDGE:%.*]] 1113; CHECK: onzero: 1114; CHECK-NEXT: br label [[BACKEDGE]] 1115; CHECK: onone: 1116; CHECK-NEXT: br label [[BACKEDGE]] 1117; CHECK: ontwo: 1118; CHECK-NEXT: br label [[BACKEDGE]] 1119; CHECK: backedge: 1120; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 2, [[DEFAULT]] ], [ 0, [[ONZERO]] ], [ 1, [[ONONE]] ], [ [[SUB]], [[ONTWO]] ] 1121; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 1122; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 4 1123; CHECK-NEXT: br label [[DONE:%.*]] 1124; CHECK: done: 1125; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 1126; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 1127; 1128entry: 1129 br label %loop 1130 1131loop: ; preds = %backedge, %entry 1132 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 1133 %sub = sub i32 4, %sum 1134 switch i32 %sub, label %default [ 1135 i32 0, label %onzero 1136 i32 1, label %onone 1137 i32 4, label %ontwo 1138 ] 1139 1140default: ; preds = %loop 1141 br label %backedge 1142 1143onzero: ; preds = %loop 1144 br label %backedge 1145 1146onone: ; preds = %loop 1147 br label %backedge 1148 1149ontwo: ; preds = %loop 1150 br label %backedge 1151 1152backedge: ; preds = %ontwo, %onone, %onzero, %default 1153 %merge.phi = phi i32 [ 2, %default ], [ 0, %onzero ], [ 1, %onone ], [ %sub, %ontwo ] 1154 %sum.next = add i32 %sum, %merge.phi 1155 %loop.cond = icmp ne i32 %sum.next, 4 1156 br i1 %loop.cond, label %loop, label %done 1157 1158done: ; preds = %backedge 1159 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 1160 ret i32 %sum.next.lcssa 1161} 1162 1163; Here switch will always jump to the %backedge label, but there are two jumps to this label in switch 1164define i32 @test_switch_ne_one_case_identical_jumps() { 1165; CHECK-LABEL: @test_switch_ne_one_case_identical_jumps( 1166; CHECK-NEXT: entry: 1167; CHECK-NEXT: br label [[LOOP:%.*]] 1168; CHECK: loop: 1169; CHECK-NEXT: [[SUM:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ] 1170; CHECK-NEXT: [[SUB:%.*]] = sub i32 2, [[SUM]] 1171; CHECK-NEXT: switch i32 [[SUB]], label [[DEFAULT:%.*]] [ 1172; CHECK-NEXT: i32 0, label [[FIRST_BLOCK:%.*]] 1173; CHECK-NEXT: i32 1, label [[BACKEDGE:%.*]] 1174; CHECK-NEXT: i32 2, label [[BACKEDGE]] 1175; CHECK-NEXT: ] 1176; CHECK: default: 1177; CHECK-NEXT: br label [[BACKEDGE]] 1178; CHECK: first_block: 1179; CHECK-NEXT: br label [[BACKEDGE]] 1180; CHECK: backedge: 1181; CHECK-NEXT: [[MERGE_PHI:%.*]] = phi i32 [ 0, [[DEFAULT]] ], [ 1, [[FIRST_BLOCK]] ], [ [[SUB]], [[LOOP]] ], [ [[SUB]], [[LOOP]] ] 1182; CHECK-NEXT: [[SUM_NEXT:%.*]] = add i32 [[SUM]], [[MERGE_PHI]] 1183; CHECK-NEXT: [[LOOP_COND:%.*]] = icmp ne i32 [[SUM_NEXT]], 2 1184; CHECK-NEXT: br label [[DONE:%.*]] 1185; CHECK: done: 1186; CHECK-NEXT: [[SUM_NEXT_LCSSA:%.*]] = phi i32 [ [[SUM_NEXT]], [[BACKEDGE]] ] 1187; CHECK-NEXT: ret i32 [[SUM_NEXT_LCSSA]] 1188; 1189entry: 1190 br label %loop 1191 1192loop: ; preds = %backedge, %entry 1193 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ] 1194 %sub = sub i32 2, %sum 1195 switch i32 %sub, label %default [ 1196 i32 0, label %first_block 1197 i32 1, label %backedge 1198 i32 2, label %backedge 1199 ] 1200 1201default: ; preds = %loop 1202 br label %backedge 1203 1204first_block: ; preds = %loop 1205 br label %backedge 1206 1207backedge: ; preds = %first_block, %default, %loop, %loop 1208 %merge.phi = phi i32 [ 0, %default ], [ 1, %first_block ], [ %sub, %loop ], [ %sub, %loop ] 1209 %sum.next = add i32 %sum, %merge.phi 1210 %loop.cond = icmp ne i32 %sum.next, 2 1211 br i1 %loop.cond, label %loop, label %done 1212 1213done: ; preds = %backedge 1214 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ] 1215 ret i32 %sum.next.lcssa 1216} 1217 1218@g = external global i32 1219 1220define void @ptr54615(ptr byval(i32) %arg) { 1221; CHECK-LABEL: @ptr54615( 1222; CHECK-NEXT: br label [[FOR_COND:%.*]] 1223; CHECK: for.cond: 1224; CHECK-NEXT: [[CMP:%.*]] = icmp eq ptr @g, [[ARG:%.*]] 1225; CHECK-NEXT: br i1 [[CMP]], label [[FOR_END:%.*]], label [[FOR_COND]] 1226; CHECK: for.end: 1227; CHECK-NEXT: ret void 1228; 1229 br label %for.cond 1230 1231for.cond: 1232 %cmp = icmp eq ptr @g, %arg 1233 br i1 %cmp, label %for.end, label %for.cond 1234 1235for.end: 1236 ret void 1237} 1238