1238 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=loop-deletion -S | FileCheck %s3; RUN: opt < %s -passes='loop(loop-deletion)' -S | FileCheck %s4 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:%.*]], 015; 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]], 022; 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: unreachable35;36entry:37 %loop_guard = icmp sgt i32 %limit, 038 br i1 %loop_guard, label %loop, label %failure39 40loop: ; preds = %backedge, %entry41 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]42 %sub = sub i32 %limit, %sum43 %is.positive = icmp sgt i32 %sub, 044 br i1 %is.positive, label %backedge, label %if.false45 46if.false: ; preds = %loop47 br label %backedge48 49backedge: ; preds = %if.false, %loop50 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]51 %sum.next = add i32 %sum, %merge.phi52 %loop.cond = icmp ne i32 %sum.next, %limit53 br i1 %loop.cond, label %loop, label %done54 55done: ; preds = %backedge56 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]57 ret i32 %sum.next.lcssa58 59failure:60 unreachable61}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:%.*]], 068; 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]], 075; 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: unreachable88;89entry:90 %loop_guard = icmp sgt i32 %limit, 091 br i1 %loop_guard, label %loop, label %failure92 93loop: ; preds = %backedge, %entry94 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]95 %sub = sub i32 %limit, %sum96 %is.positive = icmp sgt i32 %sub, 097 br i1 %is.positive, label %backedge, label %if.false98 99if.false: ; preds = %loop100 br label %backedge101 102backedge: ; preds = %if.false, %loop103 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]104 %sum.next = add i32 %sum, %merge.phi105 %loop.cond = icmp slt i32 %sum.next, %limit106 br i1 %loop.cond, label %loop, label %done107 108done: ; preds = %backedge109 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]110 ret i32 %sum.next.lcssa111 112failure:113 unreachable114}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:%.*]], 0121; 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]], 0128; 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: unreachable141;142entry:143 %loop_guard = icmp sgt i32 %limit, 0144 br i1 %loop_guard, label %loop, label %failure145 146loop: ; preds = %backedge, %entry147 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]148 %sub = sub i32 %limit, %sum149 %is.positive = icmp sgt i32 %sub, 0150 br i1 %is.positive, label %backedge, label %if.false151 152if.false: ; preds = %loop153 br label %backedge154 155backedge: ; preds = %if.false, %loop156 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]157 %sum.next = add i32 %sum, %merge.phi158 %loop.cond = icmp ult i32 %sum.next, %limit159 br i1 %loop.cond, label %loop, label %done160 161done: ; preds = %backedge162 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]163 ret i32 %sum.next.lcssa164 165failure:166 unreachable167}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:%.*]], 0174; 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]], 0181; 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: unreachable194;195entry:196 %loop_guard = icmp sgt i32 %limit, 0197 br i1 %loop_guard, label %loop, label %failure198 199loop: ; preds = %backedge, %entry200 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]201 %sub = sub i32 %limit, %sum202 %is.positive = icmp sgt i32 %sub, 0203 br i1 %is.positive, label %backedge, label %if.false204 205if.false: ; preds = %loop206 br label %backedge207 208backedge: ; preds = %if.false, %loop209 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]210 %sum.next = add i32 %sum, %merge.phi211 %loop.cond = icmp sgt i32 %sum.next, %limit212 br i1 %loop.cond, label %loop, label %done213 214done: ; preds = %backedge215 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]216 ret i32 %sum.next.lcssa217 218failure:219 unreachable220}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:%.*]], 0227; 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]], 0234; 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: unreachable247;248entry:249 %loop_guard = icmp sgt i32 %limit, 0250 br i1 %loop_guard, label %loop, label %failure251 252loop: ; preds = %backedge, %entry253 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]254 %sub = sub i32 %limit, %sum255 %is.positive = icmp sgt i32 %sub, 0256 br i1 %is.positive, label %backedge, label %if.false257 258if.false: ; preds = %loop259 br label %backedge260 261backedge: ; preds = %if.false, %loop262 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]263 %sum.next = add i32 %sum, %merge.phi264 %loop.cond = icmp ugt i32 %sum.next, %limit265 br i1 %loop.cond, label %loop, label %done266 267done: ; preds = %backedge268 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]269 ret i32 %sum.next.lcssa270 271failure:272 unreachable273}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:%.*]], 0280; 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]], 0287; 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: unreachable307;308entry:309 %loop_guard = icmp sgt i32 %limit, 0310 br i1 %loop_guard, label %loop, label %failure311 312loop: ; preds = %backedge, %entry313 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]314 %sub = sub i32 %limit, %sum315 %is.positive = icmp sgt i32 %sub, 0316 br i1 %is.positive, label %if.true, label %if.false317 318if.true:319 switch i32 %limit, label %failure [320 i32 100, label %backedge321 i32 200, label %backedge322 ]323 324if.false: ; preds = %loop325 br label %backedge326 327backedge:328 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %if.true ], [ %sub, %if.true ]329 %sum.next = add i32 %sum, %merge.phi330 %loop.cond = icmp ne i32 %sum.next, %limit331 br i1 %loop.cond, label %loop, label %done332 333done: ; preds = %backedge334 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]335 ret i32 %sum.next.lcssa336 337failure:338 unreachable339}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]], 0349; 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]], 4356; 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: unreachable362;363entry:364 365 br label %loop366 367loop: ; preds = %backedge, %entry368 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]369 %sub = sub i32 4, %sum370 %is.positive = icmp sgt i32 %sub, 0371 br i1 %is.positive, label %backedge, label %if.false372 373if.false: ; preds = %loop374 br label %backedge375 376backedge: ; preds = %if.false, %loop377 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]378 %sum.next = add i32 %sum, %merge.phi379 %loop.cond = icmp ne i32 %sum.next, 4380 br i1 %loop.cond, label %loop, label %done381 382done: ; preds = %backedge383 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]384 ret i32 %sum.next.lcssa385 386failure:387 unreachable388}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]], 0398; 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]], 4405; 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: unreachable411;412entry:413 414 br label %loop415 416loop: ; preds = %backedge, %entry417 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]418 %sub = sub i32 4, %sum419 %is.positive = icmp sgt i32 %sub, 0420 br i1 %is.positive, label %backedge, label %if.false421 422if.false: ; preds = %loop423 br label %backedge424 425backedge: ; preds = %if.false, %loop426 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]427 %sum.next = add i32 %sum, %merge.phi428 %loop.cond = icmp slt i32 %sum.next, 4429 br i1 %loop.cond, label %loop, label %done430 431done: ; preds = %backedge432 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]433 ret i32 %sum.next.lcssa434 435failure:436 unreachable437}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]], 0447; 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]], 4454; 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: unreachable460;461entry:462 463 br label %loop464 465loop: ; preds = %backedge, %entry466 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]467 %sub = sub i32 4, %sum468 %is.positive = icmp sgt i32 %sub, 0469 br i1 %is.positive, label %backedge, label %if.false470 471if.false: ; preds = %loop472 br label %backedge473 474backedge: ; preds = %if.false, %loop475 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]476 %sum.next = add i32 %sum, %merge.phi477 %loop.cond = icmp ult i32 %sum.next, 4478 br i1 %loop.cond, label %loop, label %done479 480done: ; preds = %backedge481 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]482 ret i32 %sum.next.lcssa483 484failure:485 unreachable486}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]], 0496; 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]], 4503; 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: unreachable509;510entry:511 512 br label %loop513 514loop: ; preds = %backedge, %entry515 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]516 %sub = sub i32 4, %sum517 %is.positive = icmp sgt i32 %sub, 0518 br i1 %is.positive, label %backedge, label %if.false519 520if.false: ; preds = %loop521 br label %backedge522 523backedge: ; preds = %if.false, %loop524 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]525 %sum.next = add i32 %sum, %merge.phi526 %loop.cond = icmp sgt i32 %sum.next, 4527 br i1 %loop.cond, label %loop, label %done528 529done: ; preds = %backedge530 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]531 ret i32 %sum.next.lcssa532 533failure:534 unreachable535}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]], 0545; 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]], 4552; 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: unreachable558;559entry:560 561 br label %loop562 563loop: ; preds = %backedge, %entry564 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]565 %sub = sub i32 4, %sum566 %is.positive = icmp sgt i32 %sub, 0567 br i1 %is.positive, label %backedge, label %if.false568 569if.false: ; preds = %loop570 br label %backedge571 572backedge: ; preds = %if.false, %loop573 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]574 %sum.next = add i32 %sum, %merge.phi575 %loop.cond = icmp ugt i32 %sum.next, 4576 br i1 %loop.cond, label %loop, label %done577 578done: ; preds = %backedge579 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]580 ret i32 %sum.next.lcssa581 582failure:583 unreachable584}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]], 0594; 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]], 4606; 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: unreachable612;613entry:614 615 br label %loop616 617loop: ; preds = %backedge, %entry618 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]619 %sub = sub i32 4, %sum620 %is.positive = icmp sgt i32 %sub, 0621 br i1 %is.positive, label %if.true, label %if.false622 623if.true:624 switch i32 4, label %failure [625 i32 100, label %backedge626 i32 200, label %backedge627 ]628 629if.false: ; preds = %loop630 br label %backedge631 632backedge:633 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %if.true ], [ %sub, %if.true ]634 %sum.next = add i32 %sum, %merge.phi635 %loop.cond = icmp ne i32 %sum.next, 4636 br i1 %loop.cond, label %loop, label %done637 638done: ; preds = %backedge639 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]640 ret i32 %sum.next.lcssa641 642failure:643 unreachable644}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]], 0654; 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]], 4671; 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: unreachable677;678entry:679 680 br label %loop681 682loop: ; preds = %backedge, %entry683 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]684 %sub = sub i32 4, %sum685 %is.positive = icmp sgt i32 %sub, 0686 br i1 %is.positive, label %if.true, label %if.false687 688if.true:689 br i1 %cond, label %if.true.1, label %if.true.2690 691if.true.1:692 br label %backedge693 694if.true.2:695 br label %backedge696 697if.false: ; preds = %loop698 br i1 %cond2, label %if.false.1, label %if.false.2699 700if.false.1:701 br label %backedge702 703if.false.2:704 br label %backedge705 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.phi709 %loop.cond = icmp ne i32 %sum.next, 4710 br i1 %loop.cond, label %loop, label %done711 712done: ; preds = %backedge713 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]714 ret i32 %sum.next.lcssa715 716failure:717 unreachable718}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]], 0728; 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]], 4745; 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: unreachable751;752entry:753 br label %loop754 755loop: ; preds = %backedge, %entry756 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]757 %sub = sub i32 4, %sum758 %is.positive = icmp sgt i32 %sub, 0759 br i1 %is.positive, label %if.true, label %if.false760 761if.true:762 br i1 %cond, label %if.true.1, label %if.true.2763 764if.true.1:765 br label %backedge766 767if.true.2:768 br label %backedge769 770if.false: ; preds = %loop771 br i1 %cond2, label %if.false.1, label %if.false.2772 773if.false.1:774 br label %backedge775 776if.false.2:777 br label %backedge778 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.phi782 %loop.cond = icmp ne i32 %sum.next, 4783 br i1 %loop.cond, label %loop, label %done784 785done: ; preds = %backedge786 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]787 ret i32 %sum.next.lcssa788 789failure:790 unreachable791}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]], 0801; 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]], 4818; 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: unreachable824;825entry:826 br label %loop827 828loop: ; preds = %backedge, %entry829 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]830 %sub = sub i32 4, %sum831 %is.positive = icmp sgt i32 %sub, 0832 br i1 %is.positive, label %if.true, label %if.false833 834if.true:835 br i1 %cond, label %if.true.1, label %if.true.2836 837if.true.1:838 br label %backedge839 840if.true.2:841 br label %backedge842 843if.false: ; preds = %loop844 br i1 %cond2, label %if.false.1, label %if.false.2845 846if.false.1:847 br label %backedge848 849if.false.2:850 br label %backedge851 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.phi855 %loop.cond = icmp ne i32 %sum.next, 4856 br i1 %loop.cond, label %loop, label %done857 858done: ; preds = %backedge859 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]860 ret i32 %sum.next.lcssa861 862failure:863 unreachable864}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]], 0874; 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]], 4891; 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: unreachable897;898entry:899 br label %loop900 901loop: ; preds = %backedge, %entry902 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]903 %sub = sub i32 4, %sum904 %is.positive = icmp sgt i32 %sub, 0905 br i1 %is.positive, label %if.true, label %if.false906 907if.true:908 br i1 %cond, label %if.true.1, label %if.true.2909 910if.true.1:911 br label %backedge912 913if.true.2:914 br label %backedge915 916if.false: ; preds = %loop917 br i1 %cond2, label %if.false.1, label %if.false.2918 919if.false.1:920 br label %backedge921 922if.false.2:923 br label %backedge924 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.phi928 %loop.cond = icmp ne i32 %sum.next, 4929 br i1 %loop.cond, label %loop, label %done930 931done: ; preds = %backedge932 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]933 ret i32 %sum.next.lcssa934 935failure:936 unreachable937}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:%.*]], 0944; 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]], 0951; CHECK-NEXT: [[SEL:%.*]] = select i1 [[IS_POSITIVE]], i32 [[SUB]], i32 0952; 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: unreachable960;961entry:962 %loop_guard = icmp sgt i32 %limit, 0963 br i1 %loop_guard, label %loop, label %failure964 965loop: ; preds = %backedge, %entry966 %sum = phi i32 [ 0, %entry ], [ %sum.next, %loop ]967 %sub = sub i32 %limit, %sum968 %is.positive = icmp sgt i32 %sub, 0969 %sel = select i1 %is.positive, i32 %sub, i32 0970 %sum.next = add i32 %sum, %sel971 %loop.cond = icmp ne i32 %sum.next, %limit972 br i1 %loop.cond, label %loop, label %done973 974done: ; preds = %backedge975 %sum.next.lcssa = phi i32 [ %sum.next, %loop ]976 ret i32 %sum.next.lcssa977 978failure:979 unreachable980}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]], 0990; CHECK-NEXT: [[SEL:%.*]] = select i1 [[IS_POSITIVE]], i32 [[SUB]], i32 [[X:%.*]]991; CHECK-NEXT: [[SEL_COND:%.*]] = icmp sgt i32 [[SEL]], 0992; 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]], 4999; 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 %loop1006 1007loop: ; preds = %backedge, %entry1008 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]1009 %sub = sub i32 4, %sum1010 %is.positive = icmp sgt i32 %sub, 01011 %sel = select i1 %is.positive, i32 %sub, i32 %x1012 %sel.cond = icmp sgt i32 %sel, 01013 br i1 %sel.cond, label %backedge, label %if.false1014 1015if.false: ; preds = %loop1016 br label %backedge1017 1018backedge: ; preds = %if.false, %loop1019 %merge.phi = phi i32 [ 0, %if.false ], [ %sub, %loop ]1020 %sum.next = add i32 %sum, %merge.phi1021 %loop.cond = icmp ne i32 %sum.next, 41022 br i1 %loop.cond, label %loop, label %done1023 1024done: ; preds = %backedge1025 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]1026 ret i32 %sum.next.lcssa1027}1028 1029 1030 1031; Switch tests1032 1033; Here switch will always jump to the default label1034define 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]], 41058; 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 %loop1065 1066loop: ; preds = %backedge, %entry1067 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]1068 %sub = sub i32 4, %sum1069 switch i32 %sub, label %default [1070 i32 0, label %onzero1071 i32 1, label %onone1072 i32 2, label %ontwo1073 ]1074 1075default: ; preds = %loop1076 br label %backedge1077 1078onzero: ; preds = %loop1079 br label %backedge1080 1081onone: ; preds = %loop1082 br label %backedge1083 1084ontwo: ; preds = %loop1085 br label %backedge1086 1087backedge: ; preds = %ontwo, %onone, %onzero, %default1088 %merge.phi = phi i32 [ %sub, %default ], [ 0, %onzero ], [ 1, %onone ], [ 2, %ontwo ]1089 %sum.next = add i32 %sum, %merge.phi1090 %loop.cond = icmp ne i32 %sum.next, 41091 br i1 %loop.cond, label %loop, label %done1092 1093done: ; preds = %backedge1094 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]1095 ret i32 %sum.next.lcssa1096}1097 1098; Here switch will always jump to the %ontwo label1099define 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]], 41123; 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 %loop1130 1131loop: ; preds = %backedge, %entry1132 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]1133 %sub = sub i32 4, %sum1134 switch i32 %sub, label %default [1135 i32 0, label %onzero1136 i32 1, label %onone1137 i32 4, label %ontwo1138 ]1139 1140default: ; preds = %loop1141 br label %backedge1142 1143onzero: ; preds = %loop1144 br label %backedge1145 1146onone: ; preds = %loop1147 br label %backedge1148 1149ontwo: ; preds = %loop1150 br label %backedge1151 1152backedge: ; preds = %ontwo, %onone, %onzero, %default1153 %merge.phi = phi i32 [ 2, %default ], [ 0, %onzero ], [ 1, %onone ], [ %sub, %ontwo ]1154 %sum.next = add i32 %sum, %merge.phi1155 %loop.cond = icmp ne i32 %sum.next, 41156 br i1 %loop.cond, label %loop, label %done1157 1158done: ; preds = %backedge1159 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]1160 ret i32 %sum.next.lcssa1161}1162 1163; Here switch will always jump to the %backedge label, but there are two jumps to this label in switch1164define 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]], 21184; 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 %loop1191 1192loop: ; preds = %backedge, %entry1193 %sum = phi i32 [ 0, %entry ], [ %sum.next, %backedge ]1194 %sub = sub i32 2, %sum1195 switch i32 %sub, label %default [1196 i32 0, label %first_block1197 i32 1, label %backedge1198 i32 2, label %backedge1199 ]1200 1201default: ; preds = %loop1202 br label %backedge1203 1204first_block: ; preds = %loop1205 br label %backedge1206 1207backedge: ; preds = %first_block, %default, %loop, %loop1208 %merge.phi = phi i32 [ 0, %default ], [ 1, %first_block ], [ %sub, %loop ], [ %sub, %loop ]1209 %sum.next = add i32 %sum, %merge.phi1210 %loop.cond = icmp ne i32 %sum.next, 21211 br i1 %loop.cond, label %loop, label %done1212 1213done: ; preds = %backedge1214 %sum.next.lcssa = phi i32 [ %sum.next, %backedge ]1215 ret i32 %sum.next.lcssa1216}1217 1218@g = external global i321219 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 void1228;1229 br label %for.cond1230 1231for.cond:1232 %cmp = icmp eq ptr @g, %arg1233 br i1 %cmp, label %for.end, label %for.cond1234 1235for.end:1236 ret void1237}1238