1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -S -loop-unroll -verify-loop-info | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker; 3*9880d681SAndroid Build Coastguard Worker; Unit tests for LoopInfo::markAsRemoved. 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdeclare i1 @check() nounwind 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Ensure that tail->inner is removed and rely on verify-loopinfo to 8*9880d681SAndroid Build Coastguard Worker; check soundness. 9*9880d681SAndroid Build Coastguard Worker; 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @skiplevelexit( 11*9880d681SAndroid Build Coastguard Worker; CHECK: tail: 12*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br 13*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 14*9880d681SAndroid Build Coastguard Workerdefine void @skiplevelexit() nounwind { 15*9880d681SAndroid Build Coastguard Workerentry: 16*9880d681SAndroid Build Coastguard Worker br label %outer 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerouter: 19*9880d681SAndroid Build Coastguard Worker br label %inner 20*9880d681SAndroid Build Coastguard Worker 21*9880d681SAndroid Build Coastguard Workerinner: 22*9880d681SAndroid Build Coastguard Worker %iv = phi i32 [ 0, %outer ], [ %inc, %tail ] 23*9880d681SAndroid Build Coastguard Worker %inc = add i32 %iv, 1 24*9880d681SAndroid Build Coastguard Worker call zeroext i1 @check() 25*9880d681SAndroid Build Coastguard Worker br i1 true, label %outer.backedge, label %tail 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workertail: 28*9880d681SAndroid Build Coastguard Worker br i1 false, label %inner, label %exit 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerouter.backedge: 31*9880d681SAndroid Build Coastguard Worker br label %outer 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerexit: 34*9880d681SAndroid Build Coastguard Worker ret void 35*9880d681SAndroid Build Coastguard Worker} 36*9880d681SAndroid Build Coastguard Worker 37*9880d681SAndroid Build Coastguard Worker; Remove the middle loop of a triply nested loop tree. 38*9880d681SAndroid Build Coastguard Worker; Ensure that only the middle loop is removed and rely on verify-loopinfo to 39*9880d681SAndroid Build Coastguard Worker; check soundness. 40*9880d681SAndroid Build Coastguard Worker; 41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unloopNested( 42*9880d681SAndroid Build Coastguard Worker; Outer loop control. 43*9880d681SAndroid Build Coastguard Worker; CHECK: while.body: 44*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp3, label %if.then, label %if.end 45*9880d681SAndroid Build Coastguard Worker; Inner loop control. 46*9880d681SAndroid Build Coastguard Worker; CHECK: while.end14.i: 47*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %call15.i, label %if.end.i, label %exit 48*9880d681SAndroid Build Coastguard Worker; Middle loop control should no longer reach %while.cond. 49*9880d681SAndroid Build Coastguard Worker; Now it is the outer loop backedge. 50*9880d681SAndroid Build Coastguard Worker; CHECK: exit: 51*9880d681SAndroid Build Coastguard Worker; CHECK: br label %while.cond.outer 52*9880d681SAndroid Build Coastguard Workerdefine void @unloopNested() { 53*9880d681SAndroid Build Coastguard Workerentry: 54*9880d681SAndroid Build Coastguard Worker br label %while.cond.outer 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerwhile.cond.outer: 57*9880d681SAndroid Build Coastguard Worker br label %while.cond 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Workerwhile.cond: 60*9880d681SAndroid Build Coastguard Worker %cmp = call zeroext i1 @check() 61*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %while.body, label %while.end 62*9880d681SAndroid Build Coastguard Worker 63*9880d681SAndroid Build Coastguard Workerwhile.body: 64*9880d681SAndroid Build Coastguard Worker %cmp3 = call zeroext i1 @check() 65*9880d681SAndroid Build Coastguard Worker br i1 %cmp3, label %if.then, label %if.end 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerif.then: 68*9880d681SAndroid Build Coastguard Worker br label %return 69*9880d681SAndroid Build Coastguard Worker 70*9880d681SAndroid Build Coastguard Workerif.end: 71*9880d681SAndroid Build Coastguard Worker %cmp.i48 = call zeroext i1 @check() 72*9880d681SAndroid Build Coastguard Worker br i1 %cmp.i48, label %if.then.i, label %if.else20.i 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerif.then.i: 75*9880d681SAndroid Build Coastguard Worker %cmp8.i = call zeroext i1 @check() 76*9880d681SAndroid Build Coastguard Worker br i1 %cmp8.i, label %merge, label %if.else.i 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Workerif.else.i: 79*9880d681SAndroid Build Coastguard Worker br label %merge 80*9880d681SAndroid Build Coastguard Worker 81*9880d681SAndroid Build Coastguard Workerif.else20.i: 82*9880d681SAndroid Build Coastguard Worker %cmp25.i = call zeroext i1 @check() 83*9880d681SAndroid Build Coastguard Worker br i1 %cmp25.i, label %merge, label %if.else28.i 84*9880d681SAndroid Build Coastguard Worker 85*9880d681SAndroid Build Coastguard Workerif.else28.i: 86*9880d681SAndroid Build Coastguard Worker br label %merge 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Workermerge: 89*9880d681SAndroid Build Coastguard Worker br label %while.cond2.i 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerwhile.cond2.i: 92*9880d681SAndroid Build Coastguard Worker %cmp.i = call zeroext i1 @check() 93*9880d681SAndroid Build Coastguard Worker br i1 %cmp.i, label %while.cond2.backedge.i, label %while.end.i 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Workerwhile.cond2.backedge.i: 96*9880d681SAndroid Build Coastguard Worker br label %while.cond2.i 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Workerwhile.end.i: 99*9880d681SAndroid Build Coastguard Worker %cmp1114.i = call zeroext i1 @check() 100*9880d681SAndroid Build Coastguard Worker br i1 %cmp1114.i, label %while.body12.lr.ph.i, label %while.end14.i 101*9880d681SAndroid Build Coastguard Worker 102*9880d681SAndroid Build Coastguard Workerwhile.body12.lr.ph.i: 103*9880d681SAndroid Build Coastguard Worker br label %while.end14.i 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Workerwhile.end14.i: 106*9880d681SAndroid Build Coastguard Worker %call15.i = call zeroext i1 @check() 107*9880d681SAndroid Build Coastguard Worker br i1 %call15.i, label %if.end.i, label %exit 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerif.end.i: 110*9880d681SAndroid Build Coastguard Worker br label %while.cond2.backedge.i 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerexit: 113*9880d681SAndroid Build Coastguard Worker br i1 false, label %while.cond, label %if.else 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Workerif.else: 116*9880d681SAndroid Build Coastguard Worker br label %while.cond.outer 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerwhile.end: 119*9880d681SAndroid Build Coastguard Worker br label %return 120*9880d681SAndroid Build Coastguard Worker 121*9880d681SAndroid Build Coastguard Workerreturn: 122*9880d681SAndroid Build Coastguard Worker ret void 123*9880d681SAndroid Build Coastguard Worker} 124*9880d681SAndroid Build Coastguard Worker 125*9880d681SAndroid Build Coastguard Worker; Remove the middle loop of a deeply nested loop tree. 126*9880d681SAndroid Build Coastguard Worker; Ensure that only the middle loop is removed and rely on verify-loopinfo to 127*9880d681SAndroid Build Coastguard Worker; check soundness. 128*9880d681SAndroid Build Coastguard Worker; 129*9880d681SAndroid Build Coastguard Worker; This test must be disabled until trip count computation can be optimized... 130*9880d681SAndroid Build Coastguard Worker; rdar:14038809 [SCEV]: Optimize trip count computation for multi-exit loops. 131*9880d681SAndroid Build Coastguard Worker; CHECKFIXME-LABEL: @unloopDeepNested( 132*9880d681SAndroid Build Coastguard Worker; Inner-inner loop control. 133*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: while.cond.us.i: 134*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: br i1 %cmp.us.i, label %next_data.exit, label %while.body.us.i 135*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: if.then.us.i: 136*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: br label %while.cond.us.i 137*9880d681SAndroid Build Coastguard Worker; Inner loop tail. 138*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: if.else.i: 139*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: br label %while.cond.outer.i 140*9880d681SAndroid Build Coastguard Worker; Middle loop control (removed). 141*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: valid_data.exit: 142*9880d681SAndroid Build Coastguard Worker; CHECKFIXME-NOT: br 143*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: %cmp = call zeroext i1 @check() 144*9880d681SAndroid Build Coastguard Worker; Outer loop control. 145*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: copy_data.exit: 146*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: br i1 %cmp38, label %if.then39, label %while.cond.outer 147*9880d681SAndroid Build Coastguard Worker; Outer-outer loop tail. 148*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: while.cond.outer.outer.backedge: 149*9880d681SAndroid Build Coastguard Worker; CHECKFIXME: br label %while.cond.outer.outer 150*9880d681SAndroid Build Coastguard Workerdefine void @unloopDeepNested() nounwind { 151*9880d681SAndroid Build Coastguard Workerfor.cond8.preheader.i: 152*9880d681SAndroid Build Coastguard Worker %cmp113.i = call zeroext i1 @check() 153*9880d681SAndroid Build Coastguard Worker br i1 %cmp113.i, label %make_data.exit, label %for.body13.lr.ph.i 154*9880d681SAndroid Build Coastguard Worker 155*9880d681SAndroid Build Coastguard Workerfor.body13.lr.ph.i: 156*9880d681SAndroid Build Coastguard Worker br label %make_data.exit 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Workermake_data.exit: 159*9880d681SAndroid Build Coastguard Worker br label %while.cond.outer.outer 160*9880d681SAndroid Build Coastguard Worker 161*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.outer: 162*9880d681SAndroid Build Coastguard Worker br label %while.cond.outer 163*9880d681SAndroid Build Coastguard Worker 164*9880d681SAndroid Build Coastguard Workerwhile.cond.outer: 165*9880d681SAndroid Build Coastguard Worker br label %while.cond 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerwhile.cond: 168*9880d681SAndroid Build Coastguard Worker br label %while.cond.outer.i 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.i: 171*9880d681SAndroid Build Coastguard Worker %tmp192.ph.i = call zeroext i1 @check() 172*9880d681SAndroid Build Coastguard Worker br i1 %tmp192.ph.i, label %while.cond.outer.split.us.i, label %while.body.loopexit 173*9880d681SAndroid Build Coastguard Worker 174*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.split.us.i: 175*9880d681SAndroid Build Coastguard Worker br label %while.cond.us.i 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Workerwhile.cond.us.i: 178*9880d681SAndroid Build Coastguard Worker %cmp.us.i = call zeroext i1 @check() 179*9880d681SAndroid Build Coastguard Worker br i1 %cmp.us.i, label %next_data.exit, label %while.body.us.i 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerwhile.body.us.i: 182*9880d681SAndroid Build Coastguard Worker %cmp7.us.i = call zeroext i1 @check() 183*9880d681SAndroid Build Coastguard Worker br i1 %cmp7.us.i, label %if.then.us.i, label %if.else.i 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerif.then.us.i: 186*9880d681SAndroid Build Coastguard Worker br label %while.cond.us.i 187*9880d681SAndroid Build Coastguard Worker 188*9880d681SAndroid Build Coastguard Workerif.else.i: 189*9880d681SAndroid Build Coastguard Worker br label %while.cond.outer.i 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Workernext_data.exit: 192*9880d681SAndroid Build Coastguard Worker %tmp192.ph.i.lcssa28 = call zeroext i1 @check() 193*9880d681SAndroid Build Coastguard Worker br i1 %tmp192.ph.i.lcssa28, label %while.end, label %while.body 194*9880d681SAndroid Build Coastguard Worker 195*9880d681SAndroid Build Coastguard Workerwhile.body.loopexit: 196*9880d681SAndroid Build Coastguard Worker br label %while.body 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Workerwhile.body: 199*9880d681SAndroid Build Coastguard Worker br label %while.cond.i 200*9880d681SAndroid Build Coastguard Worker 201*9880d681SAndroid Build Coastguard Workerwhile.cond.i: 202*9880d681SAndroid Build Coastguard Worker %cmp.i = call zeroext i1 @check() 203*9880d681SAndroid Build Coastguard Worker br i1 %cmp.i, label %valid_data.exit, label %while.body.i 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerwhile.body.i: 206*9880d681SAndroid Build Coastguard Worker %cmp7.i = call zeroext i1 @check() 207*9880d681SAndroid Build Coastguard Worker br i1 %cmp7.i, label %valid_data.exit, label %if.end.i 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerif.end.i: 210*9880d681SAndroid Build Coastguard Worker br label %while.cond.i 211*9880d681SAndroid Build Coastguard Worker 212*9880d681SAndroid Build Coastguard Workervalid_data.exit: 213*9880d681SAndroid Build Coastguard Worker br i1 true, label %if.then, label %while.cond 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Workerif.then: 216*9880d681SAndroid Build Coastguard Worker %cmp = call zeroext i1 @check() 217*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %if.then12, label %if.end 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerif.then12: 220*9880d681SAndroid Build Coastguard Worker br label %if.end 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerif.end: 223*9880d681SAndroid Build Coastguard Worker %tobool3.i = call zeroext i1 @check() 224*9880d681SAndroid Build Coastguard Worker br i1 %tobool3.i, label %copy_data.exit, label %while.body.lr.ph.i 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Workerwhile.body.lr.ph.i: 227*9880d681SAndroid Build Coastguard Worker br label %copy_data.exit 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workercopy_data.exit: 230*9880d681SAndroid Build Coastguard Worker %cmp38 = call zeroext i1 @check() 231*9880d681SAndroid Build Coastguard Worker br i1 %cmp38, label %if.then39, label %while.cond.outer 232*9880d681SAndroid Build Coastguard Worker 233*9880d681SAndroid Build Coastguard Workerif.then39: 234*9880d681SAndroid Build Coastguard Worker %cmp5.i = call zeroext i1 @check() 235*9880d681SAndroid Build Coastguard Worker br i1 %cmp5.i, label %while.cond.outer.outer.backedge, label %for.cond8.preheader.i8.thread 236*9880d681SAndroid Build Coastguard Worker 237*9880d681SAndroid Build Coastguard Workerfor.cond8.preheader.i8.thread: 238*9880d681SAndroid Build Coastguard Worker br label %while.cond.outer.outer.backedge 239*9880d681SAndroid Build Coastguard Worker 240*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.outer.backedge: 241*9880d681SAndroid Build Coastguard Worker br label %while.cond.outer.outer 242*9880d681SAndroid Build Coastguard Worker 243*9880d681SAndroid Build Coastguard Workerwhile.end: 244*9880d681SAndroid Build Coastguard Worker ret void 245*9880d681SAndroid Build Coastguard Worker} 246*9880d681SAndroid Build Coastguard Worker 247*9880d681SAndroid Build Coastguard Worker; Remove a nested loop with irreducible control flow. 248*9880d681SAndroid Build Coastguard Worker; Ensure that only the middle loop is removed and rely on verify-loopinfo to 249*9880d681SAndroid Build Coastguard Worker; check soundness. 250*9880d681SAndroid Build Coastguard Worker; 251*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unloopIrreducible( 252*9880d681SAndroid Build Coastguard Worker; Irreducible loop. 253*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc117: 254*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond103t 255*9880d681SAndroid Build Coastguard Worker; Nested loop (removed). 256*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc159: 257*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.inc163 258*9880d681SAndroid Build Coastguard Workerdefine void @unloopIrreducible() nounwind { 259*9880d681SAndroid Build Coastguard Worker 260*9880d681SAndroid Build Coastguard Workerentry: 261*9880d681SAndroid Build Coastguard Worker br label %for.body 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Workerfor.body: 264*9880d681SAndroid Build Coastguard Worker %cmp2113 = call zeroext i1 @check() 265*9880d681SAndroid Build Coastguard Worker br i1 %cmp2113, label %for.body22.lr.ph, label %for.inc163 266*9880d681SAndroid Build Coastguard Worker 267*9880d681SAndroid Build Coastguard Workerfor.body22.lr.ph: 268*9880d681SAndroid Build Coastguard Worker br label %for.body22 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Workerfor.body22: 271*9880d681SAndroid Build Coastguard Worker br label %for.body33 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Workerfor.body33: 274*9880d681SAndroid Build Coastguard Worker br label %for.end 275*9880d681SAndroid Build Coastguard Worker 276*9880d681SAndroid Build Coastguard Workerfor.end: 277*9880d681SAndroid Build Coastguard Worker %cmp424 = call zeroext i1 @check() 278*9880d681SAndroid Build Coastguard Worker br i1 %cmp424, label %for.body43.lr.ph, label %for.end93 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Workerfor.body43.lr.ph: 281*9880d681SAndroid Build Coastguard Worker br label %for.end93 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerfor.end93: 284*9880d681SAndroid Build Coastguard Worker %cmp96 = call zeroext i1 @check() 285*9880d681SAndroid Build Coastguard Worker br i1 %cmp96, label %if.then97, label %for.cond103 286*9880d681SAndroid Build Coastguard Worker 287*9880d681SAndroid Build Coastguard Workerif.then97: 288*9880d681SAndroid Build Coastguard Worker br label %for.cond103t 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Workerfor.cond103t: 291*9880d681SAndroid Build Coastguard Worker br label %for.cond103 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Workerfor.cond103: 294*9880d681SAndroid Build Coastguard Worker %cmp105 = call zeroext i1 @check() 295*9880d681SAndroid Build Coastguard Worker br i1 %cmp105, label %for.body106, label %for.end120 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Workerfor.body106: 298*9880d681SAndroid Build Coastguard Worker %cmp108 = call zeroext i1 @check() 299*9880d681SAndroid Build Coastguard Worker br i1 %cmp108, label %if.then109, label %for.inc117 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Workerif.then109: 302*9880d681SAndroid Build Coastguard Worker br label %for.inc117 303*9880d681SAndroid Build Coastguard Worker 304*9880d681SAndroid Build Coastguard Workerfor.inc117: 305*9880d681SAndroid Build Coastguard Worker br label %for.cond103t 306*9880d681SAndroid Build Coastguard Worker 307*9880d681SAndroid Build Coastguard Workerfor.end120: 308*9880d681SAndroid Build Coastguard Worker br label %for.inc159 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Workerfor.inc159: 311*9880d681SAndroid Build Coastguard Worker br i1 false, label %for.body22, label %for.cond15.for.inc163_crit_edge 312*9880d681SAndroid Build Coastguard Worker 313*9880d681SAndroid Build Coastguard Workerfor.cond15.for.inc163_crit_edge: 314*9880d681SAndroid Build Coastguard Worker br label %for.inc163 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Workerfor.inc163: 317*9880d681SAndroid Build Coastguard Worker %cmp12 = call zeroext i1 @check() 318*9880d681SAndroid Build Coastguard Worker br i1 %cmp12, label %for.body, label %for.end166 319*9880d681SAndroid Build Coastguard Worker 320*9880d681SAndroid Build Coastguard Workerfor.end166: 321*9880d681SAndroid Build Coastguard Worker ret void 322*9880d681SAndroid Build Coastguard Worker 323*9880d681SAndroid Build Coastguard Worker} 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Worker; Remove a loop whose exit branches into a sibling loop. 326*9880d681SAndroid Build Coastguard Worker; Ensure that only the loop is removed and rely on verify-loopinfo to 327*9880d681SAndroid Build Coastguard Worker; check soundness. 328*9880d681SAndroid Build Coastguard Worker; 329*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @unloopCriticalEdge( 330*9880d681SAndroid Build Coastguard Worker; CHECK: while.cond.outer.i.loopexit.split: 331*9880d681SAndroid Build Coastguard Worker; CHECK: br label %while.body 332*9880d681SAndroid Build Coastguard Worker; CHECK: while.body: 333*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.end78 334*9880d681SAndroid Build Coastguard Workerdefine void @unloopCriticalEdge() nounwind { 335*9880d681SAndroid Build Coastguard Workerentry: 336*9880d681SAndroid Build Coastguard Worker br label %for.cond31 337*9880d681SAndroid Build Coastguard Worker 338*9880d681SAndroid Build Coastguard Workerfor.cond31: 339*9880d681SAndroid Build Coastguard Worker br i1 undef, label %for.body35, label %for.end94 340*9880d681SAndroid Build Coastguard Worker 341*9880d681SAndroid Build Coastguard Workerfor.body35: 342*9880d681SAndroid Build Coastguard Worker br label %while.cond.i.preheader 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Workerwhile.cond.i.preheader: 345*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.cond.i.preheader.split, label %while.cond.outer.i.loopexit.split 346*9880d681SAndroid Build Coastguard Worker 347*9880d681SAndroid Build Coastguard Workerwhile.cond.i.preheader.split: 348*9880d681SAndroid Build Coastguard Worker br label %while.cond.i 349*9880d681SAndroid Build Coastguard Worker 350*9880d681SAndroid Build Coastguard Workerwhile.cond.i: 351*9880d681SAndroid Build Coastguard Worker br i1 true, label %while.cond.i, label %while.cond.outer.i.loopexit 352*9880d681SAndroid Build Coastguard Worker 353*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.i.loopexit: 354*9880d681SAndroid Build Coastguard Worker br label %while.cond.outer.i.loopexit.split 355*9880d681SAndroid Build Coastguard Worker 356*9880d681SAndroid Build Coastguard Workerwhile.cond.outer.i.loopexit.split: 357*9880d681SAndroid Build Coastguard Worker br i1 false, label %while.cond.i.preheader, label %Func2.exit 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard WorkerFunc2.exit: 360*9880d681SAndroid Build Coastguard Worker br label %while.body 361*9880d681SAndroid Build Coastguard Worker 362*9880d681SAndroid Build Coastguard Workerwhile.body: 363*9880d681SAndroid Build Coastguard Worker br i1 false, label %while.body, label %while.end 364*9880d681SAndroid Build Coastguard Worker 365*9880d681SAndroid Build Coastguard Workerwhile.end: 366*9880d681SAndroid Build Coastguard Worker br label %for.end78 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Workerfor.end78: 369*9880d681SAndroid Build Coastguard Worker br i1 undef, label %Proc2.exit, label %for.cond.i.preheader 370*9880d681SAndroid Build Coastguard Worker 371*9880d681SAndroid Build Coastguard Workerfor.cond.i.preheader: 372*9880d681SAndroid Build Coastguard Worker br label %for.cond.i 373*9880d681SAndroid Build Coastguard Worker 374*9880d681SAndroid Build Coastguard Workerfor.cond.i: 375*9880d681SAndroid Build Coastguard Worker br label %for.cond.i 376*9880d681SAndroid Build Coastguard Worker 377*9880d681SAndroid Build Coastguard WorkerProc2.exit: 378*9880d681SAndroid Build Coastguard Worker br label %for.cond31 379*9880d681SAndroid Build Coastguard Worker 380*9880d681SAndroid Build Coastguard Workerfor.end94: 381*9880d681SAndroid Build Coastguard Worker ret void 382*9880d681SAndroid Build Coastguard Worker} 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Worker; Test UnloopUpdater::removeBlocksFromAncestors. 385*9880d681SAndroid Build Coastguard Worker; 386*9880d681SAndroid Build Coastguard Worker; Check that the loop backedge is removed from the middle loop 1699, 387*9880d681SAndroid Build Coastguard Worker; but not the inner loop 1676. 388*9880d681SAndroid Build Coastguard Worker; CHECK: while.body1694: 389*9880d681SAndroid Build Coastguard Worker; CHECK: br label %while.cond1676 390*9880d681SAndroid Build Coastguard Worker; CHECK: while.end1699: 391*9880d681SAndroid Build Coastguard Worker; CHECK: br label %sw.default1711 392*9880d681SAndroid Build Coastguard Workerdefine void @removeSubloopBlocks() nounwind { 393*9880d681SAndroid Build Coastguard Workerentry: 394*9880d681SAndroid Build Coastguard Worker br label %tryagain.outer 395*9880d681SAndroid Build Coastguard Worker 396*9880d681SAndroid Build Coastguard Workertryagain.outer: ; preds = %sw.bb304, %entry 397*9880d681SAndroid Build Coastguard Worker br label %tryagain 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Workertryagain: ; preds = %while.end1699, %tryagain.outer 400*9880d681SAndroid Build Coastguard Worker br i1 undef, label %sw.bb1669, label %sw.bb304 401*9880d681SAndroid Build Coastguard Worker 402*9880d681SAndroid Build Coastguard Workersw.bb304: ; preds = %tryagain 403*9880d681SAndroid Build Coastguard Worker br i1 undef, label %return, label %tryagain.outer 404*9880d681SAndroid Build Coastguard Worker 405*9880d681SAndroid Build Coastguard Workersw.bb1669: ; preds = %tryagain 406*9880d681SAndroid Build Coastguard Worker br i1 undef, label %sw.default1711, label %while.cond1676 407*9880d681SAndroid Build Coastguard Worker 408*9880d681SAndroid Build Coastguard Workerwhile.cond1676: ; preds = %while.body1694, %sw.bb1669 409*9880d681SAndroid Build Coastguard Worker br i1 undef, label %while.end1699, label %while.body1694 410*9880d681SAndroid Build Coastguard Worker 411*9880d681SAndroid Build Coastguard Workerwhile.body1694: ; preds = %while.cond1676 412*9880d681SAndroid Build Coastguard Worker br label %while.cond1676 413*9880d681SAndroid Build Coastguard Worker 414*9880d681SAndroid Build Coastguard Workerwhile.end1699: ; preds = %while.cond1676 415*9880d681SAndroid Build Coastguard Worker br i1 false, label %tryagain, label %sw.default1711 416*9880d681SAndroid Build Coastguard Worker 417*9880d681SAndroid Build Coastguard Workersw.default1711: ; preds = %while.end1699, %sw.bb1669, %tryagain 418*9880d681SAndroid Build Coastguard Worker br label %defchar 419*9880d681SAndroid Build Coastguard Worker 420*9880d681SAndroid Build Coastguard Workerdefchar: ; preds = %sw.default1711, %sw.bb376 421*9880d681SAndroid Build Coastguard Worker br i1 undef, label %if.end2413, label %if.then2368 422*9880d681SAndroid Build Coastguard Worker 423*9880d681SAndroid Build Coastguard Workerif.then2368: ; preds = %defchar 424*9880d681SAndroid Build Coastguard Worker unreachable 425*9880d681SAndroid Build Coastguard Worker 426*9880d681SAndroid Build Coastguard Workerif.end2413: ; preds = %defchar 427*9880d681SAndroid Build Coastguard Worker unreachable 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard Workerreturn: ; preds = %sw.bb304 430*9880d681SAndroid Build Coastguard Worker ret void 431*9880d681SAndroid Build Coastguard Worker} 432*9880d681SAndroid Build Coastguard Worker 433*9880d681SAndroid Build Coastguard Worker; PR11335: the most deeply nested block should be removed from the outer loop. 434*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @removeSubloopBlocks2( 435*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond3: 436*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br 437*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 438*9880d681SAndroid Build Coastguard Workerdefine void @removeSubloopBlocks2() nounwind { 439*9880d681SAndroid Build Coastguard Workerentry: 440*9880d681SAndroid Build Coastguard Worker %tobool.i = icmp ne i32 undef, 0 441*9880d681SAndroid Build Coastguard Worker br label %lbl_616 442*9880d681SAndroid Build Coastguard Worker 443*9880d681SAndroid Build Coastguard Workerlbl_616.loopexit: ; preds = %for.cond 444*9880d681SAndroid Build Coastguard Worker br label %lbl_616 445*9880d681SAndroid Build Coastguard Worker 446*9880d681SAndroid Build Coastguard Workerlbl_616: ; preds = %lbl_616.loopexit, %entry 447*9880d681SAndroid Build Coastguard Worker br label %for.cond 448*9880d681SAndroid Build Coastguard Worker 449*9880d681SAndroid Build Coastguard Workerfor.cond: ; preds = %for.cond3, %lbl_616 450*9880d681SAndroid Build Coastguard Worker br i1 false, label %for.cond1.preheader, label %lbl_616.loopexit 451*9880d681SAndroid Build Coastguard Worker 452*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader: ; preds = %for.cond 453*9880d681SAndroid Build Coastguard Worker br label %for.cond1 454*9880d681SAndroid Build Coastguard Worker 455*9880d681SAndroid Build Coastguard Workerfor.cond1.loopexit: ; preds = %for.cond.i 456*9880d681SAndroid Build Coastguard Worker br label %for.cond1 457*9880d681SAndroid Build Coastguard Worker 458*9880d681SAndroid Build Coastguard Workerfor.cond1: ; preds = %for.cond1.loopexit, %for.cond1.preheader 459*9880d681SAndroid Build Coastguard Worker br i1 false, label %for.body2, label %for.cond3 460*9880d681SAndroid Build Coastguard Worker 461*9880d681SAndroid Build Coastguard Workerfor.body2: ; preds = %for.cond1 462*9880d681SAndroid Build Coastguard Worker br label %for.cond.i 463*9880d681SAndroid Build Coastguard Worker 464*9880d681SAndroid Build Coastguard Workerfor.cond.i: ; preds = %for.cond.i, %for.body2 465*9880d681SAndroid Build Coastguard Worker br i1 %tobool.i, label %for.cond.i, label %for.cond1.loopexit 466*9880d681SAndroid Build Coastguard Worker 467*9880d681SAndroid Build Coastguard Workerfor.cond3: ; preds = %for.cond1 468*9880d681SAndroid Build Coastguard Worker br i1 false, label %for.cond, label %if.end 469*9880d681SAndroid Build Coastguard Worker 470*9880d681SAndroid Build Coastguard Workerif.end: ; preds = %for.cond3 471*9880d681SAndroid Build Coastguard Worker ret void 472*9880d681SAndroid Build Coastguard Worker} 473