blob: a42212464f8667e88ce912f961ac469f8f314457 [file] [log] [blame]
Sebastian Pop59b61b92012-10-11 07:32:34 +00001; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
2
3; ModuleID = 'GCD.bc'
4target 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"
5target triple = "x86_64-apple-macosx10.6.0"
6
7
8;; for (long int i = 0; i < 100; i++)
Benjamin Kramer3eb15632012-11-13 12:12:02 +00009;; for (long int j = 0; j < 100; j++) {
10;; A[2*i - 4*j] = i;
11;; *B++ = A[6*i + 8*j];
Sebastian Pop59b61b92012-10-11 07:32:34 +000012
13define void @gcd0(i32* %A, i32* %B) nounwind uwtable ssp {
14entry:
15 br label %for.cond1.preheader
16
Preston Briggs1084fa22012-11-27 06:41:46 +000017; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +000018; CHECK: da analyze - flow [=> *|<]!
19; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +000020; CHECK: da analyze - input [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +000021; CHECK: da analyze - confused!
Preston Briggs5cb8cfa2012-11-27 19:12:26 +000022; CHECK: da analyze - none!
Benjamin Kramer3eb15632012-11-13 12:12:02 +000023
Sebastian Pop59b61b92012-10-11 07:32:34 +000024for.cond1.preheader: ; preds = %entry, %for.inc8
25 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc8 ]
26 %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]
27 br label %for.body3
28
29for.body3: ; preds = %for.cond1.preheader, %for.body3
30 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
31 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
32 %conv = trunc i64 %i.03 to i32
33 %mul = shl nsw i64 %i.03, 1
34 %mul4 = shl nsw i64 %j.02, 2
35 %sub = sub nsw i64 %mul, %mul4
36 %arrayidx = getelementptr inbounds i32* %A, i64 %sub
37 store i32 %conv, i32* %arrayidx, align 4
38 %mul5 = mul nsw i64 %i.03, 6
39 %mul6 = shl nsw i64 %j.02, 3
40 %add = add nsw i64 %mul5, %mul6
41 %arrayidx7 = getelementptr inbounds i32* %A, i64 %add
42 %0 = load i32* %arrayidx7, align 4
Sebastian Pop59b61b92012-10-11 07:32:34 +000043 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
44 store i32 %0, i32* %B.addr.11, align 4
45 %inc = add nsw i64 %j.02, 1
46 %exitcond = icmp ne i64 %inc, 100
47 br i1 %exitcond, label %for.body3, label %for.inc8
48
49for.inc8: ; preds = %for.body3
50 %scevgep = getelementptr i32* %B.addr.04, i64 100
51 %inc9 = add nsw i64 %i.03, 1
52 %exitcond5 = icmp ne i64 %inc9, 100
53 br i1 %exitcond5, label %for.cond1.preheader, label %for.end10
54
55for.end10: ; preds = %for.inc8
56 ret void
57}
58
59
60;; for (long int i = 0; i < 100; i++)
Benjamin Kramer3eb15632012-11-13 12:12:02 +000061;; for (long int j = 0; j < 100; j++) {
62;; A[2*i - 4*j] = i;
63;; *B++ = A[6*i + 8*j + 1];
Sebastian Pop59b61b92012-10-11 07:32:34 +000064
65define void @gcd1(i32* %A, i32* %B) nounwind uwtable ssp {
66entry:
67 br label %for.cond1.preheader
68
Preston Briggs1084fa22012-11-27 06:41:46 +000069; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +000070; CHECK: da analyze - none!
71; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +000072; CHECK: da analyze - input [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +000073; CHECK: da analyze - confused!
Preston Briggs5cb8cfa2012-11-27 19:12:26 +000074; CHECK: da analyze - none!
Benjamin Kramer3eb15632012-11-13 12:12:02 +000075
Sebastian Pop59b61b92012-10-11 07:32:34 +000076for.cond1.preheader: ; preds = %entry, %for.inc9
77 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
78 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
79 br label %for.body3
80
81for.body3: ; preds = %for.cond1.preheader, %for.body3
82 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
83 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
84 %conv = trunc i64 %i.03 to i32
85 %mul = shl nsw i64 %i.03, 1
86 %mul4 = shl nsw i64 %j.02, 2
87 %sub = sub nsw i64 %mul, %mul4
88 %arrayidx = getelementptr inbounds i32* %A, i64 %sub
89 store i32 %conv, i32* %arrayidx, align 4
90 %mul5 = mul nsw i64 %i.03, 6
91 %mul6 = shl nsw i64 %j.02, 3
92 %add = add nsw i64 %mul5, %mul6
93 %add7 = or i64 %add, 1
94 %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7
95 %0 = load i32* %arrayidx8, align 4
Sebastian Pop59b61b92012-10-11 07:32:34 +000096 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
97 store i32 %0, i32* %B.addr.11, align 4
98 %inc = add nsw i64 %j.02, 1
99 %exitcond = icmp ne i64 %inc, 100
100 br i1 %exitcond, label %for.body3, label %for.inc9
101
102for.inc9: ; preds = %for.body3
103 %scevgep = getelementptr i32* %B.addr.04, i64 100
104 %inc10 = add nsw i64 %i.03, 1
105 %exitcond5 = icmp ne i64 %inc10, 100
106 br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
107
108for.end11: ; preds = %for.inc9
109 ret void
110}
111
112
113;; for (long int i = 0; i < 100; i++)
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000114;; for (long int j = 0; j < 100; j++) {
115;; A[2*i - 4*j + 1] = i;
116;; *B++ = A[6*i + 8*j];
Sebastian Pop59b61b92012-10-11 07:32:34 +0000117
118define void @gcd2(i32* %A, i32* %B) nounwind uwtable ssp {
119entry:
120 br label %for.cond1.preheader
121
Preston Briggs1084fa22012-11-27 06:41:46 +0000122; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000123; CHECK: da analyze - none!
124; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000125; CHECK: da analyze - input [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000126; CHECK: da analyze - confused!
Preston Briggs5cb8cfa2012-11-27 19:12:26 +0000127; CHECK: da analyze - none!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000128
Sebastian Pop59b61b92012-10-11 07:32:34 +0000129for.cond1.preheader: ; preds = %entry, %for.inc9
130 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
131 %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
132 br label %for.body3
133
134for.body3: ; preds = %for.cond1.preheader, %for.body3
135 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
136 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
137 %conv = trunc i64 %i.03 to i32
138 %mul = shl nsw i64 %i.03, 1
139 %mul4 = shl nsw i64 %j.02, 2
140 %sub = sub nsw i64 %mul, %mul4
141 %add5 = or i64 %sub, 1
142 %arrayidx = getelementptr inbounds i32* %A, i64 %add5
143 store i32 %conv, i32* %arrayidx, align 4
144 %mul5 = mul nsw i64 %i.03, 6
145 %mul6 = shl nsw i64 %j.02, 3
146 %add7 = add nsw i64 %mul5, %mul6
147 %arrayidx8 = getelementptr inbounds i32* %A, i64 %add7
148 %0 = load i32* %arrayidx8, align 4
Sebastian Pop59b61b92012-10-11 07:32:34 +0000149 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
150 store i32 %0, i32* %B.addr.11, align 4
151 %inc = add nsw i64 %j.02, 1
152 %exitcond = icmp ne i64 %inc, 100
153 br i1 %exitcond, label %for.body3, label %for.inc9
154
155for.inc9: ; preds = %for.body3
156 %scevgep = getelementptr i32* %B.addr.04, i64 100
157 %inc10 = add nsw i64 %i.03, 1
158 %exitcond6 = icmp ne i64 %inc10, 100
159 br i1 %exitcond6, label %for.cond1.preheader, label %for.end11
160
161for.end11: ; preds = %for.inc9
162 ret void
163}
164
165
166;; for (long int i = 0; i < 100; i++)
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000167;; for (long int j = 0; j < 100; j++) {
168;; A[i + 2*j] = i;
169;; *B++ = A[i + 2*j - 1];
Sebastian Pop59b61b92012-10-11 07:32:34 +0000170
171define void @gcd3(i32* %A, i32* %B) nounwind uwtable ssp {
172entry:
173 br label %for.cond1.preheader
174
Preston Briggs1084fa22012-11-27 06:41:46 +0000175; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000176; CHECK: da analyze - flow [<> *]!
177; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000178; CHECK: da analyze - input [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000179; CHECK: da analyze - confused!
Preston Briggs5cb8cfa2012-11-27 19:12:26 +0000180; CHECK: da analyze - none!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000181
Sebastian Pop59b61b92012-10-11 07:32:34 +0000182for.cond1.preheader: ; preds = %entry, %for.inc7
183 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc7 ]
184 %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ]
185 br label %for.body3
186
187for.body3: ; preds = %for.cond1.preheader, %for.body3
188 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
189 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
190 %conv = trunc i64 %i.03 to i32
191 %mul = shl nsw i64 %j.02, 1
192 %add = add nsw i64 %i.03, %mul
193 %arrayidx = getelementptr inbounds i32* %A, i64 %add
194 store i32 %conv, i32* %arrayidx, align 4
195 %mul4 = shl nsw i64 %j.02, 1
196 %add5 = add nsw i64 %i.03, %mul4
197 %sub = add nsw i64 %add5, -1
198 %arrayidx6 = getelementptr inbounds i32* %A, i64 %sub
199 %0 = load i32* %arrayidx6, align 4
Sebastian Pop59b61b92012-10-11 07:32:34 +0000200 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
201 store i32 %0, i32* %B.addr.11, align 4
202 %inc = add nsw i64 %j.02, 1
203 %exitcond = icmp ne i64 %inc, 100
204 br i1 %exitcond, label %for.body3, label %for.inc7
205
206for.inc7: ; preds = %for.body3
207 %scevgep = getelementptr i32* %B.addr.04, i64 100
208 %inc8 = add nsw i64 %i.03, 1
209 %exitcond5 = icmp ne i64 %inc8, 100
210 br i1 %exitcond5, label %for.cond1.preheader, label %for.end9
211
212for.end9: ; preds = %for.inc7
213 ret void
214}
215
216
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000217;; for (long int i = 0; i < 100; i++)
218;; for (long int j = 0; j < 100; j++) {
219;; A[5*i + 10*j*M + 9*M*N] = i;
220;; *B++ = A[15*i + 20*j*M - 21*N*M + 4];
Sebastian Pop59b61b92012-10-11 07:32:34 +0000221
222define void @gcd4(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
223entry:
224 br label %for.cond1.preheader
225
Preston Briggs1084fa22012-11-27 06:41:46 +0000226; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000227; CHECK: da analyze - none!
228; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000229; CHECK: da analyze - input [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000230; CHECK: da analyze - confused!
Preston Briggs5cb8cfa2012-11-27 19:12:26 +0000231; CHECK: da analyze - none!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000232
Sebastian Pop59b61b92012-10-11 07:32:34 +0000233for.cond1.preheader: ; preds = %entry, %for.inc17
234 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
235 %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
236 br label %for.body3
237
238for.body3: ; preds = %for.cond1.preheader, %for.body3
239 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
240 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
241 %conv = trunc i64 %i.03 to i32
242 %mul = mul nsw i64 %i.03, 5
243 %mul4 = mul nsw i64 %j.02, 10
244 %mul5 = mul nsw i64 %mul4, %M
245 %add = add nsw i64 %mul, %mul5
246 %mul6 = mul nsw i64 %M, 9
247 %mul7 = mul nsw i64 %mul6, %N
248 %add8 = add nsw i64 %add, %mul7
249 %arrayidx = getelementptr inbounds i32* %A, i64 %add8
250 store i32 %conv, i32* %arrayidx, align 4
251 %mul9 = mul nsw i64 %i.03, 15
252 %mul10 = mul nsw i64 %j.02, 20
253 %mul11 = mul nsw i64 %mul10, %M
254 %add12 = add nsw i64 %mul9, %mul11
255 %mul13 = mul nsw i64 %N, 21
256 %mul14 = mul nsw i64 %mul13, %M
257 %sub = sub nsw i64 %add12, %mul14
258 %add15 = add nsw i64 %sub, 4
259 %arrayidx16 = getelementptr inbounds i32* %A, i64 %add15
260 %0 = load i32* %arrayidx16, align 4
Sebastian Pop59b61b92012-10-11 07:32:34 +0000261 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
262 store i32 %0, i32* %B.addr.11, align 4
263 %inc = add nsw i64 %j.02, 1
264 %exitcond = icmp ne i64 %inc, 100
265 br i1 %exitcond, label %for.body3, label %for.inc17
266
267for.inc17: ; preds = %for.body3
268 %scevgep = getelementptr i32* %B.addr.04, i64 100
269 %inc18 = add nsw i64 %i.03, 1
270 %exitcond5 = icmp ne i64 %inc18, 100
271 br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
272
273for.end19: ; preds = %for.inc17
274 ret void
275}
276
277
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000278;; for (long int i = 0; i < 100; i++)
279;; for (long int j = 0; j < 100; j++) {
280;; A[5*i + 10*j*M + 9*M*N] = i;
281;; *B++ = A[15*i + 20*j*M - 21*N*M + 5];
Sebastian Pop59b61b92012-10-11 07:32:34 +0000282
283define void @gcd5(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
284entry:
285 br label %for.cond1.preheader
286
Preston Briggs1084fa22012-11-27 06:41:46 +0000287; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000288; CHECK: da analyze - flow [<> *]!
289; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000290; CHECK: da analyze - input [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000291; CHECK: da analyze - confused!
Preston Briggs5cb8cfa2012-11-27 19:12:26 +0000292; CHECK: da analyze - none!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000293
Sebastian Pop59b61b92012-10-11 07:32:34 +0000294for.cond1.preheader: ; preds = %entry, %for.inc17
295 %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
296 %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
297 br label %for.body3
298
299for.body3: ; preds = %for.cond1.preheader, %for.body3
300 %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
301 %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
302 %conv = trunc i64 %i.03 to i32
303 %mul = mul nsw i64 %i.03, 5
304 %mul4 = mul nsw i64 %j.02, 10
305 %mul5 = mul nsw i64 %mul4, %M
306 %add = add nsw i64 %mul, %mul5
307 %mul6 = mul nsw i64 %M, 9
308 %mul7 = mul nsw i64 %mul6, %N
309 %add8 = add nsw i64 %add, %mul7
310 %arrayidx = getelementptr inbounds i32* %A, i64 %add8
311 store i32 %conv, i32* %arrayidx, align 4
312 %mul9 = mul nsw i64 %i.03, 15
313 %mul10 = mul nsw i64 %j.02, 20
314 %mul11 = mul nsw i64 %mul10, %M
315 %add12 = add nsw i64 %mul9, %mul11
316 %mul13 = mul nsw i64 %N, 21
317 %mul14 = mul nsw i64 %mul13, %M
318 %sub = sub nsw i64 %add12, %mul14
319 %add15 = add nsw i64 %sub, 5
320 %arrayidx16 = getelementptr inbounds i32* %A, i64 %add15
321 %0 = load i32* %arrayidx16, align 4
Sebastian Pop59b61b92012-10-11 07:32:34 +0000322 %incdec.ptr = getelementptr inbounds i32* %B.addr.11, i64 1
323 store i32 %0, i32* %B.addr.11, align 4
324 %inc = add nsw i64 %j.02, 1
325 %exitcond = icmp ne i64 %inc, 100
326 br i1 %exitcond, label %for.body3, label %for.inc17
327
328for.inc17: ; preds = %for.body3
329 %scevgep = getelementptr i32* %B.addr.04, i64 100
330 %inc18 = add nsw i64 %i.03, 1
331 %exitcond5 = icmp ne i64 %inc18, 100
332 br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
333
334for.end19: ; preds = %for.inc17
335 ret void
336}
337
338
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000339;; for (long int i = 0; i < n; i++)
340;; for (long int j = 0; j < n; j++) {
341;; A[2*i][4*j] = i;
342;; *B++ = A[8*i][6*j + 1];
Sebastian Pop59b61b92012-10-11 07:32:34 +0000343
344define void @gcd6(i64 %n, i32* %A, i32* %B) nounwind uwtable ssp {
345entry:
346 %cmp4 = icmp sgt i64 %n, 0
347 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end12
348
Preston Briggs1084fa22012-11-27 06:41:46 +0000349; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000350; CHECK: da analyze - none!
351; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000352; CHECK: da analyze - input [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000353; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000354; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000355
Sebastian Pop59b61b92012-10-11 07:32:34 +0000356for.cond1.preheader.preheader: ; preds = %entry
357 br label %for.cond1.preheader
358
359for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc10
360 %i.06 = phi i64 [ %inc11, %for.inc10 ], [ 0, %for.cond1.preheader.preheader ]
361 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc10 ], [ %B, %for.cond1.preheader.preheader ]
362 %cmp21 = icmp sgt i64 %n, 0
363 br i1 %cmp21, label %for.body3.preheader, label %for.inc10
364
365for.body3.preheader: ; preds = %for.cond1.preheader
366 br label %for.body3
367
368for.body3: ; preds = %for.body3.preheader, %for.body3
369 %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]
370 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
371 %conv = trunc i64 %i.06 to i32
372 %mul = shl nsw i64 %j.03, 2
373 %mul4 = shl nsw i64 %i.06, 1
374 %0 = mul nsw i64 %mul4, %n
375 %arrayidx.sum = add i64 %0, %mul
376 %arrayidx5 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
377 store i32 %conv, i32* %arrayidx5, align 4
378 %mul6 = mul nsw i64 %j.03, 6
379 %add7 = or i64 %mul6, 1
380 %mul7 = shl nsw i64 %i.06, 3
381 %1 = mul nsw i64 %mul7, %n
382 %arrayidx8.sum = add i64 %1, %add7
383 %arrayidx9 = getelementptr inbounds i32* %A, i64 %arrayidx8.sum
384 %2 = load i32* %arrayidx9, align 4
Sebastian Pop59b61b92012-10-11 07:32:34 +0000385 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
386 store i32 %2, i32* %B.addr.12, align 4
387 %inc = add nsw i64 %j.03, 1
388 %exitcond = icmp ne i64 %inc, %n
389 br i1 %exitcond, label %for.body3, label %for.inc10.loopexit
390
391for.inc10.loopexit: ; preds = %for.body3
392 %scevgep = getelementptr i32* %B.addr.05, i64 %n
393 br label %for.inc10
394
395for.inc10: ; preds = %for.inc10.loopexit, %for.cond1.preheader
396 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc10.loopexit ]
397 %inc11 = add nsw i64 %i.06, 1
398 %exitcond8 = icmp ne i64 %inc11, %n
399 br i1 %exitcond8, label %for.cond1.preheader, label %for.end12.loopexit
400
401for.end12.loopexit: ; preds = %for.inc10
402 br label %for.end12
403
404for.end12: ; preds = %for.end12.loopexit, %entry
405 ret void
406}
407
408
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000409;; for (int i = 0; i < n; i++)
410;; for (int j = 0; j < n; j++) {
411;; A[2*i][4*j] = i;
412;; *B++ = A[8*i][6*j + 1];
Sebastian Pop59b61b92012-10-11 07:32:34 +0000413
414define void @gcd7(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
415entry:
416 %0 = zext i32 %n to i64
417 %cmp4 = icmp sgt i32 %n, 0
418 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
419
Preston Briggs1084fa22012-11-27 06:41:46 +0000420; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000421; CHECK: da analyze - flow [* *|<]!
422; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000423; CHECK: da analyze - input [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000424; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000425; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000426
Sebastian Pop59b61b92012-10-11 07:32:34 +0000427for.cond1.preheader.preheader: ; preds = %entry
428 br label %for.cond1.preheader
429
430for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
431 %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
432 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
433 %1 = add i32 %n, -1
434 %2 = zext i32 %1 to i64
435 %3 = add i64 %2, 1
436 %cmp21 = icmp sgt i32 %n, 0
437 br i1 %cmp21, label %for.body3.preheader, label %for.inc13
438
439for.body3.preheader: ; preds = %for.cond1.preheader
440 br label %for.body3
441
442for.body3: ; preds = %for.body3.preheader, %for.body3
443 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
444 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
445 %4 = trunc i64 %indvars.iv to i32
446 %mul = shl nsw i32 %4, 2
447 %idxprom = sext i32 %mul to i64
448 %5 = trunc i64 %indvars.iv8 to i32
449 %mul4 = shl nsw i32 %5, 1
450 %idxprom5 = sext i32 %mul4 to i64
451 %6 = mul nsw i64 %idxprom5, %0
452 %arrayidx.sum = add i64 %6, %idxprom
453 %arrayidx6 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
454 %7 = trunc i64 %indvars.iv8 to i32
455 store i32 %7, i32* %arrayidx6, align 4
456 %8 = trunc i64 %indvars.iv to i32
457 %mul7 = mul nsw i32 %8, 6
458 %add7 = or i32 %mul7, 1
459 %idxprom8 = sext i32 %add7 to i64
460 %9 = trunc i64 %indvars.iv8 to i32
461 %mul9 = shl nsw i32 %9, 3
462 %idxprom10 = sext i32 %mul9 to i64
463 %10 = mul nsw i64 %idxprom10, %0
464 %arrayidx11.sum = add i64 %10, %idxprom8
465 %arrayidx12 = getelementptr inbounds i32* %A, i64 %arrayidx11.sum
466 %11 = load i32* %arrayidx12, align 4
Sebastian Pop59b61b92012-10-11 07:32:34 +0000467 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
468 store i32 %11, i32* %B.addr.12, align 4
469 %indvars.iv.next = add i64 %indvars.iv, 1
470 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
471 %exitcond = icmp ne i32 %lftr.wideiv, %n
472 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
473
474for.inc13.loopexit: ; preds = %for.body3
475 %scevgep = getelementptr i32* %B.addr.05, i64 %3
476 br label %for.inc13
477
478for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
479 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
480 %indvars.iv.next9 = add i64 %indvars.iv8, 1
481 %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
482 %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
483 br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
484
485for.end15.loopexit: ; preds = %for.inc13
486 br label %for.end15
487
488for.end15: ; preds = %for.end15.loopexit, %entry
489 ret void
490}
491
492
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000493;; for (int i = 0; i < n; i++)
494;; for (int j = 0; j < n; j++) {
495;; A[n*2*i + 4*j] = i;
496;; *B++ = A[n*8*i + 6*j + 1];
Sebastian Pop59b61b92012-10-11 07:32:34 +0000497
498define void @gcd8(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
499entry:
500 %cmp4 = icmp sgt i32 %n, 0
501 br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
502
Preston Briggs1084fa22012-11-27 06:41:46 +0000503; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000504; CHECK: da analyze - none!
505; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000506; CHECK: da analyze - input [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000507; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000508; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000509
Sebastian Pop59b61b92012-10-11 07:32:34 +0000510for.cond1.preheader.preheader: ; preds = %entry
511 br label %for.cond1.preheader
512
513for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
514 %i.06 = phi i32 [ %inc14, %for.inc13 ], [ 0, %for.cond1.preheader.preheader ]
515 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
516 %0 = add i32 %n, -1
517 %1 = zext i32 %0 to i64
518 %2 = add i64 %1, 1
519 %cmp21 = icmp sgt i32 %n, 0
520 br i1 %cmp21, label %for.body3.preheader, label %for.inc13
521
522for.body3.preheader: ; preds = %for.cond1.preheader
523 br label %for.body3
524
525for.body3: ; preds = %for.body3.preheader, %for.body3
526 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
527 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
528 %mul = shl nsw i32 %n, 1
529 %mul4 = mul nsw i32 %mul, %i.06
530 %3 = trunc i64 %indvars.iv to i32
531 %mul5 = shl nsw i32 %3, 2
532 %add = add nsw i32 %mul4, %mul5
533 %idxprom = sext i32 %add to i64
534 %arrayidx = getelementptr inbounds i32* %A, i64 %idxprom
535 store i32 %i.06, i32* %arrayidx, align 4
536 %mul6 = shl nsw i32 %n, 3
537 %mul7 = mul nsw i32 %mul6, %i.06
538 %4 = trunc i64 %indvars.iv to i32
539 %mul8 = mul nsw i32 %4, 6
540 %add9 = add nsw i32 %mul7, %mul8
541 %add10 = or i32 %add9, 1
542 %idxprom11 = sext i32 %add10 to i64
543 %arrayidx12 = getelementptr inbounds i32* %A, i64 %idxprom11
544 %5 = load i32* %arrayidx12, align 4
Sebastian Pop59b61b92012-10-11 07:32:34 +0000545 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
546 store i32 %5, i32* %B.addr.12, align 4
547 %indvars.iv.next = add i64 %indvars.iv, 1
548 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
549 %exitcond = icmp ne i32 %lftr.wideiv, %n
550 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
551
552for.inc13.loopexit: ; preds = %for.body3
553 %scevgep = getelementptr i32* %B.addr.05, i64 %2
554 br label %for.inc13
555
556for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
557 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
558 %inc14 = add nsw i32 %i.06, 1
559 %exitcond7 = icmp ne i32 %inc14, %n
560 br i1 %exitcond7, label %for.cond1.preheader, label %for.end15.loopexit
561
562for.end15.loopexit: ; preds = %for.inc13
563 br label %for.end15
564
565for.end15: ; preds = %for.end15.loopexit, %entry
566 ret void
567}
568
569
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000570;; for (unsigned i = 0; i < n; i++)
571;; for (unsigned j = 0; j < n; j++) {
572;; A[2*i][4*j] = i;
573;; *B++ = A[8*i][6*j + 1];
Sebastian Pop59b61b92012-10-11 07:32:34 +0000574
575define void @gcd9(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
576entry:
577 %0 = zext i32 %n to i64
578 %cmp4 = icmp eq i32 %n, 0
579 br i1 %cmp4, label %for.end15, label %for.cond1.preheader.preheader
580
Preston Briggs1084fa22012-11-27 06:41:46 +0000581; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000582; CHECK: da analyze - flow [* *|<]!
583; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000584; CHECK: da analyze - input [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000585; CHECK: da analyze - confused!
Preston Briggs1084fa22012-11-27 06:41:46 +0000586; CHECK: da analyze - output [* *]!
Benjamin Kramer3eb15632012-11-13 12:12:02 +0000587
Sebastian Pop59b61b92012-10-11 07:32:34 +0000588for.cond1.preheader.preheader: ; preds = %entry
589 br label %for.cond1.preheader
590
591for.cond1.preheader: ; preds = %for.cond1.preheader.preheader, %for.inc13
592 %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
593 %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
594 %1 = add i32 %n, -1
595 %2 = zext i32 %1 to i64
596 %3 = add i64 %2, 1
597 %cmp21 = icmp eq i32 %n, 0
598 br i1 %cmp21, label %for.inc13, label %for.body3.preheader
599
600for.body3.preheader: ; preds = %for.cond1.preheader
601 br label %for.body3
602
603for.body3: ; preds = %for.body3.preheader, %for.body3
604 %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
605 %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
606 %4 = trunc i64 %indvars.iv to i32
607 %mul = shl i32 %4, 2
608 %idxprom = zext i32 %mul to i64
609 %5 = trunc i64 %indvars.iv8 to i32
610 %mul4 = shl i32 %5, 1
611 %idxprom5 = zext i32 %mul4 to i64
612 %6 = mul nsw i64 %idxprom5, %0
613 %arrayidx.sum = add i64 %6, %idxprom
614 %arrayidx6 = getelementptr inbounds i32* %A, i64 %arrayidx.sum
615 %7 = trunc i64 %indvars.iv8 to i32
616 store i32 %7, i32* %arrayidx6, align 4
617 %8 = trunc i64 %indvars.iv to i32
618 %mul7 = mul i32 %8, 6
619 %add7 = or i32 %mul7, 1
620 %idxprom8 = zext i32 %add7 to i64
621 %9 = trunc i64 %indvars.iv8 to i32
622 %mul9 = shl i32 %9, 3
623 %idxprom10 = zext i32 %mul9 to i64
624 %10 = mul nsw i64 %idxprom10, %0
625 %arrayidx11.sum = add i64 %10, %idxprom8
626 %arrayidx12 = getelementptr inbounds i32* %A, i64 %arrayidx11.sum
627 %11 = load i32* %arrayidx12, align 4
Sebastian Pop59b61b92012-10-11 07:32:34 +0000628 %incdec.ptr = getelementptr inbounds i32* %B.addr.12, i64 1
629 store i32 %11, i32* %B.addr.12, align 4
630 %indvars.iv.next = add i64 %indvars.iv, 1
631 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
632 %exitcond = icmp ne i32 %lftr.wideiv, %n
633 br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
634
635for.inc13.loopexit: ; preds = %for.body3
636 %scevgep = getelementptr i32* %B.addr.05, i64 %3
637 br label %for.inc13
638
639for.inc13: ; preds = %for.inc13.loopexit, %for.cond1.preheader
640 %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
641 %indvars.iv.next9 = add i64 %indvars.iv8, 1
642 %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
643 %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
644 br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
645
646for.end15.loopexit: ; preds = %for.inc13
647 br label %for.end15
648
649for.end15: ; preds = %for.end15.loopexit, %entry
650 ret void
651}