1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
4 target 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"
5 target triple = "x86_64-apple-macosx10.6.0"
8 ;; for (long int i = 0; i < 100; i++)
9 ;; for (long int j = 0; j < 100; j++) {
11 ;; *B++ = A[6*i + 8*j];
13 define void @gcd0(i32* %A, i32* %B) nounwind uwtable ssp {
15 br label %for.cond1.preheader
17 ; CHECK: da analyze - output [* *]!
18 ; CHECK: da analyze - flow [=> *|<]!
19 ; CHECK: da analyze - confused!
20 ; CHECK: da analyze - input [* *]!
21 ; CHECK: da analyze - confused!
22 ; CHECK: da analyze - output [= =]!
24 for.cond1.preheader: ; preds = %entry, %for.inc8
25 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ]
26 %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]
29 for.body3: ; preds = %for.cond1.preheader, %for.body3
30 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
31 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
32 %conv = trunc i64 %i.03 to i32
33 %mul = shl nsw i64 %i.03, 1
34 %mul4 = shl nsw i64 %j.02, 2
35 %sub = sub nsw i64 %mul, %mul4
36 %arrayidx = getelementptr inbounds i32* %A, i64 %sub
37 store i32 %conv, i32* %arrayidx, align 4
38 %mul5 = mul nsw i64 %i.03, 6
39 %mul6 = shl nsw i64 %j.02, 3
40 %add = add nsw i64 %mul5, %mul6
41 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add
42 %0 = load i32* %arrayidx7, align 4
43 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
44 store i32 %0, i32* %B.addr.11, align 4
45 %inc = add nsw i64 %j.02, 1
46 %exitcond = icmp ne i64 %inc, 100
47 br i1 %exitcond, label %for.body3, label %for.inc8
49 for.inc8: ; preds = %for.body3
50 %scevgep = getelementptr i32* %B.addr.04, i64 100
51 %inc9 = add nsw i64 %i.03, 1
52 %exitcond5 = icmp ne i64 %inc9, 100
53 br i1 %exitcond5, label %for.cond1.preheader, label %for.end10
55 for.end10: ; preds = %for.inc8
60 ;; for (long int i = 0; i < 100; i++)
61 ;; for (long int j = 0; j < 100; j++) {
63 ;; *B++ = A[6*i + 8*j + 1];
65 define void @gcd1(i32* %A, i32* %B) nounwind uwtable ssp {
67 br label %for.cond1.preheader
69 ; CHECK: da analyze - output [* *]!
70 ; CHECK: da analyze - none!
71 ; CHECK: da analyze - confused!
72 ; CHECK: da analyze - input [* *]!
73 ; CHECK: da analyze - confused!
74 ; CHECK: da analyze - output [= =]!
76 for.cond1.preheader: ; preds = %entry, %for.inc9
77 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
78 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
81 for.body3: ; preds = %for.cond1.preheader, %for.body3
82 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
83 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
84 %conv = trunc i64 %i.03 to i32
85 %mul = shl nsw i64 %i.03, 1
86 %mul4 = shl nsw i64 %j.02, 2
87 %sub = sub nsw i64 %mul, %mul4
88 %arrayidx = getelementptr inbounds i32* %A, i64 %sub
89 store i32 %conv, i32* %arrayidx, align 4
90 %mul5 = mul nsw i64 %i.03, 6
91 %mul6 = shl nsw i64 %j.02, 3
92 %add = add nsw i64 %mul5, %mul6
93 %add7 = or i64 %add, 1
94 %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7
95 %0 = load i32* %arrayidx8, align 4
96 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
97 store i32 %0, i32* %B.addr.11, align 4
98 %inc = add nsw i64 %j.02, 1
99 %exitcond = icmp ne i64 %inc, 100
100 br i1 %exitcond, label %for.body3, label %for.inc9
102 for.inc9: ; preds = %for.body3
103 %scevgep = getelementptr i32* %B.addr.04, i64 100
104 %inc10 = add nsw i64 %i.03, 1
105 %exitcond5 = icmp ne i64 %inc10, 100
106 br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
108 for.end11: ; preds = %for.inc9
113 ;; for (long int i = 0; i < 100; i++)
114 ;; for (long int j = 0; j < 100; j++) {
115 ;; A[2*i - 4*j + 1] = i;
116 ;; *B++ = A[6*i + 8*j];
118 define void @gcd2(i32* %A, i32* %B) nounwind uwtable ssp {
120 br label %for.cond1.preheader
122 ; CHECK: da analyze - output [* *]!
123 ; CHECK: da analyze - none!
124 ; CHECK: da analyze - confused!
125 ; CHECK: da analyze - input [* *]!
126 ; CHECK: da analyze - confused!
127 ; CHECK: da analyze - output [= =]!
129 for.cond1.preheader: ; preds = %entry, %for.inc9
130 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
131 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
134 for.body3: ; preds = %for.cond1.preheader, %for.body3
135 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
136 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
137 %conv = trunc i64 %i.03 to i32
138 %mul = shl nsw i64 %i.03, 1
139 %mul4 = shl nsw i64 %j.02, 2
140 %sub = sub nsw i64 %mul, %mul4
141 %add5 = or i64 %sub, 1
142 %arrayidx = getelementptr inbounds i32* %A, i64 %add5
143 store i32 %conv, i32* %arrayidx, align 4
144 %mul5 = mul nsw i64 %i.03, 6
145 %mul6 = shl nsw i64 %j.02, 3
146 %add7 = add nsw i64 %mul5, %mul6
147 %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7
148 %0 = load i32* %arrayidx8, align 4
149 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
150 store i32 %0, i32* %B.addr.11, align 4
151 %inc = add nsw i64 %j.02, 1
152 %exitcond = icmp ne i64 %inc, 100
153 br i1 %exitcond, label %for.body3, label %for.inc9
155 for.inc9: ; preds = %for.body3
156 %scevgep = getelementptr i32* %B.addr.04, i64 100
157 %inc10 = add nsw i64 %i.03, 1
158 %exitcond6 = icmp ne i64 %inc10, 100
159 br i1 %exitcond6, label %for.cond1.preheader, label %for.end11
161 for.end11: ; preds = %for.inc9
166 ;; for (long int i = 0; i < 100; i++)
167 ;; for (long int j = 0; j < 100; j++) {
169 ;; *B++ = A[i + 2*j - 1];
171 define void @gcd3(i32* %A, i32* %B) nounwind uwtable ssp {
173 br label %for.cond1.preheader
175 ; CHECK: da analyze - output [* *]!
176 ; CHECK: da analyze - flow [<> *]!
177 ; CHECK: da analyze - confused!
178 ; CHECK: da analyze - input [* *]!
179 ; CHECK: da analyze - confused!
180 ; CHECK: da analyze - output [= =]!
182 for.cond1.preheader: ; preds = %entry, %for.inc7
183 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc7 ]
184 %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ]
187 for.body3: ; preds = %for.cond1.preheader, %for.body3
188 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
189 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
190 %conv = trunc i64 %i.03 to i32
191 %mul = shl nsw i64 %j.02, 1
192 %add = add nsw i64 %i.03, %mul
193 %arrayidx = getelementptr inbounds i32* %A, i64 %add
194 store i32 %conv, i32* %arrayidx, align 4
195 %mul4 = shl nsw i64 %j.02, 1
196 %add5 = add nsw i64 %i.03, %mul4
197 %sub = add nsw i64 %add5, -1
198 %arrayidx6 = getelementptr inbounds i32* %A, i64 %sub
199 %0 = load i32* %arrayidx6, align 4
200 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
201 store i32 %0, i32* %B.addr.11, align 4
202 %inc = add nsw i64 %j.02, 1
203 %exitcond = icmp ne i64 %inc, 100
204 br i1 %exitcond, label %for.body3, label %for.inc7
206 for.inc7: ; preds = %for.body3
207 %scevgep = getelementptr i32* %B.addr.04, i64 100
208 %inc8 = add nsw i64 %i.03, 1
209 %exitcond5 = icmp ne i64 %inc8, 100
210 br i1 %exitcond5, label %for.cond1.preheader, label %for.end9
212 for.end9: ; preds = %for.inc7
217 ;; for (long int i = 0; i < 100; i++)
218 ;; for (long int j = 0; j < 100; j++) {
219 ;; A[5*i + 10*j*M + 9*M*N] = i;
220 ;; *B++ = A[15*i + 20*j*M - 21*N*M + 4];
222 define void @gcd4(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
224 br label %for.cond1.preheader
226 ; CHECK: da analyze - output [* *]!
227 ; CHECK: da analyze - none!
228 ; CHECK: da analyze - confused!
229 ; CHECK: da analyze - input [* *]!
230 ; CHECK: da analyze - confused!
231 ; CHECK: da analyze - output [= =]!
233 for.cond1.preheader: ; preds = %entry, %for.inc17
234 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
235 %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
238 for.body3: ; preds = %for.cond1.preheader, %for.body3
239 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
240 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
241 %conv = trunc i64 %i.03 to i32
242 %mul = mul nsw i64 %i.03, 5
243 %mul4 = mul nsw i64 %j.02, 10
244 %mul5 = mul nsw i64 %mul4, %M
245 %add = add nsw i64 %mul, %mul5
246 %mul6 = mul nsw i64 %M, 9
247 %mul7 = mul nsw i64 %mul6, %N
248 %add8 = add nsw i64 %add, %mul7
249 %arrayidx = getelementptr inbounds i32* %A, i64 %add8
250 store i32 %conv, i32* %arrayidx, align 4
251 %mul9 = mul nsw i64 %i.03, 15
252 %mul10 = mul nsw i64 %j.02, 20
253 %mul11 = mul nsw i64 %mul10, %M
254 %add12 = add nsw i64 %mul9, %mul11
255 %mul13 = mul nsw i64 %N, 21
256 %mul14 = mul nsw i64 %mul13, %M
257 %sub = sub nsw i64 %add12, %mul14
258 %add15 = add nsw i64 %sub, 4
259 %arrayidx16 = getelementptr inbounds i32* %A, i64 %add15
260 %0 = load i32* %arrayidx16, align 4
261 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
262 store i32 %0, i32* %B.addr.11, align 4
263 %inc = add nsw i64 %j.02, 1
264 %exitcond = icmp ne i64 %inc, 100
265 br i1 %exitcond, label %for.body3, label %for.inc17
267 for.inc17: ; preds = %for.body3
268 %scevgep = getelementptr i32* %B.addr.04, i64 100
269 %inc18 = add nsw i64 %i.03, 1
270 %exitcond5 = icmp ne i64 %inc18, 100
271 br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
273 for.end19: ; preds = %for.inc17
278 ;; for (long int i = 0; i < 100; i++)
279 ;; for (long int j = 0; j < 100; j++) {
280 ;; A[5*i + 10*j*M + 9*M*N] = i;
281 ;; *B++ = A[15*i + 20*j*M - 21*N*M + 5];
283 define void @gcd5(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
285 br label %for.cond1.preheader
287 ; CHECK: da analyze - output [* *]!
288 ; CHECK: da analyze - flow [<> *]!
289 ; CHECK: da analyze - confused!
290 ; CHECK: da analyze - input [* *]!
291 ; CHECK: da analyze - confused!
292 ; CHECK: da analyze - output [= =]!
294 for.cond1.preheader: ; preds = %entry, %for.inc17
295 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
296 %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
299 for.body3: ; preds = %for.cond1.preheader, %for.body3
300 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
301 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
302 %conv = trunc i64 %i.03 to i32
303 %mul = mul nsw i64 %i.03, 5
304 %mul4 = mul nsw i64 %j.02, 10
305 %mul5 = mul nsw i64 %mul4, %M
306 %add = add nsw i64 %mul, %mul5
307 %mul6 = mul nsw i64 %M, 9
308 %mul7 = mul nsw i64 %mul6, %N
309 %add8 = add nsw i64 %add, %mul7
310 %arrayidx = getelementptr inbounds i32* %A, i64 %add8
311 store i32 %conv, i32* %arrayidx, align 4
312 %mul9 = mul nsw i64 %i.03, 15
313 %mul10 = mul nsw i64 %j.02, 20
314 %mul11 = mul nsw i64 %mul10, %M
315 %add12 = add nsw i64 %mul9, %mul11
316 %mul13 = mul nsw i64 %N, 21
317 %mul14 = mul nsw i64 %mul13, %M
318 %sub = sub nsw i64 %add12, %mul14
319 %add15 = add nsw i64 %sub, 5
320 %arrayidx16 = getelementptr inbounds i32* %A, i64 %add15
321 %0 = load i32* %arrayidx16, align 4
322 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
323 store i32 %0, i32* %B.addr.11, align 4
324 %inc = add nsw i64 %j.02, 1
325 %exitcond = icmp ne i64 %inc, 100
326 br i1 %exitcond, label %for.body3, label %for.inc17
328 for.inc17: ; preds = %for.body3
329 %scevgep = getelementptr i32* %B.addr.04, i64 100
330 %inc18 = add nsw i64 %i.03, 1
331 %exitcond5 = icmp ne i64 %inc18, 100
332 br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
334 for.end19: ; preds = %for.inc17
339 ;; for (long int i = 0; i < n; i++)
340 ;; for (long int j = 0; j < n; j++) {
342 ;; *B++ = A[8*i][6*j + 1];
344 define void @gcd6(i64 %n, i32* %A, i32* %B) nounwind uwtable ssp {
346 %cmp4 = icmp sgt i64 %n, 0
347 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end12
349 ; CHECK: da analyze - output [* *]!
350 ; CHECK: da analyze - none!
351 ; CHECK: da analyze - confused!
352 ; CHECK: da analyze - input [* *]!
353 ; CHECK: da analyze - confused!
354 ; CHECK: da analyze - output [* *]!
356 for.cond1.preheader.preheader: ; preds = %entry
357 br label %for.cond1.preheader
359 for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc10
360 %i.06 = phi i64 [ %inc11, %for.inc10 ], [ 0, %for.cond1.preheader.preheader ]
361 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc10 ], [ %B, %for.cond1.preheader.preheader ]
362 %cmp21 = icmp sgt i64 %n, 0
363 br i1 %cmp21, label %for.body3.preheader, label %for.inc10
365 for.body3.preheader: ; preds = %for.cond1.preheader
368 for.body3: ; preds = %for.body3.preheader, %for.body3
369 %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]
370 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
371 %conv = trunc i64 %i.06 to i32
372 %mul = shl nsw i64 %j.03, 2
373 %mul4 = shl nsw i64 %i.06, 1
374 %0 = mul nsw i64 %mul4, %n
375 %arrayidx.sum = add i64 %0, %mul
376 %arrayidx5 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
377 store i32 %conv, i32* %arrayidx5, align 4
378 %mul6 = mul nsw i64 %j.03, 6
379 %add7 = or i64 %mul6, 1
380 %mul7 = shl nsw i64 %i.06, 3
381 %1 = mul nsw i64 %mul7, %n
382 %arrayidx8.sum = add i64 %1, %add7
383 %arrayidx9 = getelementptr inbounds i32* %A, i64 %arrayidx8.sum
384 %2 = load i32* %arrayidx9, align 4
385 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
386 store i32 %2, i32* %B.addr.12, align 4
387 %inc = add nsw i64 %j.03, 1
388 %exitcond = icmp ne i64 %inc, %n
389 br i1 %exitcond, label %for.body3, label %for.inc10.loopexit
391 for.inc10.loopexit: ; preds = %for.body3
392 %scevgep = getelementptr i32* %B.addr.05, i64 %n
395 for.inc10: ; preds = %for.inc10.loopexit, %for.cond1.preheader
396 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc10.loopexit ]
397 %inc11 = add nsw i64 %i.06, 1
398 %exitcond8 = icmp ne i64 %inc11, %n
399 br i1 %exitcond8, label %for.cond1.preheader, label %for.end12.loopexit
401 for.end12.loopexit: ; preds = %for.inc10
404 for.end12: ; preds = %for.end12.loopexit, %entry
409 ;; for (int i = 0; i < n; i++)
410 ;; for (int j = 0; j < n; j++) {
412 ;; *B++ = A[8*i][6*j + 1];
414 define void @gcd7(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
416 %0 = zext i32 %n to i64
417 %cmp4 = icmp sgt i32 %n, 0
418 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
420 ; CHECK: da analyze - output [* *]!
421 ; CHECK: da analyze - flow [* *|<]!
422 ; CHECK: da analyze - confused!
423 ; CHECK: da analyze - input [* *]!
424 ; CHECK: da analyze - confused!
425 ; CHECK: da analyze - output [* *]!
427 for.cond1.preheader.preheader: ; preds = %entry
428 br label %for.cond1.preheader
430 for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
431 %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
432 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
434 %2 = zext i32 %1 to i64
436 %cmp21 = icmp sgt i32 %n, 0
437 br i1 %cmp21, label %for.body3.preheader, label %for.inc13
439 for.body3.preheader: ; preds = %for.cond1.preheader
442 for.body3: ; preds = %for.body3.preheader, %for.body3
443 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
444 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
445 %4 = trunc i64 %indvars.iv to i32
446 %mul = shl nsw i32 %4, 2
447 %idxprom = sext i32 %mul to i64
448 %5 = trunc i64 %indvars.iv8 to i32
449 %mul4 = shl nsw i32 %5, 1
450 %idxprom5 = sext i32 %mul4 to i64
451 %6 = mul nsw i64 %idxprom5, %0
452 %arrayidx.sum = add i64 %6, %idxprom
453 %arrayidx6 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
454 %7 = trunc i64 %indvars.iv8 to i32
455 store i32 %7, i32* %arrayidx6, align 4
456 %8 = trunc i64 %indvars.iv to i32
457 %mul7 = mul nsw i32 %8, 6
458 %add7 = or i32 %mul7, 1
459 %idxprom8 = sext i32 %add7 to i64
460 %9 = trunc i64 %indvars.iv8 to i32
461 %mul9 = shl nsw i32 %9, 3
462 %idxprom10 = sext i32 %mul9 to i64
463 %10 = mul nsw i64 %idxprom10, %0
464 %arrayidx11.sum = add i64 %10, %idxprom8
465 %arrayidx12 = getelementptr inbounds i32* %A, i64 %arrayidx11.sum
466 %11 = load i32* %arrayidx12, align 4
467 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
468 store i32 %11, i32* %B.addr.12, align 4
469 %indvars.iv.next = add i64 %indvars.iv, 1
470 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
471 %exitcond = icmp ne i32 %lftr.wideiv, %n
472 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
474 for.inc13.loopexit: ; preds = %for.body3
475 %scevgep = getelementptr i32* %B.addr.05, i64 %3
478 for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
479 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
480 %indvars.iv.next9 = add i64 %indvars.iv8, 1
481 %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
482 %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
483 br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
485 for.end15.loopexit: ; preds = %for.inc13
488 for.end15: ; preds = %for.end15.loopexit, %entry
493 ;; for (int i = 0; i < n; i++)
494 ;; for (int j = 0; j < n; j++) {
495 ;; A[n*2*i + 4*j] = i;
496 ;; *B++ = A[n*8*i + 6*j + 1];
498 define void @gcd8(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
500 %cmp4 = icmp sgt i32 %n, 0
501 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
503 ; CHECK: da analyze - output [* *]!
504 ; CHECK: da analyze - none!
505 ; CHECK: da analyze - confused!
506 ; CHECK: da analyze - input [* *]!
507 ; CHECK: da analyze - confused!
508 ; CHECK: da analyze - output [* *]!
510 for.cond1.preheader.preheader: ; preds = %entry
511 br label %for.cond1.preheader
513 for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
514 %i.06 = phi i32 [ %inc14, %for.inc13 ], [ 0, %for.cond1.preheader.preheader ]
515 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
517 %1 = zext i32 %0 to i64
519 %cmp21 = icmp sgt i32 %n, 0
520 br i1 %cmp21, label %for.body3.preheader, label %for.inc13
522 for.body3.preheader: ; preds = %for.cond1.preheader
525 for.body3: ; preds = %for.body3.preheader, %for.body3
526 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
527 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
528 %mul = shl nsw i32 %n, 1
529 %mul4 = mul nsw i32 %mul, %i.06
530 %3 = trunc i64 %indvars.iv to i32
531 %mul5 = shl nsw i32 %3, 2
532 %add = add nsw i32 %mul4, %mul5
533 %idxprom = sext i32 %add to i64
534 %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom
535 store i32 %i.06, i32* %arrayidx, align 4
536 %mul6 = shl nsw i32 %n, 3
537 %mul7 = mul nsw i32 %mul6, %i.06
538 %4 = trunc i64 %indvars.iv to i32
539 %mul8 = mul nsw i32 %4, 6
540 %add9 = add nsw i32 %mul7, %mul8
541 %add10 = or i32 %add9, 1
542 %idxprom11 = sext i32 %add10 to i64
543 %arrayidx12 = getelementptr inbounds i32* %A, i64 %idxprom11
544 %5 = load i32* %arrayidx12, align 4
545 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
546 store i32 %5, i32* %B.addr.12, align 4
547 %indvars.iv.next = add i64 %indvars.iv, 1
548 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
549 %exitcond = icmp ne i32 %lftr.wideiv, %n
550 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
552 for.inc13.loopexit: ; preds = %for.body3
553 %scevgep = getelementptr i32* %B.addr.05, i64 %2
556 for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
557 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
558 %inc14 = add nsw i32 %i.06, 1
559 %exitcond7 = icmp ne i32 %inc14, %n
560 br i1 %exitcond7, label %for.cond1.preheader, label %for.end15.loopexit
562 for.end15.loopexit: ; preds = %for.inc13
565 for.end15: ; preds = %for.end15.loopexit, %entry
570 ;; for (unsigned i = 0; i < n; i++)
571 ;; for (unsigned j = 0; j < n; j++) {
573 ;; *B++ = A[8*i][6*j + 1];
575 define void @gcd9(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
577 %0 = zext i32 %n to i64
578 %cmp4 = icmp eq i32 %n, 0
579 br i1 %cmp4, label %for.end15, label %for.cond1.preheader.preheader
581 ; CHECK: da analyze - output [* *]!
582 ; CHECK: da analyze - flow [* *|<]!
583 ; CHECK: da analyze - confused!
584 ; CHECK: da analyze - input [* *]!
585 ; CHECK: da analyze - confused!
586 ; CHECK: da analyze - output [* *]!
588 for.cond1.preheader.preheader: ; preds = %entry
589 br label %for.cond1.preheader
591 for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
592 %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
593 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
595 %2 = zext i32 %1 to i64
597 %cmp21 = icmp eq i32 %n, 0
598 br i1 %cmp21, label %for.inc13, label %for.body3.preheader
600 for.body3.preheader: ; preds = %for.cond1.preheader
603 for.body3: ; preds = %for.body3.preheader, %for.body3
604 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
605 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
606 %4 = trunc i64 %indvars.iv to i32
608 %idxprom = zext i32 %mul to i64
609 %5 = trunc i64 %indvars.iv8 to i32
610 %mul4 = shl i32 %5, 1
611 %idxprom5 = zext i32 %mul4 to i64
612 %6 = mul nsw i64 %idxprom5, %0
613 %arrayidx.sum = add i64 %6, %idxprom
614 %arrayidx6 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
615 %7 = trunc i64 %indvars.iv8 to i32
616 store i32 %7, i32* %arrayidx6, align 4
617 %8 = trunc i64 %indvars.iv to i32
618 %mul7 = mul i32 %8, 6
619 %add7 = or i32 %mul7, 1
620 %idxprom8 = zext i32 %add7 to i64
621 %9 = trunc i64 %indvars.iv8 to i32
622 %mul9 = shl i32 %9, 3
623 %idxprom10 = zext i32 %mul9 to i64
624 %10 = mul nsw i64 %idxprom10, %0
625 %arrayidx11.sum = add i64 %10, %idxprom8
626 %arrayidx12 = getelementptr inbounds i32* %A, i64 %arrayidx11.sum
627 %11 = load i32* %arrayidx12, align 4
628 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
629 store i32 %11, i32* %B.addr.12, align 4
630 %indvars.iv.next = add i64 %indvars.iv, 1
631 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
632 %exitcond = icmp ne i32 %lftr.wideiv, %n
633 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
635 for.inc13.loopexit: ; preds = %for.body3
636 %scevgep = getelementptr i32* %B.addr.05, i64 %3
639 for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
640 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
641 %indvars.iv.next9 = add i64 %indvars.iv8, 1
642 %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
643 %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
644 br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
646 for.end15.loopexit: ; preds = %for.inc13
649 for.end15: ; preds = %for.end15.loopexit, %entry