brintos

brintos / llvm-project-archived public Read only

0
0
Text · 44.5 KiB · 715f128 Raw
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