1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -loop-interchange -S | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker;; We test the complete .ll for adjustment in outer loop header/latch and inner loop header/latch. 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 5*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu" 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker@A = common global [100 x [100 x i32]] zeroinitializer 8*9880d681SAndroid Build Coastguard Worker@B = common global [100 x i32] zeroinitializer 9*9880d681SAndroid Build Coastguard Worker@C = common global [100 x [100 x i32]] zeroinitializer 10*9880d681SAndroid Build Coastguard Worker@D = common global [100 x [100 x [100 x i32]]] zeroinitializer 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdeclare void @foo(...) 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker;;--------------------------------------Test case 01------------------------------------ 15*9880d681SAndroid Build Coastguard Worker;; for(int i=0;i<N;i++) 16*9880d681SAndroid Build Coastguard Worker;; for(int j=1;j<N;j++) 17*9880d681SAndroid Build Coastguard Worker;; A[j][i] = A[j][i]+k; 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine void @interchange_01(i32 %k, i32 %N) { 20*9880d681SAndroid Build Coastguard Workerentry: 21*9880d681SAndroid Build Coastguard Worker %cmp21 = icmp sgt i32 %N, 0 22*9880d681SAndroid Build Coastguard Worker br i1 %cmp21, label %for.cond1.preheader.lr.ph, label %for.end12 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader.lr.ph: 25*9880d681SAndroid Build Coastguard Worker %cmp219 = icmp sgt i32 %N, 1 26*9880d681SAndroid Build Coastguard Worker %0 = add i32 %N, -1 27*9880d681SAndroid Build Coastguard Worker br label %for.cond1.preheader 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader: 30*9880d681SAndroid Build Coastguard Worker %indvars.iv23 = phi i64 [ 0, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next24, %for.inc10 ] 31*9880d681SAndroid Build Coastguard Worker br i1 %cmp219, label %for.body3, label %for.inc10 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Workerfor.body3: 34*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3 ], [ 1, %for.cond1.preheader ] 35*9880d681SAndroid Build Coastguard Worker %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv23 36*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %arrayidx5 37*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %1, %k 38*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %arrayidx5 39*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 40*9880d681SAndroid Build Coastguard Worker %lftr.wideiv = trunc i64 %indvars.iv to i32 41*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %lftr.wideiv, %0 42*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.inc10, label %for.body3 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerfor.inc10: 45*9880d681SAndroid Build Coastguard Worker %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 46*9880d681SAndroid Build Coastguard Worker %lftr.wideiv25 = trunc i64 %indvars.iv23 to i32 47*9880d681SAndroid Build Coastguard Worker %exitcond26 = icmp eq i32 %lftr.wideiv25, %0 48*9880d681SAndroid Build Coastguard Worker br i1 %exitcond26, label %for.end12, label %for.cond1.preheader 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerfor.end12: 51*9880d681SAndroid Build Coastguard Worker ret void 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @interchange_01 55*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 56*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp21 = icmp sgt i32 %N, 0 57*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp21, label %for.body3.preheader, label %for.end12 58*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond1.preheader.lr.ph: 59*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond1.preheader 60*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond1.preheader: 61*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv23 = phi i64 [ 0, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next24, %for.inc10 ] 62*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp219, label %for.body3.split1, label %for.end12.loopexit 63*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3.preheader: 64*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp219 = icmp sgt i32 %N, 1 65*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = add i32 %N, -1 66*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body3 67*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3: 68*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3.split ], [ 1, %for.body3.preheader ] 69*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond1.preheader.lr.ph 70*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3.split1: 71*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv23 72*9880d681SAndroid Build Coastguard Worker; CHECK: %1 = load i32, i32* %arrayidx5 73*9880d681SAndroid Build Coastguard Worker; CHECK: %add = add nsw i32 %1, %k 74*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %add, i32* %arrayidx5 75*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.inc10.loopexit 76*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3.split: 77*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 78*9880d681SAndroid Build Coastguard Worker; CHECK: %lftr.wideiv = trunc i64 %indvars.iv to i32 79*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i32 %lftr.wideiv, %0 80*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.end12.loopexit, label %for.body3 81*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc10.loopexit: 82*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.inc10 83*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc10: 84*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 85*9880d681SAndroid Build Coastguard Worker; CHECK: %lftr.wideiv25 = trunc i64 %indvars.iv23 to i32 86*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond26 = icmp eq i32 %lftr.wideiv25, %0 87*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond26, label %for.body3.split, label %for.cond1.preheader 88*9880d681SAndroid Build Coastguard Worker; CHECK: for.end12.loopexit: 89*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.end12 90*9880d681SAndroid Build Coastguard Worker; CHECK: for.end12: 91*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Worker;;--------------------------------------Test case 02------------------------------------- 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker;; for(int i=0;i<100;i++) 96*9880d681SAndroid Build Coastguard Worker;; for(int j=100;j>=0;j--) 97*9880d681SAndroid Build Coastguard Worker;; A[j][i] = A[j][i]+k; 98*9880d681SAndroid Build Coastguard Worker 99*9880d681SAndroid Build Coastguard Workerdefine void @interchange_02(i32 %k) { 100*9880d681SAndroid Build Coastguard Workerentry: 101*9880d681SAndroid Build Coastguard Worker br label %for.cond1.preheader 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader: 104*9880d681SAndroid Build Coastguard Worker %indvars.iv19 = phi i64 [ 0, %entry ], [ %indvars.iv.next20, %for.inc10 ] 105*9880d681SAndroid Build Coastguard Worker br label %for.body3 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Workerfor.body3: 108*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 100, %for.cond1.preheader ], [ %indvars.iv.next, %for.body3 ] 109*9880d681SAndroid Build Coastguard Worker %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv19 110*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx5 111*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %0, %k 112*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %arrayidx5 113*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nsw i64 %indvars.iv, -1 114*9880d681SAndroid Build Coastguard Worker %cmp2 = icmp sgt i64 %indvars.iv, 0 115*9880d681SAndroid Build Coastguard Worker br i1 %cmp2, label %for.body3, label %for.inc10 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerfor.inc10: 118*9880d681SAndroid Build Coastguard Worker %indvars.iv.next20 = add nuw nsw i64 %indvars.iv19, 1 119*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next20, 100 120*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.end11, label %for.cond1.preheader 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Workerfor.end11: 123*9880d681SAndroid Build Coastguard Worker ret void 124*9880d681SAndroid Build Coastguard Worker} 125*9880d681SAndroid Build Coastguard Worker 126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @interchange_02 127*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 128*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body3.preheader 129*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond1.preheader.preheader: 130*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond1.preheader 131*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond1.preheader: 132*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv19 = phi i64 [ %indvars.iv.next20, %for.inc10 ], [ 0, %for.cond1.preheader.preheader ] 133*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body3.split1 134*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3.preheader: 135*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body3 136*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3: 137*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3.split ], [ 100, %for.body3.preheader ] 138*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond1.preheader.preheader 139*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3.split1: ; preds = %for.cond1.preheader 140*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv19 141*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = load i32, i32* %arrayidx5 142*9880d681SAndroid Build Coastguard Worker; CHECK: %add = add nsw i32 %0, %k 143*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %add, i32* %arrayidx5 144*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.inc10 145*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3.split: 146*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nsw i64 %indvars.iv, -1 147*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp2 = icmp sgt i64 %indvars.iv, 0 148*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp2, label %for.body3, label %for.end11 149*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc10: 150*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next20 = add nuw nsw i64 %indvars.iv19, 1 151*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i64 %indvars.iv.next20, 100 152*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.body3.split, label %for.cond1.preheader 153*9880d681SAndroid Build Coastguard Worker; CHECK: for.end11: 154*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 155*9880d681SAndroid Build Coastguard Worker 156*9880d681SAndroid Build Coastguard Worker;;--------------------------------------Test case 03------------------------------------- 157*9880d681SAndroid Build Coastguard Worker;; Loops should not be interchanged in this case as it is not profitable. 158*9880d681SAndroid Build Coastguard Worker;; for(int i=0;i<100;i++) 159*9880d681SAndroid Build Coastguard Worker;; for(int j=0;j<100;j++) 160*9880d681SAndroid Build Coastguard Worker;; A[i][j] = A[i][j]+k; 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerdefine void @interchange_03(i32 %k) { 163*9880d681SAndroid Build Coastguard Workerentry: 164*9880d681SAndroid Build Coastguard Worker br label %for.cond1.preheader 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader: 167*9880d681SAndroid Build Coastguard Worker %indvars.iv21 = phi i64 [ 0, %entry ], [ %indvars.iv.next22, %for.inc10 ] 168*9880d681SAndroid Build Coastguard Worker br label %for.body3 169*9880d681SAndroid Build Coastguard Worker 170*9880d681SAndroid Build Coastguard Workerfor.body3: 171*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body3 ] 172*9880d681SAndroid Build Coastguard Worker %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv21, i64 %indvars.iv 173*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx5 174*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %0, %k 175*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %arrayidx5 176*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 177*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 100 178*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.inc10, label %for.body3 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workerfor.inc10: 181*9880d681SAndroid Build Coastguard Worker %indvars.iv.next22 = add nuw nsw i64 %indvars.iv21, 1 182*9880d681SAndroid Build Coastguard Worker %exitcond23 = icmp eq i64 %indvars.iv.next22, 100 183*9880d681SAndroid Build Coastguard Worker br i1 %exitcond23, label %for.end12, label %for.cond1.preheader 184*9880d681SAndroid Build Coastguard Worker 185*9880d681SAndroid Build Coastguard Workerfor.end12: 186*9880d681SAndroid Build Coastguard Worker ret void 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @interchange_03 190*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 191*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond1.preheader.preheader 192*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond1.preheader.preheader: ; preds = %entry 193*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond1.preheader 194*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc10 195*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv21 = phi i64 [ %indvars.iv.next22, %for.inc10 ], [ 0, %for.cond1.preheader.preheader ] 196*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body3.preheader 197*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3.preheader: ; preds = %for.cond1.preheader 198*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body3 199*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3: ; preds = %for.body3.preheader, %for.body3 200*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3 ], [ 0, %for.body3.preheader ] 201*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv21, i64 %indvars.iv 202*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = load i32, i32* %arrayidx5 203*9880d681SAndroid Build Coastguard Worker; CHECK: %add = add nsw i32 %0, %k 204*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %add, i32* %arrayidx5 205*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 206*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i64 %indvars.iv.next, 100 207*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.inc10, label %for.body3 208*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc10: ; preds = %for.body3 209*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next22 = add nuw nsw i64 %indvars.iv21, 1 210*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond23 = icmp eq i64 %indvars.iv.next22, 100 211*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond23, label %for.end12, label %for.cond1.preheader 212*9880d681SAndroid Build Coastguard Worker; CHECK: for.end12: ; preds = %for.inc10 213*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 214*9880d681SAndroid Build Coastguard Worker 215*9880d681SAndroid Build Coastguard Worker 216*9880d681SAndroid Build Coastguard Worker;;--------------------------------------Test case 04------------------------------------- 217*9880d681SAndroid Build Coastguard Worker;; Loops should not be interchanged in this case as it is not legal due to dependency. 218*9880d681SAndroid Build Coastguard Worker;; for(int j=0;j<99;j++) 219*9880d681SAndroid Build Coastguard Worker;; for(int i=0;i<99;i++) 220*9880d681SAndroid Build Coastguard Worker;; A[j][i+1] = A[j+1][i]+k; 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Workerdefine void @interchange_04(i32 %k){ 223*9880d681SAndroid Build Coastguard Workerentry: 224*9880d681SAndroid Build Coastguard Worker br label %for.cond1.preheader 225*9880d681SAndroid Build Coastguard Worker 226*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader: 227*9880d681SAndroid Build Coastguard Worker %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for.inc12 ] 228*9880d681SAndroid Build Coastguard Worker %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 229*9880d681SAndroid Build Coastguard Worker br label %for.body3 230*9880d681SAndroid Build Coastguard Worker 231*9880d681SAndroid Build Coastguard Workerfor.body3: 232*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body3 ] 233*9880d681SAndroid Build Coastguard Worker %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv.next24, i64 %indvars.iv 234*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx5 235*9880d681SAndroid Build Coastguard Worker %add6 = add nsw i32 %0, %k 236*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 237*9880d681SAndroid Build Coastguard Worker %arrayidx11 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv23, i64 %indvars.iv.next 238*9880d681SAndroid Build Coastguard Worker store i32 %add6, i32* %arrayidx11 239*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i64 %indvars.iv.next, 99 240*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.inc12, label %for.body3 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Workerfor.inc12: 243*9880d681SAndroid Build Coastguard Worker %exitcond25 = icmp eq i64 %indvars.iv.next24, 99 244*9880d681SAndroid Build Coastguard Worker br i1 %exitcond25, label %for.end14, label %for.cond1.preheader 245*9880d681SAndroid Build Coastguard Worker 246*9880d681SAndroid Build Coastguard Workerfor.end14: 247*9880d681SAndroid Build Coastguard Worker ret void 248*9880d681SAndroid Build Coastguard Worker} 249*9880d681SAndroid Build Coastguard Worker 250*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @interchange_04 251*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 252*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond1.preheader 253*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond1.preheader: ; preds = %for.inc12, %entry 254*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv23 = phi i64 [ 0, %entry ], [ %indvars.iv.next24, %for.inc12 ] 255*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next24 = add nuw nsw i64 %indvars.iv23, 1 256*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body3 257*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3: ; preds = %for.body3, %for.cond1.preheader 258*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ 0, %for.cond1.preheader ], [ %indvars.iv.next, %for.body3 ] 259*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv.next24, i64 %indvars.iv 260*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = load i32, i32* %arrayidx5 261*9880d681SAndroid Build Coastguard Worker; CHECK: %add6 = add nsw i32 %0, %k 262*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 263*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx11 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv23, i64 %indvars.iv.next 264*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %add6, i32* %arrayidx11 265*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i64 %indvars.iv.next, 99 266*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.inc12, label %for.body3 267*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc12: ; preds = %for.body3 268*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond25 = icmp eq i64 %indvars.iv.next24, 99 269*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond25, label %for.end14, label %for.cond1.preheader 270*9880d681SAndroid Build Coastguard Worker; CHECK: for.end14: ; preds = %for.inc12 271*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 272*9880d681SAndroid Build Coastguard Worker 273*9880d681SAndroid Build Coastguard Worker 274*9880d681SAndroid Build Coastguard Worker 275*9880d681SAndroid Build Coastguard Worker;;--------------------------------------Test case 05------------------------------------- 276*9880d681SAndroid Build Coastguard Worker;; Loops not tightly nested are not interchanged 277*9880d681SAndroid Build Coastguard Worker;; for(int j=0;j<N;j++) { 278*9880d681SAndroid Build Coastguard Worker;; B[j] = j+k; 279*9880d681SAndroid Build Coastguard Worker;; for(int i=0;i<N;i++) 280*9880d681SAndroid Build Coastguard Worker;; A[j][i] = A[j][i]+B[j]; 281*9880d681SAndroid Build Coastguard Worker;; } 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Workerdefine void @interchange_05(i32 %k, i32 %N){ 284*9880d681SAndroid Build Coastguard Workerentry: 285*9880d681SAndroid Build Coastguard Worker %cmp30 = icmp sgt i32 %N, 0 286*9880d681SAndroid Build Coastguard Worker br i1 %cmp30, label %for.body.lr.ph, label %for.end17 287*9880d681SAndroid Build Coastguard Worker 288*9880d681SAndroid Build Coastguard Workerfor.body.lr.ph: 289*9880d681SAndroid Build Coastguard Worker %0 = add i32 %N, -1 290*9880d681SAndroid Build Coastguard Worker %1 = zext i32 %k to i64 291*9880d681SAndroid Build Coastguard Worker br label %for.body 292*9880d681SAndroid Build Coastguard Worker 293*9880d681SAndroid Build Coastguard Workerfor.body: 294*9880d681SAndroid Build Coastguard Worker %indvars.iv32 = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next33, %for.inc15 ] 295*9880d681SAndroid Build Coastguard Worker %2 = add nsw i64 %indvars.iv32, %1 296*9880d681SAndroid Build Coastguard Worker %arrayidx = getelementptr inbounds [100 x i32], [100 x i32]* @B, i64 0, i64 %indvars.iv32 297*9880d681SAndroid Build Coastguard Worker %3 = trunc i64 %2 to i32 298*9880d681SAndroid Build Coastguard Worker store i32 %3, i32* %arrayidx 299*9880d681SAndroid Build Coastguard Worker br label %for.body3 300*9880d681SAndroid Build Coastguard Worker 301*9880d681SAndroid Build Coastguard Workerfor.body3: 302*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ 0, %for.body ], [ %indvars.iv.next, %for.body3 ] 303*9880d681SAndroid Build Coastguard Worker %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv32, i64 %indvars.iv 304*9880d681SAndroid Build Coastguard Worker %4 = load i32, i32* %arrayidx7 305*9880d681SAndroid Build Coastguard Worker %add10 = add nsw i32 %3, %4 306*9880d681SAndroid Build Coastguard Worker store i32 %add10, i32* %arrayidx7 307*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 308*9880d681SAndroid Build Coastguard Worker %lftr.wideiv = trunc i64 %indvars.iv to i32 309*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %lftr.wideiv, %0 310*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.inc15, label %for.body3 311*9880d681SAndroid Build Coastguard Worker 312*9880d681SAndroid Build Coastguard Workerfor.inc15: 313*9880d681SAndroid Build Coastguard Worker %indvars.iv.next33 = add nuw nsw i64 %indvars.iv32, 1 314*9880d681SAndroid Build Coastguard Worker %lftr.wideiv35 = trunc i64 %indvars.iv32 to i32 315*9880d681SAndroid Build Coastguard Worker %exitcond36 = icmp eq i32 %lftr.wideiv35, %0 316*9880d681SAndroid Build Coastguard Worker br i1 %exitcond36, label %for.end17, label %for.body 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Workerfor.end17: 319*9880d681SAndroid Build Coastguard Worker ret void 320*9880d681SAndroid Build Coastguard Worker} 321*9880d681SAndroid Build Coastguard Worker 322*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @interchange_05 323*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 324*9880d681SAndroid Build Coastguard Worker; CHECK: %cmp30 = icmp sgt i32 %N, 0 325*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cmp30, label %for.body.lr.ph, label %for.end17 326*9880d681SAndroid Build Coastguard Worker; CHECK: for.body.lr.ph: 327*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = add i32 %N, -1 328*9880d681SAndroid Build Coastguard Worker; CHECK: %1 = zext i32 %k to i64 329*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body 330*9880d681SAndroid Build Coastguard Worker; CHECK: for.body: 331*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv32 = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next33, %for.inc15 ] 332*9880d681SAndroid Build Coastguard Worker; CHECK: %2 = add nsw i64 %indvars.iv32, %1 333*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds [100 x i32], [100 x i32]* @B, i64 0, i64 %indvars.iv32 334*9880d681SAndroid Build Coastguard Worker; CHECK: %3 = trunc i64 %2 to i32 335*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %3, i32* %arrayidx 336*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body3.preheader 337*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3.preheader: 338*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body3 339*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3: 340*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3 ], [ 0, %for.body3.preheader ] 341*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv32, i64 %indvars.iv 342*9880d681SAndroid Build Coastguard Worker; CHECK: %4 = load i32, i32* %arrayidx7 343*9880d681SAndroid Build Coastguard Worker; CHECK: %add10 = add nsw i32 %3, %4 344*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %add10, i32* %arrayidx7 345*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 346*9880d681SAndroid Build Coastguard Worker; CHECK: %lftr.wideiv = trunc i64 %indvars.iv to i32 347*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i32 %lftr.wideiv, %0 348*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.inc15, label %for.body3 349*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc15: 350*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next33 = add nuw nsw i64 %indvars.iv32, 1 351*9880d681SAndroid Build Coastguard Worker; CHECK: %lftr.wideiv35 = trunc i64 %indvars.iv32 to i32 352*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond36 = icmp eq i32 %lftr.wideiv35, %0 353*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond36, label %for.end17.loopexit, label %for.body 354*9880d681SAndroid Build Coastguard Worker; CHECK: for.end17.loopexit: 355*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.end17 356*9880d681SAndroid Build Coastguard Worker; CHECK: for.end17: 357*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Worker 360*9880d681SAndroid Build Coastguard Worker;;--------------------------------------Test case 06------------------------------------- 361*9880d681SAndroid Build Coastguard Worker;; Loops not tightly nested are not interchanged 362*9880d681SAndroid Build Coastguard Worker;; for(int j=0;j<N;j++) { 363*9880d681SAndroid Build Coastguard Worker;; foo(); 364*9880d681SAndroid Build Coastguard Worker;; for(int i=2;i<N;i++) 365*9880d681SAndroid Build Coastguard Worker;; A[j][i] = A[j][i]+k; 366*9880d681SAndroid Build Coastguard Worker;; } 367*9880d681SAndroid Build Coastguard Worker 368*9880d681SAndroid Build Coastguard Workerdefine void @interchange_06(i32 %k, i32 %N) { 369*9880d681SAndroid Build Coastguard Workerentry: 370*9880d681SAndroid Build Coastguard Worker %cmp22 = icmp sgt i32 %N, 0 371*9880d681SAndroid Build Coastguard Worker br i1 %cmp22, label %for.body.lr.ph, label %for.end12 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Workerfor.body.lr.ph: 374*9880d681SAndroid Build Coastguard Worker %0 = add i32 %N, -1 375*9880d681SAndroid Build Coastguard Worker br label %for.body 376*9880d681SAndroid Build Coastguard Worker 377*9880d681SAndroid Build Coastguard Workerfor.body: 378*9880d681SAndroid Build Coastguard Worker %indvars.iv24 = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next25, %for.inc10 ] 379*9880d681SAndroid Build Coastguard Worker tail call void (...) @foo() 380*9880d681SAndroid Build Coastguard Worker br label %for.body3 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Workerfor.body3: 383*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3 ], [ 2, %for.body ] 384*9880d681SAndroid Build Coastguard Worker %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv24, i64 %indvars.iv 385*9880d681SAndroid Build Coastguard Worker %1 = load i32, i32* %arrayidx5 386*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %1, %k 387*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %arrayidx5 388*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 389*9880d681SAndroid Build Coastguard Worker %lftr.wideiv = trunc i64 %indvars.iv to i32 390*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %lftr.wideiv, %0 391*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.inc10, label %for.body3 392*9880d681SAndroid Build Coastguard Worker 393*9880d681SAndroid Build Coastguard Workerfor.inc10: 394*9880d681SAndroid Build Coastguard Worker %indvars.iv.next25 = add nuw nsw i64 %indvars.iv24, 1 395*9880d681SAndroid Build Coastguard Worker %lftr.wideiv26 = trunc i64 %indvars.iv24 to i32 396*9880d681SAndroid Build Coastguard Worker %exitcond27 = icmp eq i32 %lftr.wideiv26, %0 397*9880d681SAndroid Build Coastguard Worker br i1 %exitcond27, label %for.end12, label %for.body 398*9880d681SAndroid Build Coastguard Worker 399*9880d681SAndroid Build Coastguard Workerfor.end12: 400*9880d681SAndroid Build Coastguard Worker ret void 401*9880d681SAndroid Build Coastguard Worker} 402*9880d681SAndroid Build Coastguard Worker;; Here we are checking if the inner phi is not split then we have not interchanged. 403*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @interchange_06 404*9880d681SAndroid Build Coastguard Worker; CHECK: phi i64 [ %indvars.iv.next, %for.body3 ], [ 2, %for.body3.preheader ] 405*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: getelementptr 406*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = load 407*9880d681SAndroid Build Coastguard Worker 408*9880d681SAndroid Build Coastguard Worker;;--------------------------------------Test case 07------------------------------------- 409*9880d681SAndroid Build Coastguard Worker;; FIXME: 410*9880d681SAndroid Build Coastguard Worker;; Test for interchange when we have an lcssa phi. This should ideally be interchanged but it is currently not supported. 411*9880d681SAndroid Build Coastguard Worker;; for(gi=1;gi<N;gi++) 412*9880d681SAndroid Build Coastguard Worker;; for(gj=1;gj<M;gj++) 413*9880d681SAndroid Build Coastguard Worker;; A[gj][gi] = A[gj - 1][gi] + C[gj][gi]; 414*9880d681SAndroid Build Coastguard Worker 415*9880d681SAndroid Build Coastguard Worker@gi = common global i32 0 416*9880d681SAndroid Build Coastguard Worker@gj = common global i32 0 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Workerdefine void @interchange_07(i32 %N, i32 %M){ 419*9880d681SAndroid Build Coastguard Workerentry: 420*9880d681SAndroid Build Coastguard Worker store i32 1, i32* @gi 421*9880d681SAndroid Build Coastguard Worker %cmp21 = icmp sgt i32 %N, 1 422*9880d681SAndroid Build Coastguard Worker br i1 %cmp21, label %for.cond1.preheader.lr.ph, label %for.end16 423*9880d681SAndroid Build Coastguard Worker 424*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader.lr.ph: 425*9880d681SAndroid Build Coastguard Worker %cmp218 = icmp sgt i32 %M, 1 426*9880d681SAndroid Build Coastguard Worker %gi.promoted = load i32, i32* @gi 427*9880d681SAndroid Build Coastguard Worker %0 = add i32 %M, -1 428*9880d681SAndroid Build Coastguard Worker %1 = sext i32 %gi.promoted to i64 429*9880d681SAndroid Build Coastguard Worker %2 = sext i32 %N to i64 430*9880d681SAndroid Build Coastguard Worker %3 = add i32 %gi.promoted, 1 431*9880d681SAndroid Build Coastguard Worker %4 = icmp slt i32 %3, %N 432*9880d681SAndroid Build Coastguard Worker %smax = select i1 %4, i32 %N, i32 %3 433*9880d681SAndroid Build Coastguard Worker br label %for.cond1.preheader 434*9880d681SAndroid Build Coastguard Worker 435*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader: 436*9880d681SAndroid Build Coastguard Worker %indvars.iv25 = phi i64 [ %1, %for.cond1.preheader.lr.ph ], [ %indvars.iv.next26, %for.inc14 ] 437*9880d681SAndroid Build Coastguard Worker br i1 %cmp218, label %for.body3, label %for.inc14 438*9880d681SAndroid Build Coastguard Worker 439*9880d681SAndroid Build Coastguard Workerfor.body3: 440*9880d681SAndroid Build Coastguard Worker %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3 ], [ 1, %for.cond1.preheader ] 441*9880d681SAndroid Build Coastguard Worker %5 = add nsw i64 %indvars.iv, -1 442*9880d681SAndroid Build Coastguard Worker %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %5, i64 %indvars.iv25 443*9880d681SAndroid Build Coastguard Worker %6 = load i32, i32* %arrayidx5 444*9880d681SAndroid Build Coastguard Worker %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @C, i64 0, i64 %indvars.iv, i64 %indvars.iv25 445*9880d681SAndroid Build Coastguard Worker %7 = load i32, i32* %arrayidx9 446*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %7, %6 447*9880d681SAndroid Build Coastguard Worker %arrayidx13 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %indvars.iv, i64 %indvars.iv25 448*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %arrayidx13 449*9880d681SAndroid Build Coastguard Worker %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 450*9880d681SAndroid Build Coastguard Worker %lftr.wideiv = trunc i64 %indvars.iv to i32 451*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %lftr.wideiv, %0 452*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.inc14, label %for.body3 453*9880d681SAndroid Build Coastguard Worker 454*9880d681SAndroid Build Coastguard Workerfor.inc14: 455*9880d681SAndroid Build Coastguard Worker %inc.lcssa23 = phi i32 [ 1, %for.cond1.preheader ], [ %M, %for.body3 ] 456*9880d681SAndroid Build Coastguard Worker %indvars.iv.next26 = add nsw i64 %indvars.iv25, 1 457*9880d681SAndroid Build Coastguard Worker %cmp = icmp slt i64 %indvars.iv.next26, %2 458*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %for.cond1.preheader, label %for.cond.for.end16_crit_edge 459*9880d681SAndroid Build Coastguard Worker 460*9880d681SAndroid Build Coastguard Workerfor.cond.for.end16_crit_edge: 461*9880d681SAndroid Build Coastguard Worker store i32 %inc.lcssa23, i32* @gj 462*9880d681SAndroid Build Coastguard Worker store i32 %smax, i32* @gi 463*9880d681SAndroid Build Coastguard Worker br label %for.end16 464*9880d681SAndroid Build Coastguard Worker 465*9880d681SAndroid Build Coastguard Workerfor.end16: 466*9880d681SAndroid Build Coastguard Worker ret void 467*9880d681SAndroid Build Coastguard Worker} 468*9880d681SAndroid Build Coastguard Worker 469*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @interchange_07 470*9880d681SAndroid Build Coastguard Worker; CHECK: for.body3: ; preds = %for.body3.preheader, %for.body3 471*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ %indvars.iv.next, %for.body3 ], [ 1, %for.body3.preheader ] 472*9880d681SAndroid Build Coastguard Worker; CHECK: %5 = add nsw i64 %indvars.iv, -1 473*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx5 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @A, i64 0, i64 %5, i64 %indvars.iv25 474*9880d681SAndroid Build Coastguard Worker; CHECK: %6 = load i32, i32* %arrayidx5 475*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* @C, i64 0, i64 %indvars.iv, i64 %indvars.iv25 476*9880d681SAndroid Build Coastguard Worker 477*9880d681SAndroid Build Coastguard Worker;;------------------------------------------------Test case 08------------------------------- 478*9880d681SAndroid Build Coastguard Worker;; Test for interchange in loop nest greater than 2. 479*9880d681SAndroid Build Coastguard Worker;; for(int i=0;i<100;i++) 480*9880d681SAndroid Build Coastguard Worker;; for(int j=0;j<100;j++) 481*9880d681SAndroid Build Coastguard Worker;; for(int k=0;k<100;k++) 482*9880d681SAndroid Build Coastguard Worker;; D[i][k][j] = D[i][k][j]+t; 483*9880d681SAndroid Build Coastguard Worker 484*9880d681SAndroid Build Coastguard Workerdefine void @interchange_08(i32 %t){ 485*9880d681SAndroid Build Coastguard Workerentry: 486*9880d681SAndroid Build Coastguard Worker br label %for.cond1.preheader 487*9880d681SAndroid Build Coastguard Worker 488*9880d681SAndroid Build Coastguard Workerfor.cond1.preheader: ; preds = %for.inc15, %entry 489*9880d681SAndroid Build Coastguard Worker %i.028 = phi i32 [ 0, %entry ], [ %inc16, %for.inc15 ] 490*9880d681SAndroid Build Coastguard Worker br label %for.cond4.preheader 491*9880d681SAndroid Build Coastguard Worker 492*9880d681SAndroid Build Coastguard Workerfor.cond4.preheader: ; preds = %for.inc12, %for.cond1.preheader 493*9880d681SAndroid Build Coastguard Worker %j.027 = phi i32 [ 0, %for.cond1.preheader ], [ %inc13, %for.inc12 ] 494*9880d681SAndroid Build Coastguard Worker br label %for.body6 495*9880d681SAndroid Build Coastguard Worker 496*9880d681SAndroid Build Coastguard Workerfor.body6: ; preds = %for.body6, %for.cond4.preheader 497*9880d681SAndroid Build Coastguard Worker %k.026 = phi i32 [ 0, %for.cond4.preheader ], [ %inc, %for.body6 ] 498*9880d681SAndroid Build Coastguard Worker %arrayidx8 = getelementptr inbounds [100 x [100 x [100 x i32]]], [100 x [100 x [100 x i32]]]* @D, i32 0, i32 %i.028, i32 %k.026, i32 %j.027 499*9880d681SAndroid Build Coastguard Worker %0 = load i32, i32* %arrayidx8 500*9880d681SAndroid Build Coastguard Worker %add = add nsw i32 %0, %t 501*9880d681SAndroid Build Coastguard Worker store i32 %add, i32* %arrayidx8 502*9880d681SAndroid Build Coastguard Worker %inc = add nuw nsw i32 %k.026, 1 503*9880d681SAndroid Build Coastguard Worker %exitcond = icmp eq i32 %inc, 100 504*9880d681SAndroid Build Coastguard Worker br i1 %exitcond, label %for.inc12, label %for.body6 505*9880d681SAndroid Build Coastguard Worker 506*9880d681SAndroid Build Coastguard Workerfor.inc12: ; preds = %for.body6 507*9880d681SAndroid Build Coastguard Worker %inc13 = add nuw nsw i32 %j.027, 1 508*9880d681SAndroid Build Coastguard Worker %exitcond29 = icmp eq i32 %inc13, 100 509*9880d681SAndroid Build Coastguard Worker br i1 %exitcond29, label %for.inc15, label %for.cond4.preheader 510*9880d681SAndroid Build Coastguard Worker 511*9880d681SAndroid Build Coastguard Workerfor.inc15: ; preds = %for.inc12 512*9880d681SAndroid Build Coastguard Worker %inc16 = add nuw nsw i32 %i.028, 1 513*9880d681SAndroid Build Coastguard Worker %exitcond30 = icmp eq i32 %inc16, 100 514*9880d681SAndroid Build Coastguard Worker br i1 %exitcond30, label %for.end17, label %for.cond1.preheader 515*9880d681SAndroid Build Coastguard Worker 516*9880d681SAndroid Build Coastguard Workerfor.end17: ; preds = %for.inc15 517*9880d681SAndroid Build Coastguard Worker ret void 518*9880d681SAndroid Build Coastguard Worker} 519*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @interchange_08 520*9880d681SAndroid Build Coastguard Worker; CHECK: entry: 521*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond1.preheader.preheader 522*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond1.preheader.preheader: ; preds = %entry 523*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond1.preheader 524*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc15 525*9880d681SAndroid Build Coastguard Worker; CHECK: %i.028 = phi i32 [ %inc16, %for.inc15 ], [ 0, %for.cond1.preheader.preheader ] 526*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body6.preheader 527*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond4.preheader.preheader: ; preds = %for.body6 528*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond4.preheader 529*9880d681SAndroid Build Coastguard Worker; CHECK: for.cond4.preheader: ; preds = %for.cond4.preheader.preheader, %for.inc12 530*9880d681SAndroid Build Coastguard Worker; CHECK: %j.027 = phi i32 [ %inc13, %for.inc12 ], [ 0, %for.cond4.preheader.preheader ] 531*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body6.split1 532*9880d681SAndroid Build Coastguard Worker; CHECK: for.body6.preheader: ; preds = %for.cond1.preheader 533*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.body6 534*9880d681SAndroid Build Coastguard Worker; CHECK: for.body6: ; preds = %for.body6.preheader, %for.body6.split 535*9880d681SAndroid Build Coastguard Worker; CHECK: %k.026 = phi i32 [ %inc, %for.body6.split ], [ 0, %for.body6.preheader ] 536*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.cond4.preheader.preheader 537*9880d681SAndroid Build Coastguard Worker; CHECK: for.body6.split1: ; preds = %for.cond4.preheader 538*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx8 = getelementptr inbounds [100 x [100 x [100 x i32]]], [100 x [100 x [100 x i32]]]* @D, i32 0, i32 %i.028, i32 %k.026, i32 %j.027 539*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = load i32, i32* %arrayidx8 540*9880d681SAndroid Build Coastguard Worker; CHECK: %add = add nsw i32 %0, %t 541*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %add, i32* %arrayidx8 542*9880d681SAndroid Build Coastguard Worker; CHECK: br label %for.inc12 543*9880d681SAndroid Build Coastguard Worker; CHECK: for.body6.split: ; preds = %for.inc12 544*9880d681SAndroid Build Coastguard Worker; CHECK: %inc = add nuw nsw i32 %k.026, 1 545*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i32 %inc, 100 546*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.inc15, label %for.body6 547*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc12: ; preds = %for.body6.split1 548*9880d681SAndroid Build Coastguard Worker; CHECK: %inc13 = add nuw nsw i32 %j.027, 1 549*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond29 = icmp eq i32 %inc13, 100 550*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond29, label %for.body6.split, label %for.cond4.preheader 551*9880d681SAndroid Build Coastguard Worker; CHECK: for.inc15: ; preds = %for.body6.split 552*9880d681SAndroid Build Coastguard Worker; CHECK: %inc16 = add nuw nsw i32 %i.028, 1 553*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond30 = icmp eq i32 %inc16, 100 554*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond30, label %for.end17, label %for.cond1.preheader 555*9880d681SAndroid Build Coastguard Worker; CHECK: for.end17: ; preds = %for.inc15 556*9880d681SAndroid Build Coastguard Worker; CHECK: ret void 557*9880d681SAndroid Build Coastguard Worker 558