[InstCombine] Signed saturation patterns
[llvm-core.git] / test / Analysis / DependenceAnalysis / Propagating.ll
blob64d6a9cfae04e4acb4ce5a9237b0764318474443
1 ; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \
2 ; RUN: | FileCheck %s
3 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
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++) {
11 ;;      A[i + 1][i + j] = i;
12 ;;      *B++ = A[i][i + j];
14 define void @prop0([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
15 entry:
16   br label %for.cond1.preheader
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!
26 for.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
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   %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
48 for.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
54 for.end11:                                        ; preds = %for.inc9
55   ret void
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];
65 define void @prop1([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
66 entry:
67   br label %for.cond1.preheader
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!
77 for.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
82 for.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
87 for.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
106 for.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
112 for.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
118 for.end20:                                        ; preds = %for.inc18
119   ret void
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];
128 define void @prop2([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
129 entry:
130   br label %for.cond1.preheader
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!
140 for.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
145 for.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
163 for.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
169 for.end10:                                        ; preds = %for.inc8
170   ret void
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];
179 define void @prop3([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
180 entry:
181   br label %for.cond1.preheader
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!
191 for.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
196 for.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
215 for.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
221 for.end11:                                        ; preds = %for.inc9
222   ret void
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];
231 define void @prop4([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
232 entry:
233   br label %for.cond1.preheader
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!
243 for.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
248 for.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
268 for.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
274 for.end13:                                        ; preds = %for.inc11
275   ret void
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];
284 define void @prop5([100 x [100 x i32]]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
285 entry:
286   br label %for.cond1.preheader
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!
296 for.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
301 for.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
322 for.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
328 for.end15:                                        ; preds = %for.inc13
329   ret void
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];
338 define void @prop6([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
339 entry:
340   br label %for.cond1.preheader
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!
350 for.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
355 for.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
376 for.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
382 for.end14:                                        ; preds = %for.inc12
383   ret void
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];
392 define void @prop7([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
393 entry:
394   br label %for.cond1.preheader
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!
404 for.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
409 for.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
432 for.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
438 for.end16:                                        ; preds = %for.inc14
439   ret void
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];
448 define void @prop8([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
449 entry:
450   br label %for.cond1.preheader
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!
460 for.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
465 for.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
484 for.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
490 for.end12:                                        ; preds = %for.inc10
491   ret void
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];
500 define void @prop9([100 x i32]* %A, i32* %B, i32 %n) nounwind uwtable ssp {
501 entry:
502   br label %for.cond1.preheader
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!
512 for.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
517 for.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
536 for.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
542 for.end12:                                        ; preds = %for.inc10
543   ret void