1 ; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \
2 ; RUN: | FileCheck %s -check-prefix=DELIN
3 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s -check-prefix=DELIN
5 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"
6 target triple = "x86_64-apple-macosx10.6.0"
9 ;; for (long int i = 0; i < 100; i++)
10 ;; for (long int j = 0; j < 100; j++) {
12 ;; *B++ = A[6*i + 8*j];
14 define void @gcd0(i32* %A, i32* %B) nounwind uwtable ssp {
16 br label %for.cond1.preheader
19 ; DELIN: da analyze - output [* *]!
20 ; DELIN: da analyze - flow [=> *|<]!
21 ; DELIN: da analyze - confused!
22 ; DELIN: da analyze - input [* *]!
23 ; DELIN: da analyze - confused!
24 ; DELIN: da analyze - none!
26 for.cond1.preheader: ; preds = %entry, %for.inc8
27 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ]
28 %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]
31 for.body3: ; preds = %for.cond1.preheader, %for.body3
32 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
33 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
34 %conv = trunc i64 %i.03 to i32
35 %mul = shl nsw i64 %i.03, 1
36 %mul4 = shl nsw i64 %j.02, 2
37 %sub = sub nsw i64 %mul, %mul4
38 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %sub
39 store i32 %conv, i32* %arrayidx, align 4
40 %mul5 = mul nsw i64 %i.03, 6
41 %mul6 = shl nsw i64 %j.02, 3
42 %add = add nsw i64 %mul5, %mul6
43 %arrayidx7 = getelementptr inbounds i32, i32* %A, i64 %add
44 %0 = load i32, i32* %arrayidx7, align 4
45 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
46 store i32 %0, i32* %B.addr.11, align 4
47 %inc = add nsw i64 %j.02, 1
48 %exitcond = icmp ne i64 %inc, 100
49 br i1 %exitcond, label %for.body3, label %for.inc8
51 for.inc8: ; preds = %for.body3
52 %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
53 %inc9 = add nsw i64 %i.03, 1
54 %exitcond5 = icmp ne i64 %inc9, 100
55 br i1 %exitcond5, label %for.cond1.preheader, label %for.end10
57 for.end10: ; preds = %for.inc8
62 ;; for (long int i = 0; i < 100; i++)
63 ;; for (long int j = 0; j < 100; j++) {
65 ;; *B++ = A[6*i + 8*j + 1];
67 define void @gcd1(i32* %A, i32* %B) nounwind uwtable ssp {
69 br label %for.cond1.preheader
72 ; DELIN: da analyze - output [* *]!
73 ; DELIN: da analyze - none!
74 ; DELIN: da analyze - confused!
75 ; DELIN: da analyze - input [* *]!
76 ; DELIN: da analyze - confused!
77 ; DELIN: da analyze - none!
79 for.cond1.preheader: ; preds = %entry, %for.inc9
80 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
81 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
84 for.body3: ; preds = %for.cond1.preheader, %for.body3
85 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
86 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
87 %conv = trunc i64 %i.03 to i32
88 %mul = shl nsw i64 %i.03, 1
89 %mul4 = shl nsw i64 %j.02, 2
90 %sub = sub nsw i64 %mul, %mul4
91 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %sub
92 store i32 %conv, i32* %arrayidx, align 4
93 %mul5 = mul nsw i64 %i.03, 6
94 %mul6 = shl nsw i64 %j.02, 3
95 %add = add nsw i64 %mul5, %mul6
96 %add7 = or i64 %add, 1
97 %arrayidx8 = getelementptr inbounds i32, i32* %A, i64 %add7
98 %0 = load i32, i32* %arrayidx8, align 4
99 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
100 store i32 %0, i32* %B.addr.11, align 4
101 %inc = add nsw i64 %j.02, 1
102 %exitcond = icmp ne i64 %inc, 100
103 br i1 %exitcond, label %for.body3, label %for.inc9
105 for.inc9: ; preds = %for.body3
106 %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
107 %inc10 = add nsw i64 %i.03, 1
108 %exitcond5 = icmp ne i64 %inc10, 100
109 br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
111 for.end11: ; preds = %for.inc9
116 ;; for (long int i = 0; i < 100; i++)
117 ;; for (long int j = 0; j < 100; j++) {
118 ;; A[2*i - 4*j + 1] = i;
119 ;; *B++ = A[6*i + 8*j];
121 define void @gcd2(i32* %A, i32* %B) nounwind uwtable ssp {
123 br label %for.cond1.preheader
126 ; DELIN: da analyze - output [* *]!
127 ; DELIN: da analyze - none!
128 ; DELIN: da analyze - confused!
129 ; DELIN: da analyze - input [* *]!
130 ; DELIN: da analyze - confused!
131 ; DELIN: da analyze - none!
133 for.cond1.preheader: ; preds = %entry, %for.inc9
134 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
135 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
138 for.body3: ; preds = %for.cond1.preheader, %for.body3
139 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
140 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
141 %conv = trunc i64 %i.03 to i32
142 %mul = shl nsw i64 %i.03, 1
143 %mul4 = shl nsw i64 %j.02, 2
144 %sub = sub nsw i64 %mul, %mul4
145 %add5 = or i64 %sub, 1
146 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add5
147 store i32 %conv, i32* %arrayidx, align 4
148 %mul5 = mul nsw i64 %i.03, 6
149 %mul6 = shl nsw i64 %j.02, 3
150 %add7 = add nsw i64 %mul5, %mul6
151 %arrayidx8 = getelementptr inbounds i32, i32* %A, i64 %add7
152 %0 = load i32, i32* %arrayidx8, align 4
153 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
154 store i32 %0, i32* %B.addr.11, align 4
155 %inc = add nsw i64 %j.02, 1
156 %exitcond = icmp ne i64 %inc, 100
157 br i1 %exitcond, label %for.body3, label %for.inc9
159 for.inc9: ; preds = %for.body3
160 %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
161 %inc10 = add nsw i64 %i.03, 1
162 %exitcond6 = icmp ne i64 %inc10, 100
163 br i1 %exitcond6, label %for.cond1.preheader, label %for.end11
165 for.end11: ; preds = %for.inc9
170 ;; for (long int i = 0; i < 100; i++)
171 ;; for (long int j = 0; j < 100; j++) {
173 ;; *B++ = A[i + 2*j - 1];
175 define void @gcd3(i32* %A, i32* %B) nounwind uwtable ssp {
177 br label %for.cond1.preheader
180 ; DELIN: da analyze - output [* *]!
181 ; DELIN: da analyze - flow [<> *]!
182 ; DELIN: da analyze - confused!
183 ; DELIN: da analyze - input [* *]!
184 ; DELIN: da analyze - confused!
185 ; DELIN: da analyze - none!
187 for.cond1.preheader: ; preds = %entry, %for.inc7
188 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc7 ]
189 %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ]
192 for.body3: ; preds = %for.cond1.preheader, %for.body3
193 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
194 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
195 %conv = trunc i64 %i.03 to i32
196 %mul = shl nsw i64 %j.02, 1
197 %add = add nsw i64 %i.03, %mul
198 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
199 store i32 %conv, i32* %arrayidx, align 4
200 %mul4 = shl nsw i64 %j.02, 1
201 %add5 = add nsw i64 %i.03, %mul4
202 %sub = add nsw i64 %add5, -1
203 %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %sub
204 %0 = load i32, i32* %arrayidx6, align 4
205 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
206 store i32 %0, i32* %B.addr.11, align 4
207 %inc = add nsw i64 %j.02, 1
208 %exitcond = icmp ne i64 %inc, 100
209 br i1 %exitcond, label %for.body3, label %for.inc7
211 for.inc7: ; preds = %for.body3
212 %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
213 %inc8 = add nsw i64 %i.03, 1
214 %exitcond5 = icmp ne i64 %inc8, 100
215 br i1 %exitcond5, label %for.cond1.preheader, label %for.end9
217 for.end9: ; preds = %for.inc7
222 ;; for (long int i = 0; i < 100; i++)
223 ;; for (long int j = 0; j < 100; j++) {
224 ;; A[5*i + 10*j*M + 9*M*N] = i;
225 ;; *B++ = A[15*i + 20*j*M - 21*N*M + 4];
227 define void @gcd4(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
229 br label %for.cond1.preheader
232 ; DELIN: da analyze - output [* *]!
233 ; DELIN: da analyze - none!
234 ; DELIN: da analyze - confused!
235 ; DELIN: da analyze - input [* *]!
236 ; DELIN: da analyze - confused!
237 ; DELIN: da analyze - none!
239 for.cond1.preheader: ; preds = %entry, %for.inc17
240 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
241 %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
244 for.body3: ; preds = %for.cond1.preheader, %for.body3
245 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
246 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
247 %conv = trunc i64 %i.03 to i32
248 %mul = mul nsw i64 %i.03, 5
249 %mul4 = mul nsw i64 %j.02, 10
250 %mul5 = mul nsw i64 %mul4, %M
251 %add = add nsw i64 %mul, %mul5
252 %mul6 = mul nsw i64 %M, 9
253 %mul7 = mul nsw i64 %mul6, %N
254 %add8 = add nsw i64 %add, %mul7
255 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add8
256 store i32 %conv, i32* %arrayidx, align 4
257 %mul9 = mul nsw i64 %i.03, 15
258 %mul10 = mul nsw i64 %j.02, 20
259 %mul11 = mul nsw i64 %mul10, %M
260 %add12 = add nsw i64 %mul9, %mul11
261 %mul13 = mul nsw i64 %N, 21
262 %mul14 = mul nsw i64 %mul13, %M
263 %sub = sub nsw i64 %add12, %mul14
264 %add15 = add nsw i64 %sub, 4
265 %arrayidx16 = getelementptr inbounds i32, i32* %A, i64 %add15
266 %0 = load i32, i32* %arrayidx16, align 4
267 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
268 store i32 %0, i32* %B.addr.11, align 4
269 %inc = add nsw i64 %j.02, 1
270 %exitcond = icmp ne i64 %inc, 100
271 br i1 %exitcond, label %for.body3, label %for.inc17
273 for.inc17: ; preds = %for.body3
274 %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
275 %inc18 = add nsw i64 %i.03, 1
276 %exitcond5 = icmp ne i64 %inc18, 100
277 br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
279 for.end19: ; preds = %for.inc17
284 ;; for (long int i = 0; i < 100; i++)
285 ;; for (long int j = 0; j < 100; j++) {
286 ;; A[5*i + 10*j*M + 9*M*N] = i;
287 ;; *B++ = A[15*i + 20*j*M - 21*N*M + 5];
289 define void @gcd5(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
291 br label %for.cond1.preheader
294 ; DELIN: da analyze - output [* *]!
295 ; DELIN: da analyze - flow [<> *]!
296 ; DELIN: da analyze - confused!
297 ; DELIN: da analyze - input [* *]!
298 ; DELIN: da analyze - confused!
299 ; DELIN: da analyze - none!
301 for.cond1.preheader: ; preds = %entry, %for.inc17
302 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
303 %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
306 for.body3: ; preds = %for.cond1.preheader, %for.body3
307 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
308 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
309 %conv = trunc i64 %i.03 to i32
310 %mul = mul nsw i64 %i.03, 5
311 %mul4 = mul nsw i64 %j.02, 10
312 %mul5 = mul nsw i64 %mul4, %M
313 %add = add nsw i64 %mul, %mul5
314 %mul6 = mul nsw i64 %M, 9
315 %mul7 = mul nsw i64 %mul6, %N
316 %add8 = add nsw i64 %add, %mul7
317 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add8
318 store i32 %conv, i32* %arrayidx, align 4
319 %mul9 = mul nsw i64 %i.03, 15
320 %mul10 = mul nsw i64 %j.02, 20
321 %mul11 = mul nsw i64 %mul10, %M
322 %add12 = add nsw i64 %mul9, %mul11
323 %mul13 = mul nsw i64 %N, 21
324 %mul14 = mul nsw i64 %mul13, %M
325 %sub = sub nsw i64 %add12, %mul14
326 %add15 = add nsw i64 %sub, 5
327 %arrayidx16 = getelementptr inbounds i32, i32* %A, i64 %add15
328 %0 = load i32, i32* %arrayidx16, align 4
329 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
330 store i32 %0, i32* %B.addr.11, align 4
331 %inc = add nsw i64 %j.02, 1
332 %exitcond = icmp ne i64 %inc, 100
333 br i1 %exitcond, label %for.body3, label %for.inc17
335 for.inc17: ; preds = %for.body3
336 %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
337 %inc18 = add nsw i64 %i.03, 1
338 %exitcond5 = icmp ne i64 %inc18, 100
339 br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
341 for.end19: ; preds = %for.inc17
346 ;; for (long int i = 0; i < n; i++)
347 ;; for (long int j = 0; j < n; j++) {
349 ;; *B++ = A[8*i][6*j + 1];
351 define void @gcd6(i64 %n, i32* %A, i32* %B) nounwind uwtable ssp {
353 %cmp4 = icmp sgt i64 %n, 0
354 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end12
357 ; DELIN: da analyze - output [* *]!
358 ; DELIN: da analyze - none!
359 ; DELIN: da analyze - confused!
360 ; DELIN: da analyze - input [* *]!
361 ; DELIN: da analyze - confused!
362 ; DELIN: da analyze - output [* *]!
364 for.cond1.preheader.preheader: ; preds = %entry
365 br label %for.cond1.preheader
367 for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc10
368 %i.06 = phi i64 [ %inc11, %for.inc10 ], [ 0, %for.cond1.preheader.preheader ]
369 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc10 ], [ %B, %for.cond1.preheader.preheader ]
370 %cmp21 = icmp sgt i64 %n, 0
371 br i1 %cmp21, label %for.body3.preheader, label %for.inc10
373 for.body3.preheader: ; preds = %for.cond1.preheader
376 for.body3: ; preds = %for.body3.preheader, %for.body3
377 %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]
378 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
379 %conv = trunc i64 %i.06 to i32
380 %mul = shl nsw i64 %j.03, 2
381 %mul4 = shl nsw i64 %i.06, 1
382 %0 = mul nsw i64 %mul4, %n
383 %arrayidx.sum = add i64 %0, %mul
384 %arrayidx5 = getelementptr inbounds i32, i32* %A, i64 %arrayidx.sum
385 store i32 %conv, i32* %arrayidx5, align 4
386 %mul6 = mul nsw i64 %j.03, 6
387 %add7 = or i64 %mul6, 1
388 %mul7 = shl nsw i64 %i.06, 3
389 %1 = mul nsw i64 %mul7, %n
390 %arrayidx8.sum = add i64 %1, %add7
391 %arrayidx9 = getelementptr inbounds i32, i32* %A, i64 %arrayidx8.sum
392 %2 = load i32, i32* %arrayidx9, align 4
393 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
394 store i32 %2, i32* %B.addr.12, align 4
395 %inc = add nsw i64 %j.03, 1
396 %exitcond = icmp ne i64 %inc, %n
397 br i1 %exitcond, label %for.body3, label %for.inc10.loopexit
399 for.inc10.loopexit: ; preds = %for.body3
400 %scevgep = getelementptr i32, i32* %B.addr.05, i64 %n
403 for.inc10: ; preds = %for.inc10.loopexit, %for.cond1.preheader
404 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc10.loopexit ]
405 %inc11 = add nsw i64 %i.06, 1
406 %exitcond8 = icmp ne i64 %inc11, %n
407 br i1 %exitcond8, label %for.cond1.preheader, label %for.end12.loopexit
409 for.end12.loopexit: ; preds = %for.inc10
412 for.end12: ; preds = %for.end12.loopexit, %entry
417 ;; for (int i = 0; i < n; i++)
418 ;; for (int j = 0; j < n; j++) {
420 ;; *B++ = A[8*i][6*j + 1];
422 define void @gcd7(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
424 %0 = zext i32 %n to i64
425 %cmp4 = icmp sgt i32 %n, 0
426 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
429 ; DELIN: da analyze - output [* *]!
430 ; DELIN: da analyze - flow [* *|<]!
431 ; DELIN: da analyze - confused!
432 ; DELIN: da analyze - input [* *]!
433 ; DELIN: da analyze - confused!
434 ; DELIN: da analyze - output [* *]!
436 for.cond1.preheader.preheader: ; preds = %entry
437 br label %for.cond1.preheader
439 for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
440 %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
441 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
443 %2 = zext i32 %1 to i64
445 %cmp21 = icmp sgt i32 %n, 0
446 br i1 %cmp21, label %for.body3.preheader, label %for.inc13
448 for.body3.preheader: ; preds = %for.cond1.preheader
451 for.body3: ; preds = %for.body3.preheader, %for.body3
452 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
453 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
454 %4 = trunc i64 %indvars.iv to i32
455 %mul = shl nsw i32 %4, 2
456 %idxprom = sext i32 %mul to i64
457 %5 = trunc i64 %indvars.iv8 to i32
458 %mul4 = shl nsw i32 %5, 1
459 %idxprom5 = sext i32 %mul4 to i64
460 %6 = mul nsw i64 %idxprom5, %0
461 %arrayidx.sum = add i64 %6, %idxprom
462 %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %arrayidx.sum
463 %7 = trunc i64 %indvars.iv8 to i32
464 store i32 %7, i32* %arrayidx6, align 4
465 %8 = trunc i64 %indvars.iv to i32
466 %mul7 = mul nsw i32 %8, 6
467 %add7 = or i32 %mul7, 1
468 %idxprom8 = sext i32 %add7 to i64
469 %9 = trunc i64 %indvars.iv8 to i32
470 %mul9 = shl nsw i32 %9, 3
471 %idxprom10 = sext i32 %mul9 to i64
472 %10 = mul nsw i64 %idxprom10, %0
473 %arrayidx11.sum = add i64 %10, %idxprom8
474 %arrayidx12 = getelementptr inbounds i32, i32* %A, i64 %arrayidx11.sum
475 %11 = load i32, i32* %arrayidx12, align 4
476 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
477 store i32 %11, i32* %B.addr.12, align 4
478 %indvars.iv.next = add i64 %indvars.iv, 1
479 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
480 %exitcond = icmp ne i32 %lftr.wideiv, %n
481 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
483 for.inc13.loopexit: ; preds = %for.body3
484 %scevgep = getelementptr i32, i32* %B.addr.05, i64 %3
487 for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
488 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
489 %indvars.iv.next9 = add i64 %indvars.iv8, 1
490 %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
491 %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
492 br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
494 for.end15.loopexit: ; preds = %for.inc13
497 for.end15: ; preds = %for.end15.loopexit, %entry
502 ;; for (int i = 0; i < n; i++)
503 ;; for (int j = 0; j < n; j++) {
504 ;; A[n*2*i + 4*j] = i;
505 ;; *B++ = A[n*8*i + 6*j + 1];
507 define void @gcd8(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
509 %cmp4 = icmp sgt i32 %n, 0
510 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
513 ; DELIN: da analyze - output [* *]!
514 ; DELIN: da analyze - flow [* *|<]!
515 ; DELIN: da analyze - confused!
516 ; DELIN: da analyze - input [* *]!
517 ; DELIN: da analyze - confused!
518 ; DELIN: da analyze - output [* *]!
520 for.cond1.preheader.preheader: ; preds = %entry
521 br label %for.cond1.preheader
523 for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
524 %i.06 = phi i32 [ %inc14, %for.inc13 ], [ 0, %for.cond1.preheader.preheader ]
525 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
527 %1 = zext i32 %0 to i64
529 %cmp21 = icmp sgt i32 %n, 0
530 br i1 %cmp21, label %for.body3.preheader, label %for.inc13
532 for.body3.preheader: ; preds = %for.cond1.preheader
535 for.body3: ; preds = %for.body3.preheader, %for.body3
536 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
537 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
538 %mul = shl nsw i32 %n, 1
539 %mul4 = mul nsw i32 %mul, %i.06
540 %3 = trunc i64 %indvars.iv to i32
541 %mul5 = shl nsw i32 %3, 2
542 %add = add nsw i32 %mul4, %mul5
543 %idxprom = sext i32 %add to i64
544 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom
545 store i32 %i.06, i32* %arrayidx, align 4
546 %mul6 = shl nsw i32 %n, 3
547 %mul7 = mul nsw i32 %mul6, %i.06
548 %4 = trunc i64 %indvars.iv to i32
549 %mul8 = mul nsw i32 %4, 6
550 %add9 = add nsw i32 %mul7, %mul8
551 %add10 = or i32 %add9, 1
552 %idxprom11 = sext i32 %add10 to i64
553 %arrayidx12 = getelementptr inbounds i32, i32* %A, i64 %idxprom11
554 %5 = load i32, i32* %arrayidx12, align 4
555 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
556 store i32 %5, i32* %B.addr.12, align 4
557 %indvars.iv.next = add i64 %indvars.iv, 1
558 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
559 %exitcond = icmp ne i32 %lftr.wideiv, %n
560 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
562 for.inc13.loopexit: ; preds = %for.body3
563 %scevgep = getelementptr i32, i32* %B.addr.05, i64 %2
566 for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
567 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
568 %inc14 = add nsw i32 %i.06, 1
569 %exitcond7 = icmp ne i32 %inc14, %n
570 br i1 %exitcond7, label %for.cond1.preheader, label %for.end15.loopexit
572 for.end15.loopexit: ; preds = %for.inc13
575 for.end15: ; preds = %for.end15.loopexit, %entry
580 ;; for (unsigned i = 0; i < n; i++)
581 ;; for (unsigned j = 0; j < n; j++) {
583 ;; *B++ = A[8*i][6*j + 1];
585 define void @gcd9(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
587 %0 = zext i32 %n to i64
588 %cmp4 = icmp eq i32 %n, 0
589 br i1 %cmp4, label %for.end15, label %for.cond1.preheader.preheader
592 ; DELIN: da analyze - output [* *]!
593 ; DELIN: da analyze - flow [* *|<]!
594 ; DELIN: da analyze - confused!
595 ; DELIN: da analyze - input [* *]!
596 ; DELIN: da analyze - confused!
597 ; DELIN: da analyze - output [* *]!
599 for.cond1.preheader.preheader: ; preds = %entry
600 br label %for.cond1.preheader
602 for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
603 %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
604 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
606 %2 = zext i32 %1 to i64
608 %cmp21 = icmp eq i32 %n, 0
609 br i1 %cmp21, label %for.inc13, label %for.body3.preheader
611 for.body3.preheader: ; preds = %for.cond1.preheader
614 for.body3: ; preds = %for.body3.preheader, %for.body3
615 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
616 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
617 %4 = trunc i64 %indvars.iv to i32
619 %idxprom = zext i32 %mul to i64
620 %5 = trunc i64 %indvars.iv8 to i32
621 %mul4 = shl i32 %5, 1
622 %idxprom5 = zext i32 %mul4 to i64
623 %6 = mul nsw i64 %idxprom5, %0
624 %arrayidx.sum = add i64 %6, %idxprom
625 %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %arrayidx.sum
626 %7 = trunc i64 %indvars.iv8 to i32
627 store i32 %7, i32* %arrayidx6, align 4
628 %8 = trunc i64 %indvars.iv to i32
629 %mul7 = mul i32 %8, 6
630 %add7 = or i32 %mul7, 1
631 %idxprom8 = zext i32 %add7 to i64
632 %9 = trunc i64 %indvars.iv8 to i32
633 %mul9 = shl i32 %9, 3
634 %idxprom10 = zext i32 %mul9 to i64
635 %10 = mul nsw i64 %idxprom10, %0
636 %arrayidx11.sum = add i64 %10, %idxprom8
637 %arrayidx12 = getelementptr inbounds i32, i32* %A, i64 %arrayidx11.sum
638 %11 = load i32, i32* %arrayidx12, align 4
639 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
640 store i32 %11, i32* %B.addr.12, align 4
641 %indvars.iv.next = add i64 %indvars.iv, 1
642 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
643 %exitcond = icmp ne i32 %lftr.wideiv, %n
644 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
646 for.inc13.loopexit: ; preds = %for.body3
647 %scevgep = getelementptr i32, i32* %B.addr.05, i64 %3
650 for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
651 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
652 %indvars.iv.next9 = add i64 %indvars.iv8, 1
653 %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
654 %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
655 br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
657 for.end15.loopexit: ; preds = %for.inc13
660 for.end15: ; preds = %for.end15.loopexit, %entry