blob: 94c93a8a0dd48cc49dddf67d91f0fc41cb1e1410 [file] [log] [blame]
Sebastian Pop59b61b92012-10-11 07:32:34 +00001; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
2
3; ModuleID = 'GCD.bc'
4target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
5target triple = "x86_64-apple-macosx10.6.0"
6
7
8;; for (long int i = 0; i < 100; i++)
9;; for (long int j = 0; j < 100; j++)
10;; A[2*i - 4*j] = ...
11;; ... = A[6*i + 8*j];
12
13define void @gcd0(i32* %A, i32* %B) nounwind uwtable ssp {
14entry:
15 br label %for.cond1.preheader
16
17for.cond1.preheader: ; preds = %entry, %for.inc8
18 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ]
19 %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]
20 br label %for.body3
21
22for.body3: ; preds = %for.cond1.preheader, %for.body3
23 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
24 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
25 %conv = trunc i64 %i.03 to i32
26 %mul = shl nsw i64 %i.03, 1
27 %mul4 = shl nsw i64 %j.02, 2
28 %sub = sub nsw i64 %mul, %mul4
29 %arrayidx = getelementptr inbounds i32* %A, i64 %sub
30 store i32 %conv, i32* %arrayidx, align 4
31 %mul5 = mul nsw i64 %i.03, 6
32 %mul6 = shl nsw i64 %j.02, 3
33 %add = add nsw i64 %mul5, %mul6
34 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add
35 %0 = load i32* %arrayidx7, align 4
36; CHECK: da analyze - flow [=> *|<]!
37 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
38 store i32 %0, i32* %B.addr.11, align 4
39 %inc = add nsw i64 %j.02, 1
40 %exitcond = icmp ne i64 %inc, 100
41 br i1 %exitcond, label %for.body3, label %for.inc8
42
43for.inc8: ; preds = %for.body3
44 %scevgep = getelementptr i32* %B.addr.04, i64 100
45 %inc9 = add nsw i64 %i.03, 1
46 %exitcond5 = icmp ne i64 %inc9, 100
47 br i1 %exitcond5, label %for.cond1.preheader, label %for.end10
48
49for.end10: ; preds = %for.inc8
50 ret void
51}
52
53
54;; for (long int i = 0; i < 100; i++)
55;; for (long int j = 0; j < 100; j++)
56;; A[2*i - 4*j] = ...
57;; ... = A[6*i + 8*j + 1];
58
59define void @gcd1(i32* %A, i32* %B) nounwind uwtable ssp {
60entry:
61 br label %for.cond1.preheader
62
63for.cond1.preheader: ; preds = %entry, %for.inc9
64 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
65 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
66 br label %for.body3
67
68for.body3: ; preds = %for.cond1.preheader, %for.body3
69 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
70 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
71 %conv = trunc i64 %i.03 to i32
72 %mul = shl nsw i64 %i.03, 1
73 %mul4 = shl nsw i64 %j.02, 2
74 %sub = sub nsw i64 %mul, %mul4
75 %arrayidx = getelementptr inbounds i32* %A, i64 %sub
76 store i32 %conv, i32* %arrayidx, align 4
77 %mul5 = mul nsw i64 %i.03, 6
78 %mul6 = shl nsw i64 %j.02, 3
79 %add = add nsw i64 %mul5, %mul6
80 %add7 = or i64 %add, 1
81 %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7
82 %0 = load i32* %arrayidx8, align 4
83; CHECK: da analyze - none!
84 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
85 store i32 %0, i32* %B.addr.11, align 4
86 %inc = add nsw i64 %j.02, 1
87 %exitcond = icmp ne i64 %inc, 100
88 br i1 %exitcond, label %for.body3, label %for.inc9
89
90for.inc9: ; preds = %for.body3
91 %scevgep = getelementptr i32* %B.addr.04, i64 100
92 %inc10 = add nsw i64 %i.03, 1
93 %exitcond5 = icmp ne i64 %inc10, 100
94 br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
95
96for.end11: ; preds = %for.inc9
97 ret void
98}
99
100
101;; for (long int i = 0; i < 100; i++)
102;; for (long int j = 0; j < 100; j++)
103;; A[2*i - 4*j + 1] = ...
104;; ... = A[6*i + 8*j];
105
106define void @gcd2(i32* %A, i32* %B) nounwind uwtable ssp {
107entry:
108 br label %for.cond1.preheader
109
110for.cond1.preheader: ; preds = %entry, %for.inc9
111 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
112 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
113 br label %for.body3
114
115for.body3: ; preds = %for.cond1.preheader, %for.body3
116 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
117 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
118 %conv = trunc i64 %i.03 to i32
119 %mul = shl nsw i64 %i.03, 1
120 %mul4 = shl nsw i64 %j.02, 2
121 %sub = sub nsw i64 %mul, %mul4
122 %add5 = or i64 %sub, 1
123 %arrayidx = getelementptr inbounds i32* %A, i64 %add5
124 store i32 %conv, i32* %arrayidx, align 4
125 %mul5 = mul nsw i64 %i.03, 6
126 %mul6 = shl nsw i64 %j.02, 3
127 %add7 = add nsw i64 %mul5, %mul6
128 %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7
129 %0 = load i32* %arrayidx8, align 4
130; CHECK: da analyze - none!
131 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
132 store i32 %0, i32* %B.addr.11, align 4
133 %inc = add nsw i64 %j.02, 1
134 %exitcond = icmp ne i64 %inc, 100
135 br i1 %exitcond, label %for.body3, label %for.inc9
136
137for.inc9: ; preds = %for.body3
138 %scevgep = getelementptr i32* %B.addr.04, i64 100
139 %inc10 = add nsw i64 %i.03, 1
140 %exitcond6 = icmp ne i64 %inc10, 100
141 br i1 %exitcond6, label %for.cond1.preheader, label %for.end11
142
143for.end11: ; preds = %for.inc9
144 ret void
145}
146
147
148;; for (long int i = 0; i < 100; i++)
149;; for (long int j = 0; j < 100; j++)
150;; A[i + 2*j] = ...
151;; ... = A[i + 2*j - 1];
152
153define void @gcd3(i32* %A, i32* %B) nounwind uwtable ssp {
154entry:
155 br label %for.cond1.preheader
156
157for.cond1.preheader: ; preds = %entry, %for.inc7
158 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc7 ]
159 %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ]
160 br label %for.body3
161
162for.body3: ; preds = %for.cond1.preheader, %for.body3
163 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
164 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
165 %conv = trunc i64 %i.03 to i32
166 %mul = shl nsw i64 %j.02, 1
167 %add = add nsw i64 %i.03, %mul
168 %arrayidx = getelementptr inbounds i32* %A, i64 %add
169 store i32 %conv, i32* %arrayidx, align 4
170 %mul4 = shl nsw i64 %j.02, 1
171 %add5 = add nsw i64 %i.03, %mul4
172 %sub = add nsw i64 %add5, -1
173 %arrayidx6 = getelementptr inbounds i32* %A, i64 %sub
174 %0 = load i32* %arrayidx6, align 4
175; CHECK: da analyze - flow [<> *]!
176 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
177 store i32 %0, i32* %B.addr.11, align 4
178 %inc = add nsw i64 %j.02, 1
179 %exitcond = icmp ne i64 %inc, 100
180 br i1 %exitcond, label %for.body3, label %for.inc7
181
182for.inc7: ; preds = %for.body3
183 %scevgep = getelementptr i32* %B.addr.04, i64 100
184 %inc8 = add nsw i64 %i.03, 1
185 %exitcond5 = icmp ne i64 %inc8, 100
186 br i1 %exitcond5, label %for.cond1.preheader, label %for.end9
187
188for.end9: ; preds = %for.inc7
189 ret void
190}
191
192
193;; void gcd4(int *A, int *B, long int M, long int N) {
194;; for (long int i = 0; i < 100; i++)
195;; for (long int j = 0; j < 100; j++) {
196;; A[5*i + 10*j*M + 9*M*N] = i;
197;; *B++ = A[15*i + 20*j*M - 21*N*M + 4];
198
199define void @gcd4(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
200entry:
201 br label %for.cond1.preheader
202
203for.cond1.preheader: ; preds = %entry, %for.inc17
204 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
205 %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
206 br label %for.body3
207
208for.body3: ; preds = %for.cond1.preheader, %for.body3
209 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
210 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
211 %conv = trunc i64 %i.03 to i32
212 %mul = mul nsw i64 %i.03, 5
213 %mul4 = mul nsw i64 %j.02, 10
214 %mul5 = mul nsw i64 %mul4, %M
215 %add = add nsw i64 %mul, %mul5
216 %mul6 = mul nsw i64 %M, 9
217 %mul7 = mul nsw i64 %mul6, %N
218 %add8 = add nsw i64 %add, %mul7
219 %arrayidx = getelementptr inbounds i32* %A, i64 %add8
220 store i32 %conv, i32* %arrayidx, align 4
221 %mul9 = mul nsw i64 %i.03, 15
222 %mul10 = mul nsw i64 %j.02, 20
223 %mul11 = mul nsw i64 %mul10, %M
224 %add12 = add nsw i64 %mul9, %mul11
225 %mul13 = mul nsw i64 %N, 21
226 %mul14 = mul nsw i64 %mul13, %M
227 %sub = sub nsw i64 %add12, %mul14
228 %add15 = add nsw i64 %sub, 4
229 %arrayidx16 = getelementptr inbounds i32* %A, i64 %add15
230 %0 = load i32* %arrayidx16, align 4
231; CHECK: da analyze - none!
232 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
233 store i32 %0, i32* %B.addr.11, align 4
234 %inc = add nsw i64 %j.02, 1
235 %exitcond = icmp ne i64 %inc, 100
236 br i1 %exitcond, label %for.body3, label %for.inc17
237
238for.inc17: ; preds = %for.body3
239 %scevgep = getelementptr i32* %B.addr.04, i64 100
240 %inc18 = add nsw i64 %i.03, 1
241 %exitcond5 = icmp ne i64 %inc18, 100
242 br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
243
244for.end19: ; preds = %for.inc17
245 ret void
246}
247
248
249;; void gcd5(int *A, int *B, long int M, long int N) {
250;; for (long int i = 0; i < 100; i++)
251;; for (long int j = 0; j < 100; j++) {
252;; A[5*i + 10*j*M + 9*M*N] = i;
253;; *B++ = A[15*i + 20*j*M - 21*N*M + 5];
254
255define void @gcd5(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
256entry:
257 br label %for.cond1.preheader
258
259for.cond1.preheader: ; preds = %entry, %for.inc17
260 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
261 %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
262 br label %for.body3
263
264for.body3: ; preds = %for.cond1.preheader, %for.body3
265 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
266 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
267 %conv = trunc i64 %i.03 to i32
268 %mul = mul nsw i64 %i.03, 5
269 %mul4 = mul nsw i64 %j.02, 10
270 %mul5 = mul nsw i64 %mul4, %M
271 %add = add nsw i64 %mul, %mul5
272 %mul6 = mul nsw i64 %M, 9
273 %mul7 = mul nsw i64 %mul6, %N
274 %add8 = add nsw i64 %add, %mul7
275 %arrayidx = getelementptr inbounds i32* %A, i64 %add8
276 store i32 %conv, i32* %arrayidx, align 4
277 %mul9 = mul nsw i64 %i.03, 15
278 %mul10 = mul nsw i64 %j.02, 20
279 %mul11 = mul nsw i64 %mul10, %M
280 %add12 = add nsw i64 %mul9, %mul11
281 %mul13 = mul nsw i64 %N, 21
282 %mul14 = mul nsw i64 %mul13, %M
283 %sub = sub nsw i64 %add12, %mul14
284 %add15 = add nsw i64 %sub, 5
285 %arrayidx16 = getelementptr inbounds i32* %A, i64 %add15
286 %0 = load i32* %arrayidx16, align 4
287; CHECK: da analyze - flow [<> *]!
288 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
289 store i32 %0, i32* %B.addr.11, align 4
290 %inc = add nsw i64 %j.02, 1
291 %exitcond = icmp ne i64 %inc, 100
292 br i1 %exitcond, label %for.body3, label %for.inc17
293
294for.inc17: ; preds = %for.body3
295 %scevgep = getelementptr i32* %B.addr.04, i64 100
296 %inc18 = add nsw i64 %i.03, 1
297 %exitcond5 = icmp ne i64 %inc18, 100
298 br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
299
300for.end19: ; preds = %for.inc17
301 ret void
302}
303
304
305;; void gcd6(long int n, int A[][n], int *B) {
306;; for (long int i = 0; i < n; i++)
307;; for (long int j = 0; j < n; j++) {
308;; A[2*i][4*j] = i;
309;; *B++ = A[8*i][6*j + 1];
310
311define void @gcd6(i64 %n, i32* %A, i32* %B) nounwind uwtable ssp {
312entry:
313 %cmp4 = icmp sgt i64 %n, 0
314 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end12
315
316for.cond1.preheader.preheader: ; preds = %entry
317 br label %for.cond1.preheader
318
319for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc10
320 %i.06 = phi i64 [ %inc11, %for.inc10 ], [ 0, %for.cond1.preheader.preheader ]
321 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc10 ], [ %B, %for.cond1.preheader.preheader ]
322 %cmp21 = icmp sgt i64 %n, 0
323 br i1 %cmp21, label %for.body3.preheader, label %for.inc10
324
325for.body3.preheader: ; preds = %for.cond1.preheader
326 br label %for.body3
327
328for.body3: ; preds = %for.body3.preheader, %for.body3
329 %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]
330 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
331 %conv = trunc i64 %i.06 to i32
332 %mul = shl nsw i64 %j.03, 2
333 %mul4 = shl nsw i64 %i.06, 1
334 %0 = mul nsw i64 %mul4, %n
335 %arrayidx.sum = add i64 %0, %mul
336 %arrayidx5 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
337 store i32 %conv, i32* %arrayidx5, align 4
338 %mul6 = mul nsw i64 %j.03, 6
339 %add7 = or i64 %mul6, 1
340 %mul7 = shl nsw i64 %i.06, 3
341 %1 = mul nsw i64 %mul7, %n
342 %arrayidx8.sum = add i64 %1, %add7
343 %arrayidx9 = getelementptr inbounds i32* %A, i64 %arrayidx8.sum
344 %2 = load i32* %arrayidx9, align 4
345; CHECK: da analyze - none!
346 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
347 store i32 %2, i32* %B.addr.12, align 4
348 %inc = add nsw i64 %j.03, 1
349 %exitcond = icmp ne i64 %inc, %n
350 br i1 %exitcond, label %for.body3, label %for.inc10.loopexit
351
352for.inc10.loopexit: ; preds = %for.body3
353 %scevgep = getelementptr i32* %B.addr.05, i64 %n
354 br label %for.inc10
355
356for.inc10: ; preds = %for.inc10.loopexit, %for.cond1.preheader
357 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc10.loopexit ]
358 %inc11 = add nsw i64 %i.06, 1
359 %exitcond8 = icmp ne i64 %inc11, %n
360 br i1 %exitcond8, label %for.cond1.preheader, label %for.end12.loopexit
361
362for.end12.loopexit: ; preds = %for.inc10
363 br label %for.end12
364
365for.end12: ; preds = %for.end12.loopexit, %entry
366 ret void
367}
368
369
370;; void gcd7(int n, int A[][n], int *B) {
371;; for (int i = 0; i < n; i++)
372;; for (int j = 0; j < n; j++) {
373;; A[2*i][4*j] = i;
374;; *B++ = A[8*i][6*j + 1];
375
376define void @gcd7(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
377entry:
378 %0 = zext i32 %n to i64
379 %cmp4 = icmp sgt i32 %n, 0
380 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
381
382for.cond1.preheader.preheader: ; preds = %entry
383 br label %for.cond1.preheader
384
385for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
386 %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
387 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
388 %1 = add i32 %n, -1
389 %2 = zext i32 %1 to i64
390 %3 = add i64 %2, 1
391 %cmp21 = icmp sgt i32 %n, 0
392 br i1 %cmp21, label %for.body3.preheader, label %for.inc13
393
394for.body3.preheader: ; preds = %for.cond1.preheader
395 br label %for.body3
396
397for.body3: ; preds = %for.body3.preheader, %for.body3
398 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
399 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
400 %4 = trunc i64 %indvars.iv to i32
401 %mul = shl nsw i32 %4, 2
402 %idxprom = sext i32 %mul to i64
403 %5 = trunc i64 %indvars.iv8 to i32
404 %mul4 = shl nsw i32 %5, 1
405 %idxprom5 = sext i32 %mul4 to i64
406 %6 = mul nsw i64 %idxprom5, %0
407 %arrayidx.sum = add i64 %6, %idxprom
408 %arrayidx6 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
409 %7 = trunc i64 %indvars.iv8 to i32
410 store i32 %7, i32* %arrayidx6, align 4
411 %8 = trunc i64 %indvars.iv to i32
412 %mul7 = mul nsw i32 %8, 6
413 %add7 = or i32 %mul7, 1
414 %idxprom8 = sext i32 %add7 to i64
415 %9 = trunc i64 %indvars.iv8 to i32
416 %mul9 = shl nsw i32 %9, 3
417 %idxprom10 = sext i32 %mul9 to i64
418 %10 = mul nsw i64 %idxprom10, %0
419 %arrayidx11.sum = add i64 %10, %idxprom8
420 %arrayidx12 = getelementptr inbounds i32* %A, i64 %arrayidx11.sum
421 %11 = load i32* %arrayidx12, align 4
422; CHECK: da analyze - flow [* *|<]!
423 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
424 store i32 %11, i32* %B.addr.12, align 4
425 %indvars.iv.next = add i64 %indvars.iv, 1
426 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
427 %exitcond = icmp ne i32 %lftr.wideiv, %n
428 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
429
430for.inc13.loopexit: ; preds = %for.body3
431 %scevgep = getelementptr i32* %B.addr.05, i64 %3
432 br label %for.inc13
433
434for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
435 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
436 %indvars.iv.next9 = add i64 %indvars.iv8, 1
437 %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
438 %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
439 br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
440
441for.end15.loopexit: ; preds = %for.inc13
442 br label %for.end15
443
444for.end15: ; preds = %for.end15.loopexit, %entry
445 ret void
446}
447
448
449;; void gcd8(int n, int *A, int *B) {
450;; for (int i = 0; i < n; i++)
451;; for (int j = 0; j < n; j++) {
452;; A[n*2*i + 4*j] = i;
453;; *B++ = A[n*8*i + 6*j + 1];
454
455define void @gcd8(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
456entry:
457 %cmp4 = icmp sgt i32 %n, 0
458 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
459
460for.cond1.preheader.preheader: ; preds = %entry
461 br label %for.cond1.preheader
462
463for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
464 %i.06 = phi i32 [ %inc14, %for.inc13 ], [ 0, %for.cond1.preheader.preheader ]
465 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
466 %0 = add i32 %n, -1
467 %1 = zext i32 %0 to i64
468 %2 = add i64 %1, 1
469 %cmp21 = icmp sgt i32 %n, 0
470 br i1 %cmp21, label %for.body3.preheader, label %for.inc13
471
472for.body3.preheader: ; preds = %for.cond1.preheader
473 br label %for.body3
474
475for.body3: ; preds = %for.body3.preheader, %for.body3
476 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
477 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
478 %mul = shl nsw i32 %n, 1
479 %mul4 = mul nsw i32 %mul, %i.06
480 %3 = trunc i64 %indvars.iv to i32
481 %mul5 = shl nsw i32 %3, 2
482 %add = add nsw i32 %mul4, %mul5
483 %idxprom = sext i32 %add to i64
484 %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom
485 store i32 %i.06, i32* %arrayidx, align 4
486 %mul6 = shl nsw i32 %n, 3
487 %mul7 = mul nsw i32 %mul6, %i.06
488 %4 = trunc i64 %indvars.iv to i32
489 %mul8 = mul nsw i32 %4, 6
490 %add9 = add nsw i32 %mul7, %mul8
491 %add10 = or i32 %add9, 1
492 %idxprom11 = sext i32 %add10 to i64
493 %arrayidx12 = getelementptr inbounds i32* %A, i64 %idxprom11
494 %5 = load i32* %arrayidx12, align 4
495; CHECK: da analyze - none!
496 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
497 store i32 %5, i32* %B.addr.12, align 4
498 %indvars.iv.next = add i64 %indvars.iv, 1
499 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
500 %exitcond = icmp ne i32 %lftr.wideiv, %n
501 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
502
503for.inc13.loopexit: ; preds = %for.body3
504 %scevgep = getelementptr i32* %B.addr.05, i64 %2
505 br label %for.inc13
506
507for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
508 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
509 %inc14 = add nsw i32 %i.06, 1
510 %exitcond7 = icmp ne i32 %inc14, %n
511 br i1 %exitcond7, label %for.cond1.preheader, label %for.end15.loopexit
512
513for.end15.loopexit: ; preds = %for.inc13
514 br label %for.end15
515
516for.end15: ; preds = %for.end15.loopexit, %entry
517 ret void
518}
519
520
521;; void gcd9(unsigned n, int A[][n], int *B) {
522;; for (unsigned i = 0; i < n; i++)
523;; for (unsigned j = 0; j < n; j++) {
524;; A[2*i][4*j] = i;
525;; *B++ = A[8*i][6*j + 1];
526
527define void @gcd9(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
528entry:
529 %0 = zext i32 %n to i64
530 %cmp4 = icmp eq i32 %n, 0
531 br i1 %cmp4, label %for.end15, label %for.cond1.preheader.preheader
532
533for.cond1.preheader.preheader: ; preds = %entry
534 br label %for.cond1.preheader
535
536for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
537 %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
538 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
539 %1 = add i32 %n, -1
540 %2 = zext i32 %1 to i64
541 %3 = add i64 %2, 1
542 %cmp21 = icmp eq i32 %n, 0
543 br i1 %cmp21, label %for.inc13, label %for.body3.preheader
544
545for.body3.preheader: ; preds = %for.cond1.preheader
546 br label %for.body3
547
548for.body3: ; preds = %for.body3.preheader, %for.body3
549 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
550 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
551 %4 = trunc i64 %indvars.iv to i32
552 %mul = shl i32 %4, 2
553 %idxprom = zext i32 %mul to i64
554 %5 = trunc i64 %indvars.iv8 to i32
555 %mul4 = shl i32 %5, 1
556 %idxprom5 = zext i32 %mul4 to i64
557 %6 = mul nsw i64 %idxprom5, %0
558 %arrayidx.sum = add i64 %6, %idxprom
559 %arrayidx6 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
560 %7 = trunc i64 %indvars.iv8 to i32
561 store i32 %7, i32* %arrayidx6, align 4
562 %8 = trunc i64 %indvars.iv to i32
563 %mul7 = mul i32 %8, 6
564 %add7 = or i32 %mul7, 1
565 %idxprom8 = zext i32 %add7 to i64
566 %9 = trunc i64 %indvars.iv8 to i32
567 %mul9 = shl i32 %9, 3
568 %idxprom10 = zext i32 %mul9 to i64
569 %10 = mul nsw i64 %idxprom10, %0
570 %arrayidx11.sum = add i64 %10, %idxprom8
571 %arrayidx12 = getelementptr inbounds i32* %A, i64 %arrayidx11.sum
572 %11 = load i32* %arrayidx12, align 4
573; CHECK: da analyze - flow [* *|<]!
574 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
575 store i32 %11, i32* %B.addr.12, align 4
576 %indvars.iv.next = add i64 %indvars.iv, 1
577 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
578 %exitcond = icmp ne i32 %lftr.wideiv, %n
579 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
580
581for.inc13.loopexit: ; preds = %for.body3
582 %scevgep = getelementptr i32* %B.addr.05, i64 %3
583 br label %for.inc13
584
585for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
586 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
587 %indvars.iv.next9 = add i64 %indvars.iv8, 1
588 %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
589 %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
590 br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
591
592for.end15.loopexit: ; preds = %for.inc13
593 br label %for.end15
594
595for.end15: ; preds = %for.end15.loopexit, %entry
596 ret void
597}