1 ; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
3 ; ModuleID = 'WeakCrossingSIV.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 unsigned i = 0; i < n; i++) {
12 define void @weakcrossing0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
14 %cmp1 = icmp eq i64 %n, 0
15 br i1 %cmp1, label %for.end, label %for.body.preheader
17 for.body.preheader: ; preds = %entry
20 ; CHECK: da analyze - none!
21 ; CHECK: da analyze - flow [0|<]!
22 ; CHECK: da analyze - confused!
23 ; CHECK: da analyze - none!
24 ; CHECK: da analyze - confused!
25 ; CHECK: da analyze - none!
27 for.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 = mul i64 %i.03, %n
32 %add = add i64 %mul, 1
33 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
34 store i32 %conv, i32* %arrayidx, align 4
35 %mul1 = mul i64 %i.03, %n
36 %sub = sub i64 1, %mul1
37 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
38 %0 = load i32, i32* %arrayidx2, 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 i64 %i.03, 1
42 %exitcond = icmp ne i64 %inc, %n
43 br i1 %exitcond, label %for.body, label %for.end.loopexit
45 for.end.loopexit: ; preds = %for.body
48 for.end: ; preds = %for.end.loopexit, %entry
53 ;; for (long unsigned i = 0; i < n; i++) {
55 ;; *B++ = A[1 + n - i];
57 define void @weakcrossing1(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
59 %cmp1 = icmp eq i64 %n, 0
60 br i1 %cmp1, label %for.end, label %for.body.preheader
62 ; CHECK: da analyze - none!
63 ; CHECK: da analyze - flow [<>] splitable!
64 ; CHECK: da analyze - split level = 1, iteration = 0!
65 ; CHECK: da analyze - confused!
66 ; CHECK: da analyze - none!
67 ; CHECK: da analyze - confused!
68 ; CHECK: da analyze - none!
70 for.body.preheader: ; preds = %entry
73 for.body: ; preds = %for.body.preheader, %for.body
74 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
75 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
76 %conv = trunc i64 %i.03 to i32
77 %add = add i64 %i.03, %n
78 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
79 store i32 %conv, i32* %arrayidx, align 4
81 %sub = sub i64 %add1, %i.03
82 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
83 %0 = load i32, i32* %arrayidx2, align 4
84 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
85 store i32 %0, i32* %B.addr.02, align 4
86 %inc = add i64 %i.03, 1
87 %exitcond = icmp ne i64 %inc, %n
88 br i1 %exitcond, label %for.body, label %for.end.loopexit
90 for.end.loopexit: ; preds = %for.body
93 for.end: ; preds = %for.end.loopexit, %entry
98 ;; for (long unsigned i = 0; i < 3; i++) {
102 define void @weakcrossing2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
106 ; CHECK: da analyze - none!
107 ; CHECK: da analyze - none!
108 ; CHECK: da analyze - confused!
109 ; CHECK: da analyze - none!
110 ; CHECK: da analyze - confused!
111 ; CHECK: da analyze - none!
113 for.body: ; preds = %entry, %for.body
114 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
115 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
116 %conv = trunc i64 %i.02 to i32
117 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
118 store i32 %conv, i32* %arrayidx, align 4
119 %sub = sub i64 6, %i.02
120 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
121 %0 = load i32, i32* %arrayidx1, align 4
122 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
123 store i32 %0, i32* %B.addr.01, align 4
124 %inc = add i64 %i.02, 1
125 %exitcond = icmp ne i64 %inc, 3
126 br i1 %exitcond, label %for.body, label %for.end
128 for.end: ; preds = %for.body
133 ;; for (long unsigned i = 0; i < 4; i++) {
137 define void @weakcrossing3(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
141 ; CHECK: da analyze - none!
142 ; CHECK: da analyze - flow [0|<]!
143 ; CHECK: da analyze - confused!
144 ; CHECK: da analyze - none!
145 ; CHECK: da analyze - confused!
146 ; CHECK: da analyze - none!
148 for.body: ; preds = %entry, %for.body
149 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
150 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
151 %conv = trunc i64 %i.02 to i32
152 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
153 store i32 %conv, i32* %arrayidx, align 4
154 %sub = sub i64 6, %i.02
155 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
156 %0 = load i32, i32* %arrayidx1, align 4
157 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
158 store i32 %0, i32* %B.addr.01, align 4
159 %inc = add i64 %i.02, 1
160 %exitcond = icmp ne i64 %inc, 4
161 br i1 %exitcond, label %for.body, label %for.end
163 for.end: ; preds = %for.body
168 ;; for (long unsigned i = 0; i < 10; i++) {
172 define void @weakcrossing4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
176 ; CHECK: da analyze - none!
177 ; CHECK: da analyze - none!
178 ; CHECK: da analyze - confused!
179 ; CHECK: da analyze - none!
180 ; CHECK: da analyze - confused!
181 ; CHECK: da analyze - none!
183 for.body: ; preds = %entry, %for.body
184 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
185 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
186 %conv = trunc i64 %i.02 to i32
187 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
188 store i32 %conv, i32* %arrayidx, align 4
189 %sub = sub i64 -6, %i.02
190 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
191 %0 = load i32, i32* %arrayidx1, align 4
192 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
193 store i32 %0, i32* %B.addr.01, align 4
194 %inc = add i64 %i.02, 1
195 %exitcond = icmp ne i64 %inc, 10
196 br i1 %exitcond, label %for.body, label %for.end
198 for.end: ; preds = %for.body
203 ;; for (long unsigned i = 0; i < n; i++) {
205 ;; *B++ = A[5 - 3*i];
207 define void @weakcrossing5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
209 %cmp1 = icmp eq i64 %n, 0
210 br i1 %cmp1, label %for.end, label %for.body.preheader
212 ; CHECK: da analyze - none!
213 ; CHECK: da analyze - none!
214 ; CHECK: da analyze - confused!
215 ; CHECK: da analyze - none!
216 ; CHECK: da analyze - confused!
217 ; CHECK: da analyze - none!
219 for.body.preheader: ; preds = %entry
222 for.body: ; preds = %for.body.preheader, %for.body
223 %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
224 %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
225 %conv = trunc i64 %i.03 to i32
226 %mul = mul i64 %i.03, 3
227 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %mul
228 store i32 %conv, i32* %arrayidx, align 4
229 %0 = mul i64 %i.03, -3
231 %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %sub
232 %1 = load i32, i32* %arrayidx2, align 4
233 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
234 store i32 %1, i32* %B.addr.02, align 4
235 %inc = add i64 %i.03, 1
236 %exitcond = icmp ne i64 %inc, %n
237 br i1 %exitcond, label %for.body, label %for.end.loopexit
239 for.end.loopexit: ; preds = %for.body
242 for.end: ; preds = %for.end.loopexit, %entry
247 ;; for (long unsigned i = 0; i < 4; i++) {
251 define void @weakcrossing6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
255 ; CHECK: da analyze - none!
256 ; CHECK: da analyze - flow [<>] splitable!
257 ; CHECK: da analyze - split level = 1, iteration = 2!
258 ; CHECK: da analyze - confused!
259 ; CHECK: da analyze - none!
260 ; CHECK: da analyze - confused!
261 ; CHECK: da analyze - none!
263 for.body: ; preds = %entry, %for.body
264 %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
265 %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
266 %conv = trunc i64 %i.02 to i32
267 %arrayidx = getelementptr inbounds i32, i32* %A, i64 %i.02
268 store i32 %conv, i32* %arrayidx, align 4
269 %sub = sub i64 5, %i.02
270 %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %sub
271 %0 = load i32, i32* %arrayidx1, align 4
272 %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
273 store i32 %0, i32* %B.addr.01, align 4
274 %inc = add i64 %i.02, 1
275 %exitcond = icmp ne i64 %inc, 4
276 br i1 %exitcond, label %for.body, label %for.end
278 for.end: ; preds = %for.body