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