xref: /llvm-project/llvm/test/Analysis/DependenceAnalysis/Propagating.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 < 100; i++)
10;;    for (long int j = 0; j < 100; j++) {
11;;      A[i + 1][i + j] = i;
12;;      *B++ = A[i][i + j];
13
14define void @prop0(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
15; CHECK-LABEL: 'prop0'
16; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx5, align 4 --> Dst: store i32 %conv, ptr %arrayidx5, align 4
17; CHECK-NEXT:    da analyze - none!
18; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4
19; CHECK-NEXT:    da analyze - flow [< >]!
20; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
21; CHECK-NEXT:    da analyze - confused!
22; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4
23; CHECK-NEXT:    da analyze - none!
24; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
25; CHECK-NEXT:    da analyze - confused!
26; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
27; CHECK-NEXT:    da analyze - none!
28;
29entry:
30  br label %for.cond1.preheader
31
32for.cond1.preheader:                              ; preds = %entry, %for.inc9
33  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc9 ]
34  %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
35  br label %for.body3
36
37for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
38  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
39  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
40  %conv = trunc i64 %i.03 to i32
41  %add = add nsw i64 %i.03, %j.02
42  %add4 = add nsw i64 %i.03, 1
43  %arrayidx5 = getelementptr inbounds [100 x i32], ptr %A, i64 %add4, i64 %add
44  store i32 %conv, ptr %arrayidx5, align 4
45  %add6 = add nsw i64 %i.03, %j.02
46  %arrayidx8 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add6
47  %0 = load i32, ptr %arrayidx8, align 4
48  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
49  store i32 %0, ptr %B.addr.11, align 4
50  %inc = add nsw i64 %j.02, 1
51  %exitcond = icmp ne i64 %inc, 100
52  br i1 %exitcond, label %for.body3, label %for.inc9
53
54for.inc9:                                         ; preds = %for.body3
55  %scevgep = getelementptr i32, ptr %B.addr.04, i64 100
56  %inc10 = add nsw i64 %i.03, 1
57  %exitcond5 = icmp ne i64 %inc10, 100
58  br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
59
60for.end11:                                        ; preds = %for.inc9
61  ret void
62}
63
64
65;;  for (long int i = 0; i < 100; i++)
66;;    for (long int j = 0; j < 100; j++)
67;;      for (long int k = 0; k < 100; k++) {
68;;        A[j - i][i + 1][j + k] = i;
69;;        *B++ = A[j - i][i][j + k];
70
71define void @prop1(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
72; CHECK-LABEL: 'prop1'
73; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx9, align 4 --> Dst: store i32 %conv, ptr %arrayidx9, align 4
74; CHECK-NEXT:    da analyze - output [* * *]!
75; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx14, align 4
76; CHECK-NEXT:    da analyze - flow [<> <> *]!
77; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx9, align 4 --> Dst: store i32 %0, ptr %B.addr.21, align 4
78; CHECK-NEXT:    da analyze - confused!
79; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx14, align 4 --> Dst: %0 = load i32, ptr %arrayidx14, align 4
80; CHECK-NEXT:    da analyze - input [* * *]!
81; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx14, align 4 --> Dst: store i32 %0, ptr %B.addr.21, align 4
82; CHECK-NEXT:    da analyze - confused!
83; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.21, align 4 --> Dst: store i32 %0, ptr %B.addr.21, align 4
84; CHECK-NEXT:    da analyze - none!
85;
86entry:
87  br label %for.cond1.preheader
88
89for.cond1.preheader:                              ; preds = %entry, %for.inc18
90  %B.addr.06 = phi ptr [ %B, %entry ], [ %scevgep7, %for.inc18 ]
91  %i.05 = phi i64 [ 0, %entry ], [ %inc19, %for.inc18 ]
92  br label %for.cond4.preheader
93
94for.cond4.preheader:                              ; preds = %for.cond1.preheader, %for.inc15
95  %B.addr.14 = phi ptr [ %B.addr.06, %for.cond1.preheader ], [ %scevgep, %for.inc15 ]
96  %j.03 = phi i64 [ 0, %for.cond1.preheader ], [ %inc16, %for.inc15 ]
97  br label %for.body6
98
99for.body6:                                        ; preds = %for.cond4.preheader, %for.body6
100  %k.02 = phi i64 [ 0, %for.cond4.preheader ], [ %inc, %for.body6 ]
101  %B.addr.21 = phi ptr [ %B.addr.14, %for.cond4.preheader ], [ %incdec.ptr, %for.body6 ]
102  %conv = trunc i64 %i.05 to i32
103  %add = add nsw i64 %j.03, %k.02
104  %add7 = add nsw i64 %i.05, 1
105  %sub = sub nsw i64 %j.03, %i.05
106  %arrayidx9 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %sub, i64 %add7, i64 %add
107  store i32 %conv, ptr %arrayidx9, align 4
108  %add10 = add nsw i64 %j.03, %k.02
109  %sub11 = sub nsw i64 %j.03, %i.05
110  %arrayidx14 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %sub11, i64 %i.05, i64 %add10
111  %0 = load i32, ptr %arrayidx14, align 4
112  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.21, i64 1
113  store i32 %0, ptr %B.addr.21, align 4
114  %inc = add nsw i64 %k.02, 1
115  %exitcond = icmp ne i64 %inc, 100
116  br i1 %exitcond, label %for.body6, label %for.inc15
117
118for.inc15:                                        ; preds = %for.body6
119  %scevgep = getelementptr i32, ptr %B.addr.14, i64 100
120  %inc16 = add nsw i64 %j.03, 1
121  %exitcond8 = icmp ne i64 %inc16, 100
122  br i1 %exitcond8, label %for.cond4.preheader, label %for.inc18
123
124for.inc18:                                        ; preds = %for.inc15
125  %scevgep7 = getelementptr i32, ptr %B.addr.06, i64 10000
126  %inc19 = add nsw i64 %i.05, 1
127  %exitcond9 = icmp ne i64 %inc19, 100
128  br i1 %exitcond9, label %for.cond1.preheader, label %for.end20
129
130for.end20:                                        ; preds = %for.inc18
131  ret void
132}
133
134
135;;  for (long int i = 0; i < 100; i++)
136;;    for (long int j = 0; j ptr]!
137;;    for (long int j = 0; j < 100; j++) {
138;;      A[i - 1][2*i] = i;
139;;      *B++ = A[i][i + j + 110];
140
141define void @prop2(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
142; CHECK-LABEL: 'prop2'
143; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %conv, ptr %arrayidx4, align 4
144; CHECK-NEXT:    da analyze - consistent output [0 S]!
145; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
146; CHECK-NEXT:    da analyze - flow [> *]!
147; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
148; CHECK-NEXT:    da analyze - confused!
149; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
150; CHECK-NEXT:    da analyze - none!
151; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
152; CHECK-NEXT:    da analyze - confused!
153; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
154; CHECK-NEXT:    da analyze - none!
155;
156entry:
157  br label %for.cond1.preheader
158
159for.cond1.preheader:                              ; preds = %entry, %for.inc8
160  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc8 ]
161  %i.03 = phi i64 [ 0, %entry ], [ %inc9, %for.inc8 ]
162  br label %for.body3
163
164for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
165  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
166  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
167  %conv = trunc i64 %i.03 to i32
168  %mul = shl nsw i64 %i.03, 1
169  %sub = add nsw i64 %i.03, -1
170  %arrayidx4 = getelementptr inbounds [100 x i32], ptr %A, i64 %sub, i64 %mul
171  store i32 %conv, ptr %arrayidx4, align 4
172  %add = add nsw i64 %i.03, %j.02
173  %add5 = add nsw i64 %add, 110
174  %arrayidx7 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add5
175  %0 = load i32, ptr %arrayidx7, align 4
176  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
177  store i32 %0, ptr %B.addr.11, align 4
178  %inc = add nsw i64 %j.02, 1
179  %exitcond = icmp ne i64 %inc, 100
180  br i1 %exitcond, label %for.body3, label %for.inc8
181
182for.inc8:                                         ; preds = %for.body3
183  %scevgep = getelementptr i32, ptr %B.addr.04, i64 100
184  %inc9 = add nsw i64 %i.03, 1
185  %exitcond5 = icmp ne i64 %inc9, 100
186  br i1 %exitcond5, label %for.cond1.preheader, label %for.end10
187
188for.end10:                                        ; preds = %for.inc8
189  ret void
190}
191
192
193;;  for (long int i = 0; i < 100; i++)
194;;    for (long int j = 0; j < 100; j++) {
195;;      A[i][2*j + i] = i;
196;;      *B++ = A[i][2*j - i + 5];
197
198define void @prop3(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
199; CHECK-LABEL: 'prop3'
200; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %conv, ptr %arrayidx4, align 4
201; CHECK-NEXT:    da analyze - output [* *]!
202; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4
203; CHECK-NEXT:    da analyze - flow [<> *]!
204; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
205; CHECK-NEXT:    da analyze - confused!
206; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: %0 = load i32, ptr %arrayidx8, align 4
207; CHECK-NEXT:    da analyze - input [* *]!
208; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx8, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
209; CHECK-NEXT:    da analyze - confused!
210; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
211; CHECK-NEXT:    da analyze - none!
212;
213entry:
214  br label %for.cond1.preheader
215
216for.cond1.preheader:                              ; preds = %entry, %for.inc9
217  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc9 ]
218  %i.03 = phi i64 [ 0, %entry ], [ %inc10, %for.inc9 ]
219  br label %for.body3
220
221for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
222  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
223  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
224  %conv = trunc i64 %i.03 to i32
225  %mul = shl nsw i64 %j.02, 1
226  %add = add nsw i64 %mul, %i.03
227  %arrayidx4 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add
228  store i32 %conv, ptr %arrayidx4, align 4
229  %mul5 = shl nsw i64 %j.02, 1
230  %sub = sub nsw i64 %mul5, %i.03
231  %add6 = add nsw i64 %sub, 5
232  %arrayidx8 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add6
233  %0 = load i32, ptr %arrayidx8, align 4
234  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
235  store i32 %0, ptr %B.addr.11, align 4
236  %inc = add nsw i64 %j.02, 1
237  %exitcond = icmp ne i64 %inc, 100
238  br i1 %exitcond, label %for.body3, label %for.inc9
239
240for.inc9:                                         ; preds = %for.body3
241  %scevgep = getelementptr i32, ptr %B.addr.04, i64 100
242  %inc10 = add nsw i64 %i.03, 1
243  %exitcond5 = icmp ne i64 %inc10, 100
244  br i1 %exitcond5, label %for.cond1.preheader, label %for.end11
245
246for.end11:                                        ; preds = %for.inc9
247  ret void
248}
249
250
251;;  for (long int i = 0; i < 100; i++)
252;;    for (long int j = 0; j < 100; j++) {
253;;      A[i + 2][2*i + j + 1] = i;
254;;      *B++ = A[i][2*i + j];
255
256define void @prop4(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
257; CHECK-LABEL: 'prop4'
258; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: store i32 %conv, ptr %arrayidx6, align 4
259; CHECK-NEXT:    da analyze - none!
260; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: %0 = load i32, ptr %arrayidx10, align 4
261; CHECK-NEXT:    da analyze - flow [< <>]!
262; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
263; CHECK-NEXT:    da analyze - confused!
264; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx10, align 4 --> Dst: %0 = load i32, ptr %arrayidx10, align 4
265; CHECK-NEXT:    da analyze - none!
266; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx10, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
267; CHECK-NEXT:    da analyze - confused!
268; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
269; CHECK-NEXT:    da analyze - none!
270;
271entry:
272  br label %for.cond1.preheader
273
274for.cond1.preheader:                              ; preds = %entry, %for.inc11
275  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc11 ]
276  %i.03 = phi i64 [ 0, %entry ], [ %inc12, %for.inc11 ]
277  br label %for.body3
278
279for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
280  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
281  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
282  %conv = trunc i64 %i.03 to i32
283  %mul = shl nsw i64 %i.03, 1
284  %add = add nsw i64 %mul, %j.02
285  %add4 = add nsw i64 %add, 1
286  %add5 = add nsw i64 %i.03, 2
287  %arrayidx6 = getelementptr inbounds [100 x i32], ptr %A, i64 %add5, i64 %add4
288  store i32 %conv, ptr %arrayidx6, align 4
289  %mul7 = shl nsw i64 %i.03, 1
290  %add8 = add nsw i64 %mul7, %j.02
291  %arrayidx10 = getelementptr inbounds [100 x i32], ptr %A, i64 %i.03, i64 %add8
292  %0 = load i32, ptr %arrayidx10, align 4
293  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
294  store i32 %0, ptr %B.addr.11, align 4
295  %inc = add nsw i64 %j.02, 1
296  %exitcond = icmp ne i64 %inc, 100
297  br i1 %exitcond, label %for.body3, label %for.inc11
298
299for.inc11:                                        ; preds = %for.body3
300  %scevgep = getelementptr i32, ptr %B.addr.04, i64 100
301  %inc12 = add nsw i64 %i.03, 1
302  %exitcond5 = icmp ne i64 %inc12, 100
303  br i1 %exitcond5, label %for.cond1.preheader, label %for.end13
304
305for.end13:                                        ; preds = %for.inc11
306  ret void
307}
308
309
310;;  for (long int i = 0; i < 100; i++)
311;;    for (long int j = 0; j < 100; j++) {
312;;      A[3*i - 18][22 - i][2*i + j] = i;
313;;      *B++ = A[i][i][3*i + j];
314
315define void @prop5(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
316; CHECK-LABEL: 'prop5'
317; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %conv, ptr %arrayidx7, align 4
318; CHECK-NEXT:    da analyze - none!
319; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx12, align 4
320; CHECK-NEXT:    da analyze - flow [* *|<]!
321; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
322; CHECK-NEXT:    da analyze - confused!
323; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx12, align 4 --> Dst: %0 = load i32, ptr %arrayidx12, align 4
324; CHECK-NEXT:    da analyze - none!
325; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx12, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
326; CHECK-NEXT:    da analyze - confused!
327; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
328; CHECK-NEXT:    da analyze - none!
329;
330entry:
331  br label %for.cond1.preheader
332
333for.cond1.preheader:                              ; preds = %entry, %for.inc13
334  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc13 ]
335  %i.03 = phi i64 [ 0, %entry ], [ %inc14, %for.inc13 ]
336  br label %for.body3
337
338for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
339  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
340  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
341  %conv = trunc i64 %i.03 to i32
342  %mul = shl nsw i64 %i.03, 1
343  %add = add nsw i64 %mul, %j.02
344  %sub = sub nsw i64 22, %i.03
345  %mul4 = mul nsw i64 %i.03, 3
346  %sub5 = add nsw i64 %mul4, -18
347  %arrayidx7 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %sub5, i64 %sub, i64 %add
348  store i32 %conv, ptr %arrayidx7, align 4
349  %mul8 = mul nsw i64 %i.03, 3
350  %add9 = add nsw i64 %mul8, %j.02
351  %arrayidx12 = getelementptr inbounds [100 x [100 x i32]], ptr %A, i64 %i.03, i64 %i.03, i64 %add9
352  %0 = load i32, ptr %arrayidx12, align 4
353  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
354  store i32 %0, ptr %B.addr.11, align 4
355  %inc = add nsw i64 %j.02, 1
356  %exitcond = icmp ne i64 %inc, 100
357  br i1 %exitcond, label %for.body3, label %for.inc13
358
359for.inc13:                                        ; preds = %for.body3
360  %scevgep = getelementptr i32, ptr %B.addr.04, i64 100
361  %inc14 = add nsw i64 %i.03, 1
362  %exitcond5 = icmp ne i64 %inc14, 100
363  br i1 %exitcond5, label %for.cond1.preheader, label %for.end15
364
365for.end15:                                        ; preds = %for.inc13
366  ret void
367}
368
369
370;;  for (long int i = 0; i < 100; i++)
371;;    for (long int j = 0; j < 100; j++) {
372;;      A[i + 1][4*i + j + 2] = i;
373;;      *B++ = A[2*i][8*i + j];
374
375define void @prop6(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
376; CHECK-LABEL: 'prop6'
377; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: store i32 %conv, ptr %arrayidx6, align 4
378; CHECK-NEXT:    da analyze - none!
379; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: %0 = load i32, ptr %arrayidx11, align 4
380; CHECK-NEXT:    da analyze - flow [=> <>]!
381; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx6, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
382; CHECK-NEXT:    da analyze - confused!
383; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx11, align 4 --> Dst: %0 = load i32, ptr %arrayidx11, align 4
384; CHECK-NEXT:    da analyze - none!
385; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
386; CHECK-NEXT:    da analyze - confused!
387; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
388; CHECK-NEXT:    da analyze - none!
389;
390entry:
391  br label %for.cond1.preheader
392
393for.cond1.preheader:                              ; preds = %entry, %for.inc12
394  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc12 ]
395  %i.03 = phi i64 [ 0, %entry ], [ %inc13, %for.inc12 ]
396  br label %for.body3
397
398for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
399  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
400  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
401  %conv = trunc i64 %i.03 to i32
402  %mul = shl nsw i64 %i.03, 2
403  %add = add nsw i64 %mul, %j.02
404  %add4 = add nsw i64 %add, 2
405  %add5 = add nsw i64 %i.03, 1
406  %arrayidx6 = getelementptr inbounds [100 x i32], ptr %A, i64 %add5, i64 %add4
407  store i32 %conv, ptr %arrayidx6, align 4
408  %mul7 = shl nsw i64 %i.03, 3
409  %add8 = add nsw i64 %mul7, %j.02
410  %mul9 = shl nsw i64 %i.03, 1
411  %arrayidx11 = getelementptr inbounds [100 x i32], ptr %A, i64 %mul9, i64 %add8
412  %0 = load i32, ptr %arrayidx11, align 4
413  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
414  store i32 %0, ptr %B.addr.11, align 4
415  %inc = add nsw i64 %j.02, 1
416  %exitcond = icmp ne i64 %inc, 100
417  br i1 %exitcond, label %for.body3, label %for.inc12
418
419for.inc12:                                        ; preds = %for.body3
420  %scevgep = getelementptr i32, ptr %B.addr.04, i64 100
421  %inc13 = add nsw i64 %i.03, 1
422  %exitcond5 = icmp ne i64 %inc13, 100
423  br i1 %exitcond5, label %for.cond1.preheader, label %for.end14
424
425for.end14:                                        ; preds = %for.inc12
426  ret void
427}
428
429
430;;  for (long int i = 0; i < 100; i++)
431;;    for (long int j = 0; j < 100; j++) {
432;;      A[2*i + 4][-5*i + j + 2] = i;
433;;      *B++ = A[-2*i + 20][5*i + j];
434
435define void @prop7(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
436; CHECK-LABEL: 'prop7'
437; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %conv, ptr %arrayidx7, align 4
438; CHECK-NEXT:    da analyze - none!
439; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx13, align 4
440; CHECK-NEXT:    da analyze - flow [* <>]!
441; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
442; CHECK-NEXT:    da analyze - confused!
443; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx13, align 4 --> Dst: %0 = load i32, ptr %arrayidx13, align 4
444; CHECK-NEXT:    da analyze - none!
445; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx13, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
446; CHECK-NEXT:    da analyze - confused!
447; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
448; CHECK-NEXT:    da analyze - none!
449;
450entry:
451  br label %for.cond1.preheader
452
453for.cond1.preheader:                              ; preds = %entry, %for.inc14
454  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc14 ]
455  %i.03 = phi i64 [ 0, %entry ], [ %inc15, %for.inc14 ]
456  br label %for.body3
457
458for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
459  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
460  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
461  %conv = trunc i64 %i.03 to i32
462  %mul = mul nsw i64 %i.03, -5
463  %add = add nsw i64 %mul, %j.02
464  %add4 = add nsw i64 %add, 2
465  %mul5 = shl nsw i64 %i.03, 1
466  %add6 = add nsw i64 %mul5, 4
467  %arrayidx7 = getelementptr inbounds [100 x i32], ptr %A, i64 %add6, i64 %add4
468  store i32 %conv, ptr %arrayidx7, align 4
469  %mul8 = mul nsw i64 %i.03, 5
470  %add9 = add nsw i64 %mul8, %j.02
471  %mul10 = mul nsw i64 %i.03, -2
472  %add11 = add nsw i64 %mul10, 20
473  %arrayidx13 = getelementptr inbounds [100 x i32], ptr %A, i64 %add11, i64 %add9
474  %0 = load i32, ptr %arrayidx13, align 4
475  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
476  store i32 %0, ptr %B.addr.11, align 4
477  %inc = add nsw i64 %j.02, 1
478  %exitcond = icmp ne i64 %inc, 100
479  br i1 %exitcond, label %for.body3, label %for.inc14
480
481for.inc14:                                        ; preds = %for.body3
482  %scevgep = getelementptr i32, ptr %B.addr.04, i64 100
483  %inc15 = add nsw i64 %i.03, 1
484  %exitcond5 = icmp ne i64 %inc15, 100
485  br i1 %exitcond5, label %for.cond1.preheader, label %for.end16
486
487for.end16:                                        ; preds = %for.inc14
488  ret void
489}
490
491
492;;  for (long int i = 0; i < 100; i++)
493;;    for (long int j = 0; j < 100; j++) {
494;;      A[4][j + 2] = i;
495;;      *B++ = A[-2*i + 4][5*i + j];
496
497define void @prop8(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
498; CHECK-LABEL: 'prop8'
499; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %conv, ptr %arrayidx4, align 4
500; CHECK-NEXT:    da analyze - consistent output [S 0]!
501; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4
502; CHECK-NEXT:    da analyze - flow [=> <]!
503; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
504; CHECK-NEXT:    da analyze - confused!
505; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4
506; CHECK-NEXT:    da analyze - none!
507; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
508; CHECK-NEXT:    da analyze - confused!
509; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
510; CHECK-NEXT:    da analyze - none!
511;
512entry:
513  br label %for.cond1.preheader
514
515for.cond1.preheader:                              ; preds = %entry, %for.inc10
516  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc10 ]
517  %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ]
518  br label %for.body3
519
520for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
521  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
522  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
523  %conv = trunc i64 %i.03 to i32
524  %add = add nsw i64 %j.02, 2
525  %arrayidx4 = getelementptr inbounds [100 x i32], ptr %A, i64 4, i64 %add
526  store i32 %conv, ptr %arrayidx4, align 4
527  %mul = mul nsw i64 %i.03, 5
528  %add5 = add nsw i64 %mul, %j.02
529  %mul6 = mul nsw i64 %i.03, -2
530  %add7 = add nsw i64 %mul6, 4
531  %arrayidx9 = getelementptr inbounds [100 x i32], ptr %A, i64 %add7, i64 %add5
532  %0 = load i32, ptr %arrayidx9, align 4
533  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
534  store i32 %0, ptr %B.addr.11, align 4
535  %inc = add nsw i64 %j.02, 1
536  %exitcond = icmp ne i64 %inc, 100
537  br i1 %exitcond, label %for.body3, label %for.inc10
538
539for.inc10:                                        ; preds = %for.body3
540  %scevgep = getelementptr i32, ptr %B.addr.04, i64 100
541  %inc11 = add nsw i64 %i.03, 1
542  %exitcond5 = icmp ne i64 %inc11, 100
543  br i1 %exitcond5, label %for.cond1.preheader, label %for.end12
544
545for.end12:                                        ; preds = %for.inc10
546  ret void
547}
548
549
550;;  for (long int i = 0; i < 100; i++)
551;;    for (long int j = 0; j < 100; j++) {
552;;      A[2*i + 4][5*i + j + 2] = i;
553;;      *B++ = A[4][j];
554
555define void @prop9(ptr %A, ptr %B, i32 %n) nounwind uwtable ssp {
556; CHECK-LABEL: 'prop9'
557; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %conv, ptr %arrayidx7, align 4
558; CHECK-NEXT:    da analyze - none!
559; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4
560; CHECK-NEXT:    da analyze - flow [<= <]!
561; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
562; CHECK-NEXT:    da analyze - confused!
563; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: %0 = load i32, ptr %arrayidx9, align 4
564; CHECK-NEXT:    da analyze - consistent input [S 0]!
565; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx9, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
566; CHECK-NEXT:    da analyze - confused!
567; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
568; CHECK-NEXT:    da analyze - none!
569;
570entry:
571  br label %for.cond1.preheader
572
573for.cond1.preheader:                              ; preds = %entry, %for.inc10
574  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc10 ]
575  %i.03 = phi i64 [ 0, %entry ], [ %inc11, %for.inc10 ]
576  br label %for.body3
577
578for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
579  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
580  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
581  %conv = trunc i64 %i.03 to i32
582  %mul = mul nsw i64 %i.03, 5
583  %add = add nsw i64 %mul, %j.02
584  %add4 = add nsw i64 %add, 2
585  %mul5 = shl nsw i64 %i.03, 1
586  %add6 = add nsw i64 %mul5, 4
587  %arrayidx7 = getelementptr inbounds [100 x i32], ptr %A, i64 %add6, i64 %add4
588  store i32 %conv, ptr %arrayidx7, align 4
589  %arrayidx9 = getelementptr inbounds [100 x i32], ptr %A, i64 4, i64 %j.02
590  %0 = load i32, ptr %arrayidx9, align 4
591  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
592  store i32 %0, ptr %B.addr.11, align 4
593  %inc = add nsw i64 %j.02, 1
594  %exitcond = icmp ne i64 %inc, 100
595  br i1 %exitcond, label %for.body3, label %for.inc10
596
597for.inc10:                                        ; preds = %for.body3
598  %scevgep = getelementptr i32, ptr %B.addr.04, i64 100
599  %inc11 = add nsw i64 %i.03, 1
600  %exitcond5 = icmp ne i64 %inc11, 100
601  br i1 %exitcond5, label %for.cond1.preheader, label %for.end12
602
603for.end12:                                        ; preds = %for.inc10
604  ret void
605}
606