678 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -mtriple=thumbv8m.main -passes='simple-loop-unswitch<nontrivial>' -unswitch-threshold=5 -S -o - %s | FileCheck %s3 4declare void @a()5declare void @b()6declare void @x()7 8define void @test_no_unswitch(ptr %ptr, i1 %cond) {9; CHECK-LABEL: @test_no_unswitch(10; CHECK-NEXT: entry:11; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]12; CHECK: loop_begin:13; CHECK-NEXT: call void @x()14; CHECK-NEXT: call void @x()15; CHECK-NEXT: call void @x()16; CHECK-NEXT: call void @x()17; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP_A:%.*]], label [[LOOP_B:%.*]]18; CHECK: loop_a:19; CHECK-NEXT: call void @a()20; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]21; CHECK: loop_b:22; CHECK-NEXT: call void @b()23; CHECK-NEXT: br label [[LOOP_LATCH]]24; CHECK: loop_latch:25; CHECK-NEXT: [[V:%.*]] = load i1, ptr [[PTR:%.*]], align 126; CHECK-NEXT: br i1 [[V]], label [[LOOP_BEGIN]], label [[LOOP_EXIT:%.*]]27; CHECK: loop_exit:28; CHECK-NEXT: ret void29;30entry:31 br label %loop_begin32loop_begin:33 call void @x()34 call void @x()35 call void @x()36 call void @x()37 br i1 %cond, label %loop_a, label %loop_b38 39loop_a:40 call void @a()41 br label %loop_latch42 43loop_b:44 call void @b()45 br label %loop_latch46 47loop_latch:48 %v = load i1, ptr %ptr49 br i1 %v, label %loop_begin, label %loop_exit50 51loop_exit:52 ret void53}54 55define void @test_unswitch(ptr %ptr, i1 %cond) {56; CHECK-LABEL: @test_unswitch(57; CHECK-NEXT: entry:58; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND:%.*]]59; CHECK-NEXT: br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]60; CHECK: entry.split.us:61; CHECK-NEXT: br label [[LOOP_BEGIN_US:%.*]]62; CHECK: loop_begin.us:63; CHECK-NEXT: call void @x()64; CHECK-NEXT: br label [[LOOP_A_US:%.*]]65; CHECK: loop_a.us:66; CHECK-NEXT: call void @a()67; CHECK-NEXT: br label [[LOOP_LATCH_US:%.*]]68; CHECK: loop_latch.us:69; CHECK-NEXT: [[V_US:%.*]] = load i1, ptr [[PTR:%.*]], align 170; CHECK-NEXT: br i1 [[V_US]], label [[LOOP_BEGIN_US]], label [[LOOP_EXIT_SPLIT_US:%.*]]71; CHECK: loop_exit.split.us:72; CHECK-NEXT: br label [[LOOP_EXIT:%.*]]73; CHECK: entry.split:74; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]75; CHECK: loop_begin:76; CHECK-NEXT: call void @x()77; CHECK-NEXT: br label [[LOOP_B:%.*]]78; CHECK: loop_b:79; CHECK-NEXT: call void @b()80; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]81; CHECK: loop_latch:82; CHECK-NEXT: [[V:%.*]] = load i1, ptr [[PTR]], align 183; CHECK-NEXT: br i1 [[V]], label [[LOOP_BEGIN]], label [[LOOP_EXIT_SPLIT:%.*]]84; CHECK: loop_exit.split:85; CHECK-NEXT: br label [[LOOP_EXIT]]86; CHECK: loop_exit:87; CHECK-NEXT: ret void88;89entry:90 br label %loop_begin91 92loop_begin:93 call void @x()94 br i1 %cond, label %loop_a, label %loop_b95 96loop_a:97 call void @a()98 br label %loop_latch99 100loop_b:101 call void @b()102 br label %loop_latch103 104loop_latch:105 %v = load i1, ptr %ptr106 br i1 %v, label %loop_begin, label %loop_exit107 108loop_exit:109 ret void110}111 112define void @test_unswitch_minsize(ptr %ptr, i1 %cond) #0 {113; CHECK-LABEL: @test_unswitch_minsize(114; CHECK-NEXT: entry:115; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]116; CHECK: loop_begin:117; CHECK-NEXT: call void @x()118; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP_A:%.*]], label [[LOOP_B:%.*]]119; CHECK: loop_a:120; CHECK-NEXT: call void @a()121; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]122; CHECK: loop_b:123; CHECK-NEXT: call void @b()124; CHECK-NEXT: br label [[LOOP_LATCH]]125; CHECK: loop_latch:126; CHECK-NEXT: [[V:%.*]] = load i1, ptr [[PTR:%.*]], align 1127; CHECK-NEXT: br i1 [[V]], label [[LOOP_BEGIN]], label [[LOOP_EXIT:%.*]]128; CHECK: loop_exit:129; CHECK-NEXT: ret void130;131entry:132 br label %loop_begin133 134loop_begin:135 call void @x()136 br i1 %cond, label %loop_a, label %loop_b137 138loop_a:139 call void @a()140 br label %loop_latch141 142loop_b:143 call void @b()144 br label %loop_latch145 146loop_latch:147 %v = load i1, ptr %ptr148 br i1 %v, label %loop_begin, label %loop_exit149 150loop_exit:151 ret void152}153 154define void @test_unswitch_non_dup_code(ptr %ptr, i1 %cond) {155; CHECK-LABEL: @test_unswitch_non_dup_code(156; CHECK-NEXT: entry:157; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND:%.*]]158; CHECK-NEXT: br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]159; CHECK: entry.split.us:160; CHECK-NEXT: br label [[LOOP_BEGIN_US:%.*]]161; CHECK: loop_begin.us:162; CHECK-NEXT: call void @x()163; CHECK-NEXT: br label [[LOOP_A_US:%.*]]164; CHECK: loop_a.us:165; CHECK-NEXT: call void @a()166; CHECK-NEXT: call void @a()167; CHECK-NEXT: call void @a()168; CHECK-NEXT: call void @a()169; CHECK-NEXT: br label [[LOOP_LATCH_US:%.*]]170; CHECK: loop_latch.us:171; CHECK-NEXT: [[V_US:%.*]] = load i1, ptr [[PTR:%.*]], align 1172; CHECK-NEXT: br i1 [[V_US]], label [[LOOP_BEGIN_US]], label [[LOOP_EXIT_SPLIT_US:%.*]]173; CHECK: loop_exit.split.us:174; CHECK-NEXT: br label [[LOOP_EXIT:%.*]]175; CHECK: entry.split:176; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]177; CHECK: loop_begin:178; CHECK-NEXT: call void @x()179; CHECK-NEXT: br label [[LOOP_B:%.*]]180; CHECK: loop_b:181; CHECK-NEXT: call void @b()182; CHECK-NEXT: call void @b()183; CHECK-NEXT: call void @b()184; CHECK-NEXT: call void @b()185; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]186; CHECK: loop_latch:187; CHECK-NEXT: [[V:%.*]] = load i1, ptr [[PTR]], align 1188; CHECK-NEXT: br i1 [[V]], label [[LOOP_BEGIN]], label [[LOOP_EXIT_SPLIT:%.*]]189; CHECK: loop_exit.split:190; CHECK-NEXT: br label [[LOOP_EXIT]]191; CHECK: loop_exit:192; CHECK-NEXT: ret void193;194entry:195 br label %loop_begin196 197loop_begin:198 call void @x()199 br i1 %cond, label %loop_a, label %loop_b200 201loop_a:202 call void @a()203 call void @a()204 call void @a()205 call void @a()206 br label %loop_latch207 208loop_b:209 call void @b()210 call void @b()211 call void @b()212 call void @b()213 br label %loop_latch214 215loop_latch:216 %v = load i1, ptr %ptr217 br i1 %v, label %loop_begin, label %loop_exit218 219loop_exit:220 ret void221}222 223define void @test_unswitch_non_dup_code_minsize(ptr %ptr, i1 %cond) #0 {224; CHECK-LABEL: @test_unswitch_non_dup_code_minsize(225; CHECK-NEXT: entry:226; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]227; CHECK: loop_begin:228; CHECK-NEXT: call void @x()229; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP_A:%.*]], label [[LOOP_B:%.*]]230; CHECK: loop_a:231; CHECK-NEXT: call void @a()232; CHECK-NEXT: call void @a()233; CHECK-NEXT: call void @a()234; CHECK-NEXT: call void @a()235; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]236; CHECK: loop_b:237; CHECK-NEXT: call void @b()238; CHECK-NEXT: call void @b()239; CHECK-NEXT: call void @b()240; CHECK-NEXT: call void @b()241; CHECK-NEXT: br label [[LOOP_LATCH]]242; CHECK: loop_latch:243; CHECK-NEXT: [[V:%.*]] = load i1, ptr [[PTR:%.*]], align 1244; CHECK-NEXT: br i1 [[V]], label [[LOOP_BEGIN]], label [[LOOP_EXIT:%.*]]245; CHECK: loop_exit:246; CHECK-NEXT: ret void247;248entry:249 br label %loop_begin250 251loop_begin:252 call void @x()253 br i1 %cond, label %loop_a, label %loop_b254 255loop_a:256 call void @a()257 call void @a()258 call void @a()259 call void @a()260 br label %loop_latch261 262loop_b:263 call void @b()264 call void @b()265 call void @b()266 call void @b()267 br label %loop_latch268 269loop_latch:270 %v = load i1, ptr %ptr271 br i1 %v, label %loop_begin, label %loop_exit272 273loop_exit:274 ret void275}276 277define void @test_unswitch_non_dup_code_in_cfg(ptr %ptr, i1 %cond) {278; CHECK-LABEL: @test_unswitch_non_dup_code_in_cfg(279; CHECK-NEXT: entry:280; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND:%.*]]281; CHECK-NEXT: br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]282; CHECK: entry.split.us:283; CHECK-NEXT: br label [[LOOP_BEGIN_US:%.*]]284; CHECK: loop_begin.us:285; CHECK-NEXT: call void @x()286; CHECK-NEXT: br label [[LOOP_A_US:%.*]]287; CHECK: loop_a.us:288; CHECK-NEXT: [[V1_US:%.*]] = load i1, ptr [[PTR:%.*]], align 1289; CHECK-NEXT: br i1 [[V1_US]], label [[LOOP_A_A_US:%.*]], label [[LOOP_A_B_US:%.*]]290; CHECK: loop_a_b.us:291; CHECK-NEXT: call void @a()292; CHECK-NEXT: br label [[LOOP_LATCH_US:%.*]]293; CHECK: loop_a_a.us:294; CHECK-NEXT: call void @a()295; CHECK-NEXT: br label [[LOOP_LATCH_US]]296; CHECK: loop_latch.us:297; CHECK-NEXT: [[V3_US:%.*]] = load i1, ptr [[PTR]], align 1298; CHECK-NEXT: br i1 [[V3_US]], label [[LOOP_BEGIN_US]], label [[LOOP_EXIT_SPLIT_US:%.*]]299; CHECK: loop_exit.split.us:300; CHECK-NEXT: br label [[LOOP_EXIT:%.*]]301; CHECK: entry.split:302; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]303; CHECK: loop_begin:304; CHECK-NEXT: call void @x()305; CHECK-NEXT: br label [[LOOP_B:%.*]]306; CHECK: loop_b:307; CHECK-NEXT: [[V2:%.*]] = load i1, ptr [[PTR]], align 1308; CHECK-NEXT: br i1 [[V2]], label [[LOOP_B_A:%.*]], label [[LOOP_B_B:%.*]]309; CHECK: loop_b_a:310; CHECK-NEXT: call void @b()311; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]312; CHECK: loop_b_b:313; CHECK-NEXT: call void @b()314; CHECK-NEXT: br label [[LOOP_LATCH]]315; CHECK: loop_latch:316; CHECK-NEXT: [[V3:%.*]] = load i1, ptr [[PTR]], align 1317; CHECK-NEXT: br i1 [[V3]], label [[LOOP_BEGIN]], label [[LOOP_EXIT_SPLIT:%.*]]318; CHECK: loop_exit.split:319; CHECK-NEXT: br label [[LOOP_EXIT]]320; CHECK: loop_exit:321; CHECK-NEXT: ret void322;323entry:324 br label %loop_begin325 326loop_begin:327 call void @x()328 br i1 %cond, label %loop_a, label %loop_b329 330loop_a:331 %v1 = load i1, ptr %ptr332 br i1 %v1, label %loop_a_a, label %loop_a_b333 334loop_a_a:335 call void @a()336 br label %loop_latch337 338loop_a_b:339 call void @a()340 br label %loop_latch341 342loop_b:343 %v2 = load i1, ptr %ptr344 br i1 %v2, label %loop_b_a, label %loop_b_b345 346loop_b_a:347 call void @b()348 br label %loop_latch349 350loop_b_b:351 call void @b()352 br label %loop_latch353 354loop_latch:355 %v3 = load i1, ptr %ptr356 br i1 %v3, label %loop_begin, label %loop_exit357 358loop_exit:359 ret void360}361 362define void @test_unswitch_non_dup_code_in_cfg_minsize(ptr %ptr, i1 %cond) #0 {363; CHECK-LABEL: @test_unswitch_non_dup_code_in_cfg_minsize(364; CHECK-NEXT: entry:365; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]366; CHECK: loop_begin:367; CHECK-NEXT: call void @x()368; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP_A:%.*]], label [[LOOP_B:%.*]]369; CHECK: loop_a:370; CHECK-NEXT: [[V1:%.*]] = load i1, ptr [[PTR:%.*]], align 1371; CHECK-NEXT: br i1 [[V1]], label [[LOOP_A_A:%.*]], label [[LOOP_A_B:%.*]]372; CHECK: loop_a_a:373; CHECK-NEXT: call void @a()374; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]375; CHECK: loop_a_b:376; CHECK-NEXT: call void @a()377; CHECK-NEXT: br label [[LOOP_LATCH]]378; CHECK: loop_b:379; CHECK-NEXT: [[V2:%.*]] = load i1, ptr [[PTR]], align 1380; CHECK-NEXT: br i1 [[V2]], label [[LOOP_B_A:%.*]], label [[LOOP_B_B:%.*]]381; CHECK: loop_b_a:382; CHECK-NEXT: call void @b()383; CHECK-NEXT: br label [[LOOP_LATCH]]384; CHECK: loop_b_b:385; CHECK-NEXT: call void @b()386; CHECK-NEXT: br label [[LOOP_LATCH]]387; CHECK: loop_latch:388; CHECK-NEXT: [[V3:%.*]] = load i1, ptr [[PTR]], align 1389; CHECK-NEXT: br i1 [[V3]], label [[LOOP_BEGIN]], label [[LOOP_EXIT:%.*]]390; CHECK: loop_exit:391; CHECK-NEXT: ret void392;393entry:394 br label %loop_begin395 396loop_begin:397 call void @x()398 br i1 %cond, label %loop_a, label %loop_b399 400loop_a:401 %v1 = load i1, ptr %ptr402 br i1 %v1, label %loop_a_a, label %loop_a_b403 404loop_a_a:405 call void @a()406 br label %loop_latch407 408loop_a_b:409 call void @a()410 br label %loop_latch411 412loop_b:413 %v2 = load i1, ptr %ptr414 br i1 %v2, label %loop_b_a, label %loop_b_b415 416loop_b_a:417 call void @b()418 br label %loop_latch419 420loop_b_b:421 call void @b()422 br label %loop_latch423 424loop_latch:425 %v3 = load i1, ptr %ptr426 br i1 %v3, label %loop_begin, label %loop_exit427 428loop_exit:429 ret void430}431 432define void @test_no_unswitch_non_dup_code(ptr %ptr, i1 %cond) {433; CHECK-LABEL: @test_no_unswitch_non_dup_code(434; CHECK-NEXT: entry:435; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]436; CHECK: loop_begin:437; CHECK-NEXT: call void @x()438; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP_A:%.*]], label [[LOOP_B:%.*]]439; CHECK: loop_a:440; CHECK-NEXT: [[V1:%.*]] = load i1, ptr [[PTR:%.*]], align 1441; CHECK-NEXT: br i1 [[V1]], label [[LOOP_A_A:%.*]], label [[LOOP_A_B:%.*]]442; CHECK: loop_a_a:443; CHECK-NEXT: call void @a()444; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]445; CHECK: loop_a_b:446; CHECK-NEXT: call void @a()447; CHECK-NEXT: br label [[LOOP_LATCH]]448; CHECK: loop_b:449; CHECK-NEXT: [[V2:%.*]] = load i1, ptr [[PTR]], align 1450; CHECK-NEXT: br i1 [[V2]], label [[LOOP_B_A:%.*]], label [[LOOP_B_B:%.*]]451; CHECK: loop_b_a:452; CHECK-NEXT: call void @b()453; CHECK-NEXT: br label [[LOOP_LATCH]]454; CHECK: loop_b_b:455; CHECK-NEXT: call void @b()456; CHECK-NEXT: br label [[LOOP_LATCH]]457; CHECK: loop_latch:458; CHECK-NEXT: call void @x()459; CHECK-NEXT: call void @x()460; CHECK-NEXT: [[V:%.*]] = load i1, ptr [[PTR]], align 1461; CHECK-NEXT: br i1 [[V]], label [[LOOP_BEGIN]], label [[LOOP_EXIT:%.*]]462; CHECK: loop_exit:463; CHECK-NEXT: ret void464;465entry:466 br label %loop_begin467 468loop_begin:469 call void @x()470 br i1 %cond, label %loop_a, label %loop_b471 472loop_a:473 %v1 = load i1, ptr %ptr474 br i1 %v1, label %loop_a_a, label %loop_a_b475 476loop_a_a:477 call void @a()478 br label %loop_latch479 480loop_a_b:481 call void @a()482 br label %loop_latch483 484loop_b:485 %v2 = load i1, ptr %ptr486 br i1 %v2, label %loop_b_a, label %loop_b_b487 488loop_b_a:489 call void @b()490 br label %loop_latch491 492loop_b_b:493 call void @b()494 br label %loop_latch495 496loop_latch:497 call void @x()498 call void @x()499 %v = load i1, ptr %ptr500 br i1 %v, label %loop_begin, label %loop_exit501 502loop_exit:503 ret void504}505 506define void @test_unswitch_large_exit(ptr %ptr, i1 %cond) {507; CHECK-LABEL: @test_unswitch_large_exit(508; CHECK-NEXT: entry:509; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND:%.*]]510; CHECK-NEXT: br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]511; CHECK: entry.split.us:512; CHECK-NEXT: br label [[LOOP_BEGIN_US:%.*]]513; CHECK: loop_begin.us:514; CHECK-NEXT: call void @x()515; CHECK-NEXT: br label [[LOOP_A_US:%.*]]516; CHECK: loop_a.us:517; CHECK-NEXT: call void @a()518; CHECK-NEXT: br label [[LOOP_LATCH_US:%.*]]519; CHECK: loop_latch.us:520; CHECK-NEXT: [[V_US:%.*]] = load i1, ptr [[PTR:%.*]], align 1521; CHECK-NEXT: br i1 [[V_US]], label [[LOOP_BEGIN_US]], label [[LOOP_EXIT_SPLIT_US:%.*]]522; CHECK: loop_exit.split.us:523; CHECK-NEXT: br label [[LOOP_EXIT:%.*]]524; CHECK: entry.split:525; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]526; CHECK: loop_begin:527; CHECK-NEXT: call void @x()528; CHECK-NEXT: br label [[LOOP_B:%.*]]529; CHECK: loop_b:530; CHECK-NEXT: call void @b()531; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]532; CHECK: loop_latch:533; CHECK-NEXT: [[V:%.*]] = load i1, ptr [[PTR]], align 1534; CHECK-NEXT: br i1 [[V]], label [[LOOP_BEGIN]], label [[LOOP_EXIT_SPLIT:%.*]]535; CHECK: loop_exit.split:536; CHECK-NEXT: br label [[LOOP_EXIT]]537; CHECK: loop_exit:538; CHECK-NEXT: call void @x()539; CHECK-NEXT: call void @x()540; CHECK-NEXT: call void @x()541; CHECK-NEXT: call void @x()542; CHECK-NEXT: ret void543;544entry:545 br label %loop_begin546 547loop_begin:548 call void @x()549 br i1 %cond, label %loop_a, label %loop_b550 551loop_a:552 call void @a()553 br label %loop_latch554 555loop_b:556 call void @b()557 br label %loop_latch558 559loop_latch:560 %v = load i1, ptr %ptr561 br i1 %v, label %loop_begin, label %loop_exit562 563loop_exit:564 call void @x()565 call void @x()566 call void @x()567 call void @x()568 ret void569}570 571define void @test_unswitch_dedicated_exiting(ptr %ptr, i1 %cond) {572; CHECK-LABEL: @test_unswitch_dedicated_exiting(573; CHECK-NEXT: entry:574; CHECK-NEXT: [[COND_FR:%.*]] = freeze i1 [[COND:%.*]]575; CHECK-NEXT: br i1 [[COND_FR]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]576; CHECK: entry.split.us:577; CHECK-NEXT: br label [[LOOP_BEGIN_US:%.*]]578; CHECK: loop_begin.us:579; CHECK-NEXT: call void @x()580; CHECK-NEXT: br label [[LOOP_A_US:%.*]]581; CHECK: loop_a.us:582; CHECK-NEXT: call void @a()583; CHECK-NEXT: br label [[LOOP_LATCH_US:%.*]]584; CHECK: loop_latch.us:585; CHECK-NEXT: [[V_US:%.*]] = load i1, ptr [[PTR:%.*]], align 1586; CHECK-NEXT: br i1 [[V_US]], label [[LOOP_BEGIN_US]], label [[LOOP_EXIT_SPLIT_US:%.*]]587; CHECK: loop_exit.split.us:588; CHECK-NEXT: br label [[LOOP_EXIT:%.*]]589; CHECK: entry.split:590; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]591; CHECK: loop_begin:592; CHECK-NEXT: call void @x()593; CHECK-NEXT: br label [[LOOP_B_EXIT:%.*]]594; CHECK: loop_b_exit:595; CHECK-NEXT: call void @b()596; CHECK-NEXT: call void @b()597; CHECK-NEXT: call void @b()598; CHECK-NEXT: call void @b()599; CHECK-NEXT: ret void600; CHECK: loop_exit:601; CHECK-NEXT: ret void602;603entry:604 br label %loop_begin605 606loop_begin:607 call void @x()608 br i1 %cond, label %loop_a, label %loop_b_exit609 610loop_a:611 call void @a()612 br label %loop_latch613 614loop_b_exit:615 call void @b()616 call void @b()617 call void @b()618 call void @b()619 ret void620 621loop_latch:622 %v = load i1, ptr %ptr623 br i1 %v, label %loop_begin, label %loop_exit624 625loop_exit:626 ret void627}628 629define void @test_unswitch_dedicated_exiting_minsize(ptr %ptr, i1 %cond) #0 {630; CHECK-LABEL: @test_unswitch_dedicated_exiting_minsize(631; CHECK-NEXT: entry:632; CHECK-NEXT: br label [[LOOP_BEGIN:%.*]]633; CHECK: loop_begin:634; CHECK-NEXT: call void @x()635; CHECK-NEXT: br i1 [[COND:%.*]], label [[LOOP_A:%.*]], label [[LOOP_B_EXIT:%.*]]636; CHECK: loop_a:637; CHECK-NEXT: call void @a()638; CHECK-NEXT: br label [[LOOP_LATCH:%.*]]639; CHECK: loop_b_exit:640; CHECK-NEXT: call void @b()641; CHECK-NEXT: call void @b()642; CHECK-NEXT: call void @b()643; CHECK-NEXT: call void @b()644; CHECK-NEXT: ret void645; CHECK: loop_latch:646; CHECK-NEXT: [[V:%.*]] = load i1, ptr [[PTR:%.*]], align 1647; CHECK-NEXT: br i1 [[V]], label [[LOOP_BEGIN]], label [[LOOP_EXIT:%.*]]648; CHECK: loop_exit:649; CHECK-NEXT: ret void650;651entry:652 br label %loop_begin653 654loop_begin:655 call void @x()656 br i1 %cond, label %loop_a, label %loop_b_exit657 658loop_a:659 call void @a()660 br label %loop_latch661 662loop_b_exit:663 call void @b()664 call void @b()665 call void @b()666 call void @b()667 ret void668 669loop_latch:670 %v = load i1, ptr %ptr671 br i1 %v, label %loop_begin, label %loop_exit672 673loop_exit:674 ret void675}676 677attributes #0 = { minsize optsize }678