ScalarEvolution: Derive element size from the type of the loaded element
[oota-llvm.git] / test / Analysis / DependenceAnalysis / ExactSIV.ll
1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
2
3 ; ModuleID = 'ExactSIV.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 unsigned i = 0; i < 10; i++) {
9 ;;    A[i + 10] = i;
10 ;;    *B++ = A[2*i + 1];
11
12 define void @exact0(i32* %A, i32* %B) nounwind uwtable ssp {
13 entry:
14   br label %for.body
15
16 ; CHECK: da analyze - none!
17 ; CHECK: da analyze - flow [<=|<]!
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   %add = add i64 %i.02, 10
28   %arrayidx = getelementptr inbounds i32* %A, i64 %add
29   store i32 %conv, i32* %arrayidx, align 4
30   %mul = shl i64 %i.02, 1
31   %add13 = or i64 %mul, 1
32   %arrayidx2 = getelementptr inbounds i32* %A, i64 %add13
33   %0 = load i32* %arrayidx2, align 4
34   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
35   store i32 %0, i32* %B.addr.01, align 4
36   %inc = add i64 %i.02, 1
37   %exitcond = icmp ne i64 %inc, 10
38   br i1 %exitcond, label %for.body, label %for.end
39
40 for.end:                                          ; preds = %for.body
41   ret void
42 }
43
44
45 ;;  for (long unsigned i = 0; i < 10; i++) {
46 ;;    A[4*i + 10] = i;
47 ;;    *B++ = A[2*i + 1];
48
49 define void @exact1(i32* %A, i32* %B) nounwind uwtable ssp {
50 entry:
51   br label %for.body
52
53 ; CHECK: da analyze - none!
54 ; CHECK: da analyze - none!
55 ; CHECK: da analyze - confused!
56 ; CHECK: da analyze - none!
57 ; CHECK: da analyze - confused!
58 ; CHECK: da analyze - none!
59
60 for.body:                                         ; preds = %entry, %for.body
61   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
62   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
63   %conv = trunc i64 %i.02 to i32
64   %mul = shl i64 %i.02, 2
65   %add = add i64 %mul, 10
66   %arrayidx = getelementptr inbounds i32* %A, i64 %add
67   store i32 %conv, i32* %arrayidx, align 4
68   %mul1 = shl i64 %i.02, 1
69   %add23 = or i64 %mul1, 1
70   %arrayidx3 = getelementptr inbounds i32* %A, i64 %add23
71   %0 = load i32* %arrayidx3, align 4
72   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
73   store i32 %0, i32* %B.addr.01, align 4
74   %inc = add i64 %i.02, 1
75   %exitcond = icmp ne i64 %inc, 10
76   br i1 %exitcond, label %for.body, label %for.end
77
78 for.end:                                          ; preds = %for.body
79   ret void
80 }
81
82
83 ;;  for (long unsigned i = 0; i < 10; i++) {
84 ;;    A[6*i] = i;
85 ;;    *B++ = A[i + 60];
86
87 define void @exact2(i32* %A, i32* %B) nounwind uwtable ssp {
88 entry:
89   br label %for.body
90
91 ; CHECK: da analyze - none!
92 ; CHECK: da analyze - none!
93 ; CHECK: da analyze - confused!
94 ; CHECK: da analyze - none!
95 ; CHECK: da analyze - confused!
96 ; CHECK: da analyze - none!
97
98 for.body:                                         ; preds = %entry, %for.body
99   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
100   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
101   %conv = trunc i64 %i.02 to i32
102   %mul = mul i64 %i.02, 6
103   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
104   store i32 %conv, i32* %arrayidx, align 4
105   %add = add i64 %i.02, 60
106   %arrayidx1 = getelementptr inbounds i32* %A, i64 %add
107   %0 = load i32* %arrayidx1, align 4
108   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
109   store i32 %0, i32* %B.addr.01, align 4
110   %inc = add i64 %i.02, 1
111   %exitcond = icmp ne i64 %inc, 10
112   br i1 %exitcond, label %for.body, label %for.end
113
114 for.end:                                          ; preds = %for.body
115   ret void
116 }
117
118
119 ;;  for (long unsigned i = 0; i <= 10; i++) {
120 ;;    A[6*i] = i;
121 ;;    *B++ = A[i + 60];
122
123 define void @exact3(i32* %A, i32* %B) nounwind uwtable ssp {
124 entry:
125   br label %for.body
126
127 ; CHECK: da analyze - none!
128 ; CHECK: da analyze - flow [>]!
129 ; CHECK: da analyze - confused!
130 ; CHECK: da analyze - none!
131 ; CHECK: da analyze - confused!
132 ; CHECK: da analyze - none!
133
134 for.body:                                         ; preds = %entry, %for.body
135   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
136   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
137   %conv = trunc i64 %i.02 to i32
138   %mul = mul i64 %i.02, 6
139   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
140   store i32 %conv, i32* %arrayidx, align 4
141   %add = add i64 %i.02, 60
142   %arrayidx1 = getelementptr inbounds i32* %A, i64 %add
143   %0 = load i32* %arrayidx1, align 4
144   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
145   store i32 %0, i32* %B.addr.01, align 4
146   %inc = add i64 %i.02, 1
147   %exitcond = icmp ne i64 %inc, 11
148   br i1 %exitcond, label %for.body, label %for.end
149
150 for.end:                                          ; preds = %for.body
151   ret void
152 }
153
154
155 ;;  for (long unsigned i = 0; i < 12; i++) {
156 ;;    A[6*i] = i;
157 ;;    *B++ = A[i + 60];
158
159 define void @exact4(i32* %A, i32* %B) nounwind uwtable ssp {
160 entry:
161   br label %for.body
162
163 ; CHECK: da analyze - none!
164 ; CHECK: da analyze - flow [>]!
165 ; CHECK: da analyze - confused!
166 ; CHECK: da analyze - none!
167 ; CHECK: da analyze - confused!
168 ; CHECK: da analyze - none!
169
170 for.body:                                         ; preds = %entry, %for.body
171   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
172   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
173   %conv = trunc i64 %i.02 to i32
174   %mul = mul i64 %i.02, 6
175   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
176   store i32 %conv, i32* %arrayidx, align 4
177   %add = add i64 %i.02, 60
178   %arrayidx1 = getelementptr inbounds i32* %A, i64 %add
179   %0 = load i32* %arrayidx1, align 4
180   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
181   store i32 %0, i32* %B.addr.01, align 4
182   %inc = add i64 %i.02, 1
183   %exitcond = icmp ne i64 %inc, 12
184   br i1 %exitcond, label %for.body, label %for.end
185
186 for.end:                                          ; preds = %for.body
187   ret void
188 }
189
190
191 ;;  for (long unsigned i = 0; i <= 12; i++) {
192 ;;    A[6*i] = i;
193 ;;    *B++ = A[i + 60];
194
195 define void @exact5(i32* %A, i32* %B) nounwind uwtable ssp {
196 entry:
197   br label %for.body
198
199 ; CHECK: da analyze - none!
200 ; CHECK: da analyze - flow [=>|<]!
201 ; CHECK: da analyze - confused!
202 ; CHECK: da analyze - none!
203 ; CHECK: da analyze - confused!
204 ; CHECK: da analyze - none!
205
206 for.body:                                         ; preds = %entry, %for.body
207   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
208   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
209   %conv = trunc i64 %i.02 to i32
210   %mul = mul i64 %i.02, 6
211   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
212   store i32 %conv, i32* %arrayidx, align 4
213   %add = add i64 %i.02, 60
214   %arrayidx1 = getelementptr inbounds i32* %A, i64 %add
215   %0 = load i32* %arrayidx1, align 4
216   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
217   store i32 %0, i32* %B.addr.01, align 4
218   %inc = add i64 %i.02, 1
219   %exitcond = icmp ne i64 %inc, 13
220   br i1 %exitcond, label %for.body, label %for.end
221
222 for.end:                                          ; preds = %for.body
223   ret void
224 }
225
226
227 ;;  for (long unsigned i = 0; i < 18; i++) {
228 ;;    A[6*i] = i;
229 ;;    *B++ = A[i + 60];
230
231 define void @exact6(i32* %A, i32* %B) nounwind uwtable ssp {
232 entry:
233   br label %for.body
234
235 ; CHECK: da analyze - none!
236 ; CHECK: da analyze - flow [=>|<]!
237 ; CHECK: da analyze - confused!
238 ; CHECK: da analyze - none!
239 ; CHECK: da analyze - confused!
240 ; CHECK: da analyze - none!
241
242 for.body:                                         ; preds = %entry, %for.body
243   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
244   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
245   %conv = trunc i64 %i.02 to i32
246   %mul = mul i64 %i.02, 6
247   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
248   store i32 %conv, i32* %arrayidx, align 4
249   %add = add i64 %i.02, 60
250   %arrayidx1 = getelementptr inbounds i32* %A, i64 %add
251   %0 = load i32* %arrayidx1, align 4
252   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
253   store i32 %0, i32* %B.addr.01, align 4
254   %inc = add i64 %i.02, 1
255   %exitcond = icmp ne i64 %inc, 18
256   br i1 %exitcond, label %for.body, label %for.end
257
258 for.end:                                          ; preds = %for.body
259   ret void
260 }
261
262
263 ;;  for (long unsigned i = 0; i <= 18; i++) {
264 ;;    A[6*i] = i;
265 ;;    *B++ = A[i + 60];
266
267 define void @exact7(i32* %A, i32* %B) nounwind uwtable ssp {
268 entry:
269   br label %for.body
270
271 ; CHECK: da analyze - none!
272 ; CHECK: da analyze - flow [*|<]!
273 ; CHECK: da analyze - confused!
274 ; CHECK: da analyze - none!
275 ; CHECK: da analyze - confused!
276 ; CHECK: da analyze - none!
277
278 for.body:                                         ; preds = %entry, %for.body
279   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
280   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
281   %conv = trunc i64 %i.02 to i32
282   %mul = mul i64 %i.02, 6
283   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
284   store i32 %conv, i32* %arrayidx, align 4
285   %add = add i64 %i.02, 60
286   %arrayidx1 = getelementptr inbounds i32* %A, i64 %add
287   %0 = load i32* %arrayidx1, align 4
288   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
289   store i32 %0, i32* %B.addr.01, align 4
290   %inc = add i64 %i.02, 1
291   %exitcond = icmp ne i64 %inc, 19
292   br i1 %exitcond, label %for.body, label %for.end
293
294 for.end:                                          ; preds = %for.body
295   ret void
296 }
297
298
299 ;;  for (long unsigned i = 0; i < 10; i++) {
300 ;;    A[-6*i] = i;
301 ;;    *B++ = A[-i - 60];
302
303 define void @exact8(i32* %A, i32* %B) nounwind uwtable ssp {
304 entry:
305   br label %for.body
306
307 ; CHECK: da analyze - none!
308 ; CHECK: da analyze - none!
309 ; CHECK: da analyze - confused!
310 ; CHECK: da analyze - none!
311 ; CHECK: da analyze - confused!
312 ; CHECK: da analyze - none!
313
314 for.body:                                         ; preds = %entry, %for.body
315   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
316   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
317   %conv = trunc i64 %i.02 to i32
318   %mul = mul i64 %i.02, -6
319   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
320   store i32 %conv, i32* %arrayidx, align 4
321   %sub1 = sub i64 -60, %i.02
322   %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1
323   %0 = load i32* %arrayidx2, align 4
324   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
325   store i32 %0, i32* %B.addr.01, align 4
326   %inc = add i64 %i.02, 1
327   %exitcond = icmp ne i64 %inc, 10
328   br i1 %exitcond, label %for.body, label %for.end
329
330 for.end:                                          ; preds = %for.body
331   ret void
332 }
333
334
335 ;;  for (long unsigned i = 0; i <= 10; i++) {
336 ;;    A[-6*i] = i;
337 ;;    *B++ = A[-i - 60];
338
339 define void @exact9(i32* %A, i32* %B) nounwind uwtable ssp {
340 entry:
341   br label %for.body
342
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
350 for.body:                                         ; preds = %entry, %for.body
351   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
352   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
353   %conv = trunc i64 %i.02 to i32
354   %mul = mul i64 %i.02, -6
355   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
356   store i32 %conv, i32* %arrayidx, align 4
357   %sub1 = sub i64 -60, %i.02
358   %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1
359   %0 = load i32* %arrayidx2, align 4
360   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
361   store i32 %0, i32* %B.addr.01, align 4
362   %inc = add i64 %i.02, 1
363   %exitcond = icmp ne i64 %inc, 11
364   br i1 %exitcond, label %for.body, label %for.end
365
366 for.end:                                          ; preds = %for.body
367   ret void
368 }
369
370
371 ;;  for (long unsigned i = 0; i < 12; i++) {
372 ;;    A[-6*i] = i;
373 ;;    *B++ = A[-i - 60];
374
375 define void @exact10(i32* %A, i32* %B) nounwind uwtable ssp {
376 entry:
377   br label %for.body
378
379 ; CHECK: da analyze - none!
380 ; CHECK: da analyze - flow [>]!
381 ; CHECK: da analyze - confused!
382 ; CHECK: da analyze - none!
383 ; CHECK: da analyze - confused!
384 ; CHECK: da analyze - none!
385
386 for.body:                                         ; preds = %entry, %for.body
387   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
388   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
389   %conv = trunc i64 %i.02 to i32
390   %mul = mul i64 %i.02, -6
391   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
392   store i32 %conv, i32* %arrayidx, align 4
393   %sub1 = sub i64 -60, %i.02
394   %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1
395   %0 = load i32* %arrayidx2, align 4
396   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
397   store i32 %0, i32* %B.addr.01, align 4
398   %inc = add i64 %i.02, 1
399   %exitcond = icmp ne i64 %inc, 12
400   br i1 %exitcond, label %for.body, label %for.end
401
402 for.end:                                          ; preds = %for.body
403   ret void
404 }
405
406
407 ;;  for (long unsigned i = 0; i <= 12; i++) {
408 ;;    A[-6*i] = i;
409 ;;    *B++ = A[-i - 60];
410
411 define void @exact11(i32* %A, i32* %B) nounwind uwtable ssp {
412 entry:
413   br label %for.body
414
415 ; CHECK: da analyze - none!
416 ; CHECK: da analyze - flow [=>|<]!
417 ; CHECK: da analyze - confused!
418 ; CHECK: da analyze - none!
419 ; CHECK: da analyze - confused!
420 ; CHECK: da analyze - none!
421
422 for.body:                                         ; preds = %entry, %for.body
423   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
424   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
425   %conv = trunc i64 %i.02 to i32
426   %mul = mul i64 %i.02, -6
427   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
428   store i32 %conv, i32* %arrayidx, align 4
429   %sub1 = sub i64 -60, %i.02
430   %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1
431   %0 = load i32* %arrayidx2, align 4
432   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
433   store i32 %0, i32* %B.addr.01, align 4
434   %inc = add i64 %i.02, 1
435   %exitcond = icmp ne i64 %inc, 13
436   br i1 %exitcond, label %for.body, label %for.end
437
438 for.end:                                          ; preds = %for.body
439   ret void
440 }
441
442
443 ;;  for (long unsigned i = 0; i < 18; i++) {
444 ;;    A[-6*i] = i;
445 ;;    *B++ = A[-i - 60];
446
447 define void @exact12(i32* %A, i32* %B) nounwind uwtable ssp {
448 entry:
449   br label %for.body
450
451 ; CHECK: da analyze - none!
452 ; CHECK: da analyze - flow [=>|<]!
453 ; CHECK: da analyze - confused!
454 ; CHECK: da analyze - none!
455 ; CHECK: da analyze - confused!
456 ; CHECK: da analyze - none!
457
458 for.body:                                         ; preds = %entry, %for.body
459   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
460   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
461   %conv = trunc i64 %i.02 to i32
462   %mul = mul i64 %i.02, -6
463   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
464   store i32 %conv, i32* %arrayidx, align 4
465   %sub1 = sub i64 -60, %i.02
466   %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1
467   %0 = load i32* %arrayidx2, align 4
468   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
469   store i32 %0, i32* %B.addr.01, align 4
470   %inc = add i64 %i.02, 1
471   %exitcond = icmp ne i64 %inc, 18
472   br i1 %exitcond, label %for.body, label %for.end
473
474 for.end:                                          ; preds = %for.body
475   ret void
476 }
477
478
479 ;;  for (long unsigned i = 0; i <= 18; i++) {
480 ;;    A[-6*i] = i;
481 ;;    *B++ = A[-i - 60];
482
483 define void @exact13(i32* %A, i32* %B) nounwind uwtable ssp {
484 entry:
485   br label %for.body
486
487 ; CHECK: da analyze - none!
488 ; CHECK: da analyze - flow [*|<]!
489 ; CHECK: da analyze - confused!
490 ; CHECK: da analyze - none!
491 ; CHECK: da analyze - confused!
492 ; CHECK: da analyze - none!
493
494 for.body:                                         ; preds = %entry, %for.body
495   %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
496   %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
497   %conv = trunc i64 %i.02 to i32
498   %mul = mul i64 %i.02, -6
499   %arrayidx = getelementptr inbounds i32* %A, i64 %mul
500   store i32 %conv, i32* %arrayidx, align 4
501   %sub1 = sub i64 -60, %i.02
502   %arrayidx2 = getelementptr inbounds i32* %A, i64 %sub1
503   %0 = load i32* %arrayidx2, align 4
504   %incdec.ptr = getelementptr inbounds i32* %B.addr.01, i64 1
505   store i32 %0, i32* %B.addr.01, align 4
506   %inc = add i64 %i.02, 1
507   %exitcond = icmp ne i64 %inc, 19
508   br i1 %exitcond, label %for.body, label %for.end
509
510 for.end:                                          ; preds = %for.body
511   ret void
512 }