• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -analyze -basicaa -da | FileCheck %s -check-prefix=DELIN
2
3target 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"
4target triple = "x86_64-apple-macosx10.6.0"
5
6
7;;  for (long int i = 0; i < 100; i++)
8;;    for (long int j = 0; j < 100; j++) {
9;;      A[2*i - 4*j] = i;
10;;      *B++ = A[6*i + 8*j];
11
12define void @gcd0(i32* %A, i32* %B) nounwind uwtable ssp {
13entry:
14  br label %for.cond1.preheader
15
16; DELIN-LABEL: gcd0
17; DELIN: da analyze - output [* *]!
18; DELIN: da analyze - flow [=> *|<]!
19; DELIN: da analyze - confused!
20; DELIN: da analyze - input [* *]!
21; DELIN: da analyze - confused!
22; DELIN: da analyze - none!
23
24for.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, 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, i32* %A, i64 %add
42  %0 = load i32, i32* %arrayidx7, align 4
43  %incdec.ptr = getelementptr inbounds i32, 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, 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++)
61;;    for (long int j = 0; j < 100; j++) {
62;;      A[2*i - 4*j] = i;
63;;      *B++ = A[6*i + 8*j + 1];
64
65define void @gcd1(i32* %A, i32* %B) nounwind uwtable ssp {
66entry:
67  br label %for.cond1.preheader
68
69; DELIN-LABEL: gcd1
70; DELIN: da analyze - output [* *]!
71; DELIN: da analyze - none!
72; DELIN: da analyze - confused!
73; DELIN: da analyze - input [* *]!
74; DELIN: da analyze - confused!
75; DELIN: da analyze - none!
76
77for.cond1.preheader:                              ; preds = %entry, %for.inc9
78  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
79  %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
80  br label %for.body3
81
82for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
83  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
84  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
85  %conv = trunc i64 %i.03 to i32
86  %mul = shl nsw i64 %i.03, 1
87  %mul4 = shl nsw i64 %j.02, 2
88  %sub = sub nsw i64 %mul, %mul4
89  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %sub
90  store i32 %conv, i32* %arrayidx, align 4
91  %mul5 = mul nsw i64 %i.03, 6
92  %mul6 = shl nsw i64 %j.02, 3
93  %add = add nsw i64 %mul5, %mul6
94  %add7 = or i64 %add, 1
95  %arrayidx8 = getelementptr inbounds i32, i32* %A, i64 %add7
96  %0 = load i32, i32* %arrayidx8, align 4
97  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
98  store i32 %0, i32* %B.addr.11, align 4
99  %inc = add nsw i64 %j.02, 1
100  %exitcond = icmp ne i64 %inc, 100
101  br i1 %exitcond, label %for.body3, label %for.inc9
102
103for.inc9:                                         ; preds = %for.body3
104  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
105  %inc10 = add nsw i64 %i.03, 1
106  %exitcond5 = icmp ne i64 %inc10, 100
107  br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
108
109for.end11:                                        ; preds = %for.inc9
110  ret void
111}
112
113
114;;  for (long int i = 0; i < 100; i++)
115;;    for (long int j = 0; j < 100; j++) {
116;;      A[2*i - 4*j + 1] = i;
117;;      *B++ = A[6*i + 8*j];
118
119define void @gcd2(i32* %A, i32* %B) nounwind uwtable ssp {
120entry:
121  br label %for.cond1.preheader
122
123; DELIN-LABEL: gcd2
124; DELIN: da analyze - output [* *]!
125; DELIN: da analyze - none!
126; DELIN: da analyze - confused!
127; DELIN: da analyze - input [* *]!
128; DELIN: da analyze - confused!
129; DELIN: da analyze - none!
130
131for.cond1.preheader:                              ; preds = %entry, %for.inc9
132  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc9 ]
133  %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
134  br label %for.body3
135
136for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
137  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
138  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
139  %conv = trunc i64 %i.03 to i32
140  %mul = shl nsw i64 %i.03, 1
141  %mul4 = shl nsw i64 %j.02, 2
142  %sub = sub nsw i64 %mul, %mul4
143  %add5 = or i64 %sub, 1
144  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add5
145  store i32 %conv, i32* %arrayidx, align 4
146  %mul5 = mul nsw i64 %i.03, 6
147  %mul6 = shl nsw i64 %j.02, 3
148  %add7 = add nsw i64 %mul5, %mul6
149  %arrayidx8 = getelementptr inbounds i32, i32* %A, i64 %add7
150  %0 = load i32, i32* %arrayidx8, align 4
151  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
152  store i32 %0, i32* %B.addr.11, align 4
153  %inc = add nsw i64 %j.02, 1
154  %exitcond = icmp ne i64 %inc, 100
155  br i1 %exitcond, label %for.body3, label %for.inc9
156
157for.inc9:                                         ; preds = %for.body3
158  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
159  %inc10 = add nsw i64 %i.03, 1
160  %exitcond6 = icmp ne i64 %inc10, 100
161  br i1 %exitcond6, label %for.cond1.preheader, label %for.end11
162
163for.end11:                                        ; preds = %for.inc9
164  ret void
165}
166
167
168;;  for (long int i = 0; i < 100; i++)
169;;    for (long int j = 0; j < 100; j++) {
170;;      A[i + 2*j] = i;
171;;      *B++ = A[i + 2*j - 1];
172
173define void @gcd3(i32* %A, i32* %B) nounwind uwtable ssp {
174entry:
175  br label %for.cond1.preheader
176
177; DELIN-LABEL: gcd3
178; DELIN: da analyze - output [* *]!
179; DELIN: da analyze - flow [<> *]!
180; DELIN: da analyze - confused!
181; DELIN: da analyze - input [* *]!
182; DELIN: da analyze - confused!
183; DELIN: da analyze - none!
184
185for.cond1.preheader:                              ; preds = %entry, %for.inc7
186  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc7 ]
187  %i.03 = phi i64 [ 0, %entry ], [ %inc8, %for.inc7 ]
188  br label %for.body3
189
190for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
191  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
192  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
193  %conv = trunc i64 %i.03 to i32
194  %mul = shl nsw i64 %j.02, 1
195  %add = add nsw i64 %i.03, %mul
196  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
197  store i32 %conv, i32* %arrayidx, align 4
198  %mul4 = shl nsw i64 %j.02, 1
199  %add5 = add nsw i64 %i.03, %mul4
200  %sub = add nsw i64 %add5, -1
201  %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %sub
202  %0 = load i32, i32* %arrayidx6, align 4
203  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
204  store i32 %0, i32* %B.addr.11, align 4
205  %inc = add nsw i64 %j.02, 1
206  %exitcond = icmp ne i64 %inc, 100
207  br i1 %exitcond, label %for.body3, label %for.inc7
208
209for.inc7:                                         ; preds = %for.body3
210  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
211  %inc8 = add nsw i64 %i.03, 1
212  %exitcond5 = icmp ne i64 %inc8, 100
213  br i1 %exitcond5, label %for.cond1.preheader, label %for.end9
214
215for.end9:                                         ; preds = %for.inc7
216  ret void
217}
218
219
220;;  for (long int i = 0; i < 100; i++)
221;;    for (long int j = 0; j < 100; j++) {
222;;      A[5*i + 10*j*M + 9*M*N] = i;
223;;      *B++ = A[15*i + 20*j*M - 21*N*M + 4];
224
225define void @gcd4(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
226entry:
227  br label %for.cond1.preheader
228
229; DELIN-LABEL: gcd4
230; DELIN: da analyze - output [* *]!
231; DELIN: da analyze - none!
232; DELIN: da analyze - confused!
233; DELIN: da analyze - input [* *]!
234; DELIN: da analyze - confused!
235; DELIN: da analyze - none!
236
237for.cond1.preheader:                              ; preds = %entry, %for.inc17
238  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
239  %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
240  br label %for.body3
241
242for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
243  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
244  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
245  %conv = trunc i64 %i.03 to i32
246  %mul = mul nsw i64 %i.03, 5
247  %mul4 = mul nsw i64 %j.02, 10
248  %mul5 = mul nsw i64 %mul4, %M
249  %add = add nsw i64 %mul, %mul5
250  %mul6 = mul nsw i64 %M, 9
251  %mul7 = mul nsw i64 %mul6, %N
252  %add8 = add nsw i64 %add, %mul7
253  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add8
254  store i32 %conv, i32* %arrayidx, align 4
255  %mul9 = mul nsw i64 %i.03, 15
256  %mul10 = mul nsw i64 %j.02, 20
257  %mul11 = mul nsw i64 %mul10, %M
258  %add12 = add nsw i64 %mul9, %mul11
259  %mul13 = mul nsw i64 %N, 21
260  %mul14 = mul nsw i64 %mul13, %M
261  %sub = sub nsw i64 %add12, %mul14
262  %add15 = add nsw i64 %sub, 4
263  %arrayidx16 = getelementptr inbounds i32, i32* %A, i64 %add15
264  %0 = load i32, i32* %arrayidx16, align 4
265  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
266  store i32 %0, i32* %B.addr.11, align 4
267  %inc = add nsw i64 %j.02, 1
268  %exitcond = icmp ne i64 %inc, 100
269  br i1 %exitcond, label %for.body3, label %for.inc17
270
271for.inc17:                                        ; preds = %for.body3
272  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
273  %inc18 = add nsw i64 %i.03, 1
274  %exitcond5 = icmp ne i64 %inc18, 100
275  br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
276
277for.end19:                                        ; preds = %for.inc17
278  ret void
279}
280
281
282;;  for (long int i = 0; i < 100; i++)
283;;    for (long int j = 0; j < 100; j++) {
284;;      A[5*i + 10*j*M + 9*M*N] = i;
285;;      *B++ = A[15*i + 20*j*M - 21*N*M + 5];
286
287define void @gcd5(i32* %A, i32* %B, i64 %M, i64 %N) nounwind uwtable ssp {
288entry:
289  br label %for.cond1.preheader
290
291; DELIN-LABEL: gcd5
292; DELIN: da analyze - output [* *]!
293; DELIN: da analyze - flow [<> *]!
294; DELIN: da analyze - confused!
295; DELIN: da analyze - input [* *]!
296; DELIN: da analyze - confused!
297; DELIN: da analyze - none!
298
299for.cond1.preheader:                              ; preds = %entry, %for.inc17
300  %B.addr.04 = phi i32* [ %B, %entry ], [ %scevgep, %for.inc17 ]
301  %i.03 = phi i64 [ 0, %entry ], [ %inc18, %for.inc17 ]
302  br label %for.body3
303
304for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
305  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
306  %B.addr.11 = phi i32* [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
307  %conv = trunc i64 %i.03 to i32
308  %mul = mul nsw i64 %i.03, 5
309  %mul4 = mul nsw i64 %j.02, 10
310  %mul5 = mul nsw i64 %mul4, %M
311  %add = add nsw i64 %mul, %mul5
312  %mul6 = mul nsw i64 %M, 9
313  %mul7 = mul nsw i64 %mul6, %N
314  %add8 = add nsw i64 %add, %mul7
315  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add8
316  store i32 %conv, i32* %arrayidx, align 4
317  %mul9 = mul nsw i64 %i.03, 15
318  %mul10 = mul nsw i64 %j.02, 20
319  %mul11 = mul nsw i64 %mul10, %M
320  %add12 = add nsw i64 %mul9, %mul11
321  %mul13 = mul nsw i64 %N, 21
322  %mul14 = mul nsw i64 %mul13, %M
323  %sub = sub nsw i64 %add12, %mul14
324  %add15 = add nsw i64 %sub, 5
325  %arrayidx16 = getelementptr inbounds i32, i32* %A, i64 %add15
326  %0 = load i32, i32* %arrayidx16, align 4
327  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.11, i64 1
328  store i32 %0, i32* %B.addr.11, align 4
329  %inc = add nsw i64 %j.02, 1
330  %exitcond = icmp ne i64 %inc, 100
331  br i1 %exitcond, label %for.body3, label %for.inc17
332
333for.inc17:                                        ; preds = %for.body3
334  %scevgep = getelementptr i32, i32* %B.addr.04, i64 100
335  %inc18 = add nsw i64 %i.03, 1
336  %exitcond5 = icmp ne i64 %inc18, 100
337  br i1 %exitcond5, label %for.cond1.preheader, label %for.end19
338
339for.end19:                                        ; preds = %for.inc17
340  ret void
341}
342
343
344;;  for (long int i = 0; i < n; i++)
345;;    for (long int j = 0; j < n; j++) {
346;;      A[2*i][4*j] = i;
347;;      *B++ = A[8*i][6*j + 1];
348
349define void @gcd6(i64 %n, i32* %A, i32* %B) nounwind uwtable ssp {
350entry:
351  %cmp4 = icmp sgt i64 %n, 0
352  br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end12
353
354; DELIN-LABEL: gcd6
355; DELIN: da analyze - output [* *]!
356; DELIN: da analyze - none!
357; DELIN: da analyze - confused!
358; DELIN: da analyze - input [* *]!
359; DELIN: da analyze - confused!
360; DELIN: da analyze - output [* *]!
361
362for.cond1.preheader.preheader:                    ; preds = %entry
363  br label %for.cond1.preheader
364
365for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc10
366  %i.06 = phi i64 [ %inc11, %for.inc10 ], [ 0, %for.cond1.preheader.preheader ]
367  %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc10 ], [ %B, %for.cond1.preheader.preheader ]
368  %cmp21 = icmp sgt i64 %n, 0
369  br i1 %cmp21, label %for.body3.preheader, label %for.inc10
370
371for.body3.preheader:                              ; preds = %for.cond1.preheader
372  br label %for.body3
373
374for.body3:                                        ; preds = %for.body3.preheader, %for.body3
375  %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]
376  %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
377  %conv = trunc i64 %i.06 to i32
378  %mul = shl nsw i64 %j.03, 2
379  %mul4 = shl nsw i64 %i.06, 1
380  %0 = mul nsw i64 %mul4, %n
381  %arrayidx.sum = add i64 %0, %mul
382  %arrayidx5 = getelementptr inbounds i32, i32* %A, i64 %arrayidx.sum
383  store i32 %conv, i32* %arrayidx5, align 4
384  %mul6 = mul nsw i64 %j.03, 6
385  %add7 = or i64 %mul6, 1
386  %mul7 = shl nsw i64 %i.06, 3
387  %1 = mul nsw i64 %mul7, %n
388  %arrayidx8.sum = add i64 %1, %add7
389  %arrayidx9 = getelementptr inbounds i32, i32* %A, i64 %arrayidx8.sum
390  %2 = load i32, i32* %arrayidx9, align 4
391  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
392  store i32 %2, i32* %B.addr.12, align 4
393  %inc = add nsw i64 %j.03, 1
394  %exitcond = icmp ne i64 %inc, %n
395  br i1 %exitcond, label %for.body3, label %for.inc10.loopexit
396
397for.inc10.loopexit:                               ; preds = %for.body3
398  %scevgep = getelementptr i32, i32* %B.addr.05, i64 %n
399  br label %for.inc10
400
401for.inc10:                                        ; preds = %for.inc10.loopexit, %for.cond1.preheader
402  %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc10.loopexit ]
403  %inc11 = add nsw i64 %i.06, 1
404  %exitcond8 = icmp ne i64 %inc11, %n
405  br i1 %exitcond8, label %for.cond1.preheader, label %for.end12.loopexit
406
407for.end12.loopexit:                               ; preds = %for.inc10
408  br label %for.end12
409
410for.end12:                                        ; preds = %for.end12.loopexit, %entry
411  ret void
412}
413
414
415;;  for (int i = 0; i < n; i++)
416;;   for (int j = 0; j < n; j++) {
417;;    A[2*i][4*j] = i;
418;;   *B++ = A[8*i][6*j + 1];
419
420define void @gcd7(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
421entry:
422  %0 = zext i32 %n to i64
423  %cmp4 = icmp sgt i32 %n, 0
424  br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
425
426; DELIN-LABEL: gcd7
427; DELIN: da analyze - output [* *]!
428; DELIN: da analyze - flow [* *|<]!
429; DELIN: da analyze - confused!
430; DELIN: da analyze - input [* *]!
431; DELIN: da analyze - confused!
432; DELIN: da analyze - output [* *]!
433
434for.cond1.preheader.preheader:                    ; preds = %entry
435  br label %for.cond1.preheader
436
437for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc13
438  %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
439  %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
440  %1 = add i32 %n, -1
441  %2 = zext i32 %1 to i64
442  %3 = add i64 %2, 1
443  %cmp21 = icmp sgt i32 %n, 0
444  br i1 %cmp21, label %for.body3.preheader, label %for.inc13
445
446for.body3.preheader:                              ; preds = %for.cond1.preheader
447  br label %for.body3
448
449for.body3:                                        ; preds = %for.body3.preheader, %for.body3
450  %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
451  %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
452  %4 = trunc i64 %indvars.iv to i32
453  %mul = shl nsw i32 %4, 2
454  %idxprom = sext i32 %mul to i64
455  %5 = trunc i64 %indvars.iv8 to i32
456  %mul4 = shl nsw i32 %5, 1
457  %idxprom5 = sext i32 %mul4 to i64
458  %6 = mul nsw i64 %idxprom5, %0
459  %arrayidx.sum = add i64 %6, %idxprom
460  %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %arrayidx.sum
461  %7 = trunc i64 %indvars.iv8 to i32
462  store i32 %7, i32* %arrayidx6, align 4
463  %8 = trunc i64 %indvars.iv to i32
464  %mul7 = mul nsw i32 %8, 6
465  %add7 = or i32 %mul7, 1
466  %idxprom8 = sext i32 %add7 to i64
467  %9 = trunc i64 %indvars.iv8 to i32
468  %mul9 = shl nsw i32 %9, 3
469  %idxprom10 = sext i32 %mul9 to i64
470  %10 = mul nsw i64 %idxprom10, %0
471  %arrayidx11.sum = add i64 %10, %idxprom8
472  %arrayidx12 = getelementptr inbounds i32, i32* %A, i64 %arrayidx11.sum
473  %11 = load i32, i32* %arrayidx12, align 4
474  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
475  store i32 %11, i32* %B.addr.12, align 4
476  %indvars.iv.next = add i64 %indvars.iv, 1
477  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
478  %exitcond = icmp ne i32 %lftr.wideiv, %n
479  br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
480
481for.inc13.loopexit:                               ; preds = %for.body3
482  %scevgep = getelementptr i32, i32* %B.addr.05, i64 %3
483  br label %for.inc13
484
485for.inc13:                                        ; preds = %for.inc13.loopexit, %for.cond1.preheader
486  %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
487  %indvars.iv.next9 = add i64 %indvars.iv8, 1
488  %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
489  %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
490  br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
491
492for.end15.loopexit:                               ; preds = %for.inc13
493  br label %for.end15
494
495for.end15:                                        ; preds = %for.end15.loopexit, %entry
496  ret void
497}
498
499
500;;  for (int i = 0; i < n; i++)
501;;    for (int j = 0; j < n; j++) {
502;;      A[n*2*i + 4*j] = i;
503;;      *B++ = A[n*8*i + 6*j + 1];
504
505define void @gcd8(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
506entry:
507  %cmp4 = icmp sgt i32 %n, 0
508  br i1 %cmp4, label %for.cond1.preheader.preheader, label %for.end15
509
510; DELIN-LABEL: gcd8
511; DELIN: da analyze - output [* *]!
512; DELIN: da analyze - flow [* *|<]!
513; DELIN: da analyze - confused!
514; DELIN: da analyze - input [* *]!
515; DELIN: da analyze - confused!
516; DELIN: da analyze - output [* *]!
517
518for.cond1.preheader.preheader:                    ; preds = %entry
519  br label %for.cond1.preheader
520
521for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc13
522  %i.06 = phi i32 [ %inc14, %for.inc13 ], [ 0, %for.cond1.preheader.preheader ]
523  %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
524  %0 = add i32 %n, -1
525  %1 = zext i32 %0 to i64
526  %2 = add i64 %1, 1
527  %cmp21 = icmp sgt i32 %n, 0
528  br i1 %cmp21, label %for.body3.preheader, label %for.inc13
529
530for.body3.preheader:                              ; preds = %for.cond1.preheader
531  br label %for.body3
532
533for.body3:                                        ; preds = %for.body3.preheader, %for.body3
534  %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
535  %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
536  %mul = shl nsw i32 %n, 1
537  %mul4 = mul nsw i32 %mul, %i.06
538  %3 = trunc i64 %indvars.iv to i32
539  %mul5 = shl nsw i32 %3, 2
540  %add = add nsw i32 %mul4, %mul5
541  %idxprom = sext i32 %add to i64
542  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom
543  store i32 %i.06, i32* %arrayidx, align 4
544  %mul6 = shl nsw i32 %n, 3
545  %mul7 = mul nsw i32 %mul6, %i.06
546  %4 = trunc i64 %indvars.iv to i32
547  %mul8 = mul nsw i32 %4, 6
548  %add9 = add nsw i32 %mul7, %mul8
549  %add10 = or i32 %add9, 1
550  %idxprom11 = sext i32 %add10 to i64
551  %arrayidx12 = getelementptr inbounds i32, i32* %A, i64 %idxprom11
552  %5 = load i32, i32* %arrayidx12, align 4
553  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
554  store i32 %5, i32* %B.addr.12, align 4
555  %indvars.iv.next = add i64 %indvars.iv, 1
556  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
557  %exitcond = icmp ne i32 %lftr.wideiv, %n
558  br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
559
560for.inc13.loopexit:                               ; preds = %for.body3
561  %scevgep = getelementptr i32, i32* %B.addr.05, i64 %2
562  br label %for.inc13
563
564for.inc13:                                        ; preds = %for.inc13.loopexit, %for.cond1.preheader
565  %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
566  %inc14 = add nsw i32 %i.06, 1
567  %exitcond7 = icmp ne i32 %inc14, %n
568  br i1 %exitcond7, label %for.cond1.preheader, label %for.end15.loopexit
569
570for.end15.loopexit:                               ; preds = %for.inc13
571  br label %for.end15
572
573for.end15:                                        ; preds = %for.end15.loopexit, %entry
574  ret void
575}
576
577
578;;  for (unsigned i = 0; i < n; i++)
579;;    for (unsigned j = 0; j < n; j++) {
580;;      A[2*i][4*j] = i;
581;;      *B++ = A[8*i][6*j + 1];
582
583define void @gcd9(i32 %n, i32* %A, i32* %B) nounwind uwtable ssp {
584entry:
585  %0 = zext i32 %n to i64
586  %cmp4 = icmp eq i32 %n, 0
587  br i1 %cmp4, label %for.end15, label %for.cond1.preheader.preheader
588
589; DELIN-LABEL: gcd9
590; DELIN: da analyze - output [* *]!
591; DELIN: da analyze - flow [* *|<]!
592; DELIN: da analyze - confused!
593; DELIN: da analyze - input [* *]!
594; DELIN: da analyze - confused!
595; DELIN: da analyze - output [* *]!
596
597for.cond1.preheader.preheader:                    ; preds = %entry
598  br label %for.cond1.preheader
599
600for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc13
601  %indvars.iv8 = phi i64 [ 0, %for.cond1.preheader.preheader ], [ %indvars.iv.next9, %for.inc13 ]
602  %B.addr.05 = phi i32* [ %B.addr.1.lcssa, %for.inc13 ], [ %B, %for.cond1.preheader.preheader ]
603  %1 = add i32 %n, -1
604  %2 = zext i32 %1 to i64
605  %3 = add i64 %2, 1
606  %cmp21 = icmp eq i32 %n, 0
607  br i1 %cmp21, label %for.inc13, label %for.body3.preheader
608
609for.body3.preheader:                              ; preds = %for.cond1.preheader
610  br label %for.body3
611
612for.body3:                                        ; preds = %for.body3.preheader, %for.body3
613  %indvars.iv = phi i64 [ 0, %for.body3.preheader ], [ %indvars.iv.next, %for.body3 ]
614  %B.addr.12 = phi i32* [ %incdec.ptr, %for.body3 ], [ %B.addr.05, %for.body3.preheader ]
615  %4 = trunc i64 %indvars.iv to i32
616  %mul = shl i32 %4, 2
617  %idxprom = zext i32 %mul to i64
618  %5 = trunc i64 %indvars.iv8 to i32
619  %mul4 = shl i32 %5, 1
620  %idxprom5 = zext i32 %mul4 to i64
621  %6 = mul nsw i64 %idxprom5, %0
622  %arrayidx.sum = add i64 %6, %idxprom
623  %arrayidx6 = getelementptr inbounds i32, i32* %A, i64 %arrayidx.sum
624  %7 = trunc i64 %indvars.iv8 to i32
625  store i32 %7, i32* %arrayidx6, align 4
626  %8 = trunc i64 %indvars.iv to i32
627  %mul7 = mul i32 %8, 6
628  %add7 = or i32 %mul7, 1
629  %idxprom8 = zext i32 %add7 to i64
630  %9 = trunc i64 %indvars.iv8 to i32
631  %mul9 = shl i32 %9, 3
632  %idxprom10 = zext i32 %mul9 to i64
633  %10 = mul nsw i64 %idxprom10, %0
634  %arrayidx11.sum = add i64 %10, %idxprom8
635  %arrayidx12 = getelementptr inbounds i32, i32* %A, i64 %arrayidx11.sum
636  %11 = load i32, i32* %arrayidx12, align 4
637  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.12, i64 1
638  store i32 %11, i32* %B.addr.12, align 4
639  %indvars.iv.next = add i64 %indvars.iv, 1
640  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
641  %exitcond = icmp ne i32 %lftr.wideiv, %n
642  br i1 %exitcond, label %for.body3, label %for.inc13.loopexit
643
644for.inc13.loopexit:                               ; preds = %for.body3
645  %scevgep = getelementptr i32, i32* %B.addr.05, i64 %3
646  br label %for.inc13
647
648for.inc13:                                        ; preds = %for.inc13.loopexit, %for.cond1.preheader
649  %B.addr.1.lcssa = phi i32* [ %B.addr.05, %for.cond1.preheader ], [ %scevgep, %for.inc13.loopexit ]
650  %indvars.iv.next9 = add i64 %indvars.iv8, 1
651  %lftr.wideiv10 = trunc i64 %indvars.iv.next9 to i32
652  %exitcond11 = icmp ne i32 %lftr.wideiv10, %n
653  br i1 %exitcond11, label %for.cond1.preheader, label %for.end15.loopexit
654
655for.end15.loopexit:                               ; preds = %for.inc13
656  br label %for.end15
657
658for.end15:                                        ; preds = %for.end15.loopexit, %entry
659  ret void
660}
661