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