1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
3 ; ModuleID = 'SymbolicRDIV.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"
8 ;; for (long int i = 0; i < n1; i++)
10 ;; for (long int j = 0; j < n2; j++)
11 ;; *B++ = A[3*j + 3*n1];
13 define void @symbolicrdiv0(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
15 %cmp4 = icmp eq i64 %n1, 0
16 br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
18 ; CHECK: da analyze - none!
19 ; CHECK: da analyze - none!
20 ; CHECK: da analyze - confused!
21 ; CHECK: da analyze - none!
22 ; CHECK: da analyze - confused!
23 ; CHECK: da analyze - none!
25 for.body.preheader: ; preds = %entry
28 for.cond1.preheader.loopexit: ; preds = %for.body
29 br label %for.cond1.preheader
31 for.cond1.preheader: ; preds = %for.cond1.preheader.loopexit, %entry
32 %cmp21 = icmp eq i64 %n2, 0
33 br i1 %cmp21, label %for.end11, label %for.body4.preheader
35 for.body4.preheader: ; preds = %for.cond1.preheader
38 for.body: ; preds = %for.body.preheader, %for.body
39 %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
40 %conv = trunc i64 %i.05 to i32
41 %mul = shl nsw i64 %i.05, 1
42 %add = add i64 %mul, %n1
43 %arrayidx = getelementptr inbounds i32* %A, i64 %add
44 store i32 %conv, i32* %arrayidx, align 4
45 %inc = add nsw i64 %i.05, 1
46 %exitcond = icmp ne i64 %inc, %n1
47 br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
49 for.body4: ; preds = %for.body4.preheader, %for.body4
50 %j.03 = phi i64 [ %inc10, %for.body4 ], [ 0, %for.body4.preheader ]
51 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
52 %mul56 = add i64 %j.03, %n1
53 %add7 = mul i64 %mul56, 3
54 %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7
55 %0 = load i32* %arrayidx8, align 4
56 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1
57 store i32 %0, i32* %B.addr.02, align 4
58 %inc10 = add nsw i64 %j.03, 1
59 %exitcond7 = icmp ne i64 %inc10, %n2
60 br i1 %exitcond7, label %for.body4, label %for.end11.loopexit
62 for.end11.loopexit: ; preds = %for.body4
65 for.end11: ; preds = %for.end11.loopexit, %for.cond1.preheader
70 ;; for (long int i = 0; i < n1; i++)
72 ;; for (long int j = 0; j < n2; j++)
73 ;; *B++ = A[3*j + 2*n2];
75 define void @symbolicrdiv1(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
77 %cmp4 = icmp eq i64 %n1, 0
78 br i1 %cmp4, label %for.cond2.preheader, label %for.body.preheader
80 ; CHECK: da analyze - none!
81 ; CHECK: da analyze - none!
82 ; CHECK: da analyze - confused!
83 ; CHECK: da analyze - none!
84 ; CHECK: da analyze - confused!
85 ; CHECK: da analyze - none!
87 for.body.preheader: ; preds = %entry
90 for.cond2.preheader.loopexit: ; preds = %for.body
91 br label %for.cond2.preheader
93 for.cond2.preheader: ; preds = %for.cond2.preheader.loopexit, %entry
94 %cmp31 = icmp eq i64 %n2, 0
95 br i1 %cmp31, label %for.end12, label %for.body5.preheader
97 for.body5.preheader: ; preds = %for.cond2.preheader
100 for.body: ; preds = %for.body.preheader, %for.body
101 %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
102 %conv = trunc i64 %i.05 to i32
103 %mul = shl nsw i64 %i.05, 1
104 %mul1 = mul i64 %n2, 5
105 %add = add i64 %mul, %mul1
106 %arrayidx = getelementptr inbounds i32* %A, i64 %add
107 store i32 %conv, i32* %arrayidx, align 4
108 %inc = add nsw i64 %i.05, 1
109 %exitcond = icmp ne i64 %inc, %n1
110 br i1 %exitcond, label %for.body, label %for.cond2.preheader.loopexit
112 for.body5: ; preds = %for.body5.preheader, %for.body5
113 %j.03 = phi i64 [ %inc11, %for.body5 ], [ 0, %for.body5.preheader ]
114 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body5 ], [ %B, %for.body5.preheader ]
115 %mul6 = mul nsw i64 %j.03, 3
116 %mul7 = shl i64 %n2, 1
117 %add8 = add i64 %mul6, %mul7
118 %arrayidx9 = getelementptr inbounds i32* %A, i64 %add8
119 %0 = load i32* %arrayidx9, align 4
120 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1
121 store i32 %0, i32* %B.addr.02, align 4
122 %inc11 = add nsw i64 %j.03, 1
123 %exitcond6 = icmp ne i64 %inc11, %n2
124 br i1 %exitcond6, label %for.body5, label %for.end12.loopexit
126 for.end12.loopexit: ; preds = %for.body5
129 for.end12: ; preds = %for.end12.loopexit, %for.cond2.preheader
134 ;; for (long int i = 0; i < n1; i++)
136 ;; for (long int j = 0; j < n2; j++)
137 ;; *B++ = A[-j + 2*n1];
139 define void @symbolicrdiv2(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
141 %cmp4 = icmp eq i64 %n1, 0
142 br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
144 ; CHECK: da analyze - none!
145 ; CHECK: da analyze - none!
146 ; CHECK: da analyze - confused!
147 ; CHECK: da analyze - none!
148 ; CHECK: da analyze - confused!
149 ; CHECK: da analyze - none!
151 for.body.preheader: ; preds = %entry
154 for.cond1.preheader.loopexit: ; preds = %for.body
155 br label %for.cond1.preheader
157 for.cond1.preheader: ; preds = %for.cond1.preheader.loopexit, %entry
158 %cmp21 = icmp eq i64 %n2, 0
159 br i1 %cmp21, label %for.end10, label %for.body4.preheader
161 for.body4.preheader: ; preds = %for.cond1.preheader
164 for.body: ; preds = %for.body.preheader, %for.body
165 %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
166 %conv = trunc i64 %i.05 to i32
167 %mul = shl nsw i64 %i.05, 1
168 %sub = sub i64 %mul, %n2
169 %arrayidx = getelementptr inbounds i32* %A, i64 %sub
170 store i32 %conv, i32* %arrayidx, align 4
171 %inc = add nsw i64 %i.05, 1
172 %exitcond = icmp ne i64 %inc, %n1
173 br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
175 for.body4: ; preds = %for.body4.preheader, %for.body4
176 %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
177 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
178 %mul6 = shl i64 %n1, 1
179 %add = sub i64 %mul6, %j.03
180 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add
181 %0 = load i32* %arrayidx7, align 4
182 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1
183 store i32 %0, i32* %B.addr.02, align 4
184 %inc9 = add nsw i64 %j.03, 1
185 %exitcond6 = icmp ne i64 %inc9, %n2
186 br i1 %exitcond6, label %for.body4, label %for.end10.loopexit
188 for.end10.loopexit: ; preds = %for.body4
191 for.end10: ; preds = %for.end10.loopexit, %for.cond1.preheader
196 ;; for (long int i = 0; i < n1; i++)
198 ;; for (long int j = 0; j < n2; j++)
201 define void @symbolicrdiv3(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
203 %cmp4 = icmp eq i64 %n1, 0
204 br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
206 ; CHECK: da analyze - none!
207 ; CHECK: da analyze - none!
208 ; CHECK: da analyze - confused!
209 ; CHECK: da analyze - none!
210 ; CHECK: da analyze - confused!
211 ; CHECK: da analyze - none!
213 for.body.preheader: ; preds = %entry
216 for.cond1.preheader.loopexit: ; preds = %for.body
217 br label %for.cond1.preheader
219 for.cond1.preheader: ; preds = %for.cond1.preheader.loopexit, %entry
220 %cmp21 = icmp eq i64 %n2, 0
221 br i1 %cmp21, label %for.end9, label %for.body4.preheader
223 for.body4.preheader: ; preds = %for.cond1.preheader
226 for.body: ; preds = %for.body.preheader, %for.body
227 %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
228 %conv = trunc i64 %i.05 to i32
229 %add = sub i64 %n2, %i.05
230 %arrayidx = getelementptr inbounds i32* %A, i64 %add
231 store i32 %conv, i32* %arrayidx, align 4
232 %inc = add nsw i64 %i.05, 1
233 %exitcond = icmp ne i64 %inc, %n1
234 br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
236 for.body4: ; preds = %for.body4.preheader, %for.body4
237 %j.03 = phi i64 [ %inc8, %for.body4 ], [ 0, %for.body4.preheader ]
238 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
239 %sub5 = sub i64 %j.03, %n1
240 %arrayidx6 = getelementptr inbounds i32* %A, i64 %sub5
241 %0 = load i32* %arrayidx6, align 4
242 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1
243 store i32 %0, i32* %B.addr.02, align 4
244 %inc8 = add nsw i64 %j.03, 1
245 %exitcond6 = icmp ne i64 %inc8, %n2
246 br i1 %exitcond6, label %for.body4, label %for.end9.loopexit
248 for.end9.loopexit: ; preds = %for.body4
251 for.end9: ; preds = %for.end9.loopexit, %for.cond1.preheader
256 ;; for (long int i = 0; i < n1; i++)
258 ;; for (long int j = 0; j < n2; j++)
259 ;; *B++ = A[-j + n1];
261 define void @symbolicrdiv4(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
263 %cmp4 = icmp eq i64 %n1, 0
264 br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
266 ; CHECK: da analyze - none!
267 ; CHECK: da analyze - none!
268 ; CHECK: da analyze - confused!
269 ; CHECK: da analyze - none!
270 ; CHECK: da analyze - confused!
271 ; CHECK: da analyze - none!
273 for.body.preheader: ; preds = %entry
276 for.cond1.preheader.loopexit: ; preds = %for.body
277 br label %for.cond1.preheader
279 for.cond1.preheader: ; preds = %for.cond1.preheader.loopexit, %entry
280 %cmp21 = icmp eq i64 %n2, 0
281 br i1 %cmp21, label %for.end10, label %for.body4.preheader
283 for.body4.preheader: ; preds = %for.cond1.preheader
286 for.body: ; preds = %for.body.preheader, %for.body
287 %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
288 %conv = trunc i64 %i.05 to i32
289 %mul = shl i64 %n1, 1
290 %add = sub i64 %mul, %i.05
291 %arrayidx = getelementptr inbounds i32* %A, i64 %add
292 store i32 %conv, i32* %arrayidx, align 4
293 %inc = add nsw i64 %i.05, 1
294 %exitcond = icmp ne i64 %inc, %n1
295 br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
297 for.body4: ; preds = %for.body4.preheader, %for.body4
298 %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
299 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
300 %add6 = sub i64 %n1, %j.03
301 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add6
302 %0 = load i32* %arrayidx7, align 4
303 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1
304 store i32 %0, i32* %B.addr.02, align 4
305 %inc9 = add nsw i64 %j.03, 1
306 %exitcond6 = icmp ne i64 %inc9, %n2
307 br i1 %exitcond6, label %for.body4, label %for.end10.loopexit
309 for.end10.loopexit: ; preds = %for.body4
312 for.end10: ; preds = %for.end10.loopexit, %for.cond1.preheader
317 ;; for (long int i = 0; i < n1; i++)
319 ;; for (long int j = 0; j < n2; j++)
320 ;; *B++ = A[-j + 2*n2];
322 define void @symbolicrdiv5(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
324 %cmp4 = icmp eq i64 %n1, 0
325 br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
327 ; CHECK: da analyze - none!
328 ; CHECK: da analyze - none!
329 ; CHECK: da analyze - confused!
330 ; CHECK: da analyze - none!
331 ; CHECK: da analyze - confused!
332 ; CHECK: da analyze - none!
334 for.body.preheader: ; preds = %entry
337 for.cond1.preheader.loopexit: ; preds = %for.body
338 br label %for.cond1.preheader
340 for.cond1.preheader: ; preds = %for.cond1.preheader.loopexit, %entry
341 %cmp21 = icmp eq i64 %n2, 0
342 br i1 %cmp21, label %for.end10, label %for.body4.preheader
344 for.body4.preheader: ; preds = %for.cond1.preheader
347 for.body: ; preds = %for.body.preheader, %for.body
348 %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
349 %conv = trunc i64 %i.05 to i32
350 %add = sub i64 %n2, %i.05
351 %arrayidx = getelementptr inbounds i32* %A, i64 %add
352 store i32 %conv, i32* %arrayidx, align 4
353 %inc = add nsw i64 %i.05, 1
354 %exitcond = icmp ne i64 %inc, %n1
355 br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
357 for.body4: ; preds = %for.body4.preheader, %for.body4
358 %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
359 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
360 %mul = shl i64 %n2, 1
361 %add6 = sub i64 %mul, %j.03
362 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add6
363 %0 = load i32* %arrayidx7, align 4
364 %incdec.ptr = getelementptr inbounds i32* %B.addr.02, i64 1
365 store i32 %0, i32* %B.addr.02, align 4
366 %inc9 = add nsw i64 %j.03, 1
367 %exitcond6 = icmp ne i64 %inc9, %n2
368 br i1 %exitcond6, label %for.body4, label %for.end10.loopexit
370 for.end10.loopexit: ; preds = %for.body4
373 for.end10: ; preds = %for.end10.loopexit, %for.cond1.preheader
378 ;; for (long int i = 0; i < n1; i++)
379 ;; for (long int j = 0; j < n2; j++) {
383 define void @symbolicrdiv6(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
385 %cmp4 = icmp eq i64 %n1, 0
386 br i1 %cmp4, label %for.end7, label %for.cond1.preheader.preheader
388 ; CHECK: da analyze - output [* *]!
389 ; CHECK: da analyze - none!
390 ; CHECK: da analyze - confused!
391 ; CHECK: da analyze - consistent input [S S]!
392 ; CHECK: da analyze - confused!
393 ; CHECK: da analyze - output [* *]!
395 for.cond1.preheader.preheader: ; preds = %entry
396 br label %for.cond1.preheader
398 for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc5
399 %B.addr.06 = phi i32* [ %B.addr.1.lcssa, %for.inc5 ], [ %B, %for.cond1.preheader.preheader ]
400 %i.05 = phi i64 [ %inc6, %for.inc5 ], [ 0, %for.cond1.preheader.preheader ]
401 %cmp21 = icmp eq i64 %n2, 0
402 br i1 %cmp21, label %for.inc5, label %for.body3.preheader
404 for.body3.preheader: ; preds = %for.cond1.preheader
407 for.body3: ; preds = %for.body3.preheader, %for.body3
408 %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]
409 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.06, %for.body3.preheader ]
410 %conv = trunc i64 %i.05 to i32
411 %sub = sub nsw i64 %j.03, %i.05
412 %add = add i64 %sub, %n2
413 %arrayidx = getelementptr inbounds i32* %A, i64 %add
414 store i32 %conv, i32* %arrayidx, align 4
415 %mul = shl i64 %n2, 1
416 %arrayidx4 = getelementptr inbounds i32* %A, i64 %mul
417 %0 = load i32* %arrayidx4, align 4
418 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
419 store i32 %0, i32* %B.addr.12, align 4
420 %inc = add nsw i64 %j.03, 1
421 %exitcond = icmp ne i64 %inc, %n2
422 br i1 %exitcond, label %for.body3, label %for.inc5.loopexit
424 for.inc5.loopexit: ; preds = %for.body3
425 %scevgep = getelementptr i32* %B.addr.06, i64 %n2
428 for.inc5: ; preds = %for.inc5.loopexit, %for.cond1.preheader
429 %B.addr.1.lcssa = phi i32* [ %B.addr.06, %for.cond1.preheader ], [ %scevgep, %for.inc5.loopexit ]
430 %inc6 = add nsw i64 %i.05, 1
431 %exitcond7 = icmp ne i64 %inc6, %n1
432 br i1 %exitcond7, label %for.cond1.preheader, label %for.end7.loopexit
434 for.end7.loopexit: ; preds = %for.inc5
437 for.end7: ; preds = %for.end7.loopexit, %entry