brintos

brintos / llvm-project-archived public Read only

0
0
Text · 23.1 KiB · 170d6d0 Raw
741 lines · plain
1; RUN: opt -passes=loop-unroll-and-jam -allow-unroll-and-jam -unroll-and-jam-count=4 -pass-remarks=loop-unroll-and-jam < %s -S 2>&1 | FileCheck %s2; RUN: opt -passes='loop-unroll-and-jam' -allow-unroll-and-jam -unroll-and-jam-count=4 -pass-remarks=loop-unroll-and-jam < %s -S 2>&1 | FileCheck %s3 4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"5 6;; Common check for all tests. None should be unroll and jammed7; CHECK-NOT: remark: {{.*}} unroll and jammed8 9 10; CHECK-LABEL: disabled111; Tests for(i) { sum = A[i]; for(j) sum += B[j]; A[i+1] = sum; }12; A[i] to A[i+1] dependency should block unrollandjam13define void @disabled1(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {14; CHECK: %i.029 = phi i32 [ %add10, %for.latch ], [ 0, %for.preheader ]15; CHECK: %j.026 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]16entry:17  %cmp = icmp ne i32 %J, 018  %cmp127 = icmp ne i32 %I, 019  %or.cond = and i1 %cmp127, %cmp20  br i1 %or.cond, label %for.preheader, label %return21 22for.preheader:23  br label %for.outer24 25for.outer:26  %i.029 = phi i32 [ %add10, %for.latch ], [ 0, %for.preheader ]27  %b.028 = phi i32 [ %inc8, %for.latch ], [ 1, %for.preheader ]28  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.02929  %0 = load i32, ptr %arrayidx, align 430  br label %for.inner31 32for.inner:33  %j.026 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]34  %sum1.025 = phi i32 [ %0, %for.outer ], [ %add, %for.inner ]35  %arrayidx6 = getelementptr inbounds i32, ptr %B, i32 %j.02636  %1 = load i32, ptr %arrayidx6, align 437  %add = add i32 %1, %sum1.02538  %inc = add nuw i32 %j.026, 139  %exitcond = icmp eq i32 %inc, %J40  br i1 %exitcond, label %for.latch, label %for.inner41 42for.latch:43  %arrayidx7 = getelementptr inbounds i32, ptr %A, i32 %b.02844  store i32 %add, ptr %arrayidx7, align 445  %inc8 = add nuw nsw i32 %b.028, 146  %add10 = add nuw nsw i32 %i.029, 147  %exitcond30 = icmp eq i32 %add10, %I48  br i1 %exitcond30, label %return, label %for.outer49 50return:51  ret void52}53 54 55; CHECK-LABEL: disabled256; Tests an incompatible block layout (for.outer jumps past for.inner)57; FIXME: Make this work58define void @disabled2(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {59; CHECK: %i.032 = phi i32 [ %add13, %for.latch ], [ 0, %for.preheader ]60; CHECK: %j.030 = phi i32 [ %inc, %for.inner ], [ 0, %for.inner.preheader ]61entry:62  %cmp = icmp ne i32 %J, 063  %cmp131 = icmp ne i32 %I, 064  %or.cond = and i1 %cmp131, %cmp65  br i1 %or.cond, label %for.preheader, label %for.end1466 67for.preheader:68  br label %for.outer69 70for.outer:71  %i.032 = phi i32 [ %add13, %for.latch ], [ 0, %for.preheader ]72  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %i.03273  %0 = load i32, ptr %arrayidx, align 474  %tobool = icmp eq i32 %0, 075  br i1 %tobool, label %for.latch, label %for.inner76 77for.inner:78  %j.030 = phi i32 [ %inc, %for.inner ], [ 0, %for.outer ]79  %sum1.029 = phi i32 [ %sum1.1, %for.inner ], [ 0, %for.outer ]80  %arrayidx6 = getelementptr inbounds i32, ptr %B, i32 %j.03081  %1 = load i32, ptr %arrayidx6, align 482  %tobool7 = icmp eq i32 %1, 083  %sub = add i32 %sum1.029, 1084  %add = sub i32 %sub, %185  %sum1.1 = select i1 %tobool7, i32 %sum1.029, i32 %add86  %inc = add nuw i32 %j.030, 187  %exitcond = icmp eq i32 %inc, %J88  br i1 %exitcond, label %for.latch, label %for.inner89 90for.latch:91  %sum1.1.lcssa = phi i32 [ 0, %for.outer ], [ %sum1.1, %for.inner ]92  %arrayidx11 = getelementptr inbounds i32, ptr %A, i32 %i.03293  store i32 %sum1.1.lcssa, ptr %arrayidx11, align 494  %add13 = add nuw i32 %i.032, 195  %exitcond33 = icmp eq i32 %add13, %I96  br i1 %exitcond33, label %for.end14, label %for.outer97 98for.end14:99  ret void100}101 102 103; CHECK-LABEL: disabled3104; Tests loop carry dependencies in an array S105define void @disabled3(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {106; CHECK: %i.029 = phi i32 [ 0, %for.preheader ], [ %add12, %for.latch ]107; CHECK: %j.027 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]108entry:109  %S = alloca [4 x i32], align 4110  %cmp = icmp eq i32 %J, 0111  br i1 %cmp, label %return, label %if.end112 113if.end:114  %cmp128 = icmp eq i32 %I, 0115  br i1 %cmp128, label %for.cond.cleanup, label %for.preheader116 117for.preheader:118  br label %for.outer119 120for.cond.cleanup:121  br label %return122 123for.outer:124  %i.029 = phi i32 [ 0, %for.preheader ], [ %add12, %for.latch ]125  br label %for.inner126 127for.inner:128  %j.027 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]129  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j.027130  %l2 = load i32, ptr %arrayidx, align 4131  %add = add i32 %j.027, %i.029132  %rem = urem i32 %add, %J133  %arrayidx6 = getelementptr inbounds i32, ptr %B, i32 %rem134  %l3 = load i32, ptr %arrayidx6, align 4135  %mul = mul i32 %l3, %l2136  %rem7 = urem i32 %j.027, 3137  %arrayidx8 = getelementptr inbounds [4 x i32], ptr %S, i32 0, i32 %rem7138  store i32 %mul, ptr %arrayidx8, align 4139  %inc = add nuw i32 %j.027, 1140  %exitcond = icmp eq i32 %inc, %J141  br i1 %exitcond, label %for.latch, label %for.inner142 143for.latch:144  %l1 = load i32, ptr %S, align 4145  %arrayidx10 = getelementptr inbounds i32, ptr %A, i32 %i.029146  store i32 %l1, ptr %arrayidx10, align 4147  %add12 = add nuw i32 %i.029, 1148  %exitcond31 = icmp eq i32 %add12, %I149  br i1 %exitcond31, label %for.cond.cleanup, label %for.outer150 151return:152  ret void153}154 155 156; CHECK-LABEL: disabled4157; Inner looop induction variable is not consistent158; ie for(i = 0..n) for (j = 0..i) sum+=B[j]159define void @disabled4(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {160; CHECK: %indvars.iv = phi i32 [ %indvars.iv.next, %for.latch ], [ 1, %for.preheader ]161; CHECK: %j.021 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]162entry:163  %cmp = icmp ne i32 %J, 0164  %cmp122 = icmp ugt i32 %I, 1165  %or.cond = and i1 %cmp122, %cmp166  br i1 %or.cond, label %for.preheader, label %for.end9167 168for.preheader:169  br label %for.outer170 171for.outer:172  %indvars.iv = phi i32 [ %indvars.iv.next, %for.latch ], [ 1, %for.preheader ]173  br label %for.inner174 175for.inner:176  %j.021 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]177  %sum1.020 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]178  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j.021179  %0 = load i32, ptr %arrayidx, align 4180  %add = add i32 %0, %sum1.020181  %inc = add nuw i32 %j.021, 1182  %exitcond = icmp eq i32 %inc, %indvars.iv183  br i1 %exitcond, label %for.latch, label %for.inner184 185for.latch:186  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %indvars.iv187  store i32 %add, ptr %arrayidx6, align 4188  %indvars.iv.next = add nuw i32 %indvars.iv, 1189  %exitcond24 = icmp eq i32 %indvars.iv.next, %I190  br i1 %exitcond24, label %for.end9, label %for.outer191 192for.end9:193  ret void194}195 196 197; CHECK-LABEL: disabled5198; Test odd uses of phi nodes where the outer IV cannot be moved into Fore as it hits a PHI199@f = hidden global i32 0, align 4200define i32 @disabled5() #0 {201; CHECK: %0 = phi i32 [ %f.promoted10, %entry ], [ 2, %for.latch ]202; CHECK: %1 = phi i32 [ %0, %for.outer ], [ 2, %for.inner ]203entry:204  %f.promoted10 = load i32, ptr @f, align 4205  br label %for.outer206 207for.outer:208  %0 = phi i32 [ %f.promoted10, %entry ], [ 2, %for.latch ]209  %d.018 = phi i16 [ 0, %entry ], [ %odd.lcssa, %for.latch ]210  %inc5.sink9 = phi i32 [ 2, %entry ], [ %inc5, %for.latch ]211  br label %for.inner212 213for.inner:214  %1 = phi i32 [ %0, %for.outer ], [ 2, %for.inner ]215  %inc.sink8 = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]216  %inc = add nuw nsw i32 %inc.sink8, 1217  %exitcond = icmp ne i32 %inc, 7218  br i1 %exitcond, label %for.inner, label %for.latch219 220for.latch:221  %.lcssa = phi i32 [ %1, %for.inner ]222  %odd.lcssa = phi i16 [ 1, %for.inner ]223  %inc5 = add nuw nsw i32 %inc5.sink9, 1224  %exitcond11 = icmp ne i32 %inc5, 7225  br i1 %exitcond11, label %for.outer, label %for.end226 227for.end:228  %.lcssa.lcssa = phi i32 [ %.lcssa, %for.latch ]229  %inc.lcssa.lcssa = phi i32 [ 7, %for.latch ]230  ret i32 0231}232 233 234; CHECK-LABEL: disabled6235; There is a dependency in here, between @d and %0 (=@f)236@d6 = hidden global i16 5, align 2237@f6 = hidden global ptr @d6, align 4238define i32 @disabled6() #0 {239; CHECK: %inc8.sink14.i = phi i16 [ 1, %entry ], [ %inc8.i, %for.cond.cleanup.i ]240; CHECK: %c.013.i = phi i32 [ 0, %for.body.i ], [ %inc.i, %for.body6.i ]241entry:242  store i16 1, ptr @d6, align 2243  %0 = load ptr, ptr @f6, align 4244  br label %for.body.i245 246for.body.i:247  %inc8.sink14.i = phi i16 [ 1, %entry ], [ %inc8.i, %for.cond.cleanup.i ]248  %1 = load i16, ptr %0, align 2249  br label %for.body6.i250 251for.cond.cleanup.i:252  %inc8.i = add nuw nsw i16 %inc8.sink14.i, 1253  store i16 %inc8.i, ptr @d6, align 2254  %cmp.i = icmp ult i16 %inc8.i, 6255  br i1 %cmp.i, label %for.body.i, label %test.exit256 257for.body6.i:258  %c.013.i = phi i32 [ 0, %for.body.i ], [ %inc.i, %for.body6.i ]259  %inc.i = add nuw nsw i32 %c.013.i, 1260  %exitcond.i = icmp eq i32 %inc.i, 7261  br i1 %exitcond.i, label %for.cond.cleanup.i, label %for.body6.i262 263test.exit:264  %conv2.i = sext i16 %1 to i32265  ret i32 0266}267 268 269; CHECK-LABEL: disabled7270; Has negative output dependency271define void @disabled7(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {272; CHECK: %i.028 = phi i32 [ %add11, %for.cond3.for.cond.cleanup5_crit_edge ], [ 0, %for.body.preheader ]273; CHECK: %j.026 = phi i32 [ 0, %for.body ], [ %add9, %for.body6 ]274entry:275  %cmp = icmp ne i32 %J, 0276  %cmp127 = icmp ne i32 %I, 0277  %or.cond = and i1 %cmp127, %cmp278  br i1 %or.cond, label %for.body.preheader, label %for.end12279 280for.body.preheader:281  br label %for.body282 283for.body:284  %i.028 = phi i32 [ %add11, %for.cond3.for.cond.cleanup5_crit_edge ], [ 0, %for.body.preheader ]285  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.028286  store i32 0, ptr %arrayidx, align 4287  %sub = add i32 %i.028, -1288  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %sub289  store i32 2, ptr %arrayidx2, align 4290  br label %for.body6291 292for.cond3.for.cond.cleanup5_crit_edge:293  store i32 %add, ptr %arrayidx, align 4294  %add11 = add nuw i32 %i.028, 1295  %exitcond29 = icmp eq i32 %add11, %I296  br i1 %exitcond29, label %for.end12, label %for.body297 298for.body6:299  %0 = phi i32 [ 0, %for.body ], [ %add, %for.body6 ]300  %j.026 = phi i32 [ 0, %for.body ], [ %add9, %for.body6 ]301  %arrayidx7 = getelementptr inbounds i32, ptr %B, i32 %j.026302  %1 = load i32, ptr %arrayidx7, align 4303  %add = add i32 %1, %0304  %add9 = add nuw i32 %j.026, 1305  %exitcond = icmp eq i32 %add9, %J306  br i1 %exitcond, label %for.cond3.for.cond.cleanup5_crit_edge, label %for.body6307 308for.end12:309  ret void310}311 312 313; CHECK-LABEL: disabled8314; Same as above with an extra outer loop nest315define void @disabled8(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {316; CHECK: %i.036 = phi i32 [ %add15, %for.latch ], [ 0, %for.body ]317; CHECK: %j.034 = phi i32 [ 0, %for.outer ], [ %add13, %for.inner ]318entry:319  %cmp = icmp eq i32 %J, 0320  %cmp335 = icmp eq i32 %I, 0321  %or.cond = or i1 %cmp, %cmp335322  br i1 %or.cond, label %for.end18, label %for.body.preheader323 324for.body.preheader:325  br label %for.body326 327for.body:328  %x.037 = phi i32 [ %inc, %for.cond.cleanup4 ], [ 0, %for.body.preheader ]329  br label %for.outer330 331for.cond.cleanup4:332  %inc = add nuw nsw i32 %x.037, 1333  %exitcond40 = icmp eq i32 %inc, 5334  br i1 %exitcond40, label %for.end18, label %for.body335 336for.outer:337  %i.036 = phi i32 [ %add15, %for.latch ], [ 0, %for.body ]338  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %i.036339  store i32 0, ptr %arrayidx, align 4340  %sub = add i32 %i.036, -1341  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %sub342  store i32 2, ptr %arrayidx6, align 4343  br label %for.inner344 345for.latch:346  store i32 %add, ptr %arrayidx, align 4347  %add15 = add nuw i32 %i.036, 1348  %exitcond38 = icmp eq i32 %add15, %I349  br i1 %exitcond38, label %for.cond.cleanup4, label %for.outer350 351for.inner:352  %0 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]353  %j.034 = phi i32 [ 0, %for.outer ], [ %add13, %for.inner ]354  %arrayidx11 = getelementptr inbounds i32, ptr %B, i32 %j.034355  %1 = load i32, ptr %arrayidx11, align 4356  %add = add i32 %1, %0357  %add13 = add nuw i32 %j.034, 1358  %exitcond = icmp eq i32 %add13, %J359  br i1 %exitcond, label %for.latch, label %for.inner360 361for.end18:362  ret void363}364 365 366; CHECK-LABEL: disabled9367; Can't prove alias between A and B368define void @disabled9(i32 %I, i32 %J, ptr nocapture %A, ptr nocapture readonly %B) #0 {369; CHECK: %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]370; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]371entry:372  %cmp = icmp ne i32 %J, 0373  %cmp122 = icmp ne i32 %I, 0374  %or.cond = and i1 %cmp, %cmp122375  br i1 %or.cond, label %for.outer.preheader, label %for.end376 377for.outer.preheader:378  br label %for.outer379 380for.outer:381  %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]382  br label %for.inner383 384for.inner:385  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]386  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]387  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j388  %0 = load i32, ptr %arrayidx, align 4389  %add = add i32 %0, %sum1390  %inc = add nuw i32 %j, 1391  %exitcond = icmp eq i32 %inc, %J392  br i1 %exitcond, label %for.latch, label %for.inner393 394for.latch:395  %add.lcssa = phi i32 [ %add, %for.inner ]396  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i397  store i32 %add.lcssa, ptr %arrayidx6, align 4398  %add8 = add nuw i32 %i, 1399  %exitcond25 = icmp eq i32 %add8, %I400  br i1 %exitcond25, label %for.end.loopexit, label %for.outer401 402for.end.loopexit:403  br label %for.end404 405for.end:406  ret void407}408 409 410; CHECK-LABEL: disable10411; Simple call412declare void @f10(i32, i32) #0413define void @disable10(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {414; CHECK: %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]415; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]416entry:417  %cmp = icmp ne i32 %J, 0418  %cmp122 = icmp ne i32 %I, 0419  %or.cond = and i1 %cmp, %cmp122420  br i1 %or.cond, label %for.outer.preheader, label %for.end421 422for.outer.preheader:423  br label %for.outer424 425for.outer:426  %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]427  br label %for.inner428 429for.inner:430  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]431  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]432  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j433  %0 = load i32, ptr %arrayidx, align 4434  %add = add i32 %0, %sum1435  %inc = add nuw i32 %j, 1436  %exitcond = icmp eq i32 %inc, %J437  tail call void @f10(i32 %i, i32 %j) nounwind438  br i1 %exitcond, label %for.latch, label %for.inner439 440for.latch:441  %add.lcssa = phi i32 [ %add, %for.inner ]442  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i443  store i32 %add.lcssa, ptr %arrayidx6, align 4444  %add8 = add nuw i32 %i, 1445  %exitcond25 = icmp eq i32 %add8, %I446  br i1 %exitcond25, label %for.end.loopexit, label %for.outer447 448for.end.loopexit:449  br label %for.end450 451for.end:452  ret void453}454 455 456; CHECK-LABEL: disable11457; volatile458define void @disable11(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {459; CHECK: %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]460; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]461entry:462  %cmp = icmp ne i32 %J, 0463  %cmp122 = icmp ne i32 %I, 0464  %or.cond = and i1 %cmp, %cmp122465  br i1 %or.cond, label %for.outer.preheader, label %for.end466 467for.outer.preheader:468  br label %for.outer469 470for.outer:471  %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]472  br label %for.inner473 474for.inner:475  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]476  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]477  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j478  %0 = load volatile i32, ptr %arrayidx, align 4479  %add = add i32 %0, %sum1480  %inc = add nuw i32 %j, 1481  %exitcond = icmp eq i32 %inc, %J482  br i1 %exitcond, label %for.latch, label %for.inner483 484for.latch:485  %add.lcssa = phi i32 [ %add, %for.inner ]486  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i487  store i32 %add.lcssa, ptr %arrayidx6, align 4488  %add8 = add nuw i32 %i, 1489  %exitcond25 = icmp eq i32 %add8, %I490  br i1 %exitcond25, label %for.end.loopexit, label %for.outer491 492for.end.loopexit:493  br label %for.end494 495for.end:496  ret void497}498 499 500; CHECK-LABEL: disable12501; Multiple aft blocks502define void @disable12(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {503; CHECK: %i = phi i32 [ %add8, %for.latch3 ], [ 0, %for.outer.preheader ]504; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]505entry:506  %cmp = icmp ne i32 %J, 0507  %cmp122 = icmp ne i32 %I, 0508  %or.cond = and i1 %cmp, %cmp122509  br i1 %or.cond, label %for.outer.preheader, label %for.end510 511for.outer.preheader:512  br label %for.outer513 514for.outer:515  %i = phi i32 [ %add8, %for.latch3 ], [ 0, %for.outer.preheader ]516  br label %for.inner517 518for.inner:519  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]520  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]521  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j522  %0 = load i32, ptr %arrayidx, align 4523  %add = add i32 %0, %sum1524  %inc = add nuw i32 %j, 1525  %exitcond = icmp eq i32 %inc, %J526  br i1 %exitcond, label %for.latch, label %for.inner527 528for.latch:529  %add.lcssa = phi i32 [ %add, %for.inner ]530  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i531  store i32 %add.lcssa, ptr %arrayidx6, align 4532  %cmpl = icmp eq i32 %add.lcssa, 10533  br i1 %cmpl, label %for.latch2, label %for.latch3534 535for.latch2:536  br label %for.latch3537 538for.latch3:539  %add8 = add nuw i32 %i, 1540  %exitcond25 = icmp eq i32 %add8, %I541  br i1 %exitcond25, label %for.end.loopexit, label %for.outer542 543for.end.loopexit:544  br label %for.end545 546for.end:547  ret void548}549 550 551; CHECK-LABEL: disable13552; Two subloops553define void @disable13(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {554; CHECK: %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]555; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]556; CHECK: %j2 = phi i32 [ %inc2, %for.inner2 ], [ 0, %for.inner2.preheader ]557entry:558  %cmp = icmp ne i32 %J, 0559  %cmp122 = icmp ne i32 %I, 0560  %or.cond = and i1 %cmp, %cmp122561  br i1 %or.cond, label %for.outer.preheader, label %for.end562 563for.outer.preheader:564  br label %for.outer565 566for.outer:567  %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]568  br label %for.inner569 570for.inner:571  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]572  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]573  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j574  %0 = load i32, ptr %arrayidx, align 4575  %add = add i32 %0, %sum1576  %inc = add nuw i32 %j, 1577  %exitcond = icmp eq i32 %inc, %J578  br i1 %exitcond, label %for.inner2, label %for.inner579 580for.inner2:581  %j2 = phi i32 [ 0, %for.inner ], [ %inc2, %for.inner2 ]582  %sum12 = phi i32 [ 0, %for.inner ], [ %add2, %for.inner2 ]583  %arrayidx2 = getelementptr inbounds i32, ptr %B, i32 %j2584  %l0 = load i32, ptr %arrayidx2, align 4585  %add2 = add i32 %l0, %sum12586  %inc2 = add nuw i32 %j2, 1587  %exitcond2 = icmp eq i32 %inc2, %J588  br i1 %exitcond2, label %for.latch, label %for.inner2589 590for.latch:591  %add.lcssa = phi i32 [ %add, %for.inner2 ]592  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i593  store i32 %add.lcssa, ptr %arrayidx6, align 4594  %add8 = add nuw i32 %i, 1595  %exitcond25 = icmp eq i32 %add8, %I596  br i1 %exitcond25, label %for.end.loopexit, label %for.outer597 598for.end.loopexit:599  br label %for.end600 601for.end:602  ret void603}604 605 606; CHECK-LABEL: disable14607; Multiple exits blocks608define void @disable14(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {609; CHECK: %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]610; CHECK: %j = phi i32 [ %inc, %for.inner ], [ 0, %for.inner.preheader ]611entry:612  %cmp = icmp ne i32 %J, 0613  %cmp122 = icmp ne i32 %I, 0614  %or.cond = and i1 %cmp, %cmp122615  br i1 %or.cond, label %for.outer.preheader, label %for.end616 617for.outer.preheader:618  br label %for.outer619 620for.outer:621  %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]622  %add8 = add nuw i32 %i, 1623  %exitcond23 = icmp eq i32 %add8, %I624  br i1 %exitcond23, label %for.end.loopexit, label %for.inner625 626for.inner:627  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]628  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]629  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j630  %0 = load i32, ptr %arrayidx, align 4631  %add = add i32 %0, %sum1632  %inc = add nuw i32 %j, 1633  %exitcond = icmp eq i32 %inc, %J634  br i1 %exitcond, label %for.latch, label %for.inner635 636for.latch:637  %add.lcssa = phi i32 [ %add, %for.inner ]638  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i639  store i32 %add.lcssa, ptr %arrayidx6, align 4640  %exitcond25 = icmp eq i32 %add8, %I641  br i1 %exitcond25, label %for.end.loopexit, label %for.outer642 643for.end.loopexit:644  br label %for.end645 646for.end:647  ret void648}649 650 651; CHECK-LABEL: disable15652; Latch != exit653define void @disable15(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {654; CHECK: %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]655; CHECK: %j = phi i32 [ %inc, %for.inner ], [ 0, %for.inner.preheader ]656entry:657  %cmp = icmp ne i32 %J, 0658  %cmp122 = icmp ne i32 %I, 0659  %or.cond = and i1 %cmp, %cmp122660  br i1 %or.cond, label %for.outer.preheader, label %for.end661 662for.outer.preheader:663  br label %for.outer664 665for.outer:666  %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]667  %add8 = add nuw i32 %i, 1668  %exitcond25 = icmp eq i32 %add8, %I669  br i1 %exitcond25, label %for.end.loopexit, label %for.inner670 671for.inner:672  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]673  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]674  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j675  %0 = load i32, ptr %arrayidx, align 4676  %add = add i32 %0, %sum1677  %inc = add nuw i32 %j, 1678  %exitcond = icmp eq i32 %inc, %J679  br i1 %exitcond, label %for.latch, label %for.inner680 681for.latch:682  %add.lcssa = phi i32 [ %add, %for.inner ]683  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i684  store i32 %add.lcssa, ptr %arrayidx6, align 4685  br label %for.outer686 687for.end.loopexit:688  br label %for.end689 690for.end:691  ret void692}693 694 695; CHECK-LABEL: disable16696; Cannot move other before inner loop697define void @disable16(i32 %I, i32 %J, ptr noalias nocapture %A, ptr noalias nocapture readonly %B) #0 {698; CHECK: %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]699; CHECK: %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]700entry:701  %cmp = icmp ne i32 %J, 0702  %cmp122 = icmp ne i32 %I, 0703  %or.cond = and i1 %cmp, %cmp122704  br i1 %or.cond, label %for.outer.preheader, label %for.end705 706for.outer.preheader:707  br label %for.outer708 709for.outer:710  %i = phi i32 [ %add8, %for.latch ], [ 0, %for.outer.preheader ]711  %otherphi = phi i32 [ %other, %for.latch ], [ 0, %for.outer.preheader ]712  br label %for.inner713 714for.inner:715  %j = phi i32 [ 0, %for.outer ], [ %inc, %for.inner ]716  %sum1 = phi i32 [ 0, %for.outer ], [ %add, %for.inner ]717  %arrayidx = getelementptr inbounds i32, ptr %B, i32 %j718  %0 = load i32, ptr %arrayidx, align 4719  %add = add i32 %0, %sum1720  %inc = add nuw i32 %j, 1721  %exitcond = icmp eq i32 %inc, %J722  br i1 %exitcond, label %for.latch, label %for.inner723 724for.latch:725  %add.lcssa = phi i32 [ %add, %for.inner ]726  %arrayidx6 = getelementptr inbounds i32, ptr %A, i32 %i727  store i32 %add.lcssa, ptr %arrayidx6, align 4728  %add8 = add nuw i32 %i, 1729  %exitcond25 = icmp eq i32 %add8, %I730  %loadarr = getelementptr inbounds i32, ptr %A, i32 %i731  %load = load i32, ptr %arrayidx6, align 4732  %other = add i32 %otherphi, %load733  br i1 %exitcond25, label %for.end.loopexit, label %for.outer734 735for.end.loopexit:736  br label %for.end737 738for.end:739  ret void740}741