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