1; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \
2; RUN: | FileCheck %s
3; RUN: opt < %s -analyze -basic-aa -da | FileCheck %s
4
5target 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"
6target triple = "x86_64-apple-macosx10.6.0"
7
8
9;;  for (long int i = 0; i < 100; i++)
10;;    for (long int j = 0; j < 100; j++) {
11;;      A[i + 1][i + j] = i;
12;;      *B++ = A[i][i + j];
13
14define void @prop0([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
15entry:
16  br label %for.cond1.preheader
17
18; CHECK-LABEL: prop0
19; CHECK: da analyze - none!
20; CHECK: da analyze - flow [< >]!
21; CHECK: da analyze - confused!
22; CHECK: da analyze - none!
23; CHECK: da analyze - confused!
24; CHECK: da analyze - none!
25
26for.cond1.preheader:                              ; preds = %entry, %for.inc9
27  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
28  %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
29  br label %for.body3
30
31for.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  %add = add nsw i64 %i.03, %j.02
36  %add4 = add nsw i64 %i.03, 1
37  %arrayidx5 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add4, i64 %add
38  store i32 %conv, i32* %arrayidx5, align 4
39  %add6 = add nsw i64 %i.03, %j.02
40  %arrayidx8 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.03, i64 %add6
41  %0 = load i32, i32* %arrayidx8, align 4
42  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
43  store i32 %0, i32* %B.addr.11, align 4
44  %inc = add nsw i64 %j.02, 1
45  %exitcond = icmp ne i64 %inc, 100
46  br i1 %exitcond, label %for.body3, label %for.inc9
47
48for.inc9:                                         ; preds = %for.body3
49  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
50  %inc10 = add nsw i64 %i.03, 1
51  %exitcond5 = icmp ne i64 %inc10, 100
52  br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
53
54for.end11:                                        ; preds = %for.inc9
55  ret void
56}
57
58
59;;  for (long int i = 0; i < 100; i++)
60;;    for (long int j = 0; j < 100; j++)
61;;      for (long int k = 0; k < 100; k++) {
62;;        A[j - i][i + 1][j + k] = i;
63;;        *B++ = A[j - i][i][j + k];
64
65define void @prop1([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
66entry:
67  br label %for.cond1.preheader
68
69; CHECK-LABEL: prop1
70; CHECK: da analyze - output [* * *]!
71; CHECK: da analyze - flow [<> <> *]!
72; CHECK: da analyze - confused!
73; CHECK: da analyze - input [* * *]!
74; CHECK: da analyze - confused!
75; CHECK: da analyze - none!
76
77for.cond1.preheader:                              ; preds = %entry, %for.inc18
78  %B.addr.06 = phi i32* [ %B, %entry ], [ %scevgep7, %for.inc18 ]
79  %i.05 = phi i64 [ 0, %entry ], [ %inc19, %for.inc18 ]
80  br label %for.cond4.preheader
81
82for.cond4.preheader:                              ; preds = %for.cond1.preheader, %for.inc15
83  %B.addr.14 = phi i32* [ %B.addr.06, %for.cond1.preheader ], [ %scevgep, %for.inc15 ]
84  %j.03 = phi i64 [ 0, %for.cond1.preheader ], [ %inc16, %for.inc15 ]
85  br label %for.body6
86
87for.body6:                                        ; preds = %for.cond4.preheader, %for.body6
88  %k.02 = phi i64 [ 0, %for.cond4.preheader ], [ %inc, %for.body6 ]
89  %B.addr.21 = phi i32* [ %B.addr.14, %for.cond4.preheader ], [ %incdec.ptr, %for.body6 ]
90  %conv = trunc i64 %i.05 to i32
91  %add = add nsw i64 %j.03, %k.02
92  %add7 = add nsw i64 %i.05, 1
93  %sub = sub nsw i64 %j.03, %i.05
94  %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub, i64 %add7, i64 %add
95  store i32 %conv, i32* %arrayidx9, align 4
96  %add10 = add nsw i64 %j.03, %k.02
97  %sub11 = sub nsw i64 %j.03, %i.05
98  %arrayidx14 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub11, i64 %i.05, i64 %add10
99  %0 = load i32, i32* %arrayidx14, align 4
100  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.21, i64 1
101  store i32 %0, i32* %B.addr.21, align 4
102  %inc = add nsw i64 %k.02, 1
103  %exitcond = icmp ne i64 %inc, 100
104  br i1 %exitcond, label %for.body6, label %for.inc15
105
106for.inc15:                                        ; preds = %for.body6
107  %scevgep = getelementptr i32, i32* %B.addr.14, i64 100
108  %inc16 = add nsw i64 %j.03, 1
109  %exitcond8 = icmp ne i64 %inc16, 100
110  br i1 %exitcond8, label %for.cond4.preheader, label %for.inc18
111
112for.inc18:                                        ; preds = %for.inc15
113  %scevgep7 = getelementptr i32, i32* %B.addr.06, i64 10000
114  %inc19 = add nsw i64 %i.05, 1
115  %exitcond9 = icmp ne i64 %inc19, 100
116  br i1 %exitcond9, label %for.cond1.preheader, label %for.end20
117
118for.end20:                                        ; preds = %for.inc18
119  ret void
120}
121
122
123;;  for (long int i = 0; i < 100; i++)
124;;    for (long int j = 0; j < 100; j++) {
125;;      A[i - 1][2*i] = i;
126;;      *B++ = A[i][i + j + 110];
127
128define void @prop2([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
129entry:
130  br label %for.cond1.preheader
131
132; CHECK-LABEL: prop2
133; CHECK: da analyze - consistent output [0 S]!
134; CHECK: da analyze - flow [> *]!
135; CHECK: da analyze - confused!
136; CHECK: da analyze - none!
137; CHECK: da analyze - confused!
138; CHECK: da analyze - none!
139
140for.cond1.preheader:                              ; preds = %entry, %for.inc8
141  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ]
142  %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]
143  br label %for.body3
144
145for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
146  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
147  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
148  %conv = trunc i64 %i.03 to i32
149  %mul = shl nsw i64 %i.03, 1
150  %sub = add nsw i64 %i.03, -1
151  %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %sub, i64 %mul
152  store i32 %conv, i32* %arrayidx4, align 4
153  %add = add nsw i64 %i.03, %j.02
154  %add5 = add nsw i64 %add, 110
155  %arrayidx7 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.03, i64 %add5
156  %0 = load i32, i32* %arrayidx7, align 4
157  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
158  store i32 %0, i32* %B.addr.11, align 4
159  %inc = add nsw i64 %j.02, 1
160  %exitcond = icmp ne i64 %inc, 100
161  br i1 %exitcond, label %for.body3, label %for.inc8
162
163for.inc8:                                         ; preds = %for.body3
164  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
165  %inc9 = add nsw i64 %i.03, 1
166  %exitcond5 = icmp ne i64 %inc9, 100
167  br i1 %exitcond5, label %for.cond1.preheader, label %for.end10
168
169for.end10:                                        ; preds = %for.inc8
170  ret void
171}
172
173
174;;  for (long int i = 0; i < 100; i++)
175;;    for (long int j = 0; j < 100; j++) {
176;;      A[i][2*j + i] = i;
177;;      *B++ = A[i][2*j - i + 5];
178
179define void @prop3([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
180entry:
181  br label %for.cond1.preheader
182
183; CHECK-LABEL: prop3
184; CHECK: da analyze - output [* *]!
185; CHECK: da analyze - flow [<> *]!
186; CHECK: da analyze - confused!
187; CHECK: da analyze - input [* *]!
188; CHECK: da analyze - confused!
189; CHECK: da analyze - none!
190
191for.cond1.preheader:                              ; preds = %entry, %for.inc9
192  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
193  %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
194  br label %for.body3
195
196for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
197  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
198  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
199  %conv = trunc i64 %i.03 to i32
200  %mul = shl nsw i64 %j.02, 1
201  %add = add nsw i64 %mul, %i.03
202  %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.03, i64 %add
203  store i32 %conv, i32* %arrayidx4, align 4
204  %mul5 = shl nsw i64 %j.02, 1
205  %sub = sub nsw i64 %mul5, %i.03
206  %add6 = add nsw i64 %sub, 5
207  %arrayidx8 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.03, i64 %add6
208  %0 = load i32, i32* %arrayidx8, align 4
209  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
210  store i32 %0, i32* %B.addr.11, align 4
211  %inc = add nsw i64 %j.02, 1
212  %exitcond = icmp ne i64 %inc, 100
213  br i1 %exitcond, label %for.body3, label %for.inc9
214
215for.inc9:                                         ; preds = %for.body3
216  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
217  %inc10 = add nsw i64 %i.03, 1
218  %exitcond5 = icmp ne i64 %inc10, 100
219  br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
220
221for.end11:                                        ; preds = %for.inc9
222  ret void
223}
224
225
226;;  for (long int i = 0; i < 100; i++)
227;;    for (long int j = 0; j < 100; j++) {
228;;      A[i + 2][2*i + j + 1] = i;
229;;      *B++ = A[i][2*i + j];
230
231define void @prop4([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
232entry:
233  br label %for.cond1.preheader
234
235; CHECK-LABEL: prop4
236; CHECK: da analyze - none!
237; CHECK: da analyze - flow [< <>]!
238; CHECK: da analyze - confused!
239; CHECK: da analyze - none!
240; CHECK: da analyze - confused!
241; CHECK: da analyze - none!
242
243for.cond1.preheader:                              ; preds = %entry, %for.inc11
244  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc11 ]
245  %i.03 = phi i64 [ 0, %entry ], [ %inc12, %for.inc11 ]
246  br label %for.body3
247
248for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
249  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
250  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
251  %conv = trunc i64 %i.03 to i32
252  %mul = shl nsw i64 %i.03, 1
253  %add = add nsw i64 %mul, %j.02
254  %add4 = add nsw i64 %add, 1
255  %add5 = add nsw i64 %i.03, 2
256  %arrayidx6 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add5, i64 %add4
257  store i32 %conv, i32* %arrayidx6, align 4
258  %mul7 = shl nsw i64 %i.03, 1
259  %add8 = add nsw i64 %mul7, %j.02
260  %arrayidx10 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %i.03, i64 %add8
261  %0 = load i32, i32* %arrayidx10, align 4
262  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
263  store i32 %0, i32* %B.addr.11, align 4
264  %inc = add nsw i64 %j.02, 1
265  %exitcond = icmp ne i64 %inc, 100
266  br i1 %exitcond, label %for.body3, label %for.inc11
267
268for.inc11:                                        ; preds = %for.body3
269  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
270  %inc12 = add nsw i64 %i.03, 1
271  %exitcond5 = icmp ne i64 %inc12, 100
272  br i1 %exitcond5, label %for.cond1.preheader, label %for.end13
273
274for.end13:                                        ; preds = %for.inc11
275  ret void
276}
277
278
279;;  for (long int i = 0; i < 100; i++)
280;;    for (long int j = 0; j < 100; j++) {
281;;      A[3*i - 18][22 - i][2*i + j] = i;
282;;      *B++ = A[i][i][3*i + j];
283
284define void @prop5([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
285entry:
286  br label %for.cond1.preheader
287
288; CHECK-LABEL: prop5
289; CHECK: da analyze - none!
290; CHECK: da analyze - flow [* *|<]!
291; CHECK: da analyze - confused!
292; CHECK: da analyze - none!
293; CHECK: da analyze - confused!
294; CHECK: da analyze - none!
295
296for.cond1.preheader:                              ; preds = %entry, %for.inc13
297  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc13 ]
298  %i.03 = phi i64 [ 0, %entry ], [ %inc14, %for.inc13 ]
299  br label %for.body3
300
301for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
302  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
303  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
304  %conv = trunc i64 %i.03 to i32
305  %mul = shl nsw i64 %i.03, 1
306  %add = add nsw i64 %mul, %j.02
307  %sub = sub nsw i64 22, %i.03
308  %mul4 = mul nsw i64 %i.03, 3
309  %sub5 = add nsw i64 %mul4, -18
310  %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %sub5, i64 %sub, i64 %add
311  store i32 %conv, i32* %arrayidx7, align 4
312  %mul8 = mul nsw i64 %i.03, 3
313  %add9 = add nsw i64 %mul8, %j.02
314  %arrayidx12 = getelementptr inbounds [100 x [100 x i32]], [100 x [100 x i32]]* %A, i64 %i.03, i64 %i.03, i64 %add9
315  %0 = load i32, i32* %arrayidx12, align 4
316  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
317  store i32 %0, i32* %B.addr.11, align 4
318  %inc = add nsw i64 %j.02, 1
319  %exitcond = icmp ne i64 %inc, 100
320  br i1 %exitcond, label %for.body3, label %for.inc13
321
322for.inc13:                                        ; preds = %for.body3
323  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
324  %inc14 = add nsw i64 %i.03, 1
325  %exitcond5 = icmp ne i64 %inc14, 100
326  br i1 %exitcond5, label %for.cond1.preheader, label %for.end15
327
328for.end15:                                        ; preds = %for.inc13
329  ret void
330}
331
332
333;;  for (long int i = 0; i < 100; i++)
334;;    for (long int j = 0; j < 100; j++) {
335;;      A[i + 1][4*i + j + 2] = i;
336;;      *B++ = A[2*i][8*i + j];
337
338define void @prop6([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
339entry:
340  br label %for.cond1.preheader
341
342; CHECK-LABEL: prop6
343; CHECK: da analyze - none!
344; CHECK: da analyze - flow [=> <>]!
345; CHECK: da analyze - confused!
346; CHECK: da analyze - none!
347; CHECK: da analyze - confused!
348; CHECK: da analyze - none!
349
350for.cond1.preheader:                              ; preds = %entry, %for.inc12
351  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc12 ]
352  %i.03 = phi i64 [ 0, %entry ], [ %inc13, %for.inc12 ]
353  br label %for.body3
354
355for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
356  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
357  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
358  %conv = trunc i64 %i.03 to i32
359  %mul = shl nsw i64 %i.03, 2
360  %add = add nsw i64 %mul, %j.02
361  %add4 = add nsw i64 %add, 2
362  %add5 = add nsw i64 %i.03, 1
363  %arrayidx6 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add5, i64 %add4
364  store i32 %conv, i32* %arrayidx6, align 4
365  %mul7 = shl nsw i64 %i.03, 3
366  %add8 = add nsw i64 %mul7, %j.02
367  %mul9 = shl nsw i64 %i.03, 1
368  %arrayidx11 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %mul9, i64 %add8
369  %0 = load i32, i32* %arrayidx11, align 4
370  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
371  store i32 %0, i32* %B.addr.11, align 4
372  %inc = add nsw i64 %j.02, 1
373  %exitcond = icmp ne i64 %inc, 100
374  br i1 %exitcond, label %for.body3, label %for.inc12
375
376for.inc12:                                        ; preds = %for.body3
377  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
378  %inc13 = add nsw i64 %i.03, 1
379  %exitcond5 = icmp ne i64 %inc13, 100
380  br i1 %exitcond5, label %for.cond1.preheader, label %for.end14
381
382for.end14:                                        ; preds = %for.inc12
383  ret void
384}
385
386
387;;  for (long int i = 0; i < 100; i++)
388;;    for (long int j = 0; j < 100; j++) {
389;;      A[2*i + 4][-5*i + j + 2] = i;
390;;      *B++ = A[-2*i + 20][5*i + j];
391
392define void @prop7([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
393entry:
394  br label %for.cond1.preheader
395
396; CHECK-LABEL: prop7
397; CHECK: da analyze - none!
398; CHECK: da analyze - flow [* <>]!
399; CHECK: da analyze - confused!
400; CHECK: da analyze - none!
401; CHECK: da analyze - confused!
402; CHECK: da analyze - none!
403
404for.cond1.preheader:                              ; preds = %entry, %for.inc14
405  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc14 ]
406  %i.03 = phi i64 [ 0, %entry ], [ %inc15, %for.inc14 ]
407  br label %for.body3
408
409for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
410  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
411  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
412  %conv = trunc i64 %i.03 to i32
413  %mul = mul nsw i64 %i.03, -5
414  %add = add nsw i64 %mul, %j.02
415  %add4 = add nsw i64 %add, 2
416  %mul5 = shl nsw i64 %i.03, 1
417  %add6 = add nsw i64 %mul5, 4
418  %arrayidx7 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add6, i64 %add4
419  store i32 %conv, i32* %arrayidx7, align 4
420  %mul8 = mul nsw i64 %i.03, 5
421  %add9 = add nsw i64 %mul8, %j.02
422  %mul10 = mul nsw i64 %i.03, -2
423  %add11 = add nsw i64 %mul10, 20
424  %arrayidx13 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add11, i64 %add9
425  %0 = load i32, i32* %arrayidx13, align 4
426  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
427  store i32 %0, i32* %B.addr.11, align 4
428  %inc = add nsw i64 %j.02, 1
429  %exitcond = icmp ne i64 %inc, 100
430  br i1 %exitcond, label %for.body3, label %for.inc14
431
432for.inc14:                                        ; preds = %for.body3
433  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
434  %inc15 = add nsw i64 %i.03, 1
435  %exitcond5 = icmp ne i64 %inc15, 100
436  br i1 %exitcond5, label %for.cond1.preheader, label %for.end16
437
438for.end16:                                        ; preds = %for.inc14
439  ret void
440}
441
442
443;;  for (long int i = 0; i < 100; i++)
444;;    for (long int j = 0; j < 100; j++) {
445;;      A[4][j + 2] = i;
446;;      *B++ = A[-2*i + 4][5*i + j];
447
448define void @prop8([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
449entry:
450  br label %for.cond1.preheader
451
452; CHECK-LABEL: prop8
453; CHECK: da analyze - consistent output [S 0]!
454; CHECK: da analyze - flow [=> <]!
455; CHECK: da analyze - confused!
456; CHECK: da analyze - none!
457; CHECK: da analyze - confused!
458; CHECK: da analyze - none!
459
460for.cond1.preheader:                              ; preds = %entry, %for.inc10
461  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc10 ]
462  %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ]
463  br label %for.body3
464
465for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
466  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
467  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
468  %conv = trunc i64 %i.03 to i32
469  %add = add nsw i64 %j.02, 2
470  %arrayidx4 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 4, i64 %add
471  store i32 %conv, i32* %arrayidx4, align 4
472  %mul = mul nsw i64 %i.03, 5
473  %add5 = add nsw i64 %mul, %j.02
474  %mul6 = mul nsw i64 %i.03, -2
475  %add7 = add nsw i64 %mul6, 4
476  %arrayidx9 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add7, i64 %add5
477  %0 = load i32, i32* %arrayidx9, align 4
478  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
479  store i32 %0, i32* %B.addr.11, align 4
480  %inc = add nsw i64 %j.02, 1
481  %exitcond = icmp ne i64 %inc, 100
482  br i1 %exitcond, label %for.body3, label %for.inc10
483
484for.inc10:                                        ; preds = %for.body3
485  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
486  %inc11 = add nsw i64 %i.03, 1
487  %exitcond5 = icmp ne i64 %inc11, 100
488  br i1 %exitcond5, label %for.cond1.preheader, label %for.end12
489
490for.end12:                                        ; preds = %for.inc10
491  ret void
492}
493
494
495;;  for (long int i = 0; i < 100; i++)
496;;    for (long int j = 0; j < 100; j++) {
497;;      A[2*i + 4][5*i + j + 2] = i;
498;;      *B++ = A[4][j];
499
500define void @prop9([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
501entry:
502  br label %for.cond1.preheader
503
504; CHECK-LABEL: prop9
505; CHECK: da analyze - none!
506; CHECK: da analyze - flow [<= <]!
507; CHECK: da analyze - confused!
508; CHECK: da analyze - consistent input [S 0]!
509; CHECK: da analyze - confused!
510; CHECK: da analyze - none!
511
512for.cond1.preheader:                              ; preds = %entry, %for.inc10
513  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc10 ]
514  %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ]
515  br label %for.body3
516
517for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
518  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
519  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
520  %conv = trunc i64 %i.03 to i32
521  %mul = mul nsw i64 %i.03, 5
522  %add = add nsw i64 %mul, %j.02
523  %add4 = add nsw i64 %add, 2
524  %mul5 = shl nsw i64 %i.03, 1
525  %add6 = add nsw i64 %mul5, 4
526  %arrayidx7 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 %add6, i64 %add4
527  store i32 %conv, i32* %arrayidx7, align 4
528  %arrayidx9 = getelementptr inbounds [100 x i32], [100 x i32]* %A, i64 4, i64 %j.02
529  %0 = load i32, i32* %arrayidx9, align 4
530  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
531  store i32 %0, i32* %B.addr.11, align 4
532  %inc = add nsw i64 %j.02, 1
533  %exitcond = icmp ne i64 %inc, 100
534  br i1 %exitcond, label %for.body3, label %for.inc10
535
536for.inc10:                                        ; preds = %for.body3
537  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
538  %inc11 = add nsw i64 %i.03, 1
539  %exitcond5 = icmp ne i64 %inc11, 100
540  br i1 %exitcond5, label %for.cond1.preheader, label %for.end12
541
542for.end12:                                        ; preds = %for.inc10
543  ret void
544}
545