xref: /llvm-project/llvm/test/Analysis/DependenceAnalysis/SymbolicRDIV.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
5; ModuleID = 'SymbolicRDIV.bc'
6target 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"
7target triple = "x86_64-apple-macosx10.6.0"
8
9
10;;  for (long int i = 0; i < n1; i++)
11;;    A[2*i + n1] = i;
12;;  for (long int j = 0; j < n2; j++)
13;;    *B++ = A[3*j + 3*n1];
14
15define void @symbolicrdiv0(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
16; CHECK-LABEL: 'symbolicrdiv0'
17; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
18; CHECK-NEXT:    da analyze - none!
19; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4
20; CHECK-NEXT:    da analyze - none!
21; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
22; CHECK-NEXT:    da analyze - confused!
23; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4
24; CHECK-NEXT:    da analyze - none!
25; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
26; CHECK-NEXT:    da analyze - confused!
27; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
28; CHECK-NEXT:    da analyze - none!
29;
30entry:
31  %cmp4 = icmp eq i64 %n1, 0
32  br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
33
34for.body.preheader:                               ; preds = %entry
35  br label %for.body
36
37for.cond1.preheader.loopexit:                     ; preds = %for.body
38  br label %for.cond1.preheader
39
40for.cond1.preheader:                              ; preds = %for.cond1.preheader.loopexit, %entry
41  %cmp21 = icmp eq i64 %n2, 0
42  br i1 %cmp21, label %for.end11, label %for.body4.preheader
43
44for.body4.preheader:                              ; preds = %for.cond1.preheader
45  br label %for.body4
46
47for.body:                                         ; preds = %for.body.preheader, %for.body
48  %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
49  %conv = trunc i64 %i.05 to i32
50  %mul = shl nsw i64 %i.05, 1
51  %add = add i64 %mul, %n1
52  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
53  store i32 %conv, ptr %arrayidx, align 4
54  %inc = add nsw i64 %i.05, 1
55  %exitcond = icmp ne i64 %inc, %n1
56  br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
57
58for.body4:                                        ; preds = %for.body4.preheader, %for.body4
59  %j.03 = phi i64 [ %inc10, %for.body4 ], [ 0, %for.body4.preheader ]
60  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
61  %mul56 = add i64 %j.03, %n1
62  %add7 = mul i64 %mul56, 3
63  %arrayidx8 = getelementptr inbounds i32, ptr %A, i64 %add7
64  %0 = load i32, ptr %arrayidx8, align 4
65  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
66  store i32 %0, ptr %B.addr.02, align 4
67  %inc10 = add nsw i64 %j.03, 1
68  %exitcond7 = icmp ne i64 %inc10, %n2
69  br i1 %exitcond7, label %for.body4, label %for.end11.loopexit
70
71for.end11.loopexit:                               ; preds = %for.body4
72  br label %for.end11
73
74for.end11:                                        ; preds = %for.end11.loopexit, %for.cond1.preheader
75  ret void
76}
77
78
79;;  for (long int i = 0; i < n1; i++)
80;;    A[2*i + 5*n2] = i;
81;;  for (long int j = 0; j < n2; j++)
82;;    *B++ = A[3*j + 2*n2];
83
84define void @symbolicrdiv1(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
85; CHECK-LABEL: 'symbolicrdiv1'
86; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
87; CHECK-NEXT:    da analyze - none!
88; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4
89; CHECK-NEXT:    da analyze - none!
90; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
91; CHECK-NEXT:    da analyze - confused!
92; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4
93; CHECK-NEXT:    da analyze - none!
94; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
95; CHECK-NEXT:    da analyze - confused!
96; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
97; CHECK-NEXT:    da analyze - none!
98;
99entry:
100  %cmp4 = icmp eq i64 %n1, 0
101  br i1 %cmp4, label %for.cond2.preheader, label %for.body.preheader
102
103for.body.preheader:                               ; preds = %entry
104  br label %for.body
105
106for.cond2.preheader.loopexit:                     ; preds = %for.body
107  br label %for.cond2.preheader
108
109for.cond2.preheader:                              ; preds = %for.cond2.preheader.loopexit, %entry
110  %cmp31 = icmp eq i64 %n2, 0
111  br i1 %cmp31, label %for.end12, label %for.body5.preheader
112
113for.body5.preheader:                              ; preds = %for.cond2.preheader
114  br label %for.body5
115
116for.body:                                         ; preds = %for.body.preheader, %for.body
117  %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
118  %conv = trunc i64 %i.05 to i32
119  %mul = shl nsw i64 %i.05, 1
120  %mul1 = mul i64 %n2, 5
121  %add = add i64 %mul, %mul1
122  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
123  store i32 %conv, ptr %arrayidx, align 4
124  %inc = add nsw i64 %i.05, 1
125  %exitcond = icmp ne i64 %inc, %n1
126  br i1 %exitcond, label %for.body, label %for.cond2.preheader.loopexit
127
128for.body5:                                        ; preds = %for.body5.preheader, %for.body5
129  %j.03 = phi i64 [ %inc11, %for.body5 ], [ 0, %for.body5.preheader ]
130  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body5 ], [ %B, %for.body5.preheader ]
131  %mul6 = mul nsw i64 %j.03, 3
132  %mul7 = shl i64 %n2, 1
133  %add8 = add i64 %mul6, %mul7
134  %arrayidx9 = getelementptr inbounds i32, ptr %A, i64 %add8
135  %0 = load i32, ptr %arrayidx9, align 4
136  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
137  store i32 %0, ptr %B.addr.02, align 4
138  %inc11 = add nsw i64 %j.03, 1
139  %exitcond6 = icmp ne i64 %inc11, %n2
140  br i1 %exitcond6, label %for.body5, label %for.end12.loopexit
141
142for.end12.loopexit:                               ; preds = %for.body5
143  br label %for.end12
144
145for.end12:                                        ; preds = %for.end12.loopexit, %for.cond2.preheader
146  ret void
147}
148
149
150;;  for (long int i = 0; i < n1; i++)
151;;    A[2*i - n2] = i;
152;;  for (long int j = 0; j < n2; j++)
153;;    *B++ = A[-j + 2*n1];
154
155define void @symbolicrdiv2(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
156; CHECK-LABEL: 'symbolicrdiv2'
157; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
158; CHECK-NEXT:    da analyze - none!
159; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
160; CHECK-NEXT:    da analyze - none!
161; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
162; CHECK-NEXT:    da analyze - confused!
163; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
164; CHECK-NEXT:    da analyze - none!
165; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
166; CHECK-NEXT:    da analyze - confused!
167; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
168; CHECK-NEXT:    da analyze - none!
169;
170entry:
171  %cmp4 = icmp eq i64 %n1, 0
172  br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
173
174for.body.preheader:                               ; preds = %entry
175  br label %for.body
176
177for.cond1.preheader.loopexit:                     ; preds = %for.body
178  br label %for.cond1.preheader
179
180for.cond1.preheader:                              ; preds = %for.cond1.preheader.loopexit, %entry
181  %cmp21 = icmp eq i64 %n2, 0
182  br i1 %cmp21, label %for.end10, label %for.body4.preheader
183
184for.body4.preheader:                              ; preds = %for.cond1.preheader
185  br label %for.body4
186
187for.body:                                         ; preds = %for.body.preheader, %for.body
188  %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
189  %conv = trunc i64 %i.05 to i32
190  %mul = shl nsw i64 %i.05, 1
191  %sub = sub i64 %mul, %n2
192  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
193  store i32 %conv, ptr %arrayidx, align 4
194  %inc = add nsw i64 %i.05, 1
195  %exitcond = icmp ne i64 %inc, %n1
196  br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
197
198for.body4:                                        ; preds = %for.body4.preheader, %for.body4
199  %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
200  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
201  %mul6 = shl i64 %n1, 1
202  %add = sub i64 %mul6, %j.03
203  %arrayidx7 = getelementptr inbounds i32, ptr %A, i64 %add
204  %0 = load i32, ptr %arrayidx7, align 4
205  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
206  store i32 %0, ptr %B.addr.02, align 4
207  %inc9 = add nsw i64 %j.03, 1
208  %exitcond6 = icmp ne i64 %inc9, %n2
209  br i1 %exitcond6, label %for.body4, label %for.end10.loopexit
210
211for.end10.loopexit:                               ; preds = %for.body4
212  br label %for.end10
213
214for.end10:                                        ; preds = %for.end10.loopexit, %for.cond1.preheader
215  ret void
216}
217
218
219;;  for (long int i = 0; i < n1; i++)
220;;    A[-i + n2] = i;
221;;  for (long int j = 0; j < n2; j++)
222;;    *B++ = A[j - n1];
223
224define void @symbolicrdiv3(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
225; CHECK-LABEL: 'symbolicrdiv3'
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 %arrayidx6, 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 %arrayidx6, align 4 --> Dst: %0 = load i32, ptr %arrayidx6, align 4
233; CHECK-NEXT:    da analyze - none!
234; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx6, 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  %cmp4 = icmp eq i64 %n1, 0
241  br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
242
243for.body.preheader:                               ; preds = %entry
244  br label %for.body
245
246for.cond1.preheader.loopexit:                     ; preds = %for.body
247  br label %for.cond1.preheader
248
249for.cond1.preheader:                              ; preds = %for.cond1.preheader.loopexit, %entry
250  %cmp21 = icmp eq i64 %n2, 0
251  br i1 %cmp21, label %for.end9, label %for.body4.preheader
252
253for.body4.preheader:                              ; preds = %for.cond1.preheader
254  br label %for.body4
255
256for.body:                                         ; preds = %for.body.preheader, %for.body
257  %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
258  %conv = trunc i64 %i.05 to i32
259  %add = sub i64 %n2, %i.05
260  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
261  store i32 %conv, ptr %arrayidx, align 4
262  %inc = add nsw i64 %i.05, 1
263  %exitcond = icmp ne i64 %inc, %n1
264  br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
265
266for.body4:                                        ; preds = %for.body4.preheader, %for.body4
267  %j.03 = phi i64 [ %inc8, %for.body4 ], [ 0, %for.body4.preheader ]
268  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
269  %sub5 = sub i64 %j.03, %n1
270  %arrayidx6 = getelementptr inbounds i32, ptr %A, i64 %sub5
271  %0 = load i32, ptr %arrayidx6, align 4
272  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
273  store i32 %0, ptr %B.addr.02, align 4
274  %inc8 = add nsw i64 %j.03, 1
275  %exitcond6 = icmp ne i64 %inc8, %n2
276  br i1 %exitcond6, label %for.body4, label %for.end9.loopexit
277
278for.end9.loopexit:                                ; preds = %for.body4
279  br label %for.end9
280
281for.end9:                                         ; preds = %for.end9.loopexit, %for.cond1.preheader
282  ret void
283}
284
285
286;;  for (long int i = 0; i < n1; i++)
287;;    A[-i + 2*n1] = i;
288;;  for (long int j = 0; j < n2; j++)
289;;    *B++ = A[-j + n1];
290
291define void @symbolicrdiv4(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
292; CHECK-LABEL: 'symbolicrdiv4'
293; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
294; CHECK-NEXT:    da analyze - none!
295; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
296; CHECK-NEXT:    da analyze - none!
297; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
298; CHECK-NEXT:    da analyze - confused!
299; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
300; CHECK-NEXT:    da analyze - none!
301; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
302; CHECK-NEXT:    da analyze - confused!
303; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
304; CHECK-NEXT:    da analyze - none!
305;
306entry:
307  %cmp4 = icmp eq i64 %n1, 0
308  br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
309
310for.body.preheader:                               ; preds = %entry
311  br label %for.body
312
313for.cond1.preheader.loopexit:                     ; preds = %for.body
314  br label %for.cond1.preheader
315
316for.cond1.preheader:                              ; preds = %for.cond1.preheader.loopexit, %entry
317  %cmp21 = icmp eq i64 %n2, 0
318  br i1 %cmp21, label %for.end10, label %for.body4.preheader
319
320for.body4.preheader:                              ; preds = %for.cond1.preheader
321  br label %for.body4
322
323for.body:                                         ; preds = %for.body.preheader, %for.body
324  %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
325  %conv = trunc i64 %i.05 to i32
326  %mul = shl i64 %n1, 1
327  %add = sub i64 %mul, %i.05
328  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
329  store i32 %conv, ptr %arrayidx, align 4
330  %inc = add nsw i64 %i.05, 1
331  %exitcond = icmp ne i64 %inc, %n1
332  br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
333
334for.body4:                                        ; preds = %for.body4.preheader, %for.body4
335  %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
336  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
337  %add6 = sub i64 %n1, %j.03
338  %arrayidx7 = getelementptr inbounds i32, ptr %A, i64 %add6
339  %0 = load i32, ptr %arrayidx7, align 4
340  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
341  store i32 %0, ptr %B.addr.02, align 4
342  %inc9 = add nsw i64 %j.03, 1
343  %exitcond6 = icmp ne i64 %inc9, %n2
344  br i1 %exitcond6, label %for.body4, label %for.end10.loopexit
345
346for.end10.loopexit:                               ; preds = %for.body4
347  br label %for.end10
348
349for.end10:                                        ; preds = %for.end10.loopexit, %for.cond1.preheader
350  ret void
351}
352
353
354;;  for (long int i = 0; i < n1; i++)
355;;    A[-i + n2] = i;
356;;  for (long int j = 0; j < n2; j++)
357;;    *B++ = A[-j + 2*n2];
358
359define void @symbolicrdiv5(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
360; CHECK-LABEL: 'symbolicrdiv5'
361; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
362; CHECK-NEXT:    da analyze - none!
363; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
364; CHECK-NEXT:    da analyze - none!
365; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
366; CHECK-NEXT:    da analyze - confused!
367; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
368; CHECK-NEXT:    da analyze - none!
369; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
370; CHECK-NEXT:    da analyze - confused!
371; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
372; CHECK-NEXT:    da analyze - none!
373;
374entry:
375  %cmp4 = icmp eq i64 %n1, 0
376  br i1 %cmp4, label %for.cond1.preheader, label %for.body.preheader
377
378for.body.preheader:                               ; preds = %entry
379  br label %for.body
380
381for.cond1.preheader.loopexit:                     ; preds = %for.body
382  br label %for.cond1.preheader
383
384for.cond1.preheader:                              ; preds = %for.cond1.preheader.loopexit, %entry
385  %cmp21 = icmp eq i64 %n2, 0
386  br i1 %cmp21, label %for.end10, label %for.body4.preheader
387
388for.body4.preheader:                              ; preds = %for.cond1.preheader
389  br label %for.body4
390
391for.body:                                         ; preds = %for.body.preheader, %for.body
392  %i.05 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
393  %conv = trunc i64 %i.05 to i32
394  %add = sub i64 %n2, %i.05
395  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
396  store i32 %conv, ptr %arrayidx, align 4
397  %inc = add nsw i64 %i.05, 1
398  %exitcond = icmp ne i64 %inc, %n1
399  br i1 %exitcond, label %for.body, label %for.cond1.preheader.loopexit
400
401for.body4:                                        ; preds = %for.body4.preheader, %for.body4
402  %j.03 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
403  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
404  %mul = shl i64 %n2, 1
405  %add6 = sub i64 %mul, %j.03
406  %arrayidx7 = getelementptr inbounds i32, ptr %A, i64 %add6
407  %0 = load i32, ptr %arrayidx7, align 4
408  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
409  store i32 %0, ptr %B.addr.02, align 4
410  %inc9 = add nsw i64 %j.03, 1
411  %exitcond6 = icmp ne i64 %inc9, %n2
412  br i1 %exitcond6, label %for.body4, label %for.end10.loopexit
413
414for.end10.loopexit:                               ; preds = %for.body4
415  br label %for.end10
416
417for.end10:                                        ; preds = %for.end10.loopexit, %for.cond1.preheader
418  ret void
419}
420
421
422;;  for (long int i = 0; i < n1; i++)
423;;    for (long int j = 0; j < n2; j++) {
424;;      A[j -i + n2] = i;
425;;      *B++ = A[2*n2];
426
427define void @symbolicrdiv6(ptr %A, ptr %B, i64 %n1, i64 %n2) nounwind uwtable ssp {
428; CHECK-LABEL: 'symbolicrdiv6'
429; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
430; CHECK-NEXT:    da analyze - output [* *]!
431; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
432; CHECK-NEXT:    da analyze - none!
433; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.12, align 4
434; CHECK-NEXT:    da analyze - confused!
435; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
436; CHECK-NEXT:    da analyze - consistent input [S S]!
437; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.12, align 4
438; CHECK-NEXT:    da analyze - confused!
439; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.12, align 4 --> Dst: store i32 %0, ptr %B.addr.12, align 4
440; CHECK-NEXT:    da analyze - output [* *]!
441;
442entry:
443  %cmp4 = icmp eq i64 %n1, 0
444  br i1 %cmp4, label %for.end7, label %for.cond1.preheader.preheader
445
446for.cond1.preheader.preheader:                    ; preds = %entry
447  br label %for.cond1.preheader
448
449for.cond1.preheader:                              ; preds = %for.cond1.preheader.preheader, %for.inc5
450  %B.addr.06 = phi ptr [ %B.addr.1.lcssa, %for.inc5 ], [ %B, %for.cond1.preheader.preheader ]
451  %i.05 = phi i64 [ %inc6, %for.inc5 ], [ 0, %for.cond1.preheader.preheader ]
452  %cmp21 = icmp eq i64 %n2, 0
453  br i1 %cmp21, label %for.inc5, label %for.body3.preheader
454
455for.body3.preheader:                              ; preds = %for.cond1.preheader
456  br label %for.body3
457
458for.body3:                                        ; preds = %for.body3.preheader, %for.body3
459  %j.03 = phi i64 [ %inc, %for.body3 ], [ 0, %for.body3.preheader ]
460  %B.addr.12 = phi ptr [ %incdec.ptr, %for.body3 ], [ %B.addr.06, %for.body3.preheader ]
461  %conv = trunc i64 %i.05 to i32
462  %sub = sub nsw i64 %j.03, %i.05
463  %add = add i64 %sub, %n2
464  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
465  store i32 %conv, ptr %arrayidx, align 4
466  %mul = shl i64 %n2, 1
467  %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 %mul
468  %0 = load i32, ptr %arrayidx4, align 4
469  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.12, i64 1
470  store i32 %0, ptr %B.addr.12, align 4
471  %inc = add nsw i64 %j.03, 1
472  %exitcond = icmp ne i64 %inc, %n2
473  br i1 %exitcond, label %for.body3, label %for.inc5.loopexit
474
475for.inc5.loopexit:                                ; preds = %for.body3
476  %scevgep = getelementptr i32, ptr %B.addr.06, i64 %n2
477  br label %for.inc5
478
479for.inc5:                                         ; preds = %for.inc5.loopexit, %for.cond1.preheader
480  %B.addr.1.lcssa = phi ptr [ %B.addr.06, %for.cond1.preheader ], [ %scevgep, %for.inc5.loopexit ]
481  %inc6 = add nsw i64 %i.05, 1
482  %exitcond7 = icmp ne i64 %inc6, %n1
483  br i1 %exitcond7, label %for.cond1.preheader, label %for.end7.loopexit
484
485for.end7.loopexit:                                ; preds = %for.inc5
486  br label %for.end7
487
488for.end7:                                         ; preds = %for.end7.loopexit, %entry
489  ret void
490}
491