xref: /aosp_15_r20/external/llvm/test/Transforms/LoopInterchange/interchange.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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