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