• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
2
3; ModuleID = 'SymbolicSIV.bc'
4target 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"
5target triple = "x86_64-apple-macosx10.6.0"
6
7
8;;  for (long int i = 0; i < n; i++) {
9;;    A[2*i + n] = i;
10;;    *B++ = A[3*i + 3*n];
11
12define void @symbolicsiv0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
13entry:
14  %cmp1 = icmp eq i64 %n, 0
15  br i1 %cmp1, label %for.end, label %for.body.preheader
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
24for.body.preheader:                               ; preds = %entry
25  br label %for.body
26
27for.body:                                         ; preds = %for.body.preheader, %for.body
28  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
29  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
30  %conv = trunc i64 %i.03 to i32
31  %mul = shl nsw i64 %i.03, 1
32  %add = add i64 %mul, %n
33  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
34  store i32 %conv, i32* %arrayidx, align 4
35  %mul14 = add i64 %i.03, %n
36  %add3 = mul i64 %mul14, 3
37  %arrayidx4 = getelementptr inbounds i32, i32* %A, i64 %add3
38  %0 = load i32, i32* %arrayidx4, align 4
39  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
40  store i32 %0, i32* %B.addr.02, align 4
41  %inc = add nsw i64 %i.03, 1
42  %exitcond = icmp ne i64 %inc, %n
43  br i1 %exitcond, label %for.body, label %for.end.loopexit
44
45for.end.loopexit:                                 ; preds = %for.body
46  br label %for.end
47
48for.end:                                          ; preds = %for.end.loopexit, %entry
49  ret void
50}
51
52
53;;  for (long int i = 0; i < n; i++) {
54;;    A[2*i + 5*n] = i;
55;;    *B++ = A[3*i + 2*n];
56
57define void @symbolicsiv1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
58entry:
59  %cmp1 = icmp eq i64 %n, 0
60  br i1 %cmp1, label %for.end, label %for.body.preheader
61
62; CHECK: da analyze - none!
63; CHECK: da analyze - none!
64; CHECK: da analyze - confused!
65; CHECK: da analyze - none!
66; CHECK: da analyze - confused!
67; CHECK: da analyze - none!
68
69for.body.preheader:                               ; preds = %entry
70  br label %for.body
71
72for.body:                                         ; preds = %for.body.preheader, %for.body
73  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
74  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
75  %conv = trunc i64 %i.03 to i32
76  %mul = shl nsw i64 %i.03, 1
77  %mul1 = mul i64 %n, 5
78  %add = add i64 %mul, %mul1
79  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
80  store i32 %conv, i32* %arrayidx, align 4
81  %mul2 = mul nsw i64 %i.03, 3
82  %mul3 = shl i64 %n, 1
83  %add4 = add i64 %mul2, %mul3
84  %arrayidx5 = getelementptr inbounds i32, i32* %A, i64 %add4
85  %0 = load i32, i32* %arrayidx5, align 4
86  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
87  store i32 %0, i32* %B.addr.02, align 4
88  %inc = add nsw i64 %i.03, 1
89  %exitcond = icmp ne i64 %inc, %n
90  br i1 %exitcond, label %for.body, label %for.end.loopexit
91
92for.end.loopexit:                                 ; preds = %for.body
93  br label %for.end
94
95for.end:                                          ; preds = %for.end.loopexit, %entry
96  ret void
97}
98
99
100;;  for (long int i = 0; i < n; i++) {
101;;    A[2*i - n] = i;
102;;    *B++ = A[-i + 2*n];
103
104define void @symbolicsiv2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
105entry:
106  %cmp1 = icmp eq i64 %n, 0
107  br i1 %cmp1, label %for.end, label %for.body.preheader
108
109; CHECK: da analyze - none!
110; CHECK: da analyze - none!
111; CHECK: da analyze - confused!
112; CHECK: da analyze - none!
113; CHECK: da analyze - confused!
114; CHECK: da analyze - none!
115
116for.body.preheader:                               ; preds = %entry
117  br label %for.body
118
119for.body:                                         ; preds = %for.body.preheader, %for.body
120  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
121  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
122  %conv = trunc i64 %i.03 to i32
123  %mul = shl nsw i64 %i.03, 1
124  %sub = sub i64 %mul, %n
125  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %sub
126  store i32 %conv, i32* %arrayidx, align 4
127  %mul2 = shl i64 %n, 1
128  %add = sub i64 %mul2, %i.03
129  %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %add
130  %0 = load i32, i32* %arrayidx3, align 4
131  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
132  store i32 %0, i32* %B.addr.02, align 4
133  %inc = add nsw i64 %i.03, 1
134  %exitcond = icmp ne i64 %inc, %n
135  br i1 %exitcond, label %for.body, label %for.end.loopexit
136
137for.end.loopexit:                                 ; preds = %for.body
138  br label %for.end
139
140for.end:                                          ; preds = %for.end.loopexit, %entry
141  ret void
142}
143
144
145;;  for (long int i = 0; i < n; i++) {
146;;    A[-2*i + n + 1] = i;
147;;    *B++ = A[i - 2*n];
148
149define void @symbolicsiv3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
150entry:
151  %cmp1 = icmp eq i64 %n, 0
152  br i1 %cmp1, label %for.end, label %for.body.preheader
153
154; CHECK: da analyze - none!
155; CHECK: da analyze - none!
156; CHECK: da analyze - confused!
157; CHECK: da analyze - none!
158; CHECK: da analyze - confused!
159; CHECK: da analyze - none!
160
161for.body.preheader:                               ; preds = %entry
162  br label %for.body
163
164for.body:                                         ; preds = %for.body.preheader, %for.body
165  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
166  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
167  %conv = trunc i64 %i.03 to i32
168  %mul = mul nsw i64 %i.03, -2
169  %add = add i64 %mul, %n
170  %add1 = add i64 %add, 1
171  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add1
172  store i32 %conv, i32* %arrayidx, align 4
173  %mul2 = shl i64 %n, 1
174  %sub = sub i64 %i.03, %mul2
175  %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %sub
176  %0 = load i32, i32* %arrayidx3, align 4
177  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
178  store i32 %0, i32* %B.addr.02, align 4
179  %inc = add nsw i64 %i.03, 1
180  %exitcond = icmp ne i64 %inc, %n
181  br i1 %exitcond, label %for.body, label %for.end.loopexit
182
183for.end.loopexit:                                 ; preds = %for.body
184  br label %for.end
185
186for.end:                                          ; preds = %for.end.loopexit, %entry
187  ret void
188}
189
190
191;;  for (long int i = 0; i < n; i++) {
192;;    A[-2*i + 3*n] = i;
193;;    *B++ = A[-i + n];
194
195define void @symbolicsiv4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
196entry:
197  %cmp1 = icmp eq i64 %n, 0
198  br i1 %cmp1, label %for.end, label %for.body.preheader
199
200; CHECK: da analyze - none!
201; CHECK: da analyze - none!
202; CHECK: da analyze - confused!
203; CHECK: da analyze - none!
204; CHECK: da analyze - confused!
205; CHECK: da analyze - none!
206
207for.body.preheader:                               ; preds = %entry
208  br label %for.body
209
210for.body:                                         ; preds = %for.body.preheader, %for.body
211  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
212  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
213  %conv = trunc i64 %i.03 to i32
214  %mul = mul nsw i64 %i.03, -2
215  %mul1 = mul i64 %n, 3
216  %add = add i64 %mul, %mul1
217  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
218  store i32 %conv, i32* %arrayidx, align 4
219  %add2 = sub i64 %n, %i.03
220  %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %add2
221  %0 = load i32, i32* %arrayidx3, align 4
222  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
223  store i32 %0, i32* %B.addr.02, align 4
224  %inc = add nsw i64 %i.03, 1
225  %exitcond = icmp ne i64 %inc, %n
226  br i1 %exitcond, label %for.body, label %for.end.loopexit
227
228for.end.loopexit:                                 ; preds = %for.body
229  br label %for.end
230
231for.end:                                          ; preds = %for.end.loopexit, %entry
232  ret void
233}
234
235
236;;  for (long int i = 0; i < n; i++) {
237;;    A[-2*i - 2*n] = i;
238;;    *B++ = A[-i - n];
239
240define void @symbolicsiv5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
241entry:
242  %cmp1 = icmp eq i64 %n, 0
243  br i1 %cmp1, label %for.end, label %for.body.preheader
244
245; CHECK: da analyze - none!
246; CHECK: da analyze - none!
247; CHECK: da analyze - confused!
248; CHECK: da analyze - none!
249; CHECK: da analyze - confused!
250; CHECK: da analyze - none!
251
252for.body.preheader:                               ; preds = %entry
253  br label %for.body
254
255for.body:                                         ; preds = %for.body.preheader, %for.body
256  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
257  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
258  %conv = trunc i64 %i.03 to i32
259  %mul = mul nsw i64 %i.03, -2
260  %mul1 = shl i64 %n, 1
261  %sub = sub i64 %mul, %mul1
262  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %sub
263  store i32 %conv, i32* %arrayidx, align 4
264  %sub2 = sub nsw i64 0, %i.03
265  %sub3 = sub i64 %sub2, %n
266  %arrayidx4 = getelementptr inbounds i32, i32* %A, i64 %sub3
267  %0 = load i32, i32* %arrayidx4, align 4
268  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
269  store i32 %0, i32* %B.addr.02, align 4
270  %inc = add nsw i64 %i.03, 1
271  %exitcond = icmp ne i64 %inc, %n
272  br i1 %exitcond, label %for.body, label %for.end.loopexit
273
274for.end.loopexit:                                 ; preds = %for.body
275  br label %for.end
276
277for.end:                                          ; preds = %for.end.loopexit, %entry
278  ret void
279}
280
281
282;; why doesn't SCEV package understand that n >= 0?
283;;  for (long unsigned i = 0; i < n; i++) {
284;;    A[i + n + 1] = i;
285;;    *B++ = A[-i];
286
287define void @weaktest(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
288entry:
289  %cmp1 = icmp eq i64 %n, 0
290  br i1 %cmp1, label %for.end, label %for.body.preheader
291
292; CHECK: da analyze - none!
293; CHECK: da analyze - flow [*|<] splitable!
294; CHECK: da analyze - split level = 1, iteration = ((0 smax (-1 + (-1 * %n))) /u 2)!
295; CHECK: da analyze - confused!
296; CHECK: da analyze - none!
297; CHECK: da analyze - confused!
298; CHECK: da analyze - none!
299
300for.body.preheader:                               ; preds = %entry
301  br label %for.body
302
303for.body:                                         ; preds = %for.body.preheader, %for.body
304  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
305  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
306  %conv = trunc i64 %i.03 to i32
307  %add = add i64 %i.03, %n
308  %add1 = add i64 %add, 1
309  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add1
310  store i32 %conv, i32* %arrayidx, align 4
311  %sub = sub i64 0, %i.03
312  %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
313  %0 = load i32, i32* %arrayidx2, align 4
314  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
315  store i32 %0, i32* %B.addr.02, align 4
316  %inc = add i64 %i.03, 1
317  %exitcond = icmp ne i64 %inc, %n
318  br i1 %exitcond, label %for.body, label %for.end.loopexit
319
320for.end.loopexit:                                 ; preds = %for.body
321  br label %for.end
322
323for.end:                                          ; preds = %for.end.loopexit, %entry
324  ret void
325}
326
327
328;;  for (long int i = 0; i < n; i++) {
329;;    A[4*N*i + M] = i;
330;;    *B++ = A[4*N*i + 3*M + 1];
331
332define void @symbolicsiv6(i32* %A, i32* %B, i64 %n, i64 %N, i64 %M) nounwind uwtable ssp {
333entry:
334  %cmp1 = icmp eq i64 %n, 0
335  br i1 %cmp1, label %for.end, label %for.body.preheader
336
337; CHECK: da analyze - none!
338; CHECK: da analyze - none!
339; CHECK: da analyze - confused!
340; CHECK: da analyze - none!
341; CHECK: da analyze - confused!
342; CHECK: da analyze - none!
343
344for.body.preheader:                               ; preds = %entry
345  br label %for.body
346
347for.body:                                         ; preds = %for.body.preheader, %for.body
348  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
349  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
350  %conv = trunc i64 %i.03 to i32
351  %mul = shl i64 %N, 2
352  %mul1 = mul i64 %mul, %i.03
353  %add = add i64 %mul1, %M
354  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
355  store i32 %conv, i32* %arrayidx, align 4
356  %mul2 = shl i64 %N, 2
357  %mul3 = mul i64 %mul2, %i.03
358  %mul4 = mul i64 %M, 3
359  %add5 = add i64 %mul3, %mul4
360  %add6 = add i64 %add5, 1
361  %arrayidx7 = getelementptr inbounds i32, i32* %A, i64 %add6
362  %0 = load i32, i32* %arrayidx7, align 4
363  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
364  store i32 %0, i32* %B.addr.02, align 4
365  %inc = add nsw i64 %i.03, 1
366  %exitcond = icmp ne i64 %inc, %n
367  br i1 %exitcond, label %for.body, label %for.end.loopexit
368
369for.end.loopexit:                                 ; preds = %for.body
370  br label %for.end
371
372for.end:                                          ; preds = %for.end.loopexit, %entry
373  ret void
374}
375
376
377;;  for (long int i = 0; i < n; i++) {
378;;    A[2*N*i + M] = i;
379;;    *B++ = A[2*N*i - 3*M + 2];
380
381define void @symbolicsiv7(i32* %A, i32* %B, i64 %n, i64 %N, i64 %M) nounwind uwtable ssp {
382entry:
383  %cmp1 = icmp eq i64 %n, 0
384  br i1 %cmp1, label %for.end, label %for.body.preheader
385
386; CHECK: da analyze - none!
387; CHECK: da analyze - flow [<>]!
388; CHECK: da analyze - confused!
389; CHECK: da analyze - none!
390; CHECK: da analyze - confused!
391; CHECK: da analyze - none!
392
393for.body.preheader:                               ; preds = %entry
394  br label %for.body
395
396for.body:                                         ; preds = %for.body.preheader, %for.body
397  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
398  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
399  %conv = trunc i64 %i.03 to i32
400  %mul = shl i64 %N, 1
401  %mul1 = mul i64 %mul, %i.03
402  %add = add i64 %mul1, %M
403  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
404  store i32 %conv, i32* %arrayidx, align 4
405  %mul2 = shl i64 %N, 1
406  %mul3 = mul i64 %mul2, %i.03
407  %0 = mul i64 %M, -3
408  %sub = add i64 %mul3, %0
409  %add5 = add i64 %sub, 2
410  %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %add5
411  %1 = load i32, i32* %arrayidx6, align 4
412  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
413  store i32 %1, i32* %B.addr.02, align 4
414  %inc = add nsw i64 %i.03, 1
415  %exitcond = icmp ne i64 %inc, %n
416  br i1 %exitcond, label %for.body, label %for.end.loopexit
417
418for.end.loopexit:                                 ; preds = %for.body
419  br label %for.end
420
421for.end:                                          ; preds = %for.end.loopexit, %entry
422  ret void
423}
424