Attempt to fix uninitialized SDAG persistent ids detected by MSan
[oota-llvm.git] / test / Analysis / DependenceAnalysis / SymbolicRDIV.ll
1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
2
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"
6
7
8 ;;  for (long int i = 0; i < n1; i++)
9 ;;    A[2*i + n1] = i;
10 ;;  for (long int j = 0; j < n2; j++)
11 ;;    *B++ = A[3*j + 3*n1];
12
13 define void @symbolicrdiv0(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
14 entry:
15   %cmp4 = icmp eq i64 %n1, 0
16   br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
17
18 ; CHECK: 'Dependence Analysis' for function 'symbolicrdiv0'
19 ; CHECK: da analyze - none!
20 ; CHECK: da analyze - none!
21 ; CHECK: da analyze - confused!
22 ; CHECK: da analyze - none!
23 ; CHECK: da analyze - confused!
24 ; CHECK: da analyze - none!
25
26 for.body.preheader:                               ; preds = %entry
27   br label %for.body
28
29 for.cond1.preheader.loopexit:                     ; preds = %for.body
30   br label %for.cond1.preheader
31
32 for.cond1.preheader:                              ; preds = %for.cond1.preheader.loopexit, %entry
33   %cmp21 = icmp eq i64 %n2, 0
34   br i1 %cmp21, label %for.end11, label %for.body4.preheader
35
36 for.body4.preheader:                              ; preds = %for.cond1.preheader
37   br label %for.body4
38
39 for.body:                                         ; preds = %for.body.preheader, %for.body
40   %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
41   %conv = trunc i64 %i.05 to i32
42   %mul = shl nsw i64 %i.05, 1
43   %add = add i64 %mul, %n1
44   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
45   store i32 %conv, i32* %arrayidx, align 4
46   %inc = add nsw i64 %i.05, 1
47   %exitcond = icmp ne i64 %inc, %n1
48   br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
49
50 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
51   %j.03 = phi i64 [ %inc10, %for.body4 ], [ 0, %for.body4.preheader ]
52   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
53   %mul56 = add i64 %j.03, %n1
54   %add7 = mul i64 %mul56, 3
55   %arrayidx8 = getelementptr inbounds i32, i32* %A, i64 %add7
56   %0 = load i32, i32* %arrayidx8, align 4
57   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
58   store i32 %0, i32* %B.addr.02, align 4
59   %inc10 = add nsw i64 %j.03, 1
60   %exitcond7 = icmp ne i64 %inc10, %n2
61   br i1 %exitcond7, label %for.body4, label %for.end11.loopexit
62
63 for.end11.loopexit:                               ; preds = %for.body4
64   br label %for.end11
65
66 for.end11:                                        ; preds = %for.end11.loopexit, %for.cond1.preheader
67   ret void
68 }
69
70
71 ;;  for (long int i = 0; i < n1; i++)
72 ;;    A[2*i + 5*n2] = i;
73 ;;  for (long int j = 0; j < n2; j++)
74 ;;    *B++ = A[3*j + 2*n2];
75
76 define void @symbolicrdiv1(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
77 entry:
78   %cmp4 = icmp eq i64 %n1, 0
79   br i1 %cmp4, label %for.cond2.preheader, label %for.body.preheader
80
81 ; CHECK: 'Dependence Analysis' for function 'symbolicrdiv1'
82 ; CHECK: da analyze - none!
83 ; CHECK: da analyze - none!
84 ; CHECK: da analyze - confused!
85 ; CHECK: da analyze - none!
86 ; CHECK: da analyze - confused!
87 ; CHECK: da analyze - none!
88
89 for.body.preheader:                               ; preds = %entry
90   br label %for.body
91
92 for.cond2.preheader.loopexit:                     ; preds = %for.body
93   br label %for.cond2.preheader
94
95 for.cond2.preheader:                              ; preds = %for.cond2.preheader.loopexit, %entry
96   %cmp31 = icmp eq i64 %n2, 0
97   br i1 %cmp31, label %for.end12, label %for.body5.preheader
98
99 for.body5.preheader:                              ; preds = %for.cond2.preheader
100   br label %for.body5
101
102 for.body:                                         ; preds = %for.body.preheader, %for.body
103   %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
104   %conv = trunc i64 %i.05 to i32
105   %mul = shl nsw i64 %i.05, 1
106   %mul1 = mul i64 %n2, 5
107   %add = add i64 %mul, %mul1
108   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
109   store i32 %conv, i32* %arrayidx, align 4
110   %inc = add nsw i64 %i.05, 1
111   %exitcond = icmp ne i64 %inc, %n1
112   br i1 %exitcond, label %for.body, label %for.cond2.preheader.loopexit
113
114 for.body5:                                        ; preds = %for.body5.preheader, %for.body5
115   %j.03 = phi i64 [ %inc11, %for.body5 ], [ 0, %for.body5.preheader ]
116   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body5 ], [ %B, %for.body5.preheader ]
117   %mul6 = mul nsw i64 %j.03, 3
118   %mul7 = shl i64 %n2, 1
119   %add8 = add i64 %mul6, %mul7
120   %arrayidx9 = getelementptr inbounds i32, i32* %A, i64 %add8
121   %0 = load i32, i32* %arrayidx9, align 4
122   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
123   store i32 %0, i32* %B.addr.02, align 4
124   %inc11 = add nsw i64 %j.03, 1
125   %exitcond6 = icmp ne i64 %inc11, %n2
126   br i1 %exitcond6, label %for.body5, label %for.end12.loopexit
127
128 for.end12.loopexit:                               ; preds = %for.body5
129   br label %for.end12
130
131 for.end12:                                        ; preds = %for.end12.loopexit, %for.cond2.preheader
132   ret void
133 }
134
135
136 ;;  for (long int i = 0; i < n1; i++)
137 ;;    A[2*i - n2] = i;
138 ;;  for (long int j = 0; j < n2; j++)
139 ;;    *B++ = A[-j + 2*n1];
140
141 define void @symbolicrdiv2(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
142 entry:
143   %cmp4 = icmp eq i64 %n1, 0
144   br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
145
146 ; CHECK: 'Dependence Analysis' for function 'symbolicrdiv2'
147 ; CHECK: da analyze - none!
148 ; CHECK: da analyze - none!
149 ; CHECK: da analyze - confused!
150 ; CHECK: da analyze - none!
151 ; CHECK: da analyze - confused!
152 ; CHECK: da analyze - none!
153
154 for.body.preheader:                               ; preds = %entry
155   br label %for.body
156
157 for.cond1.preheader.loopexit:                     ; preds = %for.body
158   br label %for.cond1.preheader
159
160 for.cond1.preheader:                              ; preds = %for.cond1.preheader.loopexit, %entry
161   %cmp21 = icmp eq i64 %n2, 0
162   br i1 %cmp21, label %for.end10, label %for.body4.preheader
163
164 for.body4.preheader:                              ; preds = %for.cond1.preheader
165   br label %for.body4
166
167 for.body:                                         ; preds = %for.body.preheader, %for.body
168   %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
169   %conv = trunc i64 %i.05 to i32
170   %mul = shl nsw i64 %i.05, 1
171   %sub = sub i64 %mul, %n2
172   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %sub
173   store i32 %conv, i32* %arrayidx, align 4
174   %inc = add nsw i64 %i.05, 1
175   %exitcond = icmp ne i64 %inc, %n1
176   br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
177
178 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
179   %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
180   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
181   %mul6 = shl i64 %n1, 1
182   %add = sub i64 %mul6, %j.03
183   %arrayidx7 = getelementptr inbounds i32, i32* %A, i64 %add
184   %0 = load i32, i32* %arrayidx7, align 4
185   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
186   store i32 %0, i32* %B.addr.02, align 4
187   %inc9 = add nsw i64 %j.03, 1
188   %exitcond6 = icmp ne i64 %inc9, %n2
189   br i1 %exitcond6, label %for.body4, label %for.end10.loopexit
190
191 for.end10.loopexit:                               ; preds = %for.body4
192   br label %for.end10
193
194 for.end10:                                        ; preds = %for.end10.loopexit, %for.cond1.preheader
195   ret void
196 }
197
198
199 ;;  for (long int i = 0; i < n1; i++)
200 ;;    A[-i + n2] = i;
201 ;;  for (long int j = 0; j < n2; j++)
202 ;;    *B++ = A[j - n1];
203
204 define void @symbolicrdiv3(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
205 entry:
206   %cmp4 = icmp eq i64 %n1, 0
207   br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
208
209 ; CHECK: 'Dependence Analysis' for function 'symbolicrdiv3'
210 ; CHECK: da analyze - none!
211 ; CHECK: da analyze - none!
212 ; CHECK: da analyze - confused!
213 ; CHECK: da analyze - none!
214 ; CHECK: da analyze - confused!
215 ; CHECK: da analyze - none!
216
217 for.body.preheader:                               ; preds = %entry
218   br label %for.body
219
220 for.cond1.preheader.loopexit:                     ; preds = %for.body
221   br label %for.cond1.preheader
222
223 for.cond1.preheader:                              ; preds = %for.cond1.preheader.loopexit, %entry
224   %cmp21 = icmp eq i64 %n2, 0
225   br i1 %cmp21, label %for.end9, label %for.body4.preheader
226
227 for.body4.preheader:                              ; preds = %for.cond1.preheader
228   br label %for.body4
229
230 for.body:                                         ; preds = %for.body.preheader, %for.body
231   %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
232   %conv = trunc i64 %i.05 to i32
233   %add = sub i64 %n2, %i.05
234   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
235   store i32 %conv, i32* %arrayidx, align 4
236   %inc = add nsw i64 %i.05, 1
237   %exitcond = icmp ne i64 %inc, %n1
238   br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
239
240 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
241   %j.03 = phi i64 [ %inc8, %for.body4 ], [ 0, %for.body4.preheader ]
242   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
243   %sub5 = sub i64 %j.03, %n1
244   %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %sub5
245   %0 = load i32, i32* %arrayidx6, align 4
246   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
247   store i32 %0, i32* %B.addr.02, align 4
248   %inc8 = add nsw i64 %j.03, 1
249   %exitcond6 = icmp ne i64 %inc8, %n2
250   br i1 %exitcond6, label %for.body4, label %for.end9.loopexit
251
252 for.end9.loopexit:                                ; preds = %for.body4
253   br label %for.end9
254
255 for.end9:                                         ; preds = %for.end9.loopexit, %for.cond1.preheader
256   ret void
257 }
258
259
260 ;;  for (long int i = 0; i < n1; i++)
261 ;;    A[-i + 2*n1] = i;
262 ;;  for (long int j = 0; j < n2; j++)
263 ;;    *B++ = A[-j + n1];
264
265 define void @symbolicrdiv4(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
266 entry:
267   %cmp4 = icmp eq i64 %n1, 0
268   br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
269
270 ; CHECK: 'Dependence Analysis' for function 'symbolicrdiv4'
271 ; CHECK: da analyze - none!
272 ; CHECK: da analyze - none!
273 ; CHECK: da analyze - confused!
274 ; CHECK: da analyze - none!
275 ; CHECK: da analyze - confused!
276 ; CHECK: da analyze - none!
277
278 for.body.preheader:                               ; preds = %entry
279   br label %for.body
280
281 for.cond1.preheader.loopexit:                     ; preds = %for.body
282   br label %for.cond1.preheader
283
284 for.cond1.preheader:                              ; preds = %for.cond1.preheader.loopexit, %entry
285   %cmp21 = icmp eq i64 %n2, 0
286   br i1 %cmp21, label %for.end10, label %for.body4.preheader
287
288 for.body4.preheader:                              ; preds = %for.cond1.preheader
289   br label %for.body4
290
291 for.body:                                         ; preds = %for.body.preheader, %for.body
292   %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
293   %conv = trunc i64 %i.05 to i32
294   %mul = shl i64 %n1, 1
295   %add = sub i64 %mul, %i.05
296   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
297   store i32 %conv, i32* %arrayidx, align 4
298   %inc = add nsw i64 %i.05, 1
299   %exitcond = icmp ne i64 %inc, %n1
300   br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
301
302 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
303   %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
304   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
305   %add6 = sub i64 %n1, %j.03
306   %arrayidx7 = getelementptr inbounds i32, i32* %A, i64 %add6
307   %0 = load i32, i32* %arrayidx7, align 4
308   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
309   store i32 %0, i32* %B.addr.02, align 4
310   %inc9 = add nsw i64 %j.03, 1
311   %exitcond6 = icmp ne i64 %inc9, %n2
312   br i1 %exitcond6, label %for.body4, label %for.end10.loopexit
313
314 for.end10.loopexit:                               ; preds = %for.body4
315   br label %for.end10
316
317 for.end10:                                        ; preds = %for.end10.loopexit, %for.cond1.preheader
318   ret void
319 }
320
321
322 ;;  for (long int i = 0; i < n1; i++)
323 ;;    A[-i + n2] = i;
324 ;;  for (long int j = 0; j < n2; j++)
325 ;;    *B++ = A[-j + 2*n2];
326
327 define void @symbolicrdiv5(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
328 entry:
329   %cmp4 = icmp eq i64 %n1, 0
330   br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
331
332 ; CHECK: 'Dependence Analysis' for function 'symbolicrdiv5'
333 ; CHECK: da analyze - none!
334 ; CHECK: da analyze - none!
335 ; CHECK: da analyze - confused!
336 ; CHECK: da analyze - none!
337 ; CHECK: da analyze - confused!
338 ; CHECK: da analyze - none!
339
340 for.body.preheader:                               ; preds = %entry
341   br label %for.body
342
343 for.cond1.preheader.loopexit:                     ; preds = %for.body
344   br label %for.cond1.preheader
345
346 for.cond1.preheader:                              ; preds = %for.cond1.preheader.loopexit, %entry
347   %cmp21 = icmp eq i64 %n2, 0
348   br i1 %cmp21, label %for.end10, label %for.body4.preheader
349
350 for.body4.preheader:                              ; preds = %for.cond1.preheader
351   br label %for.body4
352
353 for.body:                                         ; preds = %for.body.preheader, %for.body
354   %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
355   %conv = trunc i64 %i.05 to i32
356   %add = sub i64 %n2, %i.05
357   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
358   store i32 %conv, i32* %arrayidx, align 4
359   %inc = add nsw i64 %i.05, 1
360   %exitcond = icmp ne i64 %inc, %n1
361   br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
362
363 for.body4:                                        ; preds = %for.body4.preheader, %for.body4
364   %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
365   %B.addr.02 = phi i32* [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
366   %mul = shl i64 %n2, 1
367   %add6 = sub i64 %mul, %j.03
368   %arrayidx7 = getelementptr inbounds i32, i32* %A, i64 %add6
369   %0 = load i32, i32* %arrayidx7, align 4
370   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
371   store i32 %0, i32* %B.addr.02, align 4
372   %inc9 = add nsw i64 %j.03, 1
373   %exitcond6 = icmp ne i64 %inc9, %n2
374   br i1 %exitcond6, label %for.body4, label %for.end10.loopexit
375
376 for.end10.loopexit:                               ; preds = %for.body4
377   br label %for.end10
378
379 for.end10:                                        ; preds = %for.end10.loopexit, %for.cond1.preheader
380   ret void
381 }
382
383
384 ;;  for (long int i = 0; i < n1; i++)
385 ;;    for (long int j = 0; j < n2; j++) {
386 ;;      A[j -i + n2] = i;
387 ;;      *B++ = A[2*n2];
388
389 define void @symbolicrdiv6(i32* %A, i32* %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
390 entry:
391   %cmp4 = icmp eq i64 %n1, 0
392   br i1 %cmp4, label %for.end7, label %for.cond1.preheader.preheader
393
394 ; CHECK: 'Dependence Analysis' for function 'symbolicrdiv6'
395 ; CHECK: da analyze - output [* *]!
396 ; CHECK: da analyze - none!
397 ; CHECK: da analyze - confused!
398 ; CHECK: da analyze - consistent input [S S]!
399 ; CHECK: da analyze - confused!
400 ; CHECK: da analyze - output [* *]!
401
402 for.cond1.preheader.preheader:                    ; preds = %entry
403   br label %for.cond1.preheader
404
405 for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc5
406   %B.addr.06 = phi i32* [ %B.addr.1.lcssa, %for.inc5 ], [ %B, %for.cond1.preheader.preheader ]
407   %i.05 = phi i64 [ %inc6, %for.inc5 ], [ 0, %for.cond1.preheader.preheader ]
408   %cmp21 = icmp eq i64 %n2, 0
409   br i1 %cmp21, label %for.inc5, label %for.body3.preheader
410
411 for.body3.preheader:                              ; preds = %for.cond1.preheader
412   br label %for.body3
413
414 for.body3:                                        ; preds = %for.body3.preheader, %for.body3
415   %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]
416   %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.06, %for.body3.preheader ]
417   %conv = trunc i64 %i.05 to i32
418   %sub = sub nsw i64 %j.03, %i.05
419   %add = add i64 %sub, %n2
420   %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
421   store i32 %conv, i32* %arrayidx, align 4
422   %mul = shl i64 %n2, 1
423   %arrayidx4 = getelementptr inbounds i32, i32* %A, i64 %mul
424   %0 = load i32, i32* %arrayidx4, align 4
425   %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
426   store i32 %0, i32* %B.addr.12, align 4
427   %inc = add nsw i64 %j.03, 1
428   %exitcond = icmp ne i64 %inc, %n2
429   br i1 %exitcond, label %for.body3, label %for.inc5.loopexit
430
431 for.inc5.loopexit:                                ; preds = %for.body3
432   %scevgep = getelementptr i32, i32* %B.addr.06, i64 %n2
433   br label %for.inc5
434
435 for.inc5:                                         ; preds = %for.inc5.loopexit, %for.cond1.preheader
436   %B.addr.1.lcssa = phi i32* [ %B.addr.06, %for.cond1.preheader ], [ %scevgep, %for.inc5.loopexit ]
437   %inc6 = add nsw i64 %i.05, 1
438   %exitcond7 = icmp ne i64 %inc6, %n1
439   br i1 %exitcond7, label %for.cond1.preheader, label %for.end7.loopexit
440
441 for.end7.loopexit:                                ; preds = %for.inc5
442   br label %for.end7
443
444 for.end7:                                         ; preds = %for.end7.loopexit, %entry
445   ret void
446 }