xref: /llvm-project/llvm/test/Analysis/DependenceAnalysis/WeakCrossingSIV.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 = 'WeakCrossingSIV.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 unsigned i = 0; i < n; i++) {
11;;    A[1 + n*i] = i;
12;;    *B++ = A[1 - n*i];
13
14define void @weakcrossing0(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
15; CHECK-LABEL: 'weakcrossing0'
16; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
17; CHECK-NEXT:    da analyze - none!
18; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
19; CHECK-NEXT:    da analyze - flow [0|<]!
20; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
21; CHECK-NEXT:    da analyze - confused!
22; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
23; CHECK-NEXT:    da analyze - none!
24; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
25; CHECK-NEXT:    da analyze - confused!
26; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
27; CHECK-NEXT:    da analyze - none!
28;
29entry:
30  %cmp1 = icmp eq i64 %n, 0
31  br i1 %cmp1, label %for.end, label %for.body.preheader
32
33for.body.preheader:                               ; preds = %entry
34  br label %for.body
35
36for.body:                                         ; preds = %for.body.preheader, %for.body
37  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
38  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
39  %conv = trunc i64 %i.03 to i32
40  %mul = mul i64 %i.03, %n
41  %add = add i64 %mul, 1
42  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
43  store i32 %conv, ptr %arrayidx, align 4
44  %mul1 = mul i64 %i.03, %n
45  %sub = sub i64 1, %mul1
46  %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub
47  %0 = load i32, ptr %arrayidx2, align 4
48  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
49  store i32 %0, ptr %B.addr.02, align 4
50  %inc = add i64 %i.03, 1
51  %exitcond = icmp ne i64 %inc, %n
52  br i1 %exitcond, label %for.body, label %for.end.loopexit
53
54for.end.loopexit:                                 ; preds = %for.body
55  br label %for.end
56
57for.end:                                          ; preds = %for.end.loopexit, %entry
58  ret void
59}
60
61
62;;  for (long unsigned i = 0; i < n; i++) {
63;;    A[n + i] = i;
64;;    *B++ = A[1 + n - i];
65
66define void @weakcrossing1(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
67; CHECK-LABEL: 'weakcrossing1'
68; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
69; CHECK-NEXT:    da analyze - none!
70; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
71; CHECK-NEXT:    da analyze - flow [<>] splitable!
72; CHECK-NEXT:    da analyze - split level = 1, iteration = 0!
73; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
74; CHECK-NEXT:    da analyze - confused!
75; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: %0 = load i32, ptr %arrayidx2, align 4
76; CHECK-NEXT:    da analyze - none!
77; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
78; CHECK-NEXT:    da analyze - confused!
79; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.02, align 4 --> Dst: store i32 %0, ptr %B.addr.02, align 4
80; CHECK-NEXT:    da analyze - none!
81;
82entry:
83  %cmp1 = icmp eq i64 %n, 0
84  br i1 %cmp1, label %for.end, label %for.body.preheader
85
86for.body.preheader:                               ; preds = %entry
87  br label %for.body
88
89for.body:                                         ; preds = %for.body.preheader, %for.body
90  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
91  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
92  %conv = trunc i64 %i.03 to i32
93  %add = add i64 %i.03, %n
94  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
95  store i32 %conv, ptr %arrayidx, align 4
96  %add1 = add i64 %n, 1
97  %sub = sub i64 %add1, %i.03
98  %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub
99  %0 = load i32, ptr %arrayidx2, align 4
100  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
101  store i32 %0, ptr %B.addr.02, align 4
102  %inc = add i64 %i.03, 1
103  %exitcond = icmp ne i64 %inc, %n
104  br i1 %exitcond, label %for.body, label %for.end.loopexit
105
106for.end.loopexit:                                 ; preds = %for.body
107  br label %for.end
108
109for.end:                                          ; preds = %for.end.loopexit, %entry
110  ret void
111}
112
113
114;;  for (long unsigned i = 0; i < 3; i++) {
115;;    A[i] = i;
116;;    *B++ = A[6 - i];
117
118define void @weakcrossing2(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
119; CHECK-LABEL: 'weakcrossing2'
120; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
121; CHECK-NEXT:    da analyze - none!
122; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
123; CHECK-NEXT:    da analyze - none!
124; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
125; CHECK-NEXT:    da analyze - confused!
126; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
127; CHECK-NEXT:    da analyze - none!
128; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
129; CHECK-NEXT:    da analyze - confused!
130; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
131; CHECK-NEXT:    da analyze - none!
132;
133entry:
134  br label %for.body
135
136for.body:                                         ; preds = %entry, %for.body
137  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
138  %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]
139  %conv = trunc i64 %i.02 to i32
140  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02
141  store i32 %conv, ptr %arrayidx, align 4
142  %sub = sub i64 6, %i.02
143  %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub
144  %0 = load i32, ptr %arrayidx1, align 4
145  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
146  store i32 %0, ptr %B.addr.01, align 4
147  %inc = add i64 %i.02, 1
148  %exitcond = icmp ne i64 %inc, 3
149  br i1 %exitcond, label %for.body, label %for.end
150
151for.end:                                          ; preds = %for.body
152  ret void
153}
154
155
156;;  for (long unsigned i = 0; i < 4; i++) {
157;;    A[i] = i;
158;;    *B++ = A[6 - i];
159
160define void @weakcrossing3(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
161; CHECK-LABEL: 'weakcrossing3'
162; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
163; CHECK-NEXT:    da analyze - none!
164; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
165; CHECK-NEXT:    da analyze - flow [0|<]!
166; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
167; CHECK-NEXT:    da analyze - confused!
168; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
169; CHECK-NEXT:    da analyze - none!
170; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
171; CHECK-NEXT:    da analyze - confused!
172; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
173; CHECK-NEXT:    da analyze - none!
174;
175entry:
176  br label %for.body
177
178for.body:                                         ; preds = %entry, %for.body
179  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
180  %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]
181  %conv = trunc i64 %i.02 to i32
182  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02
183  store i32 %conv, ptr %arrayidx, align 4
184  %sub = sub i64 6, %i.02
185  %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub
186  %0 = load i32, ptr %arrayidx1, align 4
187  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
188  store i32 %0, ptr %B.addr.01, align 4
189  %inc = add i64 %i.02, 1
190  %exitcond = icmp ne i64 %inc, 4
191  br i1 %exitcond, label %for.body, label %for.end
192
193for.end:                                          ; preds = %for.body
194  ret void
195}
196
197
198;;  for (long unsigned i = 0; i < 10; i++) {
199;;    A[i] = i;
200;;    *B++ = A[-6 - i];
201
202define void @weakcrossing4(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
203; CHECK-LABEL: 'weakcrossing4'
204; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
205; CHECK-NEXT:    da analyze - none!
206; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
207; CHECK-NEXT:    da analyze - none!
208; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
209; CHECK-NEXT:    da analyze - confused!
210; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
211; CHECK-NEXT:    da analyze - none!
212; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
213; CHECK-NEXT:    da analyze - confused!
214; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
215; CHECK-NEXT:    da analyze - none!
216;
217entry:
218  br label %for.body
219
220for.body:                                         ; preds = %entry, %for.body
221  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
222  %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]
223  %conv = trunc i64 %i.02 to i32
224  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02
225  store i32 %conv, ptr %arrayidx, align 4
226  %sub = sub i64 -6, %i.02
227  %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub
228  %0 = load i32, ptr %arrayidx1, align 4
229  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
230  store i32 %0, ptr %B.addr.01, align 4
231  %inc = add i64 %i.02, 1
232  %exitcond = icmp ne i64 %inc, 10
233  br i1 %exitcond, label %for.body, label %for.end
234
235for.end:                                          ; preds = %for.body
236  ret void
237}
238
239
240;;  for (long unsigned i = 0; i < n; i++) {
241;;    A[3*i] = i;
242;;    *B++ = A[5 - 3*i];
243
244define void @weakcrossing5(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
245; CHECK-LABEL: 'weakcrossing5'
246; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
247; CHECK-NEXT:    da analyze - none!
248; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %1 = load i32, ptr %arrayidx2, align 4
249; CHECK-NEXT:    da analyze - none!
250; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
251; CHECK-NEXT:    da analyze - confused!
252; CHECK-NEXT:  Src: %1 = load i32, ptr %arrayidx2, align 4 --> Dst: %1 = load i32, ptr %arrayidx2, align 4
253; CHECK-NEXT:    da analyze - none!
254; CHECK-NEXT:  Src: %1 = load i32, ptr %arrayidx2, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
255; CHECK-NEXT:    da analyze - confused!
256; CHECK-NEXT:  Src: store i32 %1, ptr %B.addr.02, align 4 --> Dst: store i32 %1, ptr %B.addr.02, align 4
257; CHECK-NEXT:    da analyze - none!
258;
259entry:
260  %cmp1 = icmp eq i64 %n, 0
261  br i1 %cmp1, label %for.end, label %for.body.preheader
262
263for.body.preheader:                               ; preds = %entry
264  br label %for.body
265
266for.body:                                         ; preds = %for.body.preheader, %for.body
267  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
268  %B.addr.02 = phi ptr [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
269  %conv = trunc i64 %i.03 to i32
270  %mul = mul i64 %i.03, 3
271  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %mul
272  store i32 %conv, ptr %arrayidx, align 4
273  %0 = mul i64 %i.03, -3
274  %sub = add i64 %0, 5
275  %arrayidx2 = getelementptr inbounds i32, ptr %A, i64 %sub
276  %1 = load i32, ptr %arrayidx2, align 4
277  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.02, i64 1
278  store i32 %1, ptr %B.addr.02, align 4
279  %inc = add i64 %i.03, 1
280  %exitcond = icmp ne i64 %inc, %n
281  br i1 %exitcond, label %for.body, label %for.end.loopexit
282
283for.end.loopexit:                                 ; preds = %for.body
284  br label %for.end
285
286for.end:                                          ; preds = %for.end.loopexit, %entry
287  ret void
288}
289
290
291;;  for (long unsigned i = 0; i < 4; i++) {
292;;    A[i] = i;
293;;    *B++ = A[5 - i];
294
295define void @weakcrossing6(ptr %A, ptr %B, i64 %n) nounwind uwtable ssp {
296; CHECK-LABEL: 'weakcrossing6'
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 %arrayidx1, align 4
300; CHECK-NEXT:    da analyze - flow [<>] splitable!
301; CHECK-NEXT:    da analyze - split level = 1, iteration = 2!
302; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
303; CHECK-NEXT:    da analyze - confused!
304; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: %0 = load i32, ptr %arrayidx1, align 4
305; CHECK-NEXT:    da analyze - none!
306; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx1, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
307; CHECK-NEXT:    da analyze - confused!
308; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
309; CHECK-NEXT:    da analyze - none!
310;
311entry:
312  br label %for.body
313
314for.body:                                         ; preds = %entry, %for.body
315  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
316  %B.addr.01 = phi ptr [ %B, %entry ], [ %incdec.ptr, %for.body ]
317  %conv = trunc i64 %i.02 to i32
318  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %i.02
319  store i32 %conv, ptr %arrayidx, align 4
320  %sub = sub i64 5, %i.02
321  %arrayidx1 = getelementptr inbounds i32, ptr %A, i64 %sub
322  %0 = load i32, ptr %arrayidx1, align 4
323  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
324  store i32 %0, ptr %B.addr.01, align 4
325  %inc = add i64 %i.02, 1
326  %exitcond = icmp ne i64 %inc, 4
327  br i1 %exitcond, label %for.body, label %for.end
328
329for.end:                                          ; preds = %for.body
330  ret void
331}
332