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