xref: /llvm-project/llvm/test/Analysis/DependenceAnalysis/DADelin.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-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
6target triple = "thumbv8m.main-arm-none-eabi"
7
8;;  for (int i = 0; i < n; i++)
9;;   for (int j = 0; j < m; j++)
10;;    for (int k = 0; k < o; k++)
11;;      = A[i*m*o + j*o + k]
12;;     A[i*m*o + j*o + k] =
13define void @t1(i32 %n, i32 %m, i32 %o, ptr nocapture %A) {
14; CHECK-LABEL: 't1'
15; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4
16; CHECK-NEXT:    da analyze - none!
17; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx, align 4
18; CHECK-NEXT:    da analyze - consistent anti [0 0 0|<]!
19; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx, align 4
20; CHECK-NEXT:    da analyze - none!
21;
22entry:
23  %cmp49 = icmp sgt i32 %n, 0
24  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
25
26for.cond1.preheader.lr.ph:                        ; preds = %entry
27  %cmp247 = icmp sgt i32 %m, 0
28  %cmp645 = icmp sgt i32 %o, 0
29  br label %for.cond1.preheader
30
31for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
32  %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
33  br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
34
35for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
36  %mul = mul nsw i32 %i.050, %m
37  br label %for.cond5.preheader
38
39for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
40  %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
41  br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
42
43for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
44  %mul944 = add i32 %j.048, %mul
45  %add = mul i32 %mul944, %o
46  br label %for.body8
47
48for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
49  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
50  %add11 = add nsw i32 %k.046, %add
51  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11
52  %0 = load i32, ptr %arrayidx, align 4
53  %add12 = add nsw i32 %0, 1
54  store i32 %add12, ptr %arrayidx, align 4
55  %inc = add nuw nsw i32 %k.046, 1
56  %exitcond = icmp eq i32 %inc, %o
57  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
58
59for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
60  %inc20 = add nuw nsw i32 %j.048, 1
61  %exitcond51 = icmp eq i32 %inc20, %m
62  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
63
64for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
65  %inc23 = add nuw nsw i32 %i.050, 1
66  %exitcond52 = icmp eq i32 %inc23, %n
67  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
68
69for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
70  ret void
71}
72
73;;  for (int i = 0; i < n; i++)
74;;   for (int j = 0; j < m; j++)
75;;    for (int k = 0; k < o; k++)
76;;      = A[i*m*o + j*o + k]
77;;     A[i*m*o + j*o + k + 1] =
78define void @t2(i32 %n, i32 %m, i32 %o, ptr nocapture %A) {
79; CHECK-LABEL: 't2'
80; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4
81; CHECK-NEXT:    da analyze - none!
82; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
83; CHECK-NEXT:    da analyze - anti [* * *|<]!
84; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
85; CHECK-NEXT:    da analyze - output [* * *]!
86;
87entry:
88  %cmp49 = icmp sgt i32 %n, 0
89  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
90
91for.cond1.preheader.lr.ph:                        ; preds = %entry
92  %cmp247 = icmp sgt i32 %m, 0
93  %cmp645 = icmp sgt i32 %o, 0
94  br label %for.cond1.preheader
95
96for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
97  %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
98  br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
99
100for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
101  %mul = mul nsw i32 %i.050, %m
102  br label %for.cond5.preheader
103
104for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
105  %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
106  br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
107
108for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
109  %mul944 = add i32 %j.048, %mul
110  %add = mul i32 %mul944, %o
111  br label %for.body8
112
113for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
114  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
115  %add11 = add nsw i32 %k.046, %add
116  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11
117  %0 = load i32, ptr %arrayidx, align 4
118  %add12 = add nsw i32 %0, 1
119  %add111 = add nsw i32 %add11, 1
120  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111
121  store i32 %add12, ptr %arrayidx2, align 4
122  %inc = add nuw nsw i32 %k.046, 1
123  %exitcond = icmp eq i32 %inc, %o
124  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
125
126for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
127  %inc20 = add nuw nsw i32 %j.048, 1
128  %exitcond51 = icmp eq i32 %inc20, %m
129  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
130
131for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
132  %inc23 = add nuw nsw i32 %i.050, 1
133  %exitcond52 = icmp eq i32 %inc23, %n
134  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
135
136for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
137  ret void
138}
139
140;;  for (int i = 0; i < n; i++)
141;;   for (int j = 0; j < m; j++)
142;;    for (int k = 0; k < o; k++)
143;;      = A[i*m*o + j*o + k]
144;;     A[i*m*o + j*o + k - 1] =
145define void @t3(i32 %n, i32 %m, i32 %o, ptr nocapture %A) {
146; CHECK-LABEL: 't3'
147; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4
148; CHECK-NEXT:    da analyze - none!
149; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
150; CHECK-NEXT:    da analyze - anti [* * *|<]!
151; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
152; CHECK-NEXT:    da analyze - output [* * *]!
153;
154entry:
155  %cmp49 = icmp sgt i32 %n, 0
156  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
157
158for.cond1.preheader.lr.ph:                        ; preds = %entry
159  %cmp247 = icmp sgt i32 %m, 0
160  %cmp645 = icmp sgt i32 %o, 0
161  br label %for.cond1.preheader
162
163for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
164  %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
165  br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
166
167for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
168  %mul = mul nsw i32 %i.050, %m
169  br label %for.cond5.preheader
170
171for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
172  %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
173  br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
174
175for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
176  %mul944 = add i32 %j.048, %mul
177  %add = mul i32 %mul944, %o
178  br label %for.body8
179
180for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
181  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
182  %add11 = add nsw i32 %k.046, %add
183  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11
184  %0 = load i32, ptr %arrayidx, align 4
185  %add12 = add nsw i32 %0, 1
186  %add111 = sub nsw i32 %add11, 1
187  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111
188  store i32 %add12, ptr %arrayidx2, align 4
189  %inc = add nuw nsw i32 %k.046, 1
190  %exitcond = icmp eq i32 %inc, %o
191  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
192
193for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
194  %inc20 = add nuw nsw i32 %j.048, 1
195  %exitcond51 = icmp eq i32 %inc20, %m
196  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
197
198for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
199  %inc23 = add nuw nsw i32 %i.050, 1
200  %exitcond52 = icmp eq i32 %inc23, %n
201  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
202
203for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
204  ret void
205}
206
207;;  for (int i = 0; i < n; i++)
208;;   for (int j = 0; j < m; j++)
209;;    for (int k = 0; k < o; k++)
210;;      = A[i*m*o + j*o + k]
211;;     A[i*m*o + j*o + k + o] =
212define void @t4(i32 %n, i32 %m, i32 %o, ptr nocapture %A) {
213; CHECK-LABEL: 't4'
214; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4
215; CHECK-NEXT:    da analyze - none!
216; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
217; CHECK-NEXT:    da analyze - anti [* * *|<]!
218; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
219; CHECK-NEXT:    da analyze - output [* * *]!
220;
221entry:
222  %cmp49 = icmp sgt i32 %n, 0
223  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
224
225for.cond1.preheader.lr.ph:                        ; preds = %entry
226  %cmp247 = icmp sgt i32 %m, 0
227  %cmp645 = icmp sgt i32 %o, 0
228  br label %for.cond1.preheader
229
230for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
231  %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
232  br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
233
234for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
235  %mul = mul nsw i32 %i.050, %m
236  br label %for.cond5.preheader
237
238for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
239  %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
240  br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
241
242for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
243  %mul944 = add i32 %j.048, %mul
244  %add = mul i32 %mul944, %o
245  br label %for.body8
246
247for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
248  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
249  %add11 = add nsw i32 %k.046, %add
250  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11
251  %0 = load i32, ptr %arrayidx, align 4
252  %add12 = add nsw i32 %0, 1
253  %add111 = add nsw i32 %add11, %o
254  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111
255  store i32 %add12, ptr %arrayidx2, align 4
256  %inc = add nuw nsw i32 %k.046, 1
257  %exitcond = icmp eq i32 %inc, %o
258  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
259
260for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
261  %inc20 = add nuw nsw i32 %j.048, 1
262  %exitcond51 = icmp eq i32 %inc20, %m
263  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
264
265for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
266  %inc23 = add nuw nsw i32 %i.050, 1
267  %exitcond52 = icmp eq i32 %inc23, %n
268  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
269
270for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
271  ret void
272}
273
274;;  for (int i = 0; i < n; i++)
275;;   for (int j = 0; j < m; j++)
276;;    for (int k = 0; k < o; k++)
277;;      = A[i*m*o + j*o + k]
278;;     A[i*m*o + j*o + k - o] =
279define void @t5(i32 %n, i32 %m, i32 %o, ptr nocapture %A) {
280; CHECK-LABEL: 't5'
281; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4
282; CHECK-NEXT:    da analyze - none!
283; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
284; CHECK-NEXT:    da analyze - anti [* * *|<]!
285; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
286; CHECK-NEXT:    da analyze - output [* * *]!
287;
288entry:
289  %cmp49 = icmp sgt i32 %n, 0
290  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
291
292for.cond1.preheader.lr.ph:                        ; preds = %entry
293  %cmp247 = icmp sgt i32 %m, 0
294  %cmp645 = icmp sgt i32 %o, 0
295  br label %for.cond1.preheader
296
297for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
298  %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
299  br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
300
301for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
302  %mul = mul nsw i32 %i.050, %m
303  br label %for.cond5.preheader
304
305for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
306  %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
307  br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
308
309for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
310  %mul944 = add i32 %j.048, %mul
311  %add = mul i32 %mul944, %o
312  br label %for.body8
313
314for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
315  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
316  %add11 = add nsw i32 %k.046, %add
317  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11
318  %0 = load i32, ptr %arrayidx, align 4
319  %add12 = add nsw i32 %0, 1
320  %add111 = sub nsw i32 %add11, %o
321  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111
322  store i32 %add12, ptr %arrayidx2, align 4
323  %inc = add nuw nsw i32 %k.046, 1
324  %exitcond = icmp eq i32 %inc, %o
325  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
326
327for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
328  %inc20 = add nuw nsw i32 %j.048, 1
329  %exitcond51 = icmp eq i32 %inc20, %m
330  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
331
332for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
333  %inc23 = add nuw nsw i32 %i.050, 1
334  %exitcond52 = icmp eq i32 %inc23, %n
335  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
336
337for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
338  ret void
339}
340
341;;  for (int i = 0; i < n; i++)
342;;   for (int j = 0; j < m; j++)
343;;    for (int k = 0; k < o; k++)
344;;      = A[i*m*o + j*o + k]
345;;     A[i*m*o + j*o + k + m*o] =
346define void @t6(i32 %n, i32 %m, i32 %o, ptr nocapture %A) {
347; CHECK-LABEL: 't6'
348; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4
349; CHECK-NEXT:    da analyze - none!
350; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
351; CHECK-NEXT:    da analyze - consistent anti [-1 0 0]!
352; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
353; CHECK-NEXT:    da analyze - none!
354;
355entry:
356  %cmp49 = icmp sgt i32 %n, 0
357  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
358
359for.cond1.preheader.lr.ph:                        ; preds = %entry
360  %cmp247 = icmp sgt i32 %m, 0
361  %cmp645 = icmp sgt i32 %o, 0
362  br label %for.cond1.preheader
363
364for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
365  %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
366  br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
367
368for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
369  %mul = mul nsw i32 %i.050, %m
370  br label %for.cond5.preheader
371
372for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
373  %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
374  br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
375
376for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
377  %mul944 = add i32 %j.048, %mul
378  %add = mul i32 %mul944, %o
379  br label %for.body8
380
381for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
382  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
383  %add11 = add nsw i32 %k.046, %add
384  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11
385  %0 = load i32, ptr %arrayidx, align 4
386  %add12 = add nsw i32 %0, 1
387  %mo = mul i32 %m, %o
388  %add111 = add nsw i32 %add11, %mo
389  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111
390  store i32 %add12, ptr %arrayidx2, align 4
391  %inc = add nuw nsw i32 %k.046, 1
392  %exitcond = icmp eq i32 %inc, %o
393  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
394
395for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
396  %inc20 = add nuw nsw i32 %j.048, 1
397  %exitcond51 = icmp eq i32 %inc20, %m
398  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
399
400for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
401  %inc23 = add nuw nsw i32 %i.050, 1
402  %exitcond52 = icmp eq i32 %inc23, %n
403  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
404
405for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
406  ret void
407}
408
409;;  for (int i = 0; i < n; i++)
410;;   for (int j = 0; j < m; j++)
411;;    for (int k = 0; k < o; k++)
412;;      = A[i*m*o + j*o + k]
413;;     A[i*m*o + j*o + k - m*o] =
414define void @t7(i32 %n, i32 %m, i32 %o, ptr nocapture %A) {
415; CHECK-LABEL: 't7'
416; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4
417; CHECK-NEXT:    da analyze - none!
418; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
419; CHECK-NEXT:    da analyze - consistent anti [1 0 0]!
420; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
421; CHECK-NEXT:    da analyze - none!
422;
423entry:
424  %cmp49 = icmp sgt i32 %n, 0
425  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
426
427for.cond1.preheader.lr.ph:                        ; preds = %entry
428  %cmp247 = icmp sgt i32 %m, 0
429  %cmp645 = icmp sgt i32 %o, 0
430  br label %for.cond1.preheader
431
432for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
433  %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
434  br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
435
436for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
437  %mul = mul nsw i32 %i.050, %m
438  br label %for.cond5.preheader
439
440for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
441  %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
442  br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
443
444for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
445  %mul944 = add i32 %j.048, %mul
446  %add = mul i32 %mul944, %o
447  br label %for.body8
448
449for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
450  %k.046 = phi i32 [ 0, %for.body8.lr.ph ], [ %inc, %for.body8 ]
451  %add11 = add nsw i32 %k.046, %add
452  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11
453  %0 = load i32, ptr %arrayidx, align 4
454  %add12 = add nsw i32 %0, 1
455  %mo = mul i32 %m, %o
456  %add111 = sub nsw i32 %add11, %mo
457  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111
458  store i32 %add12, ptr %arrayidx2, align 4
459  %inc = add nuw nsw i32 %k.046, 1
460  %exitcond = icmp eq i32 %inc, %o
461  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
462
463for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
464  %inc20 = add nuw nsw i32 %j.048, 1
465  %exitcond51 = icmp eq i32 %inc20, %m
466  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
467
468for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
469  %inc23 = add nuw nsw i32 %i.050, 1
470  %exitcond52 = icmp eq i32 %inc23, %n
471  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
472
473for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
474  ret void
475}
476
477;;  for (int i = 0; i < n; i++)
478;;   for (int j = 0; j < m; j++)
479;;    for (int k = 1; k < o; k++)
480;;      = A[i*m*o + j*o + k]
481;;     A[i*m*o + j*o + k - 1] =
482define void @t8(i32 %n, i32 %m, i32 %o, ptr nocapture %A) {
483; CHECK-LABEL: 't8'
484; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx, align 4
485; CHECK-NEXT:    da analyze - none!
486; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
487; CHECK-NEXT:    da analyze - consistent anti [0 0 1]!
488; CHECK-NEXT:  Src: store i32 %add12, ptr %arrayidx2, align 4 --> Dst: store i32 %add12, ptr %arrayidx2, align 4
489; CHECK-NEXT:    da analyze - none!
490;
491entry:
492  %cmp49 = icmp sgt i32 %n, 0
493  br i1 %cmp49, label %for.cond1.preheader.lr.ph, label %for.cond.cleanup
494
495for.cond1.preheader.lr.ph:                        ; preds = %entry
496  %cmp247 = icmp sgt i32 %m, 0
497  %cmp645 = icmp sgt i32 %o, 0
498  br label %for.cond1.preheader
499
500for.cond1.preheader:                              ; preds = %for.cond.cleanup3, %for.cond1.preheader.lr.ph
501  %i.050 = phi i32 [ 0, %for.cond1.preheader.lr.ph ], [ %inc23, %for.cond.cleanup3 ]
502  br i1 %cmp247, label %for.cond5.preheader.lr.ph, label %for.cond.cleanup3
503
504for.cond5.preheader.lr.ph:                        ; preds = %for.cond1.preheader
505  %mul = mul nsw i32 %i.050, %m
506  br label %for.cond5.preheader
507
508for.cond5.preheader:                              ; preds = %for.cond.cleanup7, %for.cond5.preheader.lr.ph
509  %j.048 = phi i32 [ 0, %for.cond5.preheader.lr.ph ], [ %inc20, %for.cond.cleanup7 ]
510  br i1 %cmp645, label %for.body8.lr.ph, label %for.cond.cleanup7
511
512for.body8.lr.ph:                                  ; preds = %for.cond5.preheader
513  %mul944 = add i32 %j.048, %mul
514  %add = mul i32 %mul944, %o
515  br label %for.body8
516
517for.body8:                                        ; preds = %for.body8, %for.body8.lr.ph
518  %k.046 = phi i32 [ 1, %for.body8.lr.ph ], [ %inc, %for.body8 ]
519  %add11 = add nsw i32 %k.046, %add
520  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add11
521  %0 = load i32, ptr %arrayidx, align 4
522  %add12 = add nsw i32 %0, 1
523  %add111 = sub nsw i32 %add11, 1
524  %arrayidx2 = getelementptr inbounds i32, ptr %A, i32 %add111
525  store i32 %add12, ptr %arrayidx2, align 4
526  %inc = add nuw nsw i32 %k.046, 1
527  %exitcond = icmp eq i32 %inc, %o
528  br i1 %exitcond, label %for.cond.cleanup7, label %for.body8
529
530for.cond.cleanup7:                                ; preds = %for.body8, %for.cond5.preheader
531  %inc20 = add nuw nsw i32 %j.048, 1
532  %exitcond51 = icmp eq i32 %inc20, %m
533  br i1 %exitcond51, label %for.cond.cleanup3, label %for.cond5.preheader
534
535for.cond.cleanup3:                                ; preds = %for.cond.cleanup7, %for.cond1.preheader
536  %inc23 = add nuw nsw i32 %i.050, 1
537  %exitcond52 = icmp eq i32 %inc23, %n
538  br i1 %exitcond52, label %for.cond.cleanup, label %for.cond1.preheader
539
540for.cond.cleanup:                                 ; preds = %for.cond.cleanup3, %entry
541  ret void
542}
543
544
545define double @test_sizes(i16 %h, i16 %N, ptr nocapture %array) {
546; CHECK-LABEL: 'test_sizes'
547; CHECK-NEXT:  Src: %2 = load i16, ptr %arrayidx, align 4 --> Dst: %2 = load i16, ptr %arrayidx, align 4
548; CHECK-NEXT:    da analyze - consistent input [0 S]!
549; CHECK-NEXT:  Src: %2 = load i16, ptr %arrayidx, align 4 --> Dst: store i16 %add6, ptr %arrayidx8, align 4
550; CHECK-NEXT:    da analyze - anti [* *|<]!
551; CHECK-NEXT:  Src: store i16 %add6, ptr %arrayidx8, align 4 --> Dst: store i16 %add6, ptr %arrayidx8, align 4
552; CHECK-NEXT:    da analyze - output [* *]!
553;
554entry:
555  %cmp28 = icmp sgt i16 %N, 1
556  br i1 %cmp28, label %for.body.lr.ph, label %for.end12
557
558for.body.lr.ph:                                   ; preds = %entry
559  %cmp425 = icmp slt i16 %h, 0
560  %0 = add i16 %h, 1
561  %wide.trip.count = zext i16 %N to i32
562  br label %for.body
563
564for.body:                                         ; preds = %for.inc10, %for.body.lr.ph
565  %indvars.iv32 = phi i32 [ 1, %for.body.lr.ph ], [ %indvars.iv.next33, %for.inc10 ]
566  %indvars.iv = phi i16 [ 2, %for.body.lr.ph ], [ %indvars.iv.next, %for.inc10 ]
567  br i1 %cmp425, label %for.inc10, label %for.body5.lr.ph
568
569for.body5.lr.ph:                                  ; preds = %for.body
570  %1 = sext i16 %indvars.iv to i32
571  %arrayidx = getelementptr inbounds i16, ptr %array, i32 %indvars.iv32
572  br label %for.body5
573
574for.body5:                                        ; preds = %for.body5, %for.body5.lr.ph
575  %indvars.iv30 = phi i32 [ %indvars.iv.next31, %for.body5 ], [ %1, %for.body5.lr.ph ]
576  %j.027 = phi i16 [ %inc, %for.body5 ], [ 0, %for.body5.lr.ph ]
577  %2 = load i16, ptr %arrayidx, align 4
578  %add6 = add nsw i16 %2, %j.027
579  %arrayidx8 = getelementptr inbounds i16, ptr %array, i32 %indvars.iv30
580  store i16 %add6, ptr %arrayidx8, align 4
581  %inc = add nuw nsw i16 %j.027, 1
582  %indvars.iv.next31 = add nsw i32 %indvars.iv30, 1
583  %exitcond = icmp eq i16 %inc, %0
584  br i1 %exitcond, label %for.inc10, label %for.body5
585
586for.inc10:                                        ; preds = %for.body5, %for.body
587  %indvars.iv.next33 = add nuw nsw i32 %indvars.iv32, 1
588  %indvars.iv.next = add i16 %indvars.iv, %0
589  %exitcond34 = icmp eq i32 %indvars.iv.next33, %wide.trip.count
590  br i1 %exitcond34, label %for.end12, label %for.body
591
592for.end12:                                        ; preds = %for.inc10, %entry
593  ret double undef
594}
595
596
597define void @nonnegative(ptr nocapture %A, i32 %N) {
598; CHECK-LABEL: 'nonnegative'
599; CHECK-NEXT:  Src: store i32 1, ptr %arrayidx, align 4 --> Dst: store i32 1, ptr %arrayidx, align 4
600; CHECK-NEXT:    da analyze - none!
601; CHECK-NEXT:  Src: store i32 1, ptr %arrayidx, align 4 --> Dst: store i32 2, ptr %arrayidx, align 4
602; CHECK-NEXT:    da analyze - consistent output [0 0|<]!
603; CHECK-NEXT:  Src: store i32 2, ptr %arrayidx, align 4 --> Dst: store i32 2, ptr %arrayidx, align 4
604; CHECK-NEXT:    da analyze - none!
605;
606entry:
607  %cmp44 = icmp eq i32 %N, 0
608  br i1 %cmp44, label %exit, label %for.outer
609
610for.outer:
611  %h.045 = phi i32 [ %add19, %for.latch ], [ 0, %entry ]
612  %mul = mul i32 %h.045, %N
613  br label %for.inner
614
615for.inner:
616  %i.043 = phi i32 [ 0, %for.outer ], [ %add16, %for.inner ]
617  %add = add i32 %i.043, %mul
618  %arrayidx = getelementptr inbounds i32, ptr %A, i32 %add
619  store i32 1, ptr %arrayidx, align 4
620  store i32 2, ptr %arrayidx, align 4
621  %add16 = add nuw i32 %i.043, 1
622  %exitcond46 = icmp eq i32 %add16, %N
623  br i1 %exitcond46, label %for.latch, label %for.inner
624
625for.latch:
626  %add19 = add nuw i32 %h.045, 1
627  %exitcond47 = icmp eq i32 %add19, %N
628  br i1 %exitcond47, label %exit, label %for.outer
629
630exit:
631  ret void
632}
633