xref: /llvm-project/llvm/test/Analysis/DependenceAnalysis/ExactRDIV.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 = 'ExactRDIV.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 (long int i = 0; i < 10; i++)
11;;    A[4*i + 10] = i;
12;;  for (long int j = 0; j < 10; j++)
13;;    *B++ = A[2*j + 1];
14
15define void @rdiv0(ptr %A, ptr %B) nounwind uwtable ssp {
16; CHECK-LABEL: 'rdiv0'
17; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
18; CHECK-NEXT:    da analyze - none!
19; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
20; CHECK-NEXT:    da analyze - none!
21; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
22; CHECK-NEXT:    da analyze - confused!
23; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: %0 = load i32, ptr %arrayidx7, align 4
24; CHECK-NEXT:    da analyze - none!
25; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx7, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
26; CHECK-NEXT:    da analyze - confused!
27; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
28; CHECK-NEXT:    da analyze - none!
29;
30entry:
31  br label %for.body
32
33for.body:                                         ; preds = %entry, %for.body
34  %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
35  %conv = trunc i64 %i.03 to i32
36  %mul = shl nsw i64 %i.03, 2
37  %add = add nsw i64 %mul, 10
38  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
39  store i32 %conv, ptr %arrayidx, align 4
40  %inc = add nsw i64 %i.03, 1
41  %exitcond5 = icmp ne i64 %inc, 10
42  br i1 %exitcond5, label %for.body, label %for.body4.preheader
43
44for.body4.preheader:                              ; preds = %for.body
45  br label %for.body4
46
47for.body4:                                        ; preds = %for.body4.preheader, %for.body4
48  %j.02 = phi i64 [ %inc9, %for.body4 ], [ 0, %for.body4.preheader ]
49  %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
50  %mul5 = shl nsw i64 %j.02, 1
51  %add64 = or disjoint i64 %mul5, 1
52  %arrayidx7 = getelementptr inbounds i32, ptr %A, i64 %add64
53  %0 = load i32, ptr %arrayidx7, align 4
54  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
55  store i32 %0, ptr %B.addr.01, align 4
56  %inc9 = add nsw i64 %j.02, 1
57  %exitcond = icmp ne i64 %inc9, 10
58  br i1 %exitcond, label %for.body4, label %for.end10
59
60for.end10:                                        ; preds = %for.body4
61  ret void
62}
63
64
65;;  for (long int i = 0; i < 5; i++)
66;;    A[11*i - 45] = i;
67;;  for (long int j = 0; j < 10; j++)
68;;    *B++ = A[j];
69
70define void @rdiv1(ptr %A, ptr %B) nounwind uwtable ssp {
71; CHECK-LABEL: 'rdiv1'
72; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
73; CHECK-NEXT:    da analyze - none!
74; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
75; CHECK-NEXT:    da analyze - none!
76; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
77; CHECK-NEXT:    da analyze - confused!
78; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
79; CHECK-NEXT:    da analyze - none!
80; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
81; CHECK-NEXT:    da analyze - confused!
82; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
83; CHECK-NEXT:    da analyze - none!
84;
85entry:
86  br label %for.body
87
88for.body:                                         ; preds = %entry, %for.body
89  %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
90  %conv = trunc i64 %i.03 to i32
91  %mul = mul nsw i64 %i.03, 11
92  %sub = add nsw i64 %mul, -45
93  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
94  store i32 %conv, ptr %arrayidx, align 4
95  %inc = add nsw i64 %i.03, 1
96  %exitcond4 = icmp ne i64 %inc, 5
97  br i1 %exitcond4, label %for.body, label %for.body4.preheader
98
99for.body4.preheader:                              ; preds = %for.body
100  br label %for.body4
101
102for.body4:                                        ; preds = %for.body4.preheader, %for.body4
103  %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
104  %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
105  %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %j.02
106  %0 = load i32, ptr %arrayidx5, align 4
107  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
108  store i32 %0, ptr %B.addr.01, align 4
109  %inc7 = add nsw i64 %j.02, 1
110  %exitcond = icmp ne i64 %inc7, 10
111  br i1 %exitcond, label %for.body4, label %for.end8
112
113for.end8:                                         ; preds = %for.body4
114  ret void
115}
116
117
118;;  for (long int i = 0; i <= 5; i++)
119;;    A[11*i - 45] = i;
120;;  for (long int j = 0; j < 10; j++)
121;;    *B++ = A[j];
122
123define void @rdiv2(ptr %A, ptr %B) nounwind uwtable ssp {
124; CHECK-LABEL: 'rdiv2'
125; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
126; CHECK-NEXT:    da analyze - none!
127; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
128; CHECK-NEXT:    da analyze - none!
129; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
130; CHECK-NEXT:    da analyze - confused!
131; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
132; CHECK-NEXT:    da analyze - none!
133; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
134; CHECK-NEXT:    da analyze - confused!
135; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
136; CHECK-NEXT:    da analyze - none!
137;
138entry:
139  br label %for.body
140
141for.body:                                         ; preds = %entry, %for.body
142  %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
143  %conv = trunc i64 %i.03 to i32
144  %mul = mul nsw i64 %i.03, 11
145  %sub = add nsw i64 %mul, -45
146  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
147  store i32 %conv, ptr %arrayidx, align 4
148  %inc = add nsw i64 %i.03, 1
149  %exitcond4 = icmp ne i64 %inc, 6
150  br i1 %exitcond4, label %for.body, label %for.body4.preheader
151
152for.body4.preheader:                              ; preds = %for.body
153  br label %for.body4
154
155for.body4:                                        ; preds = %for.body4.preheader, %for.body4
156  %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
157  %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
158  %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %j.02
159  %0 = load i32, ptr %arrayidx5, align 4
160  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
161  store i32 %0, ptr %B.addr.01, align 4
162  %inc7 = add nsw i64 %j.02, 1
163  %exitcond = icmp ne i64 %inc7, 10
164  br i1 %exitcond, label %for.body4, label %for.end8
165
166for.end8:                                         ; preds = %for.body4
167  ret void
168}
169
170
171;;  for (long int i = 0; i < 5; i++)
172;;    A[11*i - 45] = i;
173;;  for (long int j = 0; j <= 10; j++)
174;;    *B++ = A[j];
175
176define void @rdiv3(ptr %A, ptr %B) nounwind uwtable ssp {
177; CHECK-LABEL: 'rdiv3'
178; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
179; CHECK-NEXT:    da analyze - none!
180; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
181; CHECK-NEXT:    da analyze - none!
182; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
183; CHECK-NEXT:    da analyze - confused!
184; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
185; CHECK-NEXT:    da analyze - none!
186; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
187; CHECK-NEXT:    da analyze - confused!
188; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
189; CHECK-NEXT:    da analyze - none!
190;
191entry:
192  br label %for.body
193
194for.body:                                         ; preds = %entry, %for.body
195  %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
196  %conv = trunc i64 %i.03 to i32
197  %mul = mul nsw i64 %i.03, 11
198  %sub = add nsw i64 %mul, -45
199  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
200  store i32 %conv, ptr %arrayidx, align 4
201  %inc = add nsw i64 %i.03, 1
202  %exitcond4 = icmp ne i64 %inc, 5
203  br i1 %exitcond4, label %for.body, label %for.body4.preheader
204
205for.body4.preheader:                              ; preds = %for.body
206  br label %for.body4
207
208for.body4:                                        ; preds = %for.body4.preheader, %for.body4
209  %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
210  %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
211  %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %j.02
212  %0 = load i32, ptr %arrayidx5, align 4
213  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
214  store i32 %0, ptr %B.addr.01, align 4
215  %inc7 = add nsw i64 %j.02, 1
216  %exitcond = icmp ne i64 %inc7, 11
217  br i1 %exitcond, label %for.body4, label %for.end8
218
219for.end8:                                         ; preds = %for.body4
220  ret void
221}
222
223
224;;  for (long int i = 0; i <= 5; i++)
225;;    A[11*i - 45] = i;
226;;  for (long int j = 0; j <= 10; j++)
227;;    *B++ = A[j];
228
229define void @rdiv4(ptr %A, ptr %B) nounwind uwtable ssp {
230; CHECK-LABEL: 'rdiv4'
231; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
232; CHECK-NEXT:    da analyze - none!
233; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
234; CHECK-NEXT:    da analyze - flow [|<]!
235; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
236; CHECK-NEXT:    da analyze - confused!
237; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
238; CHECK-NEXT:    da analyze - none!
239; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
240; CHECK-NEXT:    da analyze - confused!
241; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
242; CHECK-NEXT:    da analyze - none!
243;
244entry:
245  br label %for.body
246
247for.body:                                         ; preds = %entry, %for.body
248  %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
249  %conv = trunc i64 %i.03 to i32
250  %mul = mul nsw i64 %i.03, 11
251  %sub = add nsw i64 %mul, -45
252  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
253  store i32 %conv, ptr %arrayidx, align 4
254  %inc = add nsw i64 %i.03, 1
255  %exitcond4 = icmp ne i64 %inc, 6
256  br i1 %exitcond4, label %for.body, label %for.body4.preheader
257
258for.body4.preheader:                              ; preds = %for.body
259  br label %for.body4
260
261for.body4:                                        ; preds = %for.body4.preheader, %for.body4
262  %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
263  %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
264  %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %j.02
265  %0 = load i32, ptr %arrayidx5, align 4
266  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
267  store i32 %0, ptr %B.addr.01, align 4
268  %inc7 = add nsw i64 %j.02, 1
269  %exitcond = icmp ne i64 %inc7, 11
270  br i1 %exitcond, label %for.body4, label %for.end8
271
272for.end8:                                         ; preds = %for.body4
273  ret void
274}
275
276
277;;  for (long int i = 0; i < 5; i++)
278;;    A[-11*i + 45] = i;
279;;  for (long int j = 0; j < 10; j++)
280;;    *B++ = A[-j];
281
282define void @rdiv5(ptr %A, ptr %B) nounwind uwtable ssp {
283; CHECK-LABEL: 'rdiv5'
284; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
285; CHECK-NEXT:    da analyze - none!
286; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
287; CHECK-NEXT:    da analyze - none!
288; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
289; CHECK-NEXT:    da analyze - confused!
290; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
291; CHECK-NEXT:    da analyze - none!
292; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
293; CHECK-NEXT:    da analyze - confused!
294; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
295; CHECK-NEXT:    da analyze - none!
296;
297entry:
298  br label %for.body
299
300for.body:                                         ; preds = %entry, %for.body
301  %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
302  %conv = trunc i64 %i.03 to i32
303  %mul = mul nsw i64 %i.03, -11
304  %add = add nsw i64 %mul, 45
305  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
306  store i32 %conv, ptr %arrayidx, align 4
307  %inc = add nsw i64 %i.03, 1
308  %exitcond4 = icmp ne i64 %inc, 5
309  br i1 %exitcond4, label %for.body, label %for.body4.preheader
310
311for.body4.preheader:                              ; preds = %for.body
312  br label %for.body4
313
314for.body4:                                        ; preds = %for.body4.preheader, %for.body4
315  %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
316  %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
317  %sub = sub nsw i64 0, %j.02
318  %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %sub
319  %0 = load i32, ptr %arrayidx5, align 4
320  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
321  store i32 %0, ptr %B.addr.01, align 4
322  %inc7 = add nsw i64 %j.02, 1
323  %exitcond = icmp ne i64 %inc7, 10
324  br i1 %exitcond, label %for.body4, label %for.end8
325
326for.end8:                                         ; preds = %for.body4
327  ret void
328}
329
330
331;;  for (long int i = 0; i <= 5; i++)
332;;    A[-11*i + 45] = i;
333;;  for (long int j = 0; j < 10; j++)
334;;    *B++ = A[-j];
335
336define void @rdiv6(ptr %A, ptr %B) nounwind uwtable ssp {
337; CHECK-LABEL: 'rdiv6'
338; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
339; CHECK-NEXT:    da analyze - none!
340; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
341; CHECK-NEXT:    da analyze - none!
342; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
343; CHECK-NEXT:    da analyze - confused!
344; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
345; CHECK-NEXT:    da analyze - none!
346; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
347; CHECK-NEXT:    da analyze - confused!
348; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
349; CHECK-NEXT:    da analyze - none!
350;
351entry:
352  br label %for.body
353
354for.body:                                         ; preds = %entry, %for.body
355  %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
356  %conv = trunc i64 %i.03 to i32
357  %mul = mul nsw i64 %i.03, -11
358  %add = add nsw i64 %mul, 45
359  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
360  store i32 %conv, ptr %arrayidx, align 4
361  %inc = add nsw i64 %i.03, 1
362  %exitcond4 = icmp ne i64 %inc, 6
363  br i1 %exitcond4, label %for.body, label %for.body4.preheader
364
365for.body4.preheader:                              ; preds = %for.body
366  br label %for.body4
367
368for.body4:                                        ; preds = %for.body4.preheader, %for.body4
369  %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
370  %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
371  %sub = sub nsw i64 0, %j.02
372  %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %sub
373  %0 = load i32, ptr %arrayidx5, align 4
374  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
375  store i32 %0, ptr %B.addr.01, align 4
376  %inc7 = add nsw i64 %j.02, 1
377  %exitcond = icmp ne i64 %inc7, 10
378  br i1 %exitcond, label %for.body4, label %for.end8
379
380for.end8:                                         ; preds = %for.body4
381  ret void
382}
383
384
385;;  for (long int i = 0; i < 5; i++)
386;;    A[-11*i + 45] = i;
387;;  for (long int j = 0; j <= 10; j++)
388;;    *B++ = A[-j];
389
390define void @rdiv7(ptr %A, ptr %B) nounwind uwtable ssp {
391; CHECK-LABEL: 'rdiv7'
392; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
393; CHECK-NEXT:    da analyze - none!
394; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
395; CHECK-NEXT:    da analyze - none!
396; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
397; CHECK-NEXT:    da analyze - confused!
398; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
399; CHECK-NEXT:    da analyze - none!
400; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
401; CHECK-NEXT:    da analyze - confused!
402; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
403; CHECK-NEXT:    da analyze - none!
404;
405entry:
406  br label %for.body
407
408for.body:                                         ; preds = %entry, %for.body
409  %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
410  %conv = trunc i64 %i.03 to i32
411  %mul = mul nsw i64 %i.03, -11
412  %add = add nsw i64 %mul, 45
413  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
414  store i32 %conv, ptr %arrayidx, align 4
415  %inc = add nsw i64 %i.03, 1
416  %exitcond4 = icmp ne i64 %inc, 5
417  br i1 %exitcond4, label %for.body, label %for.body4.preheader
418
419for.body4.preheader:                              ; preds = %for.body
420  br label %for.body4
421
422for.body4:                                        ; preds = %for.body4.preheader, %for.body4
423  %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
424  %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
425  %sub = sub nsw i64 0, %j.02
426  %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %sub
427  %0 = load i32, ptr %arrayidx5, align 4
428  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
429  store i32 %0, ptr %B.addr.01, align 4
430  %inc7 = add nsw i64 %j.02, 1
431  %exitcond = icmp ne i64 %inc7, 11
432  br i1 %exitcond, label %for.body4, label %for.end8
433
434for.end8:                                         ; preds = %for.body4
435  ret void
436}
437
438
439;;  for (long int i = 0; i <= 5; i++)
440;;    A[-11*i + 45] = i;
441;;  for (long int j = 0; j <= 10; j++)
442;;    *B++ = A[-j];
443
444define void @rdiv8(ptr %A, ptr %B) nounwind uwtable ssp {
445; CHECK-LABEL: 'rdiv8'
446; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
447; CHECK-NEXT:    da analyze - none!
448; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
449; CHECK-NEXT:    da analyze - flow [|<]!
450; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
451; CHECK-NEXT:    da analyze - confused!
452; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: %0 = load i32, ptr %arrayidx5, align 4
453; CHECK-NEXT:    da analyze - none!
454; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx5, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
455; CHECK-NEXT:    da analyze - confused!
456; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.01, align 4 --> Dst: store i32 %0, ptr %B.addr.01, align 4
457; CHECK-NEXT:    da analyze - none!
458;
459entry:
460  br label %for.body
461
462for.body:                                         ; preds = %entry, %for.body
463  %i.03 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
464  %conv = trunc i64 %i.03 to i32
465  %mul = mul nsw i64 %i.03, -11
466  %add = add nsw i64 %mul, 45
467  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %add
468  store i32 %conv, ptr %arrayidx, align 4
469  %inc = add nsw i64 %i.03, 1
470  %exitcond4 = icmp ne i64 %inc, 6
471  br i1 %exitcond4, label %for.body, label %for.body4.preheader
472
473for.body4.preheader:                              ; preds = %for.body
474  br label %for.body4
475
476for.body4:                                        ; preds = %for.body4.preheader, %for.body4
477  %j.02 = phi i64 [ %inc7, %for.body4 ], [ 0, %for.body4.preheader ]
478  %B.addr.01 = phi ptr [ %incdec.ptr, %for.body4 ], [ %B, %for.body4.preheader ]
479  %sub = sub nsw i64 0, %j.02
480  %arrayidx5 = getelementptr inbounds i32, ptr %A, i64 %sub
481  %0 = load i32, ptr %arrayidx5, align 4
482  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.01, i64 1
483  store i32 %0, ptr %B.addr.01, align 4
484  %inc7 = add nsw i64 %j.02, 1
485  %exitcond = icmp ne i64 %inc7, 11
486  br i1 %exitcond, label %for.body4, label %for.end8
487
488for.end8:                                         ; preds = %for.body4
489  ret void
490}
491
492
493;;  for (long int i = 0; i < 5; i++)
494;;    for (long int j = 0; j < 10; j++) {
495;;      A[11*i - j] = i;
496;;      *B++ = A[45];
497
498define void @rdiv9(ptr %A, ptr %B) nounwind uwtable ssp {
499; CHECK-LABEL: 'rdiv9'
500; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
501; CHECK-NEXT:    da analyze - none!
502; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
503; CHECK-NEXT:    da analyze - none!
504; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
505; CHECK-NEXT:    da analyze - confused!
506; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
507; CHECK-NEXT:    da analyze - consistent input [S S]!
508; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
509; CHECK-NEXT:    da analyze - confused!
510; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
511; CHECK-NEXT:    da analyze - none!
512;
513entry:
514  br label %for.cond1.preheader
515
516for.cond1.preheader:                              ; preds = %entry, %for.inc5
517  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc5 ]
518  %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ]
519  br label %for.body3
520
521for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
522  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
523  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
524  %conv = trunc i64 %i.03 to i32
525  %mul = mul nsw i64 %i.03, 11
526  %sub = sub nsw i64 %mul, %j.02
527  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
528  store i32 %conv, ptr %arrayidx, align 4
529  %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 45
530  %0 = load i32, ptr %arrayidx4, align 4
531  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
532  store i32 %0, ptr %B.addr.11, align 4
533  %inc = add nsw i64 %j.02, 1
534  %exitcond = icmp ne i64 %inc, 10
535  br i1 %exitcond, label %for.body3, label %for.inc5
536
537for.inc5:                                         ; preds = %for.body3
538  %scevgep = getelementptr i32, ptr %B.addr.04, i64 10
539  %inc6 = add nsw i64 %i.03, 1
540  %exitcond5 = icmp ne i64 %inc6, 5
541  br i1 %exitcond5, label %for.cond1.preheader, label %for.end7
542
543for.end7:                                         ; preds = %for.inc5
544  ret void
545}
546
547
548
549;;  for (long int i = 0; i <= 5; i++)
550;;    for (long int j = 0; j < 10; j++) {
551;;      A[11*i - j] = i;
552;;      *B++ = A[45];
553
554define void @rdiv10(ptr %A, ptr %B) nounwind uwtable ssp {
555; CHECK-LABEL: 'rdiv10'
556; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
557; CHECK-NEXT:    da analyze - none!
558; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
559; CHECK-NEXT:    da analyze - none!
560; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
561; CHECK-NEXT:    da analyze - confused!
562; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
563; CHECK-NEXT:    da analyze - consistent input [S S]!
564; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
565; CHECK-NEXT:    da analyze - confused!
566; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
567; CHECK-NEXT:    da analyze - none!
568;
569entry:
570  br label %for.cond1.preheader
571
572for.cond1.preheader:                              ; preds = %entry, %for.inc5
573  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc5 ]
574  %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ]
575  br label %for.body3
576
577for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
578  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
579  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
580  %conv = trunc i64 %i.03 to i32
581  %mul = mul nsw i64 %i.03, 11
582  %sub = sub nsw i64 %mul, %j.02
583  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
584  store i32 %conv, ptr %arrayidx, align 4
585  %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 45
586  %0 = load i32, ptr %arrayidx4, align 4
587  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
588  store i32 %0, ptr %B.addr.11, align 4
589  %inc = add nsw i64 %j.02, 1
590  %exitcond = icmp ne i64 %inc, 10
591  br i1 %exitcond, label %for.body3, label %for.inc5
592
593for.inc5:                                         ; preds = %for.body3
594  %scevgep = getelementptr i32, ptr %B.addr.04, i64 10
595  %inc6 = add nsw i64 %i.03, 1
596  %exitcond5 = icmp ne i64 %inc6, 6
597  br i1 %exitcond5, label %for.cond1.preheader, label %for.end7
598
599for.end7:                                         ; preds = %for.inc5
600  ret void
601}
602
603
604;;  for (long int i = 0; i < 5; i++)
605;;    for (long int j = 0; j <= 10; j++) {
606;;      A[11*i - j] = i;
607;;      *B++ = A[45];
608
609define void @rdiv11(ptr %A, ptr %B) nounwind uwtable ssp {
610; CHECK-LABEL: 'rdiv11'
611; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
612; CHECK-NEXT:    da analyze - none!
613; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
614; CHECK-NEXT:    da analyze - none!
615; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
616; CHECK-NEXT:    da analyze - confused!
617; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
618; CHECK-NEXT:    da analyze - consistent input [S S]!
619; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
620; CHECK-NEXT:    da analyze - confused!
621; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
622; CHECK-NEXT:    da analyze - none!
623;
624entry:
625  br label %for.cond1.preheader
626
627for.cond1.preheader:                              ; preds = %entry, %for.inc5
628  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc5 ]
629  %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ]
630  br label %for.body3
631
632for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
633  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
634  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
635  %conv = trunc i64 %i.03 to i32
636  %mul = mul nsw i64 %i.03, 11
637  %sub = sub nsw i64 %mul, %j.02
638  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
639  store i32 %conv, ptr %arrayidx, align 4
640  %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 45
641  %0 = load i32, ptr %arrayidx4, align 4
642  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
643  store i32 %0, ptr %B.addr.11, align 4
644  %inc = add nsw i64 %j.02, 1
645  %exitcond = icmp ne i64 %inc, 11
646  br i1 %exitcond, label %for.body3, label %for.inc5
647
648for.inc5:                                         ; preds = %for.body3
649  %scevgep = getelementptr i32, ptr %B.addr.04, i64 11
650  %inc6 = add nsw i64 %i.03, 1
651  %exitcond5 = icmp ne i64 %inc6, 5
652  br i1 %exitcond5, label %for.cond1.preheader, label %for.end7
653
654for.end7:                                         ; preds = %for.inc5
655  ret void
656}
657
658
659;;  for (long int i = 0; i <= 5; i++)
660;;    for (long int j = 0; j <= 10; j++) {
661;;      A[11*i - j] = i;
662;;      *B++ = A[45];
663
664define void @rdiv12(ptr %A, ptr %B) nounwind uwtable ssp {
665; CHECK-LABEL: 'rdiv12'
666; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %conv, ptr %arrayidx, align 4
667; CHECK-NEXT:    da analyze - none!
668; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
669; CHECK-NEXT:    da analyze - flow [* *|<]!
670; CHECK-NEXT:  Src: store i32 %conv, ptr %arrayidx, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
671; CHECK-NEXT:    da analyze - confused!
672; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: %0 = load i32, ptr %arrayidx4, align 4
673; CHECK-NEXT:    da analyze - consistent input [S S]!
674; CHECK-NEXT:  Src: %0 = load i32, ptr %arrayidx4, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
675; CHECK-NEXT:    da analyze - confused!
676; CHECK-NEXT:  Src: store i32 %0, ptr %B.addr.11, align 4 --> Dst: store i32 %0, ptr %B.addr.11, align 4
677; CHECK-NEXT:    da analyze - none!
678;
679entry:
680  br label %for.cond1.preheader
681
682for.cond1.preheader:                              ; preds = %entry, %for.inc5
683  %B.addr.04 = phi ptr [ %B, %entry ], [ %scevgep, %for.inc5 ]
684  %i.03 = phi i64 [ 0, %entry ], [ %inc6, %for.inc5 ]
685  br label %for.body3
686
687for.body3:                                        ; preds = %for.cond1.preheader, %for.body3
688  %j.02 = phi i64 [ 0, %for.cond1.preheader ], [ %inc, %for.body3 ]
689  %B.addr.11 = phi ptr [ %B.addr.04, %for.cond1.preheader ], [ %incdec.ptr, %for.body3 ]
690  %conv = trunc i64 %i.03 to i32
691  %mul = mul nsw i64 %i.03, 11
692  %sub = sub nsw i64 %mul, %j.02
693  %arrayidx = getelementptr inbounds i32, ptr %A, i64 %sub
694  store i32 %conv, ptr %arrayidx, align 4
695  %arrayidx4 = getelementptr inbounds i32, ptr %A, i64 45
696  %0 = load i32, ptr %arrayidx4, align 4
697  %incdec.ptr = getelementptr inbounds i32, ptr %B.addr.11, i64 1
698  store i32 %0, ptr %B.addr.11, align 4
699  %inc = add nsw i64 %j.02, 1
700  %exitcond = icmp ne i64 %inc, 11
701  br i1 %exitcond, label %for.body3, label %for.inc5
702
703for.inc5:                                         ; preds = %for.body3
704  %scevgep = getelementptr i32, ptr %B.addr.04, i64 11
705  %inc6 = add nsw i64 %i.03, 1
706  %exitcond5 = icmp ne i64 %inc6, 6
707  br i1 %exitcond5, label %for.cond1.preheader, label %for.end7
708
709for.end7:                                         ; preds = %for.inc5
710  ret void
711}
712