1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -fix-irreducible -unify-loop-exits -structurizecfg -enable-new-pm=0 -S | FileCheck %s 3define void @irreducible_mountain_bug(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) { 4; CHECK-LABEL: @irreducible_mountain_bug( 5; CHECK-NEXT: entry: 6; CHECK-NEXT: [[PRED0_INV:%.*]] = xor i1 [[PRED0:%.*]], true 7; CHECK-NEXT: [[PRED1_INV:%.*]] = xor i1 [[PRED1:%.*]], true 8; CHECK-NEXT: [[PRED2_INV:%.*]] = xor i1 [[PRED2:%.*]], true 9; CHECK-NEXT: [[PRED3_INV:%.*]] = xor i1 [[PRED3:%.*]], true 10; CHECK-NEXT: [[PRED5_INV:%.*]] = xor i1 [[PRED5:%.*]], true 11; CHECK-NEXT: [[PRED4_INV:%.*]] = xor i1 [[PRED4:%.*]], true 12; CHECK-NEXT: [[PRED10_INV:%.*]] = xor i1 [[PRED10:%.*]], true 13; CHECK-NEXT: [[PRED11_INV:%.*]] = xor i1 [[PRED11:%.*]], true 14; CHECK-NEXT: [[PRED12_INV:%.*]] = xor i1 [[PRED12:%.*]], true 15; CHECK-NEXT: [[PRED13_INV:%.*]] = xor i1 [[PRED13:%.*]], true 16; CHECK-NEXT: br i1 [[PRED0_INV]], label [[IF_THEN:%.*]], label [[FLOW19:%.*]] 17; CHECK: Flow19: 18; CHECK-NEXT: [[TMP0:%.*]] = phi i1 [ false, [[FLOW3:%.*]] ], [ true, [[ENTRY:%.*]] ] 19; CHECK-NEXT: br i1 [[TMP0]], label [[IF_END:%.*]], label [[FLOW20:%.*]] 20; CHECK: if.end: 21; CHECK-NEXT: br i1 [[PRED1_INV]], label [[IF_ELSE:%.*]], label [[FLOW18:%.*]] 22; CHECK: Flow18: 23; CHECK-NEXT: [[TMP1:%.*]] = phi i1 [ false, [[IF_ELSE]] ], [ true, [[IF_END]] ] 24; CHECK-NEXT: br i1 [[TMP1]], label [[IF_THEN7:%.*]], label [[IF_END16:%.*]] 25; CHECK: if.then7: 26; CHECK-NEXT: br label [[IF_END16]] 27; CHECK: if.else: 28; CHECK-NEXT: br label [[FLOW18]] 29; CHECK: Flow20: 30; CHECK-NEXT: br label [[EXIT:%.*]] 31; CHECK: if.end16: 32; CHECK-NEXT: br i1 [[PRED2_INV]], label [[IF_THEN39:%.*]], label [[FLOW16:%.*]] 33; CHECK: Flow16: 34; CHECK-NEXT: [[TMP2:%.*]] = phi i1 [ false, [[FLOW5:%.*]] ], [ true, [[IF_END16]] ] 35; CHECK-NEXT: br i1 [[TMP2]], label [[WHILE_COND_PREHEADER:%.*]], label [[FLOW17:%.*]] 36; CHECK: while.cond.preheader: 37; CHECK-NEXT: br label [[WHILE_COND:%.*]] 38; CHECK: Flow17: 39; CHECK-NEXT: br label [[FLOW20]] 40; CHECK: while.cond: 41; CHECK-NEXT: br i1 [[PRED3_INV]], label [[LOR_RHS:%.*]], label [[FLOW12:%.*]] 42; CHECK: Flow7: 43; CHECK-NEXT: [[TMP3:%.*]] = phi i1 [ [[PRED7:%.*]], [[COND_END61:%.*]] ], [ false, [[IRR_GUARD:%.*]] ] 44; CHECK-NEXT: [[TMP4:%.*]] = phi i1 [ false, [[COND_END61]] ], [ true, [[IRR_GUARD]] ] 45; CHECK-NEXT: br i1 [[TMP4]], label [[COND_TRUE49:%.*]], label [[FLOW8:%.*]] 46; CHECK: cond.true49: 47; CHECK-NEXT: br label [[FLOW8]] 48; CHECK: Flow8: 49; CHECK-NEXT: [[TMP5:%.*]] = phi i1 [ false, [[COND_TRUE49]] ], [ true, [[FLOW7:%.*]] ] 50; CHECK-NEXT: [[TMP6:%.*]] = phi i1 [ [[PRED4_INV]], [[COND_TRUE49]] ], [ [[TMP3]], [[FLOW7]] ] 51; CHECK-NEXT: br i1 [[TMP6]], label [[WHILE_BODY63:%.*]], label [[FLOW9:%.*]] 52; CHECK: while.body63: 53; CHECK-NEXT: br i1 [[PRED5_INV]], label [[WHILE_COND47:%.*]], label [[FLOW10:%.*]] 54; CHECK: Flow9: 55; CHECK-NEXT: [[TMP7:%.*]] = phi i1 [ true, [[FLOW10]] ], [ false, [[FLOW8]] ] 56; CHECK-NEXT: [[TMP8:%.*]] = phi i1 [ false, [[FLOW10]] ], [ [[TMP5]], [[FLOW8]] ] 57; CHECK-NEXT: [[TMP9:%.*]] = phi i1 [ [[TMP15:%.*]], [[FLOW10]] ], [ true, [[FLOW8]] ] 58; CHECK-NEXT: [[DOTINV11:%.*]] = xor i1 [[TMP7]], true 59; CHECK-NEXT: [[DOTINV:%.*]] = xor i1 [[TMP8]], true 60; CHECK-NEXT: br i1 [[TMP9]], label [[LOOP_EXIT_GUARD1:%.*]], label [[IRR_GUARD]] 61; CHECK: while.cond47: 62; CHECK-NEXT: br label [[FLOW10]] 63; CHECK: cond.end61: 64; CHECK-NEXT: br label [[FLOW7]] 65; CHECK: Flow14: 66; CHECK-NEXT: [[TMP10:%.*]] = phi i1 [ false, [[FLOW15:%.*]] ], [ true, [[LOOP_EXIT_GUARD1]] ] 67; CHECK-NEXT: [[TMP11:%.*]] = phi i1 [ [[TMP14:%.*]], [[FLOW15]] ], [ [[DOTINV]], [[LOOP_EXIT_GUARD1]] ] 68; CHECK-NEXT: br label [[FLOW13:%.*]] 69; CHECK: if.then69: 70; CHECK-NEXT: br label [[FLOW15]] 71; CHECK: lor.rhs: 72; CHECK-NEXT: br label [[FLOW12]] 73; CHECK: while.end76: 74; CHECK-NEXT: br label [[FLOW6:%.*]] 75; CHECK: if.then39: 76; CHECK-NEXT: br i1 [[PRED10_INV]], label [[IF_END_I145:%.*]], label [[FLOW5]] 77; CHECK: if.end.i145: 78; CHECK-NEXT: br i1 [[PRED11_INV]], label [[IF_END8_I149:%.*]], label [[FLOW4:%.*]] 79; CHECK: if.end8.i149: 80; CHECK-NEXT: br label [[FLOW4]] 81; CHECK: if.then: 82; CHECK-NEXT: br i1 [[PRED12_INV]], label [[IF_END_I:%.*]], label [[FLOW3]] 83; CHECK: if.end.i: 84; CHECK-NEXT: br i1 [[PRED13_INV]], label [[IF_END8_I:%.*]], label [[FLOW:%.*]] 85; CHECK: if.end8.i: 86; CHECK-NEXT: br label [[FLOW]] 87; CHECK: Flow: 88; CHECK-NEXT: br label [[FLOW3]] 89; CHECK: Flow3: 90; CHECK-NEXT: br label [[FLOW19]] 91; CHECK: Flow4: 92; CHECK-NEXT: br label [[FLOW5]] 93; CHECK: Flow5: 94; CHECK-NEXT: br label [[FLOW16]] 95; CHECK: Flow6: 96; CHECK-NEXT: br label [[FLOW17]] 97; CHECK: exit: 98; CHECK-NEXT: ret void 99; CHECK: Flow12: 100; CHECK-NEXT: [[TMP12:%.*]] = phi i1 [ false, [[LOR_RHS]] ], [ true, [[WHILE_COND]] ] 101; CHECK-NEXT: [[TMP13:%.*]] = phi i1 [ [[PRED9:%.*]], [[LOR_RHS]] ], [ [[PRED3]], [[WHILE_COND]] ] 102; CHECK-NEXT: br i1 [[TMP13]], label [[IRR_GUARD]], label [[FLOW13]] 103; CHECK: irr.guard: 104; CHECK-NEXT: [[GUARD_COND_TRUE49:%.*]] = phi i1 [ [[PRED6:%.*]], [[FLOW9]] ], [ [[TMP12]], [[FLOW12]] ] 105; CHECK-NEXT: [[GUARD_COND_TRUE49_INV:%.*]] = xor i1 [[GUARD_COND_TRUE49]], true 106; CHECK-NEXT: br i1 [[GUARD_COND_TRUE49_INV]], label [[COND_END61]], label [[FLOW7]] 107; CHECK: Flow15: 108; CHECK-NEXT: [[TMP14]] = phi i1 [ [[PRED8:%.*]], [[IF_THEN69:%.*]] ], [ [[DOTINV]], [[LOOP_EXIT_GUARD2:%.*]] ] 109; CHECK-NEXT: br label [[FLOW14:%.*]] 110; CHECK: loop.exit.guard: 111; CHECK-NEXT: br i1 [[TMP16:%.*]], label [[WHILE_END76:%.*]], label [[FLOW6]] 112; CHECK: Flow10: 113; CHECK-NEXT: [[TMP15]] = phi i1 [ false, [[WHILE_COND47]] ], [ true, [[WHILE_BODY63]] ] 114; CHECK-NEXT: br label [[FLOW9]] 115; CHECK: Flow13: 116; CHECK-NEXT: [[TMP16]] = phi i1 [ [[TMP10]], [[FLOW14]] ], [ true, [[FLOW12]] ] 117; CHECK-NEXT: [[TMP17:%.*]] = phi i1 [ [[TMP11]], [[FLOW14]] ], [ true, [[FLOW12]] ] 118; CHECK-NEXT: br i1 [[TMP17]], label [[LOOP_EXIT_GUARD:%.*]], label [[WHILE_COND]] 119; CHECK: loop.exit.guard1: 120; CHECK-NEXT: br i1 [[DOTINV]], label [[LOOP_EXIT_GUARD2]], label [[FLOW14]] 121; CHECK: loop.exit.guard2: 122; CHECK-NEXT: br i1 [[DOTINV11]], label [[IF_THEN69]], label [[FLOW15]] 123; 124entry: 125 br i1 %Pred0, label %if.end, label %if.then 126 127if.end: 128 br i1 %Pred1, label %if.then7, label %if.else 129 130if.then7: 131 br label %if.end16 132 133if.else: 134 br label %if.end16 135 136if.end16: 137 br i1 %Pred2, label %while.cond.preheader, label %if.then39 138 139while.cond.preheader: 140 br label %while.cond 141 142while.cond: 143 br i1 %Pred3, label %cond.true49, label %lor.rhs 144 145cond.true49: 146 br i1 %Pred4, label %if.then69, label %while.body63 147 148while.body63: 149 br i1 %Pred5, label %exit, label %while.cond47 150 151while.cond47: 152 br i1 %Pred6, label %cond.true49, label %cond.end61 153 154cond.end61: 155 br i1 %Pred7, label %while.body63, label %while.cond 156 157if.then69: 158 br i1 %Pred8, label %exit, label %while.cond 159 160lor.rhs: 161 br i1 %Pred9, label %cond.end61, label %while.end76 162 163while.end76: 164 br label %exit 165 166if.then39: 167 br i1 %Pred10, label %exit, label %if.end.i145 168 169if.end.i145: 170 br i1 %Pred11, label %exit, label %if.end8.i149 171 172if.end8.i149: 173 br label %exit 174 175if.then: 176 br i1 %Pred12, label %exit, label %if.end.i 177 178if.end.i: 179 br i1 %Pred13, label %exit, label %if.end8.i 180 181if.end8.i: 182 br label %exit 183 184exit: 185 ret void 186} 187