Revert r193251 : Use address-taken to disambiguate global variable and indirect memops.
[oota-llvm.git] / test / Analysis / DependenceAnalysis / GCD.ll
1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
2
3 ; ModuleID = 'GCD.bc'
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"
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] = i;
11 ;;      *B++ = A[6*i + 8*j];
12
13 define void @gcd0(i32* %A, i32* %B) nounwind uwtable ssp {
14 entry:
15   br label %for.cond1.preheader
16
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 - none!
23
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 ]
27   br label %for.body3
28
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
48
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
54
55 for.end10:                                        ; preds = %for.inc8
56   ret void
57 }
58
59
60 ;;  for (long int i = 0; i < 100; i++)
61 ;;    for (long int j = 0; j < 100; j++) {
62 ;;      A[2*i - 4*j] = i;
63 ;;      *B++ = A[6*i + 8*j + 1];
64
65 define void @gcd1(i32* %A, i32* %B) nounwind uwtable ssp {
66 entry:
67   br label %for.cond1.preheader
68
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 - none!
75
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 ]
79   br label %for.body3
80
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
101
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
107
108 for.end11:                                        ; preds = %for.inc9
109   ret void
110 }
111
112
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];
117
118 define void @gcd2(i32* %A, i32* %B) nounwind uwtable ssp {
119 entry:
120   br label %for.cond1.preheader
121
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 - none!
128
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 ]
132   br label %for.body3
133
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
154
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
160
161 for.end11:                                        ; preds = %for.inc9
162   ret void
163 }
164
165
166 ;;  for (long int i = 0; i < 100; i++)
167 ;;    for (long int j = 0; j < 100; j++) {
168 ;;      A[i + 2*j] = i;
169 ;;      *B++ = A[i + 2*j - 1];
170
171 define void @gcd3(i32* %A, i32* %B) nounwind uwtable ssp {
172 entry:
173   br label %for.cond1.preheader
174
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 - none!
181
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 ]
185   br label %for.body3
186
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
205
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
211
212 for.end9:                                         ; preds = %for.inc7
213   ret void
214 }
215
216
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];
221
222 define void @gcd4(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
223 entry:
224   br label %for.cond1.preheader
225
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 - none!
232
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 ]
236   br label %for.body3
237
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
266
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
272
273 for.end19:                                        ; preds = %for.inc17
274   ret void
275 }
276
277
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];
282
283 define void @gcd5(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
284 entry:
285   br label %for.cond1.preheader
286
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 - none!
293
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 ]
297   br label %for.body3
298
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
327
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
333
334 for.end19:                                        ; preds = %for.inc17
335   ret void
336 }
337
338
339 ;;  for (long int i = 0; i < n; i++)
340 ;;    for (long int j = 0; j < n; j++) {
341 ;;      A[2*i][4*j] = i;
342 ;;      *B++ = A[8*i][6*j + 1];
343
344 define void @gcd6(i64 %n, i32* %A, i32* %B) nounwind uwtable ssp {
345 entry:
346   %cmp4 = icmp sgt i64 %n, 0
347   br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end12
348
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 [* *]!
355
356 for.cond1.preheader.preheader:                    ; preds = %entry
357   br label %for.cond1.preheader
358
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
364
365 for.body3.preheader:                              ; preds = %for.cond1.preheader
366   br label %for.body3
367
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
390
391 for.inc10.loopexit:                               ; preds = %for.body3
392   %scevgep = getelementptr i32* %B.addr.05, i64 %n
393   br label %for.inc10
394
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
400
401 for.end12.loopexit:                               ; preds = %for.inc10
402   br label %for.end12
403
404 for.end12:                                        ; preds = %for.end12.loopexit, %entry
405   ret void
406 }
407
408
409 ;;  for (int i = 0; i < n; i++)
410 ;;   for (int j = 0; j < n; j++) {
411 ;;    A[2*i][4*j] = i;
412 ;;   *B++ = A[8*i][6*j + 1];
413
414 define void @gcd7(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
415 entry:
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
419
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 [* *]!
426
427 for.cond1.preheader.preheader:                    ; preds = %entry
428   br label %for.cond1.preheader
429
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 ]
433   %1 = add i32 %n, -1
434   %2 = zext i32 %1 to i64
435   %3 = add i64 %2, 1
436   %cmp21 = icmp sgt i32 %n, 0
437   br i1 %cmp21, label %for.body3.preheader, label %for.inc13
438
439 for.body3.preheader:                              ; preds = %for.cond1.preheader
440   br label %for.body3
441
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
473
474 for.inc13.loopexit:                               ; preds = %for.body3
475   %scevgep = getelementptr i32* %B.addr.05, i64 %3
476   br label %for.inc13
477
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
484
485 for.end15.loopexit:                               ; preds = %for.inc13
486   br label %for.end15
487
488 for.end15:                                        ; preds = %for.end15.loopexit, %entry
489   ret void
490 }
491
492
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];
497
498 define void @gcd8(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
499 entry:
500   %cmp4 = icmp sgt i32 %n, 0
501   br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
502
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 [* *]!
509
510 for.cond1.preheader.preheader:                    ; preds = %entry
511   br label %for.cond1.preheader
512
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 ]
516   %0 = add i32 %n, -1
517   %1 = zext i32 %0 to i64
518   %2 = add i64 %1, 1
519   %cmp21 = icmp sgt i32 %n, 0
520   br i1 %cmp21, label %for.body3.preheader, label %for.inc13
521
522 for.body3.preheader:                              ; preds = %for.cond1.preheader
523   br label %for.body3
524
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
551
552 for.inc13.loopexit:                               ; preds = %for.body3
553   %scevgep = getelementptr i32* %B.addr.05, i64 %2
554   br label %for.inc13
555
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
561
562 for.end15.loopexit:                               ; preds = %for.inc13
563   br label %for.end15
564
565 for.end15:                                        ; preds = %for.end15.loopexit, %entry
566   ret void
567 }
568
569
570 ;;  for (unsigned i = 0; i < n; i++)
571 ;;    for (unsigned j = 0; j < n; j++) {
572 ;;      A[2*i][4*j] = i;
573 ;;      *B++ = A[8*i][6*j + 1];
574
575 define void @gcd9(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
576 entry:
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
580
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 [* *]!
587
588 for.cond1.preheader.preheader:                    ; preds = %entry
589   br label %for.cond1.preheader
590
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 ]
594   %1 = add i32 %n, -1
595   %2 = zext i32 %1 to i64
596   %3 = add i64 %2, 1
597   %cmp21 = icmp eq i32 %n, 0
598   br i1 %cmp21, label %for.inc13, label %for.body3.preheader
599
600 for.body3.preheader:                              ; preds = %for.cond1.preheader
601   br label %for.body3
602
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
607   %mul = shl i32 %4, 2
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
634
635 for.inc13.loopexit:                               ; preds = %for.body3
636   %scevgep = getelementptr i32* %B.addr.05, i64 %3
637   br label %for.inc13
638
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
645
646 for.end15.loopexit:                               ; preds = %for.inc13
647   br label %for.end15
648
649 for.end15:                                        ; preds = %for.end15.loopexit, %entry
650   ret void
651 }