xref: /llvm-project/llvm/test/Analysis/DependenceAnalysis/SymbolicSIV.ll (revision 46f9cddfd7e40998422d1e34a3f1193210ee2fb8)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5
2; RUN: opt < %s -disable-output "-passes=print<da>" -aa-pipeline=basic-aa 2>&1 \
3; RUN: | FileCheck %s
4
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 (long int i = 0; i < n; i++) {
10;;    A[2*i + n] = i;
11;;    *B++ = A[3*i + 3*n];
12
13define void @symbolicsiv0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
14; CHECK-LABEL: 'symbolicsiv0'
15; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
16; CHECK-NEXT:    da analyze - none!
17; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
18; CHECK-NEXT:    da analyze - none!
19; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
20; CHECK-NEXT:    da analyze - confused!
21; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
22; CHECK-NEXT:    da analyze - none!
23; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
24; CHECK-NEXT:    da analyze - confused!
25; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
26; CHECK-NEXT:    da analyze - none!
27;
28entry:
29  %cmp1 = icmp eq i64 %n, 0
30  br i1 %cmp1, label %for.end, label %for.body.preheader
31
32for.body.preheader:                               ; preds = %entry
33  br label %for.body
34
35for.body:                                         ; preds = %for.body.preheader, %for.body
36  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
37  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
38  %conv = trunc i64 %i.03 to i32
39  %mul = shl nsw i64 %i.03, 1
40  %add = add i64 %mul, %n
41  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
42  store i32 %conv, ptr %arrayidx, align 4
43  %mul14 = add i64 %i.03, %n
44  %add3 = mul i64 %mul14, 3
45  %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 %add3
46  %0 = load i32, ptr %arrayidx4, align 4
47  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
48  store i32 %0, ptr %B.addr.02, align 4
49  %inc = add nsw i64 %i.03, 1
50  %exitcond = icmp ne i64 %inc, %n
51  br i1 %exitcond, label %for.body, label %for.end.loopexit
52
53for.end.loopexit:                                 ; preds = %for.body
54  br label %for.end
55
56for.end:                                          ; preds = %for.end.loopexit, %entry
57  ret void
58}
59
60
61;;  for (long int i = 0; i < n; i++) {
62;;    A[2*i + 5*n] = i;
63;;    *B++ = A[3*i + 2*n];
64
65define void @symbolicsiv1(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
66; CHECK-LABEL: 'symbolicsiv1'
67; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
68; CHECK-NEXT:    da analyze - none!
69; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
70; CHECK-NEXT:    da analyze - none!
71; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
72; CHECK-NEXT:    da analyze - confused!
73; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
74; CHECK-NEXT:    da analyze - none!
75; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
76; CHECK-NEXT:    da analyze - confused!
77; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
78; CHECK-NEXT:    da analyze - none!
79;
80entry:
81  %cmp1 = icmp eq i64 %n, 0
82  br i1 %cmp1, label %for.end, label %for.body.preheader
83
84for.body.preheader:                               ; preds = %entry
85  br label %for.body
86
87for.body:                                         ; preds = %for.body.preheader, %for.body
88  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
89  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
90  %conv = trunc i64 %i.03 to i32
91  %mul = shl nsw i64 %i.03, 1
92  %mul1 = mul i64 %n, 5
93  %add = add i64 %mul, %mul1
94  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
95  store i32 %conv, ptr %arrayidx, align 4
96  %mul2 = mul nsw i64 %i.03, 3
97  %mul3 = shl i64 %n, 1
98  %add4 = add i64 %mul2, %mul3
99  %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %add4
100  %0 = load i32, ptr %arrayidx5, align 4
101  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
102  store i32 %0, ptr %B.addr.02, align 4
103  %inc = add nsw 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 int i = 0; i < n; i++) {
116;;    A[2*i - n] = i;
117;;    *B++ = A[-i + 2*n];
118
119define void @symbolicsiv2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
120; CHECK-LABEL: 'symbolicsiv2'
121; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
122; CHECK-NEXT:    da analyze - none!
123; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
124; CHECK-NEXT:    da analyze - none!
125; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
126; CHECK-NEXT:    da analyze - confused!
127; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
128; CHECK-NEXT:    da analyze - none!
129; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
130; CHECK-NEXT:    da analyze - confused!
131; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
132; CHECK-NEXT:    da analyze - none!
133;
134entry:
135  %cmp1 = icmp eq i64 %n, 0
136  br i1 %cmp1, label %for.end, label %for.body.preheader
137
138for.body.preheader:                               ; preds = %entry
139  br label %for.body
140
141for.body:                                         ; preds = %for.body.preheader, %for.body
142  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
143  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
144  %conv = trunc i64 %i.03 to i32
145  %mul = shl nsw i64 %i.03, 1
146  %sub = sub i64 %mul, %n
147  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
148  store i32 %conv, ptr %arrayidx, align 4
149  %mul2 = shl i64 %n, 1
150  %add = sub i64 %mul2, %i.03
151  %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %add
152  %0 = load i32, ptr %arrayidx3, align 4
153  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
154  store i32 %0, ptr %B.addr.02, align 4
155  %inc = add nsw i64 %i.03, 1
156  %exitcond = icmp ne i64 %inc, %n
157  br i1 %exitcond, label %for.body, label %for.end.loopexit
158
159for.end.loopexit:                                 ; preds = %for.body
160  br label %for.end
161
162for.end:                                          ; preds = %for.end.loopexit, %entry
163  ret void
164}
165
166
167;;  for (long int i = 0; i < n; i++) {
168;;    A[-2*i + n + 1] = i;
169;;    *B++ = A[i - 2*n];
170
171define void @symbolicsiv3(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
172; CHECK-LABEL: 'symbolicsiv3'
173; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
174; CHECK-NEXT:    da analyze - none!
175; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
176; CHECK-NEXT:    da analyze - none!
177; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
178; CHECK-NEXT:    da analyze - confused!
179; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
180; CHECK-NEXT:    da analyze - none!
181; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
182; CHECK-NEXT:    da analyze - confused!
183; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
184; CHECK-NEXT:    da analyze - none!
185;
186entry:
187  %cmp1 = icmp eq i64 %n, 0
188  br i1 %cmp1, label %for.end, label %for.body.preheader
189
190for.body.preheader:                               ; preds = %entry
191  br label %for.body
192
193for.body:                                         ; preds = %for.body.preheader, %for.body
194  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
195  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
196  %conv = trunc i64 %i.03 to i32
197  %mul = mul nsw i64 %i.03, -2
198  %add = add i64 %mul, %n
199  %add1 = add i64 %add, 1
200  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add1
201  store i32 %conv, ptr %arrayidx, align 4
202  %mul2 = shl i64 %n, 1
203  %sub = sub i64 %i.03, %mul2
204  %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %sub
205  %0 = load i32, ptr %arrayidx3, align 4
206  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
207  store i32 %0, ptr %B.addr.02, align 4
208  %inc = add nsw i64 %i.03, 1
209  %exitcond = icmp ne i64 %inc, %n
210  br i1 %exitcond, label %for.body, label %for.end.loopexit
211
212for.end.loopexit:                                 ; preds = %for.body
213  br label %for.end
214
215for.end:                                          ; preds = %for.end.loopexit, %entry
216  ret void
217}
218
219
220;;  for (long int i = 0; i < n; i++) {
221;;    A[-2*i + 3*n] = i;
222;;    *B++ = A[-i + n];
223
224define void @symbolicsiv4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
225; CHECK-LABEL: 'symbolicsiv4'
226; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
227; CHECK-NEXT:    da analyze - none!
228; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
229; CHECK-NEXT:    da analyze - none!
230; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
231; CHECK-NEXT:    da analyze - confused!
232; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: %0 = load i32, ptr %arrayidx3, align 4
233; CHECK-NEXT:    da analyze - none!
234; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx3, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
235; CHECK-NEXT:    da analyze - confused!
236; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
237; CHECK-NEXT:    da analyze - none!
238;
239entry:
240  %cmp1 = icmp eq i64 %n, 0
241  br i1 %cmp1, label %for.end, label %for.body.preheader
242
243for.body.preheader:                               ; preds = %entry
244  br label %for.body
245
246for.body:                                         ; preds = %for.body.preheader, %for.body
247  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
248  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
249  %conv = trunc i64 %i.03 to i32
250  %mul = mul nsw i64 %i.03, -2
251  %mul1 = mul i64 %n, 3
252  %add = add i64 %mul, %mul1
253  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
254  store i32 %conv, ptr %arrayidx, align 4
255  %add2 = sub i64 %n, %i.03
256  %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %add2
257  %0 = load i32, ptr %arrayidx3, align 4
258  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
259  store i32 %0, ptr %B.addr.02, align 4
260  %inc = add nsw i64 %i.03, 1
261  %exitcond = icmp ne i64 %inc, %n
262  br i1 %exitcond, label %for.body, label %for.end.loopexit
263
264for.end.loopexit:                                 ; preds = %for.body
265  br label %for.end
266
267for.end:                                          ; preds = %for.end.loopexit, %entry
268  ret void
269}
270
271
272;;  for (long int i = 0; i < n; i++) {
273;;    A[-2*i - 2*n] = i;
274;;    *B++ = A[-i - n];
275
276define void @symbolicsiv5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
277; CHECK-LABEL: 'symbolicsiv5'
278; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
279; CHECK-NEXT:    da analyze - none!
280; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
281; CHECK-NEXT:    da analyze - none!
282; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
283; CHECK-NEXT:    da analyze - confused!
284; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
285; CHECK-NEXT:    da analyze - none!
286; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
287; CHECK-NEXT:    da analyze - confused!
288; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
289; CHECK-NEXT:    da analyze - none!
290;
291entry:
292  %cmp1 = icmp eq i64 %n, 0
293  br i1 %cmp1, label %for.end, label %for.body.preheader
294
295for.body.preheader:                               ; preds = %entry
296  br label %for.body
297
298for.body:                                         ; preds = %for.body.preheader, %for.body
299  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
300  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
301  %conv = trunc i64 %i.03 to i32
302  %mul = mul nsw i64 %i.03, -2
303  %mul1 = shl i64 %n, 1
304  %sub = sub i64 %mul, %mul1
305  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
306  store i32 %conv, ptr %arrayidx, align 4
307  %sub2 = sub nsw i64 0, %i.03
308  %sub3 = sub i64 %sub2, %n
309  %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 %sub3
310  %0 = load i32, ptr %arrayidx4, align 4
311  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
312  store i32 %0, ptr %B.addr.02, align 4
313  %inc = add nsw i64 %i.03, 1
314  %exitcond = icmp ne i64 %inc, %n
315  br i1 %exitcond, label %for.body, label %for.end.loopexit
316
317for.end.loopexit:                                 ; preds = %for.body
318  br label %for.end
319
320for.end:                                          ; preds = %for.end.loopexit, %entry
321  ret void
322}
323
324
325;; why doesn't SCEV package understand that n >= 0?
326;;  for (long unsigned i = 0; i < n; i++) {
327;;    A[i + n + 1] = i;
328;;    *B++ = A[-i];
329
330define void @weaktest(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
331; CHECK-LABEL: 'weaktest'
332; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
333; CHECK-NEXT:    da analyze - none!
334; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
335; CHECK-NEXT:    da analyze - flow [*|<] splitable!
336; CHECK-NEXT:    da analyze - split level = 1, iteration = ((0 smax (-4 + (-4 * %n))) /u 8)!
337; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
338; CHECK-NEXT:    da analyze - confused!
339; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
340; CHECK-NEXT:    da analyze - none!
341; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
342; CHECK-NEXT:    da analyze - confused!
343; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
344; CHECK-NEXT:    da analyze - none!
345;
346entry:
347  %cmp1 = icmp eq i64 %n, 0
348  br i1 %cmp1, label %for.end, label %for.body.preheader
349
350for.body.preheader:                               ; preds = %entry
351  br label %for.body
352
353for.body:                                         ; preds = %for.body.preheader, %for.body
354  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
355  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
356  %conv = trunc i64 %i.03 to i32
357  %add = add i64 %i.03, %n
358  %add1 = add i64 %add, 1
359  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add1
360  store i32 %conv, ptr %arrayidx, align 4
361  %sub = sub i64 0, %i.03
362  %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub
363  %0 = load i32, ptr %arrayidx2, align 4
364  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
365  store i32 %0, ptr %B.addr.02, align 4
366  %inc = add i64 %i.03, 1
367  %exitcond = icmp ne i64 %inc, %n
368  br i1 %exitcond, label %for.body, label %for.end.loopexit
369
370for.end.loopexit:                                 ; preds = %for.body
371  br label %for.end
372
373for.end:                                          ; preds = %for.end.loopexit, %entry
374  ret void
375}
376
377
378;;  for (long int i = 0; i < n; i++) {
379;;    A[4*N*i + M] = i;
380;;    *B++ = A[4*N*i + 3*M + 1];
381
382define void @symbolicsiv6(ptr %A, ptr %B, i64 %n, i64 %N, i64 %M) nounwind uwtable ssp {
383; CHECK-LABEL: 'symbolicsiv6'
384; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
385; CHECK-NEXT:    da analyze - none!
386; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
387; CHECK-NEXT:    da analyze - none!
388; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
389; CHECK-NEXT:    da analyze - confused!
390; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
391; CHECK-NEXT:    da analyze - none!
392; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
393; CHECK-NEXT:    da analyze - confused!
394; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
395; CHECK-NEXT:    da analyze - none!
396;
397entry:
398  %cmp1 = icmp eq i64 %n, 0
399  br i1 %cmp1, label %for.end, label %for.body.preheader
400
401for.body.preheader:                               ; preds = %entry
402  br label %for.body
403
404for.body:                                         ; preds = %for.body.preheader, %for.body
405  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
406  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
407  %conv = trunc i64 %i.03 to i32
408  %mul = shl i64 %N, 2
409  %mul1 = mul i64 %mul, %i.03
410  %add = add i64 %mul1, %M
411  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
412  store i32 %conv, ptr %arrayidx, align 4
413  %mul2 = shl i64 %N, 2
414  %mul3 = mul i64 %mul2, %i.03
415  %mul4 = mul i64 %M, 3
416  %add5 = add i64 %mul3, %mul4
417  %add6 = add i64 %add5, 1
418  %arrayidx7 = getelementptr inbounds i32, ptr %A, i64 %add6
419  %0 = load i32, ptr %arrayidx7, align 4
420  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
421  store i32 %0, ptr %B.addr.02, align 4
422  %inc = add nsw i64 %i.03, 1
423  %exitcond = icmp ne i64 %inc, %n
424  br i1 %exitcond, label %for.body, label %for.end.loopexit
425
426for.end.loopexit:                                 ; preds = %for.body
427  br label %for.end
428
429for.end:                                          ; preds = %for.end.loopexit, %entry
430  ret void
431}
432
433
434;;  for (long int i = 0; i < n; i++) {
435;;    A[2*N*i + M] = i;
436;;    *B++ = A[2*N*i - 3*M + 2];
437
438define void @symbolicsiv7(ptr %A, ptr %B, i64 %n, i64 %N, i64 %M) nounwind uwtable ssp {
439; CHECK-LABEL: 'symbolicsiv7'
440; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
441; CHECK-NEXT:    da analyze - none!
442; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %1 = load i32, ptr %arrayidx6, align 4
443; CHECK-NEXT:    da analyze - flow [<>]!
444; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
445; CHECK-NEXT:    da analyze - confused!
446; CHECK-NEXT:  Src: %1 = load i32, ptr %arrayidx6, align 4 --> Dst: %1 = load i32, ptr %arrayidx6, align 4
447; CHECK-NEXT:    da analyze - none!
448; CHECK-NEXT:  Src: %1 = load i32, ptr %arrayidx6, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
449; CHECK-NEXT:    da analyze - confused!
450; CHECK-NEXT:  Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
451; CHECK-NEXT:    da analyze - none!
452;
453entry:
454  %cmp1 = icmp eq i64 %n, 0
455  br i1 %cmp1, label %for.end, label %for.body.preheader
456
457for.body.preheader:                               ; preds = %entry
458  br label %for.body
459
460for.body:                                         ; preds = %for.body.preheader, %for.body
461  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
462  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
463  %conv = trunc i64 %i.03 to i32
464  %mul = shl i64 %N, 1
465  %mul1 = mul i64 %mul, %i.03
466  %add = add i64 %mul1, %M
467  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
468  store i32 %conv, ptr %arrayidx, align 4
469  %mul2 = shl i64 %N, 1
470  %mul3 = mul i64 %mul2, %i.03
471  %0 = mul i64 %M, -3
472  %sub = add i64 %mul3, %0
473  %add5 = add i64 %sub, 2
474  %arrayidx6 = getelementptr inbounds i32, ptr %A, i64 %add5
475  %1 = load i32, ptr %arrayidx6, align 4
476  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
477  store i32 %1, ptr %B.addr.02, align 4
478  %inc = add nsw i64 %i.03, 1
479  %exitcond = icmp ne i64 %inc, %n
480  br i1 %exitcond, label %for.body, label %for.end.loopexit
481
482for.end.loopexit:                                 ; preds = %for.body
483  br label %for.end
484
485for.end:                                          ; preds = %for.end.loopexit, %entry
486  ret void
487}
488