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