1206 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -fix-irreducible --verify-loop-info -S | FileCheck %s3; RUN: opt < %s -passes='fix-irreducible,verify<loops>' -S | FileCheck %s4; RUN: opt < %s -passes='verify<loops>,fix-irreducible,verify<loops>' -S | FileCheck %s5 6define void @nested_irr_top_level(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5) {7; CHECK-LABEL: @nested_irr_top_level(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[PRED1_INV:%.*]] = xor i1 [[PRED1:%.*]], true10; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true11; CHECK-NEXT: br label [[IRR_GUARD:%.*]]12; CHECK: A1:13; CHECK-NEXT: br label [[IRR_GUARD1:%.*]]14; CHECK: B1:15; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[IRR_GUARD1]], label [[A3:%.*]]16; CHECK: B2:17; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[B1:%.*]], label [[A3]]18; CHECK: A3:19; CHECK-NEXT: br i1 [[PRED4:%.*]], label [[IRR_GUARD]], label [[EXIT:%.*]]20; CHECK: A2:21; CHECK-NEXT: br i1 [[PRED5:%.*]], label [[A1:%.*]], label [[EXIT]]22; CHECK: exit:23; CHECK-NEXT: ret void24; CHECK: irr.guard:25; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3]] ], [ [[PRED0_INV]], [[ENTRY:%.*]] ]26; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]]27; CHECK: irr.guard1:28; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[B1]] ], [ [[PRED1_INV]], [[A1]] ]29; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]]30;31entry:32 br i1 %Pred0, label %A1, label %A233 34A1:35 br i1 %Pred1, label %B1, label %B236 37B1:38 br i1 %Pred2, label %B2, label %A339 40B2:41 br i1 %Pred3, label %B1, label %A342 43A3:44 br i1 %Pred4, label %A2, label %exit45 46A2:47 br i1 %Pred5, label %A1, label %exit48 49exit:50 ret void51}52 53define void @nested_irr_top_level_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5) {54; CHECK-LABEL: @nested_irr_top_level_callbr(55; CHECK-NEXT: entry:56; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]])57; CHECK-NEXT: to label [[ENTRY_TARGET_A1:%.*]] [label %entry.target.A2]58; CHECK: A1:59; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]])60; CHECK-NEXT: to label [[A1_TARGET_B1:%.*]] [label %A1.target.B2]61; CHECK: B1:62; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]])63; CHECK-NEXT: to label [[B1_TARGET_B2:%.*]] [label %A3]64; CHECK: B2:65; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]])66; CHECK-NEXT: to label [[B1:%.*]] [label %A3]67; CHECK: A3:68; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED4:%.*]])69; CHECK-NEXT: to label [[A3_TARGET_A2:%.*]] [label %exit]70; CHECK: A2:71; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED5:%.*]])72; CHECK-NEXT: to label [[A1:%.*]] [label %exit]73; CHECK: exit:74; CHECK-NEXT: ret void75; CHECK: A3.target.A2:76; CHECK-NEXT: br label [[IRR_GUARD:%.*]]77; CHECK: entry.target.A1:78; CHECK-NEXT: br label [[IRR_GUARD]]79; CHECK: entry.target.A2:80; CHECK-NEXT: br label [[IRR_GUARD]]81; CHECK: irr.guard:82; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3_TARGET_A2]] ], [ false, [[ENTRY_TARGET_A1]] ], [ true, [[ENTRY_TARGET_A2:%.*]] ]83; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]]84; CHECK: B1.target.B2:85; CHECK-NEXT: br label [[IRR_GUARD1:%.*]]86; CHECK: A1.target.B1:87; CHECK-NEXT: br label [[IRR_GUARD1]]88; CHECK: A1.target.B2:89; CHECK-NEXT: br label [[IRR_GUARD1]]90; CHECK: irr.guard1:91; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[B1_TARGET_B2]] ], [ false, [[A1_TARGET_B1]] ], [ true, [[A1_TARGET_B2:%.*]] ]92; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]]93;94entry:95 callbr void asm "", "r,!i"(i1 %Pred0) to label %A1 [label %A2]96 97A1:98 callbr void asm "", "r,!i"(i1 %Pred1) to label %B1 [label %B2]99 100B1:101 callbr void asm "", "r,!i"(i1 %Pred2) to label %B2 [label %A3]102 103B2:104 callbr void asm "", "r,!i"(i1 %Pred3) to label %B1 [label %A3]105 106A3:107 callbr void asm "", "r,!i"(i1 %Pred4) to label %A2 [label %exit]108 109A2:110 callbr void asm "", "r,!i"(i1 %Pred5) to label %A1 [label %exit]111 112exit:113 ret void114}115 116define void @nested_irr_in_loop(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6) {117; CHECK-LABEL: @nested_irr_in_loop(118; CHECK-NEXT: entry:119; CHECK-NEXT: [[PRED1_INV:%.*]] = xor i1 [[PRED1:%.*]], true120; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true121; CHECK-NEXT: br label [[H1:%.*]]122; CHECK: H1:123; CHECK-NEXT: br label [[IRR_GUARD:%.*]]124; CHECK: A1:125; CHECK-NEXT: br label [[IRR_GUARD1:%.*]]126; CHECK: B1:127; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[IRR_GUARD1]], label [[A3:%.*]]128; CHECK: B2:129; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[B1:%.*]], label [[A3]]130; CHECK: A3:131; CHECK-NEXT: br i1 [[PRED4:%.*]], label [[IRR_GUARD]], label [[L1:%.*]]132; CHECK: A2:133; CHECK-NEXT: br i1 [[PRED5:%.*]], label [[A1:%.*]], label [[L1]]134; CHECK: L1:135; CHECK-NEXT: br i1 [[PRED6:%.*]], label [[EXIT:%.*]], label [[H1]]136; CHECK: exit:137; CHECK-NEXT: ret void138; CHECK: irr.guard:139; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3]] ], [ [[PRED0_INV]], [[H1]] ]140; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]]141; CHECK: irr.guard1:142; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[B1]] ], [ [[PRED1_INV]], [[A1]] ]143; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]]144;145entry:146 br label %H1147 148H1:149 br i1 %Pred0, label %A1, label %A2150 151A1:152 br i1 %Pred1, label %B1, label %B2153 154B1:155 br i1 %Pred2, label %B2, label %A3156 157B2:158 br i1 %Pred3, label %B1, label %A3159 160A3:161 br i1 %Pred4, label %A2, label %L1162 163A2:164 br i1 %Pred5, label %A1, label %L1165 166L1:167 br i1 %Pred6, label %exit, label %H1168 169exit:170 ret void171}172 173define void @nested_irr_in_loop_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6) {174; CHECK-LABEL: @nested_irr_in_loop_callbr(175; CHECK-NEXT: entry:176; CHECK-NEXT: br label [[H1:%.*]]177; CHECK: H1:178; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]])179; CHECK-NEXT: to label [[H1_TARGET_A1:%.*]] [label %H1.target.A2]180; CHECK: A1:181; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]])182; CHECK-NEXT: to label [[A1_TARGET_B1:%.*]] [label %A1.target.B2]183; CHECK: B1:184; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]])185; CHECK-NEXT: to label [[B1_TARGET_B2:%.*]] [label %A3]186; CHECK: B2:187; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]])188; CHECK-NEXT: to label [[B1:%.*]] [label %A3]189; CHECK: A3:190; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED4:%.*]])191; CHECK-NEXT: to label [[A3_TARGET_A2:%.*]] [label %L1]192; CHECK: A2:193; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED5:%.*]])194; CHECK-NEXT: to label [[A1:%.*]] [label %L1]195; CHECK: L1:196; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED6:%.*]])197; CHECK-NEXT: to label [[EXIT:%.*]] [label %H1]198; CHECK: exit:199; CHECK-NEXT: ret void200; CHECK: A3.target.A2:201; CHECK-NEXT: br label [[IRR_GUARD:%.*]]202; CHECK: H1.target.A1:203; CHECK-NEXT: br label [[IRR_GUARD]]204; CHECK: H1.target.A2:205; CHECK-NEXT: br label [[IRR_GUARD]]206; CHECK: irr.guard:207; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3_TARGET_A2]] ], [ false, [[H1_TARGET_A1]] ], [ true, [[H1_TARGET_A2:%.*]] ]208; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]]209; CHECK: B1.target.B2:210; CHECK-NEXT: br label [[IRR_GUARD1:%.*]]211; CHECK: A1.target.B1:212; CHECK-NEXT: br label [[IRR_GUARD1]]213; CHECK: A1.target.B2:214; CHECK-NEXT: br label [[IRR_GUARD1]]215; CHECK: irr.guard1:216; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[B1_TARGET_B2]] ], [ false, [[A1_TARGET_B1]] ], [ true, [[A1_TARGET_B2:%.*]] ]217; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]]218;219entry:220 br label %H1221 222H1:223 callbr void asm "", "r,!i"(i1 %Pred0) to label %A1 [label %A2]224 225A1:226 callbr void asm "", "r,!i"(i1 %Pred1) to label %B1 [label %B2]227 228B1:229 callbr void asm "", "r,!i"(i1 %Pred2) to label %B2 [label %A3]230 231B2:232 callbr void asm "", "r,!i"(i1 %Pred3) to label %B1 [label %A3]233 234A3:235 callbr void asm "", "r,!i"(i1 %Pred4) to label %A2 [label %L1]236 237A2:238 callbr void asm "", "r,!i"(i1 %Pred5) to label %A1 [label %L1]239 240L1:241 callbr void asm "", "r,!i"(i1 %Pred6) to label %exit [label %H1]242 243exit:244 ret void245}246 247define void @loop_in_irr(i1 %Pred0, i1 %Pred1, i1 %Pred2) {248; CHECK-LABEL: @loop_in_irr(249; CHECK-NEXT: entry:250; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true251; CHECK-NEXT: br label [[IRR_GUARD:%.*]]252; CHECK: A1:253; CHECK-NEXT: br label [[H1:%.*]]254; CHECK: H1:255; CHECK-NEXT: br label [[L1:%.*]]256; CHECK: L1:257; CHECK-NEXT: br i1 [[PRED1:%.*]], label [[H1]], label [[A3:%.*]]258; CHECK: A3:259; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[IRR_GUARD]], label [[EXIT:%.*]]260; CHECK: A2:261; CHECK-NEXT: br label [[A1:%.*]]262; CHECK: exit:263; CHECK-NEXT: ret void264; CHECK: irr.guard:265; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3]] ], [ [[PRED0_INV]], [[ENTRY:%.*]] ]266; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]]267;268entry:269 br i1 %Pred0, label %A1, label %A2270 271A1:272 br label %H1273 274H1:275 br label %L1276 277L1:278 br i1 %Pred1, label %H1, label %A3279 280A3:281 br i1 %Pred2, label %A2, label %exit282 283A2:284 br label %A1285 286exit:287 ret void288}289 290define void @loop_in_irr_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2) {291; CHECK-LABEL: @loop_in_irr_callbr(292; CHECK-NEXT: entry:293; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]])294; CHECK-NEXT: to label [[ENTRY_TARGET_A1:%.*]] [label %entry.target.A2]295; CHECK: A1:296; CHECK-NEXT: callbr void asm "", ""()297; CHECK-NEXT: to label [[H1:%.*]] []298; CHECK: H1:299; CHECK-NEXT: callbr void asm "", ""()300; CHECK-NEXT: to label [[L1:%.*]] []301; CHECK: L1:302; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]])303; CHECK-NEXT: to label [[H1]] [label %A3]304; CHECK: A3:305; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]])306; CHECK-NEXT: to label [[A3_TARGET_A2:%.*]] [label %exit]307; CHECK: A2:308; CHECK-NEXT: callbr void asm "", ""()309; CHECK-NEXT: to label [[A1:%.*]] []310; CHECK: exit:311; CHECK-NEXT: ret void312; CHECK: A3.target.A2:313; CHECK-NEXT: br label [[IRR_GUARD:%.*]]314; CHECK: entry.target.A1:315; CHECK-NEXT: br label [[IRR_GUARD]]316; CHECK: entry.target.A2:317; CHECK-NEXT: br label [[IRR_GUARD]]318; CHECK: irr.guard:319; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3_TARGET_A2]] ], [ false, [[ENTRY_TARGET_A1]] ], [ true, [[ENTRY_TARGET_A2:%.*]] ]320; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]]321;322entry:323 callbr void asm "", "r,!i"(i1 %Pred0) to label %A1 [label %A2]324 325A1:326 callbr void asm "", ""() to label %H1 []327 328H1:329 callbr void asm "", ""() to label %L1 []330 331L1:332 callbr void asm "", "r,!i"(i1 %Pred1) to label %H1 [label %A3]333 334A3:335 callbr void asm "", "r,!i"(i1 %Pred2) to label %A2 [label %exit]336 337A2:338 callbr void asm "", ""() to label %A1 []339 340exit:341 ret void342}343 344define void @loop_in_irr_shared_entry(i1 %Pred0, i1 %Pred1, i1 %Pred2) {345; CHECK-LABEL: @loop_in_irr_shared_entry(346; CHECK-NEXT: entry:347; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true348; CHECK-NEXT: br label [[IRR_GUARD:%.*]]349; CHECK: H1:350; CHECK-NEXT: br label [[L1:%.*]]351; CHECK: L1:352; CHECK-NEXT: br i1 [[PRED1:%.*]], label [[H1:%.*]], label [[A3:%.*]]353; CHECK: A3:354; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[IRR_GUARD]], label [[EXIT:%.*]]355; CHECK: A2:356; CHECK-NEXT: br label [[H1]]357; CHECK: exit:358; CHECK-NEXT: ret void359; CHECK: irr.guard:360; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3]] ], [ [[PRED0_INV]], [[ENTRY:%.*]] ]361; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[H1]]362;363entry:364 br i1 %Pred0, label %H1, label %A2365 366H1:367 br label %L1368 369L1:370 br i1 %Pred1, label %H1, label %A3371 372A3:373 br i1 %Pred2, label %A2, label %exit374 375A2:376 br label %H1377 378exit:379 ret void380}381 382define void @loop_in_irr_shared_entry_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2) {383; CHECK-LABEL: @loop_in_irr_shared_entry_callbr(384; CHECK-NEXT: entry:385; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]])386; CHECK-NEXT: to label [[ENTRY_TARGET_H1:%.*]] [label %entry.target.A2]387; CHECK: H1:388; CHECK-NEXT: callbr void asm "", ""()389; CHECK-NEXT: to label [[L1:%.*]] []390; CHECK: L1:391; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]])392; CHECK-NEXT: to label [[H1:%.*]] [label %A3]393; CHECK: A3:394; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]])395; CHECK-NEXT: to label [[A3_TARGET_A2:%.*]] [label %exit]396; CHECK: A2:397; CHECK-NEXT: callbr void asm "", ""()398; CHECK-NEXT: to label [[H1]] []399; CHECK: exit:400; CHECK-NEXT: ret void401; CHECK: A3.target.A2:402; CHECK-NEXT: br label [[IRR_GUARD:%.*]]403; CHECK: entry.target.H1:404; CHECK-NEXT: br label [[IRR_GUARD]]405; CHECK: entry.target.A2:406; CHECK-NEXT: br label [[IRR_GUARD]]407; CHECK: irr.guard:408; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A3_TARGET_A2]] ], [ false, [[ENTRY_TARGET_H1]] ], [ true, [[ENTRY_TARGET_A2:%.*]] ]409; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[H1]]410;411entry:412 callbr void asm "", "r,!i"(i1 %Pred0) to label %H1 [label %A2]413 414H1:415 callbr void asm "", ""() to label %L1 []416 417L1:418 callbr void asm "", "r,!i"(i1 %Pred1) to label %H1 [label %A3]419 420A3:421 callbr void asm "", "r,!i"(i1 %Pred2) to label %A2 [label %exit]422 423A2:424 callbr void asm "", ""() to label %H1 []425 426exit:427 ret void428}429 430define void @loop_in_irr_shared_header(i1 %Pred0, i1 %Pred1, i1 %Pred2) {431; CHECK-LABEL: @loop_in_irr_shared_header(432; CHECK-NEXT: entry:433; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true434; CHECK-NEXT: br label [[IRR_GUARD:%.*]]435; CHECK: H1:436; CHECK-NEXT: br label [[L1:%.*]]437; CHECK: L1:438; CHECK-NEXT: br i1 [[PRED1:%.*]], label [[IRR_GUARD]], label [[A3:%.*]]439; CHECK: A3:440; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[A2:%.*]], label [[EXIT:%.*]]441; CHECK: A2:442; CHECK-NEXT: br label [[IRR_GUARD]]443; CHECK: exit:444; CHECK-NEXT: ret void445; CHECK: irr.guard:446; CHECK-NEXT: [[GUARD_H1:%.*]] = phi i1 [ true, [[A2]] ], [ true, [[L1]] ], [ [[PRED0_INV]], [[ENTRY:%.*]] ]447; CHECK-NEXT: br i1 [[GUARD_H1]], label [[H1:%.*]], label [[A2]]448;449entry:450 br i1 %Pred0, label %A2, label %H1451 452H1:453 br label %L1454 455L1:456 br i1 %Pred1, label %H1, label %A3457 458A3:459 br i1 %Pred2, label %A2, label %exit460 461A2:462 br label %H1463 464exit:465 ret void466}467 468define void @loop_in_irr_shared_header_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2) {469; CHECK-LABEL: @loop_in_irr_shared_header_callbr(470; CHECK-NEXT: entry:471; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]])472; CHECK-NEXT: to label [[ENTRY_TARGET_A2:%.*]] [label %entry.target.H1]473; CHECK: H1:474; CHECK-NEXT: callbr void asm "", ""()475; CHECK-NEXT: to label [[L1:%.*]] []476; CHECK: L1:477; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]])478; CHECK-NEXT: to label [[L1_TARGET_H1:%.*]] [label %A3]479; CHECK: A3:480; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]])481; CHECK-NEXT: to label [[A2:%.*]] [label %exit]482; CHECK: A2:483; CHECK-NEXT: callbr void asm "", ""()484; CHECK-NEXT: to label [[A2_TARGET_H1:%.*]] []485; CHECK: exit:486; CHECK-NEXT: ret void487; CHECK: A2.target.H1:488; CHECK-NEXT: br label [[IRR_GUARD:%.*]]489; CHECK: L1.target.H1:490; CHECK-NEXT: br label [[IRR_GUARD]]491; CHECK: entry.target.A2:492; CHECK-NEXT: br label [[IRR_GUARD]]493; CHECK: entry.target.H1:494; CHECK-NEXT: br label [[IRR_GUARD]]495; CHECK: irr.guard:496; CHECK-NEXT: [[GUARD_H1:%.*]] = phi i1 [ true, [[A2_TARGET_H1]] ], [ true, [[L1_TARGET_H1]] ], [ false, [[ENTRY_TARGET_A2]] ], [ true, [[ENTRY_TARGET_H1:%.*]] ]497; CHECK-NEXT: br i1 [[GUARD_H1]], label [[H1:%.*]], label [[A2]]498;499entry:500 callbr void asm "", "r,!i"(i1 %Pred0) to label %A2 [label %H1]501 502H1:503 callbr void asm "", ""() to label %L1 []504 505L1:506 callbr void asm "", "r,!i"(i1 %Pred1) to label %H1 [label %A3]507 508A3:509 callbr void asm "", "r,!i"(i1 %Pred2) to label %A2 [label %exit]510 511A2:512 callbr void asm "", ""() to label %H1 []513 514exit:515 ret void516}517 518define void @loop_irr_loop_shared_header(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3) {519; CHECK-LABEL: @loop_irr_loop_shared_header(520; CHECK-NEXT: entry:521; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true522; CHECK-NEXT: br label [[H2:%.*]]523; CHECK: H2:524; CHECK-NEXT: br label [[IRR_GUARD:%.*]]525; CHECK: H1:526; CHECK-NEXT: br i1 [[PRED1:%.*]], label [[A3:%.*]], label [[IRR_GUARD]]527; CHECK: A3:528; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[A2:%.*]], label [[L2:%.*]]529; CHECK: A2:530; CHECK-NEXT: br label [[IRR_GUARD]]531; CHECK: L2:532; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[H2]], label [[EXIT:%.*]]533; CHECK: exit:534; CHECK-NEXT: ret void535; CHECK: irr.guard:536; CHECK-NEXT: [[GUARD_H1:%.*]] = phi i1 [ true, [[A2]] ], [ true, [[H1:%.*]] ], [ [[PRED0_INV]], [[H2]] ]537; CHECK-NEXT: br i1 [[GUARD_H1]], label [[H1]], label [[A2]]538;539entry:540 br label %H2541 542H2:543 br i1 %Pred0, label %A2, label %H1544 545H1:546 br i1 %Pred1, label %A3, label %H1547 548A3:549 br i1 %Pred2, label %A2, label %L2550 551A2:552 br label %H1553 554L2:555 br i1 %Pred3, label %H2, label %exit556 557exit:558 ret void559}560 561define void @loop_irr_loop_shared_header_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3) {562; CHECK-LABEL: @loop_irr_loop_shared_header_callbr(563; CHECK-NEXT: entry:564; CHECK-NEXT: callbr void asm "", ""()565; CHECK-NEXT: to label [[H2:%.*]] []566; CHECK: H2:567; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]])568; CHECK-NEXT: to label [[H2_TARGET_A2:%.*]] [label %H2.target.H1]569; CHECK: H1:570; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]])571; CHECK-NEXT: to label [[A3:%.*]] [label %H1.target.H1]572; CHECK: A3:573; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]])574; CHECK-NEXT: to label [[A2:%.*]] [label %L2]575; CHECK: A2:576; CHECK-NEXT: callbr void asm "", ""()577; CHECK-NEXT: to label [[A2_TARGET_H1:%.*]] []578; CHECK: L2:579; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]])580; CHECK-NEXT: to label [[H2]] [label %exit]581; CHECK: exit:582; CHECK-NEXT: ret void583; CHECK: A2.target.H1:584; CHECK-NEXT: br label [[IRR_GUARD:%.*]]585; CHECK: H1.target.H1:586; CHECK-NEXT: br label [[IRR_GUARD]]587; CHECK: H2.target.A2:588; CHECK-NEXT: br label [[IRR_GUARD]]589; CHECK: H2.target.H1:590; CHECK-NEXT: br label [[IRR_GUARD]]591; CHECK: irr.guard:592; CHECK-NEXT: [[GUARD_H1:%.*]] = phi i1 [ true, [[A2_TARGET_H1]] ], [ true, [[H1_TARGET_H1:%.*]] ], [ false, [[H2_TARGET_A2]] ], [ true, [[H2_TARGET_H1:%.*]] ]593; CHECK-NEXT: br i1 [[GUARD_H1]], label [[H1:%.*]], label [[A2]]594;595entry:596 callbr void asm "", ""() to label %H2 []597 598H2:599 callbr void asm "", "r,!i"(i1 %Pred0) to label %A2 [label %H1]600 601H1:602 callbr void asm "", "r,!i"(i1 %Pred1) to label %A3 [label %H1]603 604A3:605 callbr void asm "", "r,!i"(i1 %Pred2) to label %A2 [label %L2]606 607A2:608 callbr void asm "", ""() to label %H1 []609 610L2:611 callbr void asm "", "r,!i"(i1 %Pred3) to label %H2 [label %exit]612 613exit:614 ret void615}616 617define void @siblings_top_level(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6) {618; CHECK-LABEL: @siblings_top_level(619; CHECK-NEXT: entry:620; CHECK-NEXT: [[PRED4_INV:%.*]] = xor i1 [[PRED4:%.*]], true621; CHECK-NEXT: [[PRED1_INV:%.*]] = xor i1 [[PRED1:%.*]], true622; CHECK-NEXT: br i1 [[PRED0:%.*]], label [[H1:%.*]], label [[FORK1:%.*]]623; CHECK: H1:624; CHECK-NEXT: br label [[IRR_GUARD:%.*]]625; CHECK: A1:626; CHECK-NEXT: br label [[IRR_GUARD]]627; CHECK: A2:628; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[A1:%.*]], label [[L1:%.*]]629; CHECK: L1:630; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[H1]], label [[EXIT:%.*]]631; CHECK: fork1:632; CHECK-NEXT: br label [[IRR_GUARD1:%.*]]633; CHECK: B1:634; CHECK-NEXT: br label [[H2:%.*]]635; CHECK: H2:636; CHECK-NEXT: br label [[L2:%.*]]637; CHECK: L2:638; CHECK-NEXT: br i1 [[PRED5:%.*]], label [[H2]], label [[IRR_GUARD1]]639; CHECK: B2:640; CHECK-NEXT: br i1 [[PRED6:%.*]], label [[B1:%.*]], label [[EXIT]]641; CHECK: exit:642; CHECK-NEXT: ret void643; CHECK: irr.guard:644; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A1]] ], [ [[PRED1_INV]], [[H1]] ]645; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]]646; CHECK: irr.guard1:647; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[L2]] ], [ [[PRED4_INV]], [[FORK1]] ]648; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]]649;650entry:651 br i1 %Pred0, label %H1, label %fork1652 653H1:654 br i1 %Pred1, label %A1, label %A2655 656A1:657 br label %A2658 659A2:660 br i1 %Pred2, label %A1, label %L1661 662L1:663 br i1 %Pred3, label %H1, label %exit664 665fork1:666 br i1 %Pred4, label %B1, label %B2667 668B1:669 br label %H2670 671H2:672 br label %L2673 674L2:675 br i1 %Pred5, label %H2, label %B2676 677B2:678 br i1 %Pred6, label %B1, label %exit679 680exit:681 ret void682}683 684define void @siblings_top_level_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6) {685; CHECK-LABEL: @siblings_top_level_callbr(686; CHECK-NEXT: entry:687; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]])688; CHECK-NEXT: to label [[H1:%.*]] [label %fork1]689; CHECK: H1:690; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]])691; CHECK-NEXT: to label [[H1_TARGET_A1:%.*]] [label %H1.target.A2]692; CHECK: A1:693; CHECK-NEXT: callbr void asm "", ""()694; CHECK-NEXT: to label [[A1_TARGET_A2:%.*]] []695; CHECK: A2:696; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]])697; CHECK-NEXT: to label [[A1:%.*]] [label %L1]698; CHECK: L1:699; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]])700; CHECK-NEXT: to label [[H1]] [label %exit]701; CHECK: fork1:702; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED4:%.*]])703; CHECK-NEXT: to label [[FORK1_TARGET_B1:%.*]] [label %fork1.target.B2]704; CHECK: B1:705; CHECK-NEXT: callbr void asm "", ""()706; CHECK-NEXT: to label [[H2:%.*]] []707; CHECK: H2:708; CHECK-NEXT: callbr void asm "", ""()709; CHECK-NEXT: to label [[L2:%.*]] []710; CHECK: L2:711; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED5:%.*]])712; CHECK-NEXT: to label [[H2]] [label %L2.target.B2]713; CHECK: B2:714; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED6:%.*]])715; CHECK-NEXT: to label [[B1:%.*]] [label %exit]716; CHECK: exit:717; CHECK-NEXT: ret void718; CHECK: A1.target.A2:719; CHECK-NEXT: br label [[IRR_GUARD:%.*]]720; CHECK: H1.target.A1:721; CHECK-NEXT: br label [[IRR_GUARD]]722; CHECK: H1.target.A2:723; CHECK-NEXT: br label [[IRR_GUARD]]724; CHECK: irr.guard:725; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A1_TARGET_A2]] ], [ false, [[H1_TARGET_A1]] ], [ true, [[H1_TARGET_A2:%.*]] ]726; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]]727; CHECK: L2.target.B2:728; CHECK-NEXT: br label [[IRR_GUARD1:%.*]]729; CHECK: fork1.target.B1:730; CHECK-NEXT: br label [[IRR_GUARD1]]731; CHECK: fork1.target.B2:732; CHECK-NEXT: br label [[IRR_GUARD1]]733; CHECK: irr.guard1:734; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[L2_TARGET_B2:%.*]] ], [ false, [[FORK1_TARGET_B1]] ], [ true, [[FORK1_TARGET_B2:%.*]] ]735; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]]736;737entry:738 callbr void asm "", "r,!i"(i1 %Pred0) to label %H1 [label %fork1]739 740H1:741 callbr void asm "", "r,!i"(i1 %Pred1) to label %A1 [label %A2]742 743A1:744 callbr void asm "", ""() to label %A2 []745 746A2:747 callbr void asm "", "r,!i"(i1 %Pred2) to label %A1 [label %L1]748 749L1:750 callbr void asm "", "r,!i"(i1 %Pred3) to label %H1 [label %exit]751 752fork1:753 callbr void asm "", "r,!i"(i1 %Pred4) to label %B1 [label %B2]754 755B1:756 callbr void asm "", ""() to label %H2 []757 758H2:759 callbr void asm "", ""() to label %L2 []760 761L2:762 callbr void asm "", "r,!i"(i1 %Pred5) to label %H2 [label %B2]763 764B2:765 callbr void asm "", "r,!i"(i1 %Pred6) to label %B1 [label %exit]766 767exit:768 ret void769}770 771define void @siblings_in_loop(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6, i1 %Pred7) {772; CHECK-LABEL: @siblings_in_loop(773; CHECK-NEXT: entry:774; CHECK-NEXT: [[PRED4_INV:%.*]] = xor i1 [[PRED4:%.*]], true775; CHECK-NEXT: [[PRED1_INV:%.*]] = xor i1 [[PRED1:%.*]], true776; CHECK-NEXT: br label [[H0:%.*]]777; CHECK: H0:778; CHECK-NEXT: br i1 [[PRED0:%.*]], label [[H1:%.*]], label [[FORK1:%.*]]779; CHECK: H1:780; CHECK-NEXT: br label [[IRR_GUARD:%.*]]781; CHECK: A1:782; CHECK-NEXT: br label [[IRR_GUARD]]783; CHECK: A2:784; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[A1:%.*]], label [[L1:%.*]]785; CHECK: L1:786; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[H1]], label [[L0:%.*]]787; CHECK: fork1:788; CHECK-NEXT: br label [[IRR_GUARD1:%.*]]789; CHECK: B1:790; CHECK-NEXT: br label [[H2:%.*]]791; CHECK: H2:792; CHECK-NEXT: br label [[L2:%.*]]793; CHECK: L2:794; CHECK-NEXT: br i1 [[PRED5:%.*]], label [[H2]], label [[IRR_GUARD1]]795; CHECK: B2:796; CHECK-NEXT: br i1 [[PRED6:%.*]], label [[B1:%.*]], label [[L0]]797; CHECK: L0:798; CHECK-NEXT: br i1 [[PRED7:%.*]], label [[EXIT:%.*]], label [[H0]]799; CHECK: exit:800; CHECK-NEXT: ret void801; CHECK: irr.guard:802; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A1]] ], [ [[PRED1_INV]], [[H1]] ]803; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]]804; CHECK: irr.guard1:805; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[L2]] ], [ [[PRED4_INV]], [[FORK1]] ]806; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]]807;808entry:809 br label %H0810 811H0:812 br i1 %Pred0, label %H1, label %fork1813 814H1:815 br i1 %Pred1, label %A1, label %A2816 817A1:818 br label %A2819 820A2:821 br i1 %Pred2, label %A1, label %L1822 823L1:824 br i1 %Pred3, label %H1, label %L0825 826fork1:827 br i1 %Pred4, label %B1, label %B2828 829B1:830 br label %H2831 832H2:833 br label %L2834 835L2:836 br i1 %Pred5, label %H2, label %B2837 838B2:839 br i1 %Pred6, label %B1, label %L0840 841L0:842 br i1 %Pred7, label %exit, label %H0843 844exit:845 ret void846}847 848define void @siblings_in_loop_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6, i1 %Pred7) {849; CHECK-LABEL: @siblings_in_loop_callbr(850; CHECK-NEXT: entry:851; CHECK-NEXT: callbr void asm "", ""()852; CHECK-NEXT: to label [[H0:%.*]] []853; CHECK: H0:854; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]])855; CHECK-NEXT: to label [[H1:%.*]] [label %fork1]856; CHECK: H1:857; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]])858; CHECK-NEXT: to label [[H1_TARGET_A1:%.*]] [label %H1.target.A2]859; CHECK: A1:860; CHECK-NEXT: callbr void asm "", ""()861; CHECK-NEXT: to label [[A1_TARGET_A2:%.*]] []862; CHECK: A2:863; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]])864; CHECK-NEXT: to label [[A1:%.*]] [label %L1]865; CHECK: L1:866; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]])867; CHECK-NEXT: to label [[H1]] [label %L0]868; CHECK: fork1:869; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED4:%.*]])870; CHECK-NEXT: to label [[FORK1_TARGET_B1:%.*]] [label %fork1.target.B2]871; CHECK: B1:872; CHECK-NEXT: callbr void asm "", ""()873; CHECK-NEXT: to label [[H2:%.*]] []874; CHECK: H2:875; CHECK-NEXT: callbr void asm "", ""()876; CHECK-NEXT: to label [[L2:%.*]] []877; CHECK: L2:878; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED5:%.*]])879; CHECK-NEXT: to label [[H2]] [label %L2.target.B2]880; CHECK: B2:881; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED6:%.*]])882; CHECK-NEXT: to label [[B1:%.*]] [label %L0]883; CHECK: L0:884; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED7:%.*]])885; CHECK-NEXT: to label [[EXIT:%.*]] [label %H0]886; CHECK: exit:887; CHECK-NEXT: ret void888; CHECK: A1.target.A2:889; CHECK-NEXT: br label [[IRR_GUARD:%.*]]890; CHECK: H1.target.A1:891; CHECK-NEXT: br label [[IRR_GUARD]]892; CHECK: H1.target.A2:893; CHECK-NEXT: br label [[IRR_GUARD]]894; CHECK: irr.guard:895; CHECK-NEXT: [[GUARD_A2:%.*]] = phi i1 [ true, [[A1_TARGET_A2]] ], [ false, [[H1_TARGET_A1]] ], [ true, [[H1_TARGET_A2:%.*]] ]896; CHECK-NEXT: br i1 [[GUARD_A2]], label [[A2:%.*]], label [[A1]]897; CHECK: L2.target.B2:898; CHECK-NEXT: br label [[IRR_GUARD1:%.*]]899; CHECK: fork1.target.B1:900; CHECK-NEXT: br label [[IRR_GUARD1]]901; CHECK: fork1.target.B2:902; CHECK-NEXT: br label [[IRR_GUARD1]]903; CHECK: irr.guard1:904; CHECK-NEXT: [[GUARD_B2:%.*]] = phi i1 [ true, [[L2_TARGET_B2:%.*]] ], [ false, [[FORK1_TARGET_B1]] ], [ true, [[FORK1_TARGET_B2:%.*]] ]905; CHECK-NEXT: br i1 [[GUARD_B2]], label [[B2:%.*]], label [[B1]]906;907entry:908 callbr void asm "", ""() to label %H0 []909 910H0:911 callbr void asm "", "r,!i"(i1 %Pred0) to label %H1 [label %fork1]912 913H1:914 callbr void asm "", "r,!i"(i1 %Pred1) to label %A1 [label %A2]915 916A1:917 callbr void asm "", ""() to label %A2 []918 919A2:920 callbr void asm "", "r,!i"(i1 %Pred2) to label %A1 [label %L1]921 922L1:923 callbr void asm "", "r,!i"(i1 %Pred3) to label %H1 [label %L0]924 925fork1:926 callbr void asm "", "r,!i"(i1 %Pred4) to label %B1 [label %B2]927 928B1:929 callbr void asm "", ""() to label %H2 []930 931H2:932 callbr void asm "", ""() to label %L2 []933 934L2:935 callbr void asm "", "r,!i"(i1 %Pred5) to label %H2 [label %B2]936 937B2:938 callbr void asm "", "r,!i"(i1 %Pred6) to label %B1 [label %L0]939 940L0:941 callbr void asm "", "r,!i"(i1 %Pred7) to label %exit [label %H0]942 943exit:944 ret void945}946 947define void @irr_in_irr_shared_entry(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6, i1 %Pred7, i1 %Pred8, i1 %Pred9, i1 %Pred10, i1 %Pred11, i1 %Pred12, i1 %Pred13) {948; CHECK-LABEL: @irr_in_irr_shared_entry(949; CHECK-NEXT: entry:950; CHECK-NEXT: br i1 [[PRED0:%.*]], label [[IF_END:%.*]], label [[IF_THEN:%.*]]951; CHECK: if.end:952; CHECK-NEXT: br i1 [[PRED1:%.*]], label [[IF_THEN7:%.*]], label [[IF_ELSE:%.*]]953; CHECK: if.then7:954; CHECK-NEXT: br label [[IF_END16:%.*]]955; CHECK: if.else:956; CHECK-NEXT: br label [[IF_END16]]957; CHECK: if.end16:958; CHECK-NEXT: br i1 [[PRED2:%.*]], label [[WHILE_COND_PREHEADER:%.*]], label [[IF_THEN39:%.*]]959; CHECK: while.cond.preheader:960; CHECK-NEXT: br label [[WHILE_COND:%.*]]961; CHECK: while.cond:962; CHECK-NEXT: br i1 [[PRED3:%.*]], label [[IRR_GUARD:%.*]], label [[LOR_RHS:%.*]]963; CHECK: cond.true49:964; CHECK-NEXT: br i1 [[PRED4:%.*]], label [[IF_THEN69:%.*]], label [[IRR_GUARD1:%.*]]965; CHECK: while.body63:966; CHECK-NEXT: br i1 [[PRED5:%.*]], label [[EXIT:%.*]], label [[WHILE_COND47:%.*]]967; CHECK: while.cond47:968; CHECK-NEXT: br i1 [[PRED6:%.*]], label [[COND_TRUE49:%.*]], label [[IRR_GUARD]]969; CHECK: cond.end61:970; CHECK-NEXT: br i1 [[PRED7:%.*]], label [[IRR_GUARD1]], label [[WHILE_COND]]971; CHECK: if.then69:972; CHECK-NEXT: br i1 [[PRED8:%.*]], label [[EXIT]], label [[WHILE_COND]]973; CHECK: lor.rhs:974; CHECK-NEXT: br i1 [[PRED9:%.*]], label [[IRR_GUARD]], label [[WHILE_END76:%.*]]975; CHECK: while.end76:976; CHECK-NEXT: br label [[EXIT]]977; CHECK: if.then39:978; CHECK-NEXT: br i1 [[PRED10:%.*]], label [[EXIT]], label [[IF_END_I145:%.*]]979; CHECK: if.end.i145:980; CHECK-NEXT: br i1 [[PRED11:%.*]], label [[EXIT]], label [[IF_END8_I149:%.*]]981; CHECK: if.end8.i149:982; CHECK-NEXT: br label [[EXIT]]983; CHECK: if.then:984; CHECK-NEXT: br i1 [[PRED12:%.*]], label [[EXIT]], label [[IF_END_I:%.*]]985; CHECK: if.end.i:986; CHECK-NEXT: br i1 [[PRED13:%.*]], label [[EXIT]], label [[IF_END8_I:%.*]]987; CHECK: if.end8.i:988; CHECK-NEXT: br label [[EXIT]]989; CHECK: exit:990; CHECK-NEXT: ret void991; CHECK: irr.guard:992; CHECK-NEXT: [[GUARD_COND_END61:%.*]] = phi i1 [ true, [[WHILE_COND47]] ], [ true, [[LOR_RHS]] ], [ false, [[WHILE_COND]] ]993; CHECK-NEXT: br i1 [[GUARD_COND_END61]], label [[COND_END61:%.*]], label [[IRR_GUARD1]]994; CHECK: irr.guard1:995; CHECK-NEXT: [[GUARD_WHILE_BODY63:%.*]] = phi i1 [ true, [[COND_TRUE49]] ], [ true, [[COND_END61]] ], [ false, [[IRR_GUARD]] ]996; CHECK-NEXT: br i1 [[GUARD_WHILE_BODY63]], label [[WHILE_BODY63:%.*]], label [[COND_TRUE49]]997;998entry:999 br i1 %Pred0, label %if.end, label %if.then1000 1001if.end:1002 br i1 %Pred1, label %if.then7, label %if.else1003 1004if.then7:1005 br label %if.end161006 1007if.else:1008 br label %if.end161009 1010if.end16:1011 br i1 %Pred2, label %while.cond.preheader, label %if.then391012 1013while.cond.preheader:1014 br label %while.cond1015 1016while.cond:1017 br i1 %Pred3, label %cond.true49, label %lor.rhs1018 1019cond.true49:1020 br i1 %Pred4, label %if.then69, label %while.body631021 1022while.body63:1023 br i1 %Pred5, label %exit, label %while.cond471024 1025while.cond47:1026 br i1 %Pred6, label %cond.true49, label %cond.end611027 1028cond.end61:1029 br i1 %Pred7, label %while.body63, label %while.cond1030 1031if.then69:1032 br i1 %Pred8, label %exit, label %while.cond1033 1034lor.rhs:1035 br i1 %Pred9, label %cond.end61, label %while.end761036 1037while.end76:1038 br label %exit1039 1040if.then39:1041 br i1 %Pred10, label %exit, label %if.end.i1451042 1043if.end.i145:1044 br i1 %Pred11, label %exit, label %if.end8.i1491045 1046if.end8.i149:1047 br label %exit1048 1049if.then:1050 br i1 %Pred12, label %exit, label %if.end.i1051 1052if.end.i:1053 br i1 %Pred13, label %exit, label %if.end8.i1054 1055if.end8.i:1056 br label %exit1057 1058exit:1059 ret void1060}1061 1062define void @irr_in_irr_shared_entry_callbr(i1 %Pred0, i1 %Pred1, i1 %Pred2, i1 %Pred3, i1 %Pred4, i1 %Pred5, i1 %Pred6, i1 %Pred7, i1 %Pred8, i1 %Pred9, i1 %Pred10, i1 %Pred11, i1 %Pred12, i1 %Pred13) {1063; CHECK-LABEL: @irr_in_irr_shared_entry_callbr(1064; CHECK-NEXT: entry:1065; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED0:%.*]])1066; CHECK-NEXT: to label [[IF_END:%.*]] [label %if.then]1067; CHECK: if.end:1068; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED1:%.*]])1069; CHECK-NEXT: to label [[IF_THEN7:%.*]] [label %if.else]1070; CHECK: if.then7:1071; CHECK-NEXT: callbr void asm "", ""()1072; CHECK-NEXT: to label [[IF_END16:%.*]] []1073; CHECK: if.else:1074; CHECK-NEXT: callbr void asm "", ""()1075; CHECK-NEXT: to label [[IF_END16]] []1076; CHECK: if.end16:1077; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED2:%.*]])1078; CHECK-NEXT: to label [[WHILE_COND_PREHEADER:%.*]] [label %if.then39]1079; CHECK: while.cond.preheader:1080; CHECK-NEXT: callbr void asm "", ""()1081; CHECK-NEXT: to label [[WHILE_COND:%.*]] []1082; CHECK: while.cond:1083; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED3:%.*]])1084; CHECK-NEXT: to label [[WHILE_COND_TARGET_COND_TRUE49:%.*]] [label %lor.rhs]1085; CHECK: cond.true49:1086; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED4:%.*]])1087; CHECK-NEXT: to label [[IF_THEN69:%.*]] [label %cond.true49.target.while.body63]1088; CHECK: while.body63:1089; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED5:%.*]])1090; CHECK-NEXT: to label [[EXIT:%.*]] [label %while.cond47]1091; CHECK: while.cond47:1092; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED6:%.*]])1093; CHECK-NEXT: to label [[COND_TRUE49:%.*]] [label %while.cond47.target.cond.end61]1094; CHECK: cond.end61:1095; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED7:%.*]])1096; CHECK-NEXT: to label [[COND_END61_TARGET_WHILE_BODY63:%.*]] [label %while.cond]1097; CHECK: if.then69:1098; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED8:%.*]])1099; CHECK-NEXT: to label [[EXIT]] [label %while.cond]1100; CHECK: lor.rhs:1101; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED9:%.*]])1102; CHECK-NEXT: to label [[LOR_RHS_TARGET_COND_END61:%.*]] [label %while.end76]1103; CHECK: while.end76:1104; CHECK-NEXT: callbr void asm "", ""()1105; CHECK-NEXT: to label [[EXIT]] []1106; CHECK: if.then39:1107; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED10:%.*]])1108; CHECK-NEXT: to label [[EXIT]] [label %if.end.i145]1109; CHECK: if.end.i145:1110; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED11:%.*]])1111; CHECK-NEXT: to label [[EXIT]] [label %if.end8.i149]1112; CHECK: if.end8.i149:1113; CHECK-NEXT: callbr void asm "", ""()1114; CHECK-NEXT: to label [[EXIT]] []1115; CHECK: if.then:1116; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED12:%.*]])1117; CHECK-NEXT: to label [[EXIT]] [label %if.end.i]1118; CHECK: if.end.i:1119; CHECK-NEXT: callbr void asm "", "r,!i"(i1 [[PRED13:%.*]])1120; CHECK-NEXT: to label [[EXIT]] [label %if.end8.i]1121; CHECK: if.end8.i:1122; CHECK-NEXT: callbr void asm "", ""()1123; CHECK-NEXT: to label [[EXIT]] []1124; CHECK: exit:1125; CHECK-NEXT: ret void1126; CHECK: while.cond47.target.cond.end61:1127; CHECK-NEXT: br label [[IRR_GUARD:%.*]]1128; CHECK: lor.rhs.target.cond.end61:1129; CHECK-NEXT: br label [[IRR_GUARD]]1130; CHECK: while.cond.target.cond.true49:1131; CHECK-NEXT: br label [[IRR_GUARD]]1132; CHECK: irr.guard:1133; CHECK-NEXT: [[GUARD_COND_END61:%.*]] = phi i1 [ true, [[WHILE_COND47_TARGET_COND_END61:%.*]] ], [ true, [[LOR_RHS_TARGET_COND_END61]] ], [ false, [[WHILE_COND_TARGET_COND_TRUE49]] ]1134; CHECK-NEXT: br i1 [[GUARD_COND_END61]], label [[COND_END61:%.*]], label [[IRR_GUARD1:%.*]]1135; CHECK: cond.true49.target.while.body63:1136; CHECK-NEXT: br label [[IRR_GUARD1]]1137; CHECK: cond.end61.target.while.body63:1138; CHECK-NEXT: br label [[IRR_GUARD1]]1139; CHECK: irr.guard1:1140; CHECK-NEXT: [[GUARD_WHILE_BODY63:%.*]] = phi i1 [ true, [[COND_TRUE49_TARGET_WHILE_BODY63:%.*]] ], [ true, [[COND_END61_TARGET_WHILE_BODY63]] ], [ false, [[IRR_GUARD]] ]1141; CHECK-NEXT: br i1 [[GUARD_WHILE_BODY63]], label [[WHILE_BODY63:%.*]], label [[COND_TRUE49]]1142;1143entry:1144 callbr void asm "", "r,!i"(i1 %Pred0) to label %if.end [label %if.then]1145 1146if.end:1147 callbr void asm "", "r,!i"(i1 %Pred1) to label %if.then7 [label %if.else]1148 1149if.then7:1150 callbr void asm "", ""() to label %if.end16 []1151 1152if.else:1153 callbr void asm "", ""() to label %if.end16 []1154 1155if.end16:1156 callbr void asm "", "r,!i"(i1 %Pred2) to label %while.cond.preheader [label %if.then39]1157 1158while.cond.preheader:1159 callbr void asm "", ""() to label %while.cond []1160 1161while.cond:1162 callbr void asm "", "r,!i"(i1 %Pred3) to label %cond.true49 [label %lor.rhs]1163 1164cond.true49:1165 callbr void asm "", "r,!i"(i1 %Pred4) to label %if.then69 [label %while.body63]1166 1167while.body63:1168 callbr void asm "", "r,!i"(i1 %Pred5) to label %exit [label %while.cond47]1169 1170while.cond47:1171 callbr void asm "", "r,!i"(i1 %Pred6) to label %cond.true49 [label %cond.end61]1172 1173cond.end61:1174 callbr void asm "", "r,!i"(i1 %Pred7) to label %while.body63 [label %while.cond]1175 1176if.then69:1177 callbr void asm "", "r,!i"(i1 %Pred8) to label %exit [label %while.cond]1178 1179lor.rhs:1180 callbr void asm "", "r,!i"(i1 %Pred9) to label %cond.end61 [label %while.end76]1181 1182while.end76:1183 callbr void asm "", ""() to label %exit []1184 1185if.then39:1186 callbr void asm "", "r,!i"(i1 %Pred10) to label %exit [label %if.end.i145]1187 1188if.end.i145:1189 callbr void asm "", "r,!i"(i1 %Pred11) to label %exit [label %if.end8.i149]1190 1191if.end8.i149:1192 callbr void asm "", ""() to label %exit []1193 1194if.then:1195 callbr void asm "", "r,!i"(i1 %Pred12) to label %exit [label %if.end.i]1196 1197if.end.i:1198 callbr void asm "", "r,!i"(i1 %Pred13) to label %exit [label %if.end8.i]1199 1200if.end8.i:1201 callbr void asm "", ""() to label %exit []1202 1203exit:1204 ret void1205}1206