brintos

brintos / llvm-project-archived public Read only

0
0
Text · 21.0 KiB · 20164dd Raw
671 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -S -passes=loop-unroll -verify-loop-info | FileCheck %s3; RUN: opt < %s -S -passes='require<opt-remark-emit>,loop-unroll,verify<loops>' | FileCheck %s4;5; Unit tests for LoopInfo::markAsRemoved.6 7declare i1 @check() nounwind8 9; Ensure that tail->inner is removed and rely on verify-loopinfo to10; check soundness.11define void @skiplevelexit() nounwind {12; CHECK-LABEL: @skiplevelexit(13; CHECK-NEXT:  entry:14; CHECK-NEXT:    br label [[OUTER:%.*]]15; CHECK:       outer:16; CHECK-NEXT:    br label [[INNER:%.*]]17; CHECK:       inner:18; CHECK-NEXT:    [[TMP0:%.*]] = call zeroext i1 @check()19; CHECK-NEXT:    br i1 true, label [[OUTER_BACKEDGE:%.*]], label [[TAIL:%.*]]20; CHECK:       tail:21; CHECK-NEXT:    ret void22; CHECK:       outer.backedge:23; CHECK-NEXT:    br label [[OUTER]]24;25entry:26  br label %outer27 28outer:29  br label %inner30 31inner:32  %iv = phi i32 [ 0, %outer ], [ %inc, %tail ]33  %inc = add i32 %iv, 134  call zeroext i1 @check()35  br i1 true, label %outer.backedge, label %tail36 37tail:38  br i1 false, label %inner, label %exit39 40outer.backedge:41  br label %outer42 43exit:44  ret void45}46 47; Remove the middle loop of a triply nested loop tree.48; Ensure that only the middle loop is removed and rely on verify-loopinfo to49; check soundness.50define void @unloopNested() {51; CHECK-LABEL: @unloopNested(52; CHECK-NEXT:  entry:53; CHECK-NEXT:    br label [[WHILE_COND_OUTER:%.*]]54; CHECK:       while.cond.outer:55; CHECK-NEXT:    br label [[WHILE_COND:%.*]]56; CHECK:       while.cond:57; CHECK-NEXT:    [[CMP:%.*]] = call zeroext i1 @check()58; CHECK-NEXT:    br i1 [[CMP]], label [[WHILE_BODY:%.*]], label [[WHILE_END:%.*]]59; CHECK:       while.body:60; CHECK-NEXT:    [[CMP3:%.*]] = call zeroext i1 @check()61; CHECK-NEXT:    br i1 [[CMP3]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]62; CHECK:       if.then:63; CHECK-NEXT:    br label [[RETURN:%.*]]64; CHECK:       if.end:65; CHECK-NEXT:    [[CMP_I48:%.*]] = call zeroext i1 @check()66; CHECK-NEXT:    br i1 [[CMP_I48]], label [[IF_THEN_I:%.*]], label [[IF_ELSE20_I:%.*]]67; CHECK:       if.then.i:68; CHECK-NEXT:    [[CMP8_I:%.*]] = call zeroext i1 @check()69; CHECK-NEXT:    br i1 [[CMP8_I]], label [[MERGE:%.*]], label [[IF_ELSE_I:%.*]]70; CHECK:       if.else.i:71; CHECK-NEXT:    br label [[MERGE]]72; CHECK:       if.else20.i:73; CHECK-NEXT:    [[CMP25_I:%.*]] = call zeroext i1 @check()74; CHECK-NEXT:    br i1 [[CMP25_I]], label [[MERGE]], label [[IF_ELSE28_I:%.*]]75; CHECK:       if.else28.i:76; CHECK-NEXT:    br label [[MERGE]]77; CHECK:       merge:78; CHECK-NEXT:    br label [[WHILE_COND2_I:%.*]]79; CHECK:       while.cond2.i:80; CHECK-NEXT:    [[CMP_I:%.*]] = call zeroext i1 @check()81; CHECK-NEXT:    br i1 [[CMP_I]], label [[WHILE_COND2_BACKEDGE_I:%.*]], label [[WHILE_END_I:%.*]]82; CHECK:       while.cond2.backedge.i:83; CHECK-NEXT:    br label [[WHILE_COND2_I]]84; CHECK:       while.end.i:85; CHECK-NEXT:    [[CMP1114_I:%.*]] = call zeroext i1 @check()86; CHECK-NEXT:    br i1 [[CMP1114_I]], label [[WHILE_BODY12_LR_PH_I:%.*]], label [[WHILE_END14_I:%.*]]87; CHECK:       while.body12.lr.ph.i:88; CHECK-NEXT:    br label [[WHILE_END14_I]]89; CHECK:       while.end14.i:90; CHECK-NEXT:    [[CALL15_I:%.*]] = call zeroext i1 @check()91; CHECK-NEXT:    br i1 [[CALL15_I]], label [[IF_END_I:%.*]], label [[EXIT:%.*]]92; CHECK:       if.end.i:93; CHECK-NEXT:    br label [[WHILE_COND2_BACKEDGE_I]]94; CHECK:       exit:95; CHECK-NEXT:    br label [[WHILE_COND_OUTER]]96; CHECK:       while.end:97; CHECK-NEXT:    br label [[RETURN]]98; CHECK:       return:99; CHECK-NEXT:    ret void100;101entry:102  br label %while.cond.outer103 104while.cond.outer:105  br label %while.cond106 107while.cond:108  %cmp = call zeroext i1 @check()109  br i1 %cmp, label %while.body, label %while.end110 111while.body:112  %cmp3 = call zeroext i1 @check()113  br i1 %cmp3, label %if.then, label %if.end114 115if.then:116  br label %return117 118if.end:119  %cmp.i48 = call zeroext i1 @check()120  br i1 %cmp.i48, label %if.then.i, label %if.else20.i121 122if.then.i:123  %cmp8.i = call zeroext i1 @check()124  br i1 %cmp8.i, label %merge, label %if.else.i125 126if.else.i:127  br label %merge128 129if.else20.i:130  %cmp25.i = call zeroext i1 @check()131  br i1 %cmp25.i, label %merge, label %if.else28.i132 133if.else28.i:134  br label %merge135 136merge:137  br label %while.cond2.i138 139while.cond2.i:140  %cmp.i = call zeroext i1 @check()141  br i1 %cmp.i, label %while.cond2.backedge.i, label %while.end.i142 143while.cond2.backedge.i:144  br label %while.cond2.i145 146while.end.i:147  %cmp1114.i = call zeroext i1 @check()148  br i1 %cmp1114.i, label %while.body12.lr.ph.i, label %while.end14.i149 150while.body12.lr.ph.i:151  br label %while.end14.i152 153while.end14.i:154  %call15.i = call zeroext i1 @check()155  br i1 %call15.i, label %if.end.i, label %exit156 157if.end.i:158  br label %while.cond2.backedge.i159 160exit:161  br i1 false, label %while.cond, label %if.else162 163if.else:164  br label %while.cond.outer165 166while.end:167  br label %return168 169return:170  ret void171}172 173; Remove the middle loop of a deeply nested loop tree.174; Ensure that only the middle loop is removed and rely on verify-loopinfo to175; check soundness.176;177; This test must be disabled until trip count computation can be optimized...178; rdar:14038809 [SCEV]: Optimize trip count computation for multi-exit loops.179define void @unloopDeepNested() nounwind {180; CHECK-LABEL: @unloopDeepNested(181; CHECK-NEXT:  for.cond8.preheader.i:182; CHECK-NEXT:    [[CMP113_I:%.*]] = call zeroext i1 @check()183; CHECK-NEXT:    br i1 [[CMP113_I]], label [[MAKE_DATA_EXIT:%.*]], label [[FOR_BODY13_LR_PH_I:%.*]]184; CHECK:       for.body13.lr.ph.i:185; CHECK-NEXT:    br label [[MAKE_DATA_EXIT]]186; CHECK:       make_data.exit:187; CHECK-NEXT:    br label [[WHILE_COND_OUTER_OUTER:%.*]]188; CHECK:       while.cond.outer.outer:189; CHECK-NEXT:    br label [[WHILE_COND_OUTER:%.*]]190; CHECK:       while.cond.outer:191; CHECK-NEXT:    br label [[WHILE_COND:%.*]]192; CHECK:       while.cond:193; CHECK-NEXT:    br label [[WHILE_COND_OUTER_I:%.*]]194; CHECK:       while.cond.outer.i:195; CHECK-NEXT:    [[TMP192_PH_I:%.*]] = call zeroext i1 @check()196; CHECK-NEXT:    br i1 [[TMP192_PH_I]], label [[WHILE_COND_OUTER_SPLIT_US_I:%.*]], label [[WHILE_BODY_LOOPEXIT:%.*]]197; CHECK:       while.cond.outer.split.us.i:198; CHECK-NEXT:    br label [[WHILE_COND_US_I:%.*]]199; CHECK:       while.cond.us.i:200; CHECK-NEXT:    [[CMP_US_I:%.*]] = call zeroext i1 @check()201; CHECK-NEXT:    br i1 [[CMP_US_I]], label [[NEXT_DATA_EXIT:%.*]], label [[WHILE_BODY_US_I:%.*]]202; CHECK:       while.body.us.i:203; CHECK-NEXT:    [[CMP7_US_I:%.*]] = call zeroext i1 @check()204; CHECK-NEXT:    br i1 [[CMP7_US_I]], label [[IF_THEN_US_I:%.*]], label [[IF_ELSE_I:%.*]]205; CHECK:       if.then.us.i:206; CHECK-NEXT:    br label [[WHILE_COND_US_I]]207; CHECK:       if.else.i:208; CHECK-NEXT:    br label [[WHILE_COND_OUTER_I]]209; CHECK:       next_data.exit:210; CHECK-NEXT:    [[TMP192_PH_I_LCSSA28:%.*]] = call zeroext i1 @check()211; CHECK-NEXT:    br i1 [[TMP192_PH_I_LCSSA28]], label [[WHILE_END:%.*]], label [[WHILE_BODY:%.*]]212; CHECK:       while.body.loopexit:213; CHECK-NEXT:    br label [[WHILE_BODY]]214; CHECK:       while.body:215; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]216; CHECK:       while.cond.i:217; CHECK-NEXT:    [[CMP_I:%.*]] = call zeroext i1 @check()218; CHECK-NEXT:    br i1 [[CMP_I]], label [[VALID_DATA_EXIT:%.*]], label [[WHILE_BODY_I:%.*]]219; CHECK:       while.body.i:220; CHECK-NEXT:    [[CMP7_I:%.*]] = call zeroext i1 @check()221; CHECK-NEXT:    br i1 [[CMP7_I]], label [[VALID_DATA_EXIT]], label [[IF_END_I:%.*]]222; CHECK:       if.end.i:223; CHECK-NEXT:    br label [[WHILE_COND_I]]224; CHECK:       valid_data.exit:225; CHECK-NEXT:    [[CMP:%.*]] = call zeroext i1 @check()226; CHECK-NEXT:    br i1 [[CMP]], label [[IF_THEN12:%.*]], label [[IF_END:%.*]]227; CHECK:       if.then12:228; CHECK-NEXT:    br label [[IF_END]]229; CHECK:       if.end:230; CHECK-NEXT:    [[TOBOOL3_I:%.*]] = call zeroext i1 @check()231; CHECK-NEXT:    br i1 [[TOBOOL3_I]], label [[COPY_DATA_EXIT:%.*]], label [[WHILE_BODY_LR_PH_I:%.*]]232; CHECK:       while.body.lr.ph.i:233; CHECK-NEXT:    br label [[COPY_DATA_EXIT]]234; CHECK:       copy_data.exit:235; CHECK-NEXT:    [[CMP38:%.*]] = call zeroext i1 @check()236; CHECK-NEXT:    br i1 [[CMP38]], label [[IF_THEN39:%.*]], label [[WHILE_COND_OUTER]]237; CHECK:       if.then39:238; CHECK-NEXT:    [[CMP5_I:%.*]] = call zeroext i1 @check()239; CHECK-NEXT:    br i1 [[CMP5_I]], label [[WHILE_COND_OUTER_OUTER_BACKEDGE:%.*]], label [[FOR_COND8_PREHEADER_I8_THREAD:%.*]]240; CHECK:       for.cond8.preheader.i8.thread:241; CHECK-NEXT:    br label [[WHILE_COND_OUTER_OUTER_BACKEDGE]]242; CHECK:       while.cond.outer.outer.backedge:243; CHECK-NEXT:    br label [[WHILE_COND_OUTER_OUTER]]244; CHECK:       while.end:245; CHECK-NEXT:    ret void246;247for.cond8.preheader.i:248  %cmp113.i = call zeroext i1 @check()249  br i1 %cmp113.i, label %make_data.exit, label %for.body13.lr.ph.i250 251for.body13.lr.ph.i:252  br label %make_data.exit253 254make_data.exit:255  br label %while.cond.outer.outer256 257while.cond.outer.outer:258  br label %while.cond.outer259 260while.cond.outer:261  br label %while.cond262 263while.cond:264  br label %while.cond.outer.i265 266while.cond.outer.i:267  %tmp192.ph.i = call zeroext i1 @check()268  br i1 %tmp192.ph.i, label %while.cond.outer.split.us.i, label %while.body.loopexit269 270while.cond.outer.split.us.i:271  br label %while.cond.us.i272 273while.cond.us.i:274  %cmp.us.i = call zeroext i1 @check()275  br i1 %cmp.us.i, label %next_data.exit, label %while.body.us.i276 277while.body.us.i:278  %cmp7.us.i = call zeroext i1 @check()279  br i1 %cmp7.us.i, label %if.then.us.i, label %if.else.i280 281if.then.us.i:282  br label %while.cond.us.i283 284if.else.i:285  br label %while.cond.outer.i286 287next_data.exit:288  %tmp192.ph.i.lcssa28 = call zeroext i1 @check()289  br i1 %tmp192.ph.i.lcssa28, label %while.end, label %while.body290 291while.body.loopexit:292  br label %while.body293 294while.body:295  br label %while.cond.i296 297while.cond.i:298  %cmp.i = call zeroext i1 @check()299  br i1 %cmp.i, label %valid_data.exit, label %while.body.i300 301while.body.i:302  %cmp7.i = call zeroext i1 @check()303  br i1 %cmp7.i, label %valid_data.exit, label %if.end.i304 305if.end.i:306  br label %while.cond.i307 308valid_data.exit:309  br i1 true, label %if.then, label %while.cond310 311if.then:312  %cmp = call zeroext i1 @check()313  br i1 %cmp, label %if.then12, label %if.end314 315if.then12:316  br label %if.end317 318if.end:319  %tobool3.i = call zeroext i1 @check()320  br i1 %tobool3.i, label %copy_data.exit, label %while.body.lr.ph.i321 322while.body.lr.ph.i:323  br label %copy_data.exit324 325copy_data.exit:326  %cmp38 = call zeroext i1 @check()327  br i1 %cmp38, label %if.then39, label %while.cond.outer328 329if.then39:330  %cmp5.i = call zeroext i1 @check()331  br i1 %cmp5.i, label %while.cond.outer.outer.backedge, label %for.cond8.preheader.i8.thread332 333for.cond8.preheader.i8.thread:334  br label %while.cond.outer.outer.backedge335 336while.cond.outer.outer.backedge:337  br label %while.cond.outer.outer338 339while.end:340  ret void341}342 343; Remove a nested loop with irreducible control flow.344; Ensure that only the middle loop is removed and rely on verify-loopinfo to345; check soundness.346define void @unloopIrreducible() nounwind {347; CHECK-LABEL: @unloopIrreducible(348; CHECK-NEXT:  entry:349; CHECK-NEXT:    br label [[FOR_BODY:%.*]]350; CHECK:       for.body:351; CHECK-NEXT:    [[CMP2113:%.*]] = call zeroext i1 @check()352; CHECK-NEXT:    br i1 [[CMP2113]], label [[FOR_BODY22_LR_PH:%.*]], label [[FOR_INC163:%.*]]353; CHECK:       for.body22.lr.ph:354; CHECK-NEXT:    br label [[FOR_BODY22:%.*]]355; CHECK:       for.body22:356; CHECK-NEXT:    br label [[FOR_BODY33:%.*]]357; CHECK:       for.body33:358; CHECK-NEXT:    br label [[FOR_END:%.*]]359; CHECK:       for.end:360; CHECK-NEXT:    [[CMP424:%.*]] = call zeroext i1 @check()361; CHECK-NEXT:    br i1 [[CMP424]], label [[FOR_BODY43_LR_PH:%.*]], label [[FOR_END93:%.*]]362; CHECK:       for.body43.lr.ph:363; CHECK-NEXT:    br label [[FOR_END93]]364; CHECK:       for.end93:365; CHECK-NEXT:    [[CMP96:%.*]] = call zeroext i1 @check()366; CHECK-NEXT:    br i1 [[CMP96]], label [[IF_THEN97:%.*]], label [[FOR_COND103:%.*]]367; CHECK:       if.then97:368; CHECK-NEXT:    br label [[FOR_COND103T:%.*]]369; CHECK:       for.cond103t:370; CHECK-NEXT:    br label [[FOR_COND103]]371; CHECK:       for.cond103:372; CHECK-NEXT:    [[CMP105:%.*]] = call zeroext i1 @check()373; CHECK-NEXT:    br i1 [[CMP105]], label [[FOR_BODY106:%.*]], label [[FOR_END120:%.*]]374; CHECK:       for.body106:375; CHECK-NEXT:    [[CMP108:%.*]] = call zeroext i1 @check()376; CHECK-NEXT:    br i1 [[CMP108]], label [[IF_THEN109:%.*]], label [[FOR_INC117:%.*]]377; CHECK:       if.then109:378; CHECK-NEXT:    br label [[FOR_INC117]]379; CHECK:       for.inc117:380; CHECK-NEXT:    br label [[FOR_COND103T]]381; CHECK:       for.end120:382; CHECK-NEXT:    br label [[FOR_INC159:%.*]]383; CHECK:       for.inc159:384; CHECK-NEXT:    br label [[FOR_INC163]]385; CHECK:       for.inc163:386; CHECK-NEXT:    [[CMP12:%.*]] = call zeroext i1 @check()387; CHECK-NEXT:    br i1 [[CMP12]], label [[FOR_BODY]], label [[FOR_END166:%.*]]388; CHECK:       for.end166:389; CHECK-NEXT:    ret void390;391entry:392  br label %for.body393 394for.body:395  %cmp2113 = call zeroext i1 @check()396  br i1 %cmp2113, label %for.body22.lr.ph, label %for.inc163397 398for.body22.lr.ph:399  br label %for.body22400 401for.body22:402  br label %for.body33403 404for.body33:405  br label %for.end406 407for.end:408  %cmp424 = call zeroext i1 @check()409  br i1 %cmp424, label %for.body43.lr.ph, label %for.end93410 411for.body43.lr.ph:412  br label %for.end93413 414for.end93:415  %cmp96 = call zeroext i1 @check()416  br i1 %cmp96, label %if.then97, label %for.cond103417 418if.then97:419  br label %for.cond103t420 421for.cond103t:422  br label %for.cond103423 424for.cond103:425  %cmp105 = call zeroext i1 @check()426  br i1 %cmp105, label %for.body106, label %for.end120427 428for.body106:429  %cmp108 = call zeroext i1 @check()430  br i1 %cmp108, label %if.then109, label %for.inc117431 432if.then109:433  br label %for.inc117434 435for.inc117:436  br label %for.cond103t437 438for.end120:439  br label %for.inc159440 441for.inc159:442  br i1 false, label %for.body22, label %for.cond15.for.inc163_crit_edge443 444for.cond15.for.inc163_crit_edge:445  br label %for.inc163446 447for.inc163:448  %cmp12 = call zeroext i1 @check()449  br i1 %cmp12, label %for.body, label %for.end166450 451for.end166:452  ret void453 454}455 456; Remove a loop whose exit branches into a sibling loop.457; Ensure that only the loop is removed and rely on verify-loopinfo to458; check soundness.459define void @unloopCriticalEdge(i1 %arg) nounwind {460; CHECK-LABEL: @unloopCriticalEdge(461; CHECK-NEXT:  entry:462; CHECK-NEXT:    br label [[FOR_COND31:%.*]]463; CHECK:       for.cond31:464; CHECK-NEXT:    br i1 false, label [[FOR_BODY35:%.*]], label [[FOR_END94:%.*]]465; CHECK:       for.body35:466; CHECK-NEXT:    br label [[WHILE_COND_I_PREHEADER:%.*]]467; CHECK:       while.cond.i.preheader:468; CHECK-NEXT:    br i1 %arg, label [[WHILE_COND_I_PREHEADER_SPLIT:%.*]], label [[WHILE_COND_OUTER_I_LOOPEXIT_SPLIT:%.*]]469; CHECK:       while.cond.i.preheader.split:470; CHECK-NEXT:    br label [[WHILE_COND_I:%.*]]471; CHECK:       while.cond.i:472; CHECK-NEXT:    br i1 true, label [[WHILE_COND_I]], label [[WHILE_COND_OUTER_I_LOOPEXIT:%.*]]473; CHECK:       while.cond.outer.i.loopexit:474; CHECK-NEXT:    br label [[WHILE_COND_OUTER_I_LOOPEXIT_SPLIT]]475; CHECK:       while.cond.outer.i.loopexit.split:476; CHECK-NEXT:    br label [[WHILE_BODY:%.*]]477; CHECK:       while.body:478; CHECK-NEXT:    br label [[FOR_END78:%.*]]479; CHECK:       for.end78:480; CHECK-NEXT:    br i1 false, label [[PROC2_EXIT:%.*]], label [[FOR_COND_I_PREHEADER:%.*]]481; CHECK:       for.cond.i.preheader:482; CHECK-NEXT:    br label [[FOR_COND_I:%.*]]483; CHECK:       for.cond.i:484; CHECK-NEXT:    br label [[FOR_COND_I]]485; CHECK:       Proc2.exit:486; CHECK-NEXT:    unreachable487; CHECK:       for.end94:488; CHECK-NEXT:    ret void489;490entry:491  br label %for.cond31492 493for.cond31:494  br i1 false, label %for.body35, label %for.end94495 496for.body35:497  br label %while.cond.i.preheader498 499while.cond.i.preheader:500  br i1 %arg, label %while.cond.i.preheader.split, label %while.cond.outer.i.loopexit.split501 502while.cond.i.preheader.split:503  br label %while.cond.i504 505while.cond.i:506  br i1 true, label %while.cond.i, label %while.cond.outer.i.loopexit507 508while.cond.outer.i.loopexit:509  br label %while.cond.outer.i.loopexit.split510 511while.cond.outer.i.loopexit.split:512  br i1 false, label %while.cond.i.preheader, label %Func2.exit513 514Func2.exit:515  br label %while.body516 517while.body:518  br i1 false, label %while.body, label %while.end519 520while.end:521  br label %for.end78522 523for.end78:524  br i1 false, label %Proc2.exit, label %for.cond.i.preheader525 526for.cond.i.preheader:527  br label %for.cond.i528 529for.cond.i:530  br label %for.cond.i531 532Proc2.exit:533  br label %for.cond31534 535for.end94:536  ret void537}538 539; Test UnloopUpdater::removeBlocksFromAncestors.540;541; Check that the loop backedge is removed from the middle loop 1699,542; but not the inner loop 1676.543define void @removeSubloopBlocks() nounwind {544; CHECK-LABEL: @removeSubloopBlocks(545; CHECK-NEXT:  entry:546; CHECK-NEXT:    br label [[TRYAGAIN_OUTER:%.*]]547; CHECK:       tryagain.outer:548; CHECK-NEXT:    br label [[TRYAGAIN:%.*]]549; CHECK:       tryagain:550; CHECK-NEXT:    br i1 false, label [[SW_BB1669:%.*]], label [[SW_BB304:%.*]]551; CHECK:       sw.bb304:552; CHECK-NEXT:    ret void553; CHECK:       sw.bb1669:554; CHECK-NEXT:    br i1 true, label [[SW_DEFAULT1711:%.*]], label [[WHILE_COND1676_PREHEADER:%.*]]555; CHECK:       while.cond1676.preheader:556; CHECK-NEXT:    br label [[WHILE_COND1676:%.*]]557; CHECK:       while.cond1676:558; CHECK-NEXT:    br i1 true, label [[WHILE_END1699:%.*]], label [[WHILE_BODY1694:%.*]]559; CHECK:       while.body1694:560; CHECK-NEXT:    unreachable561; CHECK:       while.end1699:562; CHECK-NEXT:    br label [[SW_DEFAULT1711]]563; CHECK:       sw.default1711:564; CHECK-NEXT:    br label [[DEFCHAR:%.*]]565; CHECK:       defchar:566; CHECK-NEXT:    br i1 true, label [[IF_END2413:%.*]], label [[IF_THEN2368:%.*]]567; CHECK:       if.then2368:568; CHECK-NEXT:    unreachable569; CHECK:       if.end2413:570; CHECK-NEXT:    unreachable571;572entry:573  br label %tryagain.outer574 575tryagain.outer:                                   ; preds = %sw.bb304, %entry576  br label %tryagain577 578tryagain:                                         ; preds = %while.end1699, %tryagain.outer579  br i1 false, label %sw.bb1669, label %sw.bb304580 581sw.bb304:                                         ; preds = %tryagain582  br i1 true, label %return, label %tryagain.outer583 584sw.bb1669:                                        ; preds = %tryagain585  br i1 true, label %sw.default1711, label %while.cond1676586 587while.cond1676:                                   ; preds = %while.body1694, %sw.bb1669588  br i1 true, label %while.end1699, label %while.body1694589 590while.body1694:                                   ; preds = %while.cond1676591  br label %while.cond1676592 593while.end1699:                                    ; preds = %while.cond1676594  br i1 false, label %tryagain, label %sw.default1711595 596sw.default1711:                                   ; preds = %while.end1699, %sw.bb1669, %tryagain597  br label %defchar598 599defchar:                                          ; preds = %sw.default1711, %sw.bb376600  br i1 true, label %if.end2413, label %if.then2368601 602if.then2368:                                      ; preds = %defchar603  unreachable604 605if.end2413:                                       ; preds = %defchar606  unreachable607 608return:                                           ; preds = %sw.bb304609  ret void610}611 612; PR11335: the most deeply nested block should be removed from the outer loop.613define void @removeSubloopBlocks2() nounwind {614; CHECK-LABEL: @removeSubloopBlocks2(615; CHECK-NEXT:  entry:616; CHECK-NEXT:    [[TOBOOL_I:%.*]] = icmp ne i32 undef, 0617; CHECK-NEXT:    br label [[LBL_616:%.*]]618; CHECK:       lbl_616.loopexit:619; CHECK-NEXT:    br label [[LBL_616]]620; CHECK:       lbl_616:621; CHECK-NEXT:    br label [[FOR_COND:%.*]]622; CHECK:       for.cond:623; CHECK-NEXT:    br i1 false, label [[FOR_COND1_PREHEADER:%.*]], label [[LBL_616_LOOPEXIT:%.*]]624; CHECK:       for.cond1.preheader:625; CHECK-NEXT:    br label [[FOR_COND1:%.*]]626; CHECK:       for.cond1.loopexit:627; CHECK-NEXT:    unreachable628; CHECK:       for.cond1:629; CHECK-NEXT:    br i1 false, label [[FOR_BODY2:%.*]], label [[FOR_COND3:%.*]]630; CHECK:       for.body2:631; CHECK-NEXT:    br label [[FOR_COND_I:%.*]]632; CHECK:       for.cond.i:633; CHECK-NEXT:    br i1 [[TOBOOL_I]], label [[FOR_COND_I]], label [[FOR_COND1_LOOPEXIT:%.*]]634; CHECK:       for.cond3:635; CHECK-NEXT:    ret void636;637entry:638  %tobool.i = icmp ne i32 undef, 0639  br label %lbl_616640 641lbl_616.loopexit:                                 ; preds = %for.cond642  br label %lbl_616643 644lbl_616:                                          ; preds = %lbl_616.loopexit, %entry645  br label %for.cond646 647for.cond:                                         ; preds = %for.cond3, %lbl_616648  br i1 false, label %for.cond1.preheader, label %lbl_616.loopexit649 650for.cond1.preheader:                              ; preds = %for.cond651  br label %for.cond1652 653for.cond1.loopexit:                               ; preds = %for.cond.i654  br label %for.cond1655 656for.cond1:                                        ; preds = %for.cond1.loopexit, %for.cond1.preheader657  br i1 false, label %for.body2, label %for.cond3658 659for.body2:                                        ; preds = %for.cond1660  br label %for.cond.i661 662for.cond.i:                                       ; preds = %for.cond.i, %for.body2663  br i1 %tobool.i, label %for.cond.i, label %for.cond1.loopexit664 665for.cond3:                                        ; preds = %for.cond1666  br i1 false, label %for.cond, label %if.end667 668if.end:                                           ; preds = %for.cond3669  ret void670}671