1; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \
2; RUN: | FileCheck %s
3
4; ModuleID = 'WeakZeroDstSIV.bc'
5target 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"
6target triple = "x86_64-apple-macosx10.6.0"
7
8
9;;  for (int i = 0; i < N; i++) {
10;;    A[i] = 1;
11;;    A[0] = 2;
12
13define void @dstzero(i32* nocapture %A, i32 %N) {
14entry:
15  %cmp6 = icmp sgt i32 %N, 0
16  br i1 %cmp6, label %for.body, label %for.cond.cleanup
17
18; CHECK: da analyze - none!
19; CHECK: da analyze - output [p<=|<]!
20; CHECK: da analyze - consistent output [S]!
21
22for.body:                                         ; preds = %entry, %for.body
23  %i.07 = phi i32 [ %add, %for.body ], [ 0, %entry ]
24  %arrayidx = getelementptr inbounds i32, i32* %A, i32 %i.07
25  store i32 0, i32* %arrayidx, align 4
26  store i32 1, i32* %A, align 4
27  %add = add nuw nsw i32 %i.07, 1
28  %exitcond = icmp eq i32 %add, %N
29  br i1 %exitcond, label %for.cond.cleanup, label %for.body
30
31for.cond.cleanup:                                 ; preds = %for.body, %entry
32  ret void
33}
34
35
36
37
38;;  for (long unsigned i = 0; i < 30; i++) {
39;;    A[2*i + 10] = i;
40;;    *B++ = A[10];
41
42define void @weakzerodst0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
43entry:
44  br label %for.body
45
46; CHECK: da analyze - none!
47; CHECK: da analyze - flow [p<=|<]!
48; CHECK: da analyze - confused!
49; CHECK: da analyze - consistent input [S]!
50; CHECK: da analyze - confused!
51; CHECK: da analyze - none!
52
53for.body:                                         ; preds = %entry, %for.body
54  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
55  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
56  %conv = trunc i64 %i.02 to i32
57  %mul = shl i64 %i.02, 1
58  %add = add i64 %mul, 10
59  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
60  store i32 %conv, i32* %arrayidx, align 4
61  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10
62  %0 = load i32, i32* %arrayidx1, align 4
63  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
64  store i32 %0, i32* %B.addr.01, align 4
65  %inc = add i64 %i.02, 1
66  %exitcond = icmp ne i64 %inc, 30
67  br i1 %exitcond, label %for.body, label %for.end
68
69for.end:                                          ; preds = %for.body
70  ret void
71}
72
73
74;;  for (long unsigned i = 0; i < n; i++) {
75;;    A[n*i + 10] = i;
76;;    *B++ = A[10];
77
78define void @weakzerodst1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
79entry:
80  %cmp1 = icmp eq i64 %n, 0
81  br i1 %cmp1, label %for.end, label %for.body.preheader
82
83; CHECK: da analyze - none!
84; CHECK: da analyze - flow [p<=|<]!
85; CHECK: da analyze - confused!
86; CHECK: da analyze - consistent input [S]!
87; CHECK: da analyze - confused!
88; CHECK: da analyze - none!
89
90for.body.preheader:                               ; preds = %entry
91  br label %for.body
92
93for.body:                                         ; preds = %for.body.preheader, %for.body
94  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
95  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
96  %conv = trunc i64 %i.03 to i32
97  %mul = mul i64 %i.03, %n
98  %add = add i64 %mul, 10
99  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
100  store i32 %conv, i32* %arrayidx, align 4
101  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10
102  %0 = load i32, i32* %arrayidx1, align 4
103  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
104  store i32 %0, i32* %B.addr.02, align 4
105  %inc = add i64 %i.03, 1
106  %exitcond = icmp ne i64 %inc, %n
107  br i1 %exitcond, label %for.body, label %for.end.loopexit
108
109for.end.loopexit:                                 ; preds = %for.body
110  br label %for.end
111
112for.end:                                          ; preds = %for.end.loopexit, %entry
113  ret void
114}
115
116
117;;  for (long unsigned i = 0; i < 5; i++) {
118;;    A[2*i] = i;
119;;    *B++ = A[10];
120
121define void @weakzerodst2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
122entry:
123  br label %for.body
124
125; CHECK: da analyze - none!
126; CHECK: da analyze - none!
127; CHECK: da analyze - confused!
128; CHECK: da analyze - consistent input [S]!
129; CHECK: da analyze - confused!
130; CHECK: da analyze - none!
131
132for.body:                                         ; preds = %entry, %for.body
133  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
134  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
135  %conv = trunc i64 %i.02 to i32
136  %mul = shl i64 %i.02, 1
137  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul
138  store i32 %conv, i32* %arrayidx, align 4
139  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10
140  %0 = load i32, i32* %arrayidx1, align 4
141  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
142  store i32 %0, i32* %B.addr.01, align 4
143  %inc = add i64 %i.02, 1
144  %exitcond = icmp ne i64 %inc, 5
145  br i1 %exitcond, label %for.body, label %for.end
146
147for.end:                                          ; preds = %for.body
148  ret void
149}
150
151
152;;  for (long unsigned i = 0; i < 6; i++) {
153;;    A[2*i] = i;
154;;    *B++ = A[10];
155
156define void @weakzerodst3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
157entry:
158  br label %for.body
159
160; CHECK: da analyze - none!
161; CHECK: da analyze - flow [=>p|<]!
162; CHECK: da analyze - confused!
163; CHECK: da analyze - consistent input [S]!
164; CHECK: da analyze - confused!
165; CHECK: da analyze - none!
166
167for.body:                                         ; preds = %entry, %for.body
168  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
169  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
170  %conv = trunc i64 %i.02 to i32
171  %mul = shl i64 %i.02, 1
172  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul
173  store i32 %conv, i32* %arrayidx, align 4
174  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10
175  %0 = load i32, i32* %arrayidx1, align 4
176  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
177  store i32 %0, i32* %B.addr.01, align 4
178  %inc = add i64 %i.02, 1
179  %exitcond = icmp ne i64 %inc, 6
180  br i1 %exitcond, label %for.body, label %for.end
181
182for.end:                                          ; preds = %for.body
183  ret void
184}
185
186
187;;  for (long unsigned i = 0; i < 7; i++) {
188;;    A[2*i] = i;
189;;    *B++ = A[10];
190
191define void @weakzerodst4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
192entry:
193  br label %for.body
194
195; CHECK: da analyze - none!
196; CHECK: da analyze - flow [*|<]!
197; CHECK: da analyze - confused!
198; CHECK: da analyze - consistent input [S]!
199; CHECK: da analyze - confused!
200; CHECK: da analyze - none!
201
202for.body:                                         ; preds = %entry, %for.body
203  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
204  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
205  %conv = trunc i64 %i.02 to i32
206  %mul = shl i64 %i.02, 1
207  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul
208  store i32 %conv, i32* %arrayidx, align 4
209  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10
210  %0 = load i32, i32* %arrayidx1, align 4
211  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
212  store i32 %0, i32* %B.addr.01, align 4
213  %inc = add i64 %i.02, 1
214  %exitcond = icmp ne i64 %inc, 7
215  br i1 %exitcond, label %for.body, label %for.end
216
217for.end:                                          ; preds = %for.body
218  ret void
219}
220
221
222;;  for (long unsigned i = 0; i < 7; i++) {
223;;    A[2*i] = i;
224;;    *B++ = A[-10];
225
226define void @weakzerodst5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
227entry:
228  br label %for.body
229
230; CHECK: da analyze - none!
231; CHECK: da analyze - none!
232; CHECK: da analyze - confused!
233; CHECK: da analyze - consistent input [S]!
234; CHECK: da analyze - confused!
235; CHECK: da analyze - none!
236
237for.body:                                         ; preds = %entry, %for.body
238  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
239  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
240  %conv = trunc i64 %i.02 to i32
241  %mul = shl i64 %i.02, 1
242  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul
243  store i32 %conv, i32* %arrayidx, align 4
244  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 -10
245  %0 = load i32, i32* %arrayidx1, align 4
246  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
247  store i32 %0, i32* %B.addr.01, align 4
248  %inc = add i64 %i.02, 1
249  %exitcond = icmp ne i64 %inc, 7
250  br i1 %exitcond, label %for.body, label %for.end
251
252for.end:                                          ; preds = %for.body
253  ret void
254}
255
256
257;;  for (long unsigned i = 0; i < n; i++) {
258;;    A[3*i] = i;
259;;    *B++ = A[10];
260
261define void @weakzerodst6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
262entry:
263  %cmp1 = icmp eq i64 %n, 0
264  br i1 %cmp1, label %for.end, label %for.body.preheader
265
266; CHECK: da analyze - none!
267; CHECK: da analyze - none!
268; CHECK: da analyze - confused!
269; CHECK: da analyze - consistent input [S]!
270; CHECK: da analyze - confused!
271; CHECK: da analyze - none!
272
273for.body.preheader:                               ; preds = %entry
274  br label %for.body
275
276for.body:                                         ; preds = %for.body.preheader, %for.body
277  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
278  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
279  %conv = trunc i64 %i.03 to i32
280  %mul = mul i64 %i.03, 3
281  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul
282  store i32 %conv, i32* %arrayidx, align 4
283  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 10
284  %0 = load i32, i32* %arrayidx1, align 4
285  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
286  store i32 %0, i32* %B.addr.02, align 4
287  %inc = add i64 %i.03, 1
288  %exitcond = icmp ne i64 %inc, %n
289  br i1 %exitcond, label %for.body, label %for.end.loopexit
290
291for.end.loopexit:                                 ; preds = %for.body
292  br label %for.end
293
294for.end:                                          ; preds = %for.end.loopexit, %entry
295  ret void
296}
297