Modified depends() to recognize that when all levels are "=" and
[oota-llvm.git] / test / Analysis / DependenceAnalysis / ExactRDIV.ll
1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
2
3 ; ModuleID = 'ExactRDIV.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 < 10; i++)
9 ;;    A[4*i + 10] = i;
10 ;;  for (long int j = 0; j < 10; j++)
11 ;;    *B++ = A[2*j + 1];
12
13 define void @rdiv0(i32* %A, i32* %B) nounwind uwtable ssp {
14 entry:
15   br label %for.body
16
17 ; CHECK: da analyze - none!
18 ; CHECK: da analyze - none!
19 ; CHECK: da analyze - confused!
20 ; CHECK: da analyze - none!
21 ; CHECK: da analyze - confused!
22 ; CHECK: da analyze - none!
23
24 for.body:                                         ; preds = %entry, %for.body
25   %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
26   %conv = trunc i64 %i.03 to i32
27   %mul = shl nsw i64 %i.03, 2
28   %add = add nsw i64 %mul, 10
29   %arrayidx = getelementptr inbounds i32* %A, i64 %add
30   store i32 %conv, i32* %arrayidx, align 4
31   %inc = add nsw i64 %i.03, 1
32   %exitcond5 = icmp ne i64 %inc, 10
33   br i1 %exitcond5, label %for.body, label %for.body4.preheader
34
35 for.body4.preheader:                              ; preds = %for.body
36   br label %for.body4
37
38 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
39   %j.02 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
40   %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
41   %mul5 = shl nsw i64 %j.02, 1
42   %add64 = or i64 %mul5, 1
43   %arrayidx7 = getelementptr inbounds i32* %A, i64 %add64
44   %0 = load i32* %arrayidx7, align 4
45   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
46   store i32 %0, i32* %B.addr.01, align 4
47   %inc9 = add nsw i64 %j.02, 1
48   %exitcond = icmp ne i64 %inc9, 10
49   br i1 %exitcond, label %for.body4, label %for.end10
50
51 for.end10:                                        ; preds = %for.body4
52   ret void
53 }
54
55
56 ;;  for (long int i = 0; i < 5; i++)
57 ;;    A[11*i - 45] = i;
58 ;;  for (long int j = 0; j < 10; j++)
59 ;;    *B++ = A[j];
60
61 define void @rdiv1(i32* %A, i32* %B) nounwind uwtable ssp {
62 entry:
63   br label %for.body
64
65 ; CHECK: da analyze - none!
66 ; CHECK: da analyze - none!
67 ; CHECK: da analyze - confused!
68 ; CHECK: da analyze - none!
69 ; CHECK: da analyze - confused!
70 ; CHECK: da analyze - none!
71
72 for.body:                                         ; preds = %entry, %for.body
73   %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
74   %conv = trunc i64 %i.03 to i32
75   %mul = mul nsw i64 %i.03, 11
76   %sub = add nsw i64 %mul, -45
77   %arrayidx = getelementptr inbounds i32* %A, i64 %sub
78   store i32 %conv, i32* %arrayidx, align 4
79   %inc = add nsw i64 %i.03, 1
80   %exitcond4 = icmp ne i64 %inc, 5
81   br i1 %exitcond4, label %for.body, label %for.body4.preheader
82
83 for.body4.preheader:                              ; preds = %for.body
84   br label %for.body4
85
86 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
87   %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
88   %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
89   %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02
90   %0 = load i32* %arrayidx5, align 4
91   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
92   store i32 %0, i32* %B.addr.01, align 4
93   %inc7 = add nsw i64 %j.02, 1
94   %exitcond = icmp ne i64 %inc7, 10
95   br i1 %exitcond, label %for.body4, label %for.end8
96
97 for.end8:                                         ; preds = %for.body4
98   ret void
99 }
100
101
102 ;;  for (long int i = 0; i <= 5; i++)
103 ;;    A[11*i - 45] = i;
104 ;;  for (long int j = 0; j < 10; j++)
105 ;;    *B++ = A[j];
106
107 define void @rdiv2(i32* %A, i32* %B) nounwind uwtable ssp {
108 entry:
109   br label %for.body
110
111 ; CHECK: da analyze - none!
112 ; CHECK: da analyze - none!
113 ; CHECK: da analyze - confused!
114 ; CHECK: da analyze - none!
115 ; CHECK: da analyze - confused!
116 ; CHECK: da analyze - none!
117
118 for.body:                                         ; preds = %entry, %for.body
119   %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
120   %conv = trunc i64 %i.03 to i32
121   %mul = mul nsw i64 %i.03, 11
122   %sub = add nsw i64 %mul, -45
123   %arrayidx = getelementptr inbounds i32* %A, i64 %sub
124   store i32 %conv, i32* %arrayidx, align 4
125   %inc = add nsw i64 %i.03, 1
126   %exitcond4 = icmp ne i64 %inc, 6
127   br i1 %exitcond4, label %for.body, label %for.body4.preheader
128
129 for.body4.preheader:                              ; preds = %for.body
130   br label %for.body4
131
132 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
133   %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
134   %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
135   %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02
136   %0 = load i32* %arrayidx5, align 4
137   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
138   store i32 %0, i32* %B.addr.01, align 4
139   %inc7 = add nsw i64 %j.02, 1
140   %exitcond = icmp ne i64 %inc7, 10
141   br i1 %exitcond, label %for.body4, label %for.end8
142
143 for.end8:                                         ; preds = %for.body4
144   ret void
145 }
146
147
148 ;;  for (long int i = 0; i < 5; i++)
149 ;;    A[11*i - 45] = i;
150 ;;  for (long int j = 0; j <= 10; j++)
151 ;;    *B++ = A[j];
152
153 define void @rdiv3(i32* %A, i32* %B) nounwind uwtable ssp {
154 entry:
155   br label %for.body
156
157 ; CHECK: da analyze - none!
158 ; CHECK: da analyze - none!
159 ; CHECK: da analyze - confused!
160 ; CHECK: da analyze - none!
161 ; CHECK: da analyze - confused!
162 ; CHECK: da analyze - none!
163
164 for.body:                                         ; preds = %entry, %for.body
165   %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
166   %conv = trunc i64 %i.03 to i32
167   %mul = mul nsw i64 %i.03, 11
168   %sub = add nsw i64 %mul, -45
169   %arrayidx = getelementptr inbounds i32* %A, i64 %sub
170   store i32 %conv, i32* %arrayidx, align 4
171   %inc = add nsw i64 %i.03, 1
172   %exitcond4 = icmp ne i64 %inc, 5
173   br i1 %exitcond4, label %for.body, label %for.body4.preheader
174
175 for.body4.preheader:                              ; preds = %for.body
176   br label %for.body4
177
178 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
179   %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
180   %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
181   %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02
182   %0 = load i32* %arrayidx5, align 4
183   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
184   store i32 %0, i32* %B.addr.01, align 4
185   %inc7 = add nsw i64 %j.02, 1
186   %exitcond = icmp ne i64 %inc7, 11
187   br i1 %exitcond, label %for.body4, label %for.end8
188
189 for.end8:                                         ; preds = %for.body4
190   ret void
191 }
192
193
194 ;;  for (long int i = 0; i <= 5; i++)
195 ;;    A[11*i - 45] = i;
196 ;;  for (long int j = 0; j <= 10; j++)
197 ;;    *B++ = A[j];
198
199 define void @rdiv4(i32* %A, i32* %B) nounwind uwtable ssp {
200 entry:
201   br label %for.body
202
203 ; CHECK: da analyze - none!
204 ; CHECK: da analyze - flow!
205 ; CHECK: da analyze - confused!
206 ; CHECK: da analyze - none!
207 ; CHECK: da analyze - confused!
208 ; CHECK: da analyze - none!
209
210 for.body:                                         ; preds = %entry, %for.body
211   %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
212   %conv = trunc i64 %i.03 to i32
213   %mul = mul nsw i64 %i.03, 11
214   %sub = add nsw i64 %mul, -45
215   %arrayidx = getelementptr inbounds i32* %A, i64 %sub
216   store i32 %conv, i32* %arrayidx, align 4
217   %inc = add nsw i64 %i.03, 1
218   %exitcond4 = icmp ne i64 %inc, 6
219   br i1 %exitcond4, label %for.body, label %for.body4.preheader
220
221 for.body4.preheader:                              ; preds = %for.body
222   br label %for.body4
223
224 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
225   %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
226   %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
227   %arrayidx5 = getelementptr inbounds i32* %A, i64 %j.02
228   %0 = load i32* %arrayidx5, align 4
229   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
230   store i32 %0, i32* %B.addr.01, align 4
231   %inc7 = add nsw i64 %j.02, 1
232   %exitcond = icmp ne i64 %inc7, 11
233   br i1 %exitcond, label %for.body4, label %for.end8
234
235 for.end8:                                         ; preds = %for.body4
236   ret void
237 }
238
239
240 ;;  for (long int i = 0; i < 5; i++)
241 ;;    A[-11*i + 45] = i;
242 ;;  for (long int j = 0; j < 10; j++)
243 ;;    *B++ = A[-j];
244
245 define void @rdiv5(i32* %A, i32* %B) nounwind uwtable ssp {
246 entry:
247   br label %for.body
248
249 ; CHECK: da analyze - none!
250 ; CHECK: da analyze - none!
251 ; CHECK: da analyze - confused!
252 ; CHECK: da analyze - none!
253 ; CHECK: da analyze - confused!
254 ; CHECK: da analyze - none!
255
256 for.body:                                         ; preds = %entry, %for.body
257   %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
258   %conv = trunc i64 %i.03 to i32
259   %mul = mul nsw i64 %i.03, -11
260   %add = add nsw i64 %mul, 45
261   %arrayidx = getelementptr inbounds i32* %A, i64 %add
262   store i32 %conv, i32* %arrayidx, align 4
263   %inc = add nsw i64 %i.03, 1
264   %exitcond4 = icmp ne i64 %inc, 5
265   br i1 %exitcond4, label %for.body, label %for.body4.preheader
266
267 for.body4.preheader:                              ; preds = %for.body
268   br label %for.body4
269
270 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
271   %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
272   %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
273   %sub = sub nsw i64 0, %j.02
274   %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub
275   %0 = load i32* %arrayidx5, align 4
276   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
277   store i32 %0, i32* %B.addr.01, align 4
278   %inc7 = add nsw i64 %j.02, 1
279   %exitcond = icmp ne i64 %inc7, 10
280   br i1 %exitcond, label %for.body4, label %for.end8
281
282 for.end8:                                         ; preds = %for.body4
283   ret void
284 }
285
286
287 ;;  for (long int i = 0; i <= 5; i++)
288 ;;    A[-11*i + 45] = i;
289 ;;  for (long int j = 0; j < 10; j++)
290 ;;    *B++ = A[-j];
291
292 define void @rdiv6(i32* %A, i32* %B) nounwind uwtable ssp {
293 entry:
294   br label %for.body
295
296 ; CHECK: da analyze - none!
297 ; CHECK: da analyze - none!
298 ; CHECK: da analyze - confused!
299 ; CHECK: da analyze - none!
300 ; CHECK: da analyze - confused!
301 ; CHECK: da analyze - none!
302
303 for.body:                                         ; preds = %entry, %for.body
304   %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
305   %conv = trunc i64 %i.03 to i32
306   %mul = mul nsw i64 %i.03, -11
307   %add = add nsw i64 %mul, 45
308   %arrayidx = getelementptr inbounds i32* %A, i64 %add
309   store i32 %conv, i32* %arrayidx, align 4
310   %inc = add nsw i64 %i.03, 1
311   %exitcond4 = icmp ne i64 %inc, 6
312   br i1 %exitcond4, label %for.body, label %for.body4.preheader
313
314 for.body4.preheader:                              ; preds = %for.body
315   br label %for.body4
316
317 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
318   %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
319   %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
320   %sub = sub nsw i64 0, %j.02
321   %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub
322   %0 = load i32* %arrayidx5, align 4
323   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
324   store i32 %0, i32* %B.addr.01, align 4
325   %inc7 = add nsw i64 %j.02, 1
326   %exitcond = icmp ne i64 %inc7, 10
327   br i1 %exitcond, label %for.body4, label %for.end8
328
329 for.end8:                                         ; preds = %for.body4
330   ret void
331 }
332
333
334 ;;  for (long int i = 0; i < 5; i++)
335 ;;    A[-11*i + 45] = i;
336 ;;  for (long int j = 0; j <= 10; j++)
337 ;;    *B++ = A[-j];
338
339 define void @rdiv7(i32* %A, i32* %B) nounwind uwtable ssp {
340 entry:
341   br label %for.body
342
343 ; CHECK: da analyze - none!
344 ; CHECK: da analyze - none!
345 ; CHECK: da analyze - confused!
346 ; CHECK: da analyze - none!
347 ; CHECK: da analyze - confused!
348 ; CHECK: da analyze - none!
349
350 for.body:                                         ; preds = %entry, %for.body
351   %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
352   %conv = trunc i64 %i.03 to i32
353   %mul = mul nsw i64 %i.03, -11
354   %add = add nsw i64 %mul, 45
355   %arrayidx = getelementptr inbounds i32* %A, i64 %add
356   store i32 %conv, i32* %arrayidx, align 4
357   %inc = add nsw i64 %i.03, 1
358   %exitcond4 = icmp ne i64 %inc, 5
359   br i1 %exitcond4, label %for.body, label %for.body4.preheader
360
361 for.body4.preheader:                              ; preds = %for.body
362   br label %for.body4
363
364 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
365   %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
366   %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
367   %sub = sub nsw i64 0, %j.02
368   %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub
369   %0 = load i32* %arrayidx5, align 4
370   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
371   store i32 %0, i32* %B.addr.01, align 4
372   %inc7 = add nsw i64 %j.02, 1
373   %exitcond = icmp ne i64 %inc7, 11
374   br i1 %exitcond, label %for.body4, label %for.end8
375
376 for.end8:                                         ; preds = %for.body4
377   ret void
378 }
379
380
381 ;;  for (long int i = 0; i <= 5; i++)
382 ;;    A[-11*i + 45] = i;
383 ;;  for (long int j = 0; j <= 10; j++)
384 ;;    *B++ = A[-j];
385
386 define void @rdiv8(i32* %A, i32* %B) nounwind uwtable ssp {
387 entry:
388   br label %for.body
389
390 ; CHECK: da analyze - none!
391 ; CHECK: da analyze - flow!
392 ; CHECK: da analyze - confused!
393 ; CHECK: da analyze - none!
394 ; CHECK: da analyze - confused!
395 ; CHECK: da analyze - none!
396
397 for.body:                                         ; preds = %entry, %for.body
398   %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
399   %conv = trunc i64 %i.03 to i32
400   %mul = mul nsw i64 %i.03, -11
401   %add = add nsw i64 %mul, 45
402   %arrayidx = getelementptr inbounds i32* %A, i64 %add
403   store i32 %conv, i32* %arrayidx, align 4
404   %inc = add nsw i64 %i.03, 1
405   %exitcond4 = icmp ne i64 %inc, 6
406   br i1 %exitcond4, label %for.body, label %for.body4.preheader
407
408 for.body4.preheader:                              ; preds = %for.body
409   br label %for.body4
410
411 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
412   %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
413   %B.addr.01 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
414   %sub = sub nsw i64 0, %j.02
415   %arrayidx5 = getelementptr inbounds i32* %A, i64 %sub
416   %0 = load i32* %arrayidx5, align 4
417   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
418   store i32 %0, i32* %B.addr.01, align 4
419   %inc7 = add nsw i64 %j.02, 1
420   %exitcond = icmp ne i64 %inc7, 11
421   br i1 %exitcond, label %for.body4, label %for.end8
422
423 for.end8:                                         ; preds = %for.body4
424   ret void
425 }
426
427
428 ;;  for (long int i = 0; i < 5; i++)
429 ;;    for (long int j = 0; j < 10; j++) {
430 ;;      A[11*i - j] = i;
431 ;;      *B++ = A[45];
432
433 define void @rdiv9(i32* %A, i32* %B) nounwind uwtable ssp {
434 entry:
435   br label %for.cond1.preheader
436
437 ; CHECK: da analyze - none!
438 ; CHECK: da analyze - none!
439 ; CHECK: da analyze - confused!
440 ; CHECK: da analyze - consistent input [S S]!
441 ; CHECK: da analyze - confused!
442 ; CHECK: da analyze - none!
443
444 for.cond1.preheader:                              ; preds = %entry, %for.inc5
445   %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ]
446   %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ]
447   br label %for.body3
448
449 for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
450   %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
451   %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
452   %conv = trunc i64 %i.03 to i32
453   %mul = mul nsw i64 %i.03, 11
454   %sub = sub nsw i64 %mul, %j.02
455   %arrayidx = getelementptr inbounds i32* %A, i64 %sub
456   store i32 %conv, i32* %arrayidx, align 4
457   %arrayidx4 = getelementptr inbounds i32* %A, i64 45
458   %0 = load i32* %arrayidx4, align 4
459   %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
460   store i32 %0, i32* %B.addr.11, align 4
461   %inc = add nsw i64 %j.02, 1
462   %exitcond = icmp ne i64 %inc, 10
463   br i1 %exitcond, label %for.body3, label %for.inc5
464
465 for.inc5:                                         ; preds = %for.body3
466   %scevgep = getelementptr i32* %B.addr.04, i64 10
467   %inc6 = add nsw i64 %i.03, 1
468   %exitcond5 = icmp ne i64 %inc6, 5
469   br i1 %exitcond5, label %for.cond1.preheader, label %for.end7
470
471 for.end7:                                         ; preds = %for.inc5
472   ret void
473 }
474
475
476
477 ;;  for (long int i = 0; i <= 5; i++)
478 ;;    for (long int j = 0; j < 10; j++) {
479 ;;      A[11*i - j] = i;
480 ;;      *B++ = A[45];
481
482 define void @rdiv10(i32* %A, i32* %B) nounwind uwtable ssp {
483 entry:
484   br label %for.cond1.preheader
485
486 ; CHECK: da analyze - none!
487 ; CHECK: da analyze - none!
488 ; CHECK: da analyze - confused!
489 ; CHECK: da analyze - consistent input [S S]!
490 ; CHECK: da analyze - confused!
491 ; CHECK: da analyze - none!
492
493 for.cond1.preheader:                              ; preds = %entry, %for.inc5
494   %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ]
495   %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ]
496   br label %for.body3
497
498 for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
499   %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
500   %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
501   %conv = trunc i64 %i.03 to i32
502   %mul = mul nsw i64 %i.03, 11
503   %sub = sub nsw i64 %mul, %j.02
504   %arrayidx = getelementptr inbounds i32* %A, i64 %sub
505   store i32 %conv, i32* %arrayidx, align 4
506   %arrayidx4 = getelementptr inbounds i32* %A, i64 45
507   %0 = load i32* %arrayidx4, align 4
508   %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
509   store i32 %0, i32* %B.addr.11, align 4
510   %inc = add nsw i64 %j.02, 1
511   %exitcond = icmp ne i64 %inc, 10
512   br i1 %exitcond, label %for.body3, label %for.inc5
513
514 for.inc5:                                         ; preds = %for.body3
515   %scevgep = getelementptr i32* %B.addr.04, i64 10
516   %inc6 = add nsw i64 %i.03, 1
517   %exitcond5 = icmp ne i64 %inc6, 6
518   br i1 %exitcond5, label %for.cond1.preheader, label %for.end7
519
520 for.end7:                                         ; preds = %for.inc5
521   ret void
522 }
523
524
525 ;;  for (long int i = 0; i < 5; i++)
526 ;;    for (long int j = 0; j <= 10; j++) {
527 ;;      A[11*i - j] = i;
528 ;;      *B++ = A[45];
529
530 define void @rdiv11(i32* %A, i32* %B) nounwind uwtable ssp {
531 entry:
532   br label %for.cond1.preheader
533
534 ; CHECK: da analyze - none!
535 ; CHECK: da analyze - none!
536 ; CHECK: da analyze - confused!
537 ; CHECK: da analyze - consistent input [S S]!
538 ; CHECK: da analyze - confused!
539 ; CHECK: da analyze - none!
540
541 for.cond1.preheader:                              ; preds = %entry, %for.inc5
542   %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ]
543   %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ]
544   br label %for.body3
545
546 for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
547   %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
548   %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
549   %conv = trunc i64 %i.03 to i32
550   %mul = mul nsw i64 %i.03, 11
551   %sub = sub nsw i64 %mul, %j.02
552   %arrayidx = getelementptr inbounds i32* %A, i64 %sub
553   store i32 %conv, i32* %arrayidx, align 4
554   %arrayidx4 = getelementptr inbounds i32* %A, i64 45
555   %0 = load i32* %arrayidx4, align 4
556   %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
557   store i32 %0, i32* %B.addr.11, align 4
558   %inc = add nsw i64 %j.02, 1
559   %exitcond = icmp ne i64 %inc, 11
560   br i1 %exitcond, label %for.body3, label %for.inc5
561
562 for.inc5:                                         ; preds = %for.body3
563   %scevgep = getelementptr i32* %B.addr.04, i64 11
564   %inc6 = add nsw i64 %i.03, 1
565   %exitcond5 = icmp ne i64 %inc6, 5
566   br i1 %exitcond5, label %for.cond1.preheader, label %for.end7
567
568 for.end7:                                         ; preds = %for.inc5
569   ret void
570 }
571
572
573 ;;  for (long int i = 0; i <= 5; i++)
574 ;;    for (long int j = 0; j <= 10; j++) {
575 ;;      A[11*i - j] = i;
576 ;;      *B++ = A[45];
577
578 define void @rdiv12(i32* %A, i32* %B) nounwind uwtable ssp {
579 entry:
580   br label %for.cond1.preheader
581
582 ; CHECK: da analyze - none!
583 ; CHECK: da analyze - flow [* *|<]!
584 ; CHECK: da analyze - confused!
585 ; CHECK: da analyze - consistent input [S S]!
586 ; CHECK: da analyze - confused!
587 ; CHECK: da analyze - none!
588
589 for.cond1.preheader:                              ; preds = %entry, %for.inc5
590   %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc5 ]
591   %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ]
592   br label %for.body3
593
594 for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
595   %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
596   %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
597   %conv = trunc i64 %i.03 to i32
598   %mul = mul nsw i64 %i.03, 11
599   %sub = sub nsw i64 %mul, %j.02
600   %arrayidx = getelementptr inbounds i32* %A, i64 %sub
601   store i32 %conv, i32* %arrayidx, align 4
602   %arrayidx4 = getelementptr inbounds i32* %A, i64 45
603   %0 = load i32* %arrayidx4, align 4
604   %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
605   store i32 %0, i32* %B.addr.11, align 4
606   %inc = add nsw i64 %j.02, 1
607   %exitcond = icmp ne i64 %inc, 11
608   br i1 %exitcond, label %for.body3, label %for.inc5
609
610 for.inc5:                                         ; preds = %for.body3
611   %scevgep = getelementptr i32* %B.addr.04, i64 11
612   %inc6 = add nsw i64 %i.03, 1
613   %exitcond5 = icmp ne i64 %inc6, 6
614   br i1 %exitcond5, label %for.cond1.preheader, label %for.end7
615
616 for.end7:                                         ; preds = %for.inc5
617   ret void
618 }