xref: /aosp_15_r20/external/llvm/test/Analysis/DependenceAnalysis/StrongSIV.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -basicaa -da | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; ModuleID = 'StrongSIV.bc'
4*9880d681SAndroid Build Coastguard Workertarget 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"
5*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-apple-macosx10.6.0"
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker;;  for (int i = 0; i < n; i++) {
9*9880d681SAndroid Build Coastguard Worker;;    A[i + 2] = i;
10*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[i];
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine void @strong0(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
13*9880d681SAndroid Build Coastguard Workerentry:
14*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sgt i64 %n, 0
15*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.body.preheader, label %for.end
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
18*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent flow [2]!
19*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
20*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
21*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
22*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
25*9880d681SAndroid Build Coastguard Worker  br label %for.body
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
28*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
29*9880d681SAndroid Build Coastguard Worker  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
30*9880d681SAndroid Build Coastguard Worker  %0 = add nsw i64 %indvars.iv, 2
31*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %0
32*9880d681SAndroid Build Coastguard Worker  %1 = trunc i64 %indvars.iv to i32
33*9880d681SAndroid Build Coastguard Worker  store i32 %1, i32* %arrayidx, align 4
34*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
35*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %arrayidx3, align 4
36*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
37*9880d681SAndroid Build Coastguard Worker  store i32 %2, i32* %B.addr.02, align 4
38*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add i64 %indvars.iv, 1
39*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i64 %indvars.iv.next, %n
40*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end.loopexit
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
43*9880d681SAndroid Build Coastguard Worker  br label %for.end
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
46*9880d681SAndroid Build Coastguard Worker  ret void
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker;;  for (long int i = 0; i < n; i++) {
51*9880d681SAndroid Build Coastguard Worker;;    A[i + 2] = i;
52*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[i];
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine void @strong1(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp {
55*9880d681SAndroid Build Coastguard Workerentry:
56*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sgt i32 %n, 0
57*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.body.preheader, label %for.end
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
60*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent flow [2]!
61*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
62*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
63*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
64*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
67*9880d681SAndroid Build Coastguard Worker  %0 = sext i32 %n to i64
68*9880d681SAndroid Build Coastguard Worker  br label %for.body
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
71*9880d681SAndroid Build Coastguard Worker  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
72*9880d681SAndroid Build Coastguard Worker  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
73*9880d681SAndroid Build Coastguard Worker  %conv2 = trunc i64 %i.03 to i32
74*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %i.03, 2
75*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
76*9880d681SAndroid Build Coastguard Worker  store i32 %conv2, i32* %arrayidx, align 4
77*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %i.03
78*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %arrayidx3, align 4
79*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
80*9880d681SAndroid Build Coastguard Worker  store i32 %1, i32* %B.addr.02, align 4
81*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i64 %i.03, 1
82*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i64 %inc, %0
83*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end.loopexit
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
86*9880d681SAndroid Build Coastguard Worker  br label %for.end
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
89*9880d681SAndroid Build Coastguard Worker  ret void
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker;;  for (long unsigned i = 0; i < n; i++) {
94*9880d681SAndroid Build Coastguard Worker;;    A[i + 2] = i;
95*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[i];
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdefine void @strong2(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
98*9880d681SAndroid Build Coastguard Workerentry:
99*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i64 %n, 0
100*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.end, label %for.body.preheader
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
103*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent flow [2]!
104*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
105*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
106*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
107*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
110*9880d681SAndroid Build Coastguard Worker  br label %for.body
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
113*9880d681SAndroid Build Coastguard Worker  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
114*9880d681SAndroid Build Coastguard Worker  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
115*9880d681SAndroid Build Coastguard Worker  %conv = trunc i64 %i.03 to i32
116*9880d681SAndroid Build Coastguard Worker  %add = add i64 %i.03, 2
117*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
118*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %arrayidx, align 4
119*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %i.03
120*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx1, align 4
121*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
122*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %B.addr.02, align 4
123*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.03, 1
124*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i64 %inc, %n
125*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end.loopexit
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
128*9880d681SAndroid Build Coastguard Worker  br label %for.end
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
131*9880d681SAndroid Build Coastguard Worker  ret void
132*9880d681SAndroid Build Coastguard Worker}
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker;;  for (int i = 0; i < n; i++) {
136*9880d681SAndroid Build Coastguard Worker;;    A[i + 2] = i;
137*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[i];
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdefine void @strong3(i32* %A, i32* %B, i32 %n) nounwind uwtable ssp {
140*9880d681SAndroid Build Coastguard Workerentry:
141*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp sgt i32 %n, 0
142*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.body.preheader, label %for.end
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
145*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent flow [2]!
146*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
147*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
148*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
149*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
152*9880d681SAndroid Build Coastguard Worker  br label %for.body
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
155*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %for.body.preheader ], [ %indvars.iv.next, %for.body ]
156*9880d681SAndroid Build Coastguard Worker  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
157*9880d681SAndroid Build Coastguard Worker  %0 = add nsw i64 %indvars.iv, 2
158*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %0
159*9880d681SAndroid Build Coastguard Worker  %1 = trunc i64 %indvars.iv to i32
160*9880d681SAndroid Build Coastguard Worker  store i32 %1, i32* %arrayidx, align 4
161*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
162*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %arrayidx2, align 4
163*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
164*9880d681SAndroid Build Coastguard Worker  store i32 %2, i32* %B.addr.02, align 4
165*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add i64 %indvars.iv, 1
166*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
167*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i32 %lftr.wideiv, %n
168*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end.loopexit
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
171*9880d681SAndroid Build Coastguard Worker  br label %for.end
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
174*9880d681SAndroid Build Coastguard Worker  ret void
175*9880d681SAndroid Build Coastguard Worker}
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Worker;;  for (long unsigned i = 0; i < 19; i++) {
179*9880d681SAndroid Build Coastguard Worker;;    A[i + 19] = i;
180*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[i];
181*9880d681SAndroid Build Coastguard Worker
182*9880d681SAndroid Build Coastguard Workerdefine void @strong4(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
183*9880d681SAndroid Build Coastguard Workerentry:
184*9880d681SAndroid Build Coastguard Worker  br label %for.body
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
187*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
188*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
189*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
190*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
191*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
194*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
195*9880d681SAndroid Build Coastguard Worker  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
196*9880d681SAndroid Build Coastguard Worker  %conv = trunc i64 %i.02 to i32
197*9880d681SAndroid Build Coastguard Worker  %add = add i64 %i.02, 19
198*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
199*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %arrayidx, align 4
200*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %i.02
201*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx1, align 4
202*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
203*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %B.addr.01, align 4
204*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
205*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i64 %inc, 19
206*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
209*9880d681SAndroid Build Coastguard Worker  ret void
210*9880d681SAndroid Build Coastguard Worker}
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker;;  for (long unsigned i = 0; i < 20; i++) {
214*9880d681SAndroid Build Coastguard Worker;;    A[i + 19] = i;
215*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[i];
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Workerdefine void @strong5(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
218*9880d681SAndroid Build Coastguard Workerentry:
219*9880d681SAndroid Build Coastguard Worker  br label %for.body
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
222*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent flow [19]!
223*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
224*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
225*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
226*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
229*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
230*9880d681SAndroid Build Coastguard Worker  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
231*9880d681SAndroid Build Coastguard Worker  %conv = trunc i64 %i.02 to i32
232*9880d681SAndroid Build Coastguard Worker  %add = add i64 %i.02, 19
233*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
234*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %arrayidx, align 4
235*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %i.02
236*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx1, align 4
237*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
238*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %B.addr.01, align 4
239*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
240*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i64 %inc, 20
241*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
244*9880d681SAndroid Build Coastguard Worker  ret void
245*9880d681SAndroid Build Coastguard Worker}
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker;;  for (long unsigned i = 0; i < 20; i++) {
249*9880d681SAndroid Build Coastguard Worker;;    A[2*i + 6] = i;
250*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[2*i];
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Workerdefine void @strong6(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
253*9880d681SAndroid Build Coastguard Workerentry:
254*9880d681SAndroid Build Coastguard Worker  br label %for.body
255*9880d681SAndroid Build Coastguard Worker
256*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
257*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent flow [3]!
258*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
259*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
260*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
261*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
262*9880d681SAndroid Build Coastguard Worker
263*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
264*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
265*9880d681SAndroid Build Coastguard Worker  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
266*9880d681SAndroid Build Coastguard Worker  %conv = trunc i64 %i.02 to i32
267*9880d681SAndroid Build Coastguard Worker  %mul = shl i64 %i.02, 1
268*9880d681SAndroid Build Coastguard Worker  %add = add i64 %mul, 6
269*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
270*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %arrayidx, align 4
271*9880d681SAndroid Build Coastguard Worker  %mul1 = shl i64 %i.02, 1
272*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %mul1
273*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx2, align 4
274*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
275*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %B.addr.01, align 4
276*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
277*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i64 %inc, 20
278*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
281*9880d681SAndroid Build Coastguard Worker  ret void
282*9880d681SAndroid Build Coastguard Worker}
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard Worker;;  for (long unsigned i = 0; i < 20; i++) {
286*9880d681SAndroid Build Coastguard Worker;;    A[2*i + 7] = i;
287*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[2*i];
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerdefine void @strong7(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
290*9880d681SAndroid Build Coastguard Workerentry:
291*9880d681SAndroid Build Coastguard Worker  br label %for.body
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
294*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
295*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
296*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
297*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
298*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
301*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
302*9880d681SAndroid Build Coastguard Worker  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
303*9880d681SAndroid Build Coastguard Worker  %conv = trunc i64 %i.02 to i32
304*9880d681SAndroid Build Coastguard Worker  %mul = shl i64 %i.02, 1
305*9880d681SAndroid Build Coastguard Worker  %add = add i64 %mul, 7
306*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
307*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %arrayidx, align 4
308*9880d681SAndroid Build Coastguard Worker  %mul1 = shl i64 %i.02, 1
309*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %mul1
310*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx2, align 4
311*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
312*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %B.addr.01, align 4
313*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
314*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i64 %inc, 20
315*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
318*9880d681SAndroid Build Coastguard Worker  ret void
319*9880d681SAndroid Build Coastguard Worker}
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Worker
322*9880d681SAndroid Build Coastguard Worker;;  for (long unsigned i = 0; i < 20; i++) {
323*9880d681SAndroid Build Coastguard Worker;;    A[i + n] = i;
324*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[i];
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Workerdefine void @strong8(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
327*9880d681SAndroid Build Coastguard Workerentry:
328*9880d681SAndroid Build Coastguard Worker  br label %for.body
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
331*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent flow [%n|<]!
332*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
333*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
334*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
335*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
338*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
339*9880d681SAndroid Build Coastguard Worker  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
340*9880d681SAndroid Build Coastguard Worker  %conv = trunc i64 %i.02 to i32
341*9880d681SAndroid Build Coastguard Worker  %add = add i64 %i.02, %n
342*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
343*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %arrayidx, align 4
344*9880d681SAndroid Build Coastguard Worker  %arrayidx1 = getelementptr inbounds i32, i32* %A, i64 %i.02
345*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx1, align 4
346*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
347*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %B.addr.01, align 4
348*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
349*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i64 %inc, 20
350*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
353*9880d681SAndroid Build Coastguard Worker  ret void
354*9880d681SAndroid Build Coastguard Worker}
355*9880d681SAndroid Build Coastguard Worker
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker;;  for (long unsigned i = 0; i < n; i++) {
358*9880d681SAndroid Build Coastguard Worker;;    A[i + n] = i;
359*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[i + 2*n];
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Workerdefine void @strong9(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
362*9880d681SAndroid Build Coastguard Workerentry:
363*9880d681SAndroid Build Coastguard Worker  %cmp1 = icmp eq i64 %n, 0
364*9880d681SAndroid Build Coastguard Worker  br i1 %cmp1, label %for.end, label %for.body.preheader
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
367*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
368*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
369*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
370*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
371*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Workerfor.body.preheader:                               ; preds = %entry
374*9880d681SAndroid Build Coastguard Worker  br label %for.body
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body.preheader, %for.body
377*9880d681SAndroid Build Coastguard Worker  %i.03 = phi i64 [ %inc, %for.body ], [ 0, %for.body.preheader ]
378*9880d681SAndroid Build Coastguard Worker  %B.addr.02 = phi i32* [ %incdec.ptr, %for.body ], [ %B, %for.body.preheader ]
379*9880d681SAndroid Build Coastguard Worker  %conv = trunc i64 %i.03 to i32
380*9880d681SAndroid Build Coastguard Worker  %add = add i64 %i.03, %n
381*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
382*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %arrayidx, align 4
383*9880d681SAndroid Build Coastguard Worker  %mul = shl i64 %n, 1
384*9880d681SAndroid Build Coastguard Worker  %add1 = add i64 %i.03, %mul
385*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %add1
386*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx2, align 4
387*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.02, i64 1
388*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %B.addr.02, align 4
389*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.03, 1
390*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i64 %inc, %n
391*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end.loopexit
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Workerfor.end.loopexit:                                 ; preds = %for.body
394*9880d681SAndroid Build Coastguard Worker  br label %for.end
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.end.loopexit, %entry
397*9880d681SAndroid Build Coastguard Worker  ret void
398*9880d681SAndroid Build Coastguard Worker}
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard Worker
401*9880d681SAndroid Build Coastguard Worker;;  for (long unsigned i = 0; i < 1000; i++) {
402*9880d681SAndroid Build Coastguard Worker;;    A[n*i + 5] = i;
403*9880d681SAndroid Build Coastguard Worker;;    *B++ = A[n*i + 5];
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Workerdefine void @strong10(i32* %A, i32* %B, i64 %n) nounwind uwtable ssp {
406*9880d681SAndroid Build Coastguard Workerentry:
407*9880d681SAndroid Build Coastguard Worker  br label %for.body
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
410*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - consistent flow [0|<]!
411*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
412*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
413*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - confused!
414*9880d681SAndroid Build Coastguard Worker; CHECK: da analyze - none!
415*9880d681SAndroid Build Coastguard Worker
416*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
417*9880d681SAndroid Build Coastguard Worker  %i.02 = phi i64 [ 0, %entry ], [ %inc, %for.body ]
418*9880d681SAndroid Build Coastguard Worker  %B.addr.01 = phi i32* [ %B, %entry ], [ %incdec.ptr, %for.body ]
419*9880d681SAndroid Build Coastguard Worker  %conv = trunc i64 %i.02 to i32
420*9880d681SAndroid Build Coastguard Worker  %mul = mul i64 %i.02, %n
421*9880d681SAndroid Build Coastguard Worker  %add = add i64 %mul, 5
422*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
423*9880d681SAndroid Build Coastguard Worker  store i32 %conv, i32* %arrayidx, align 4
424*9880d681SAndroid Build Coastguard Worker  %mul1 = mul i64 %i.02, %n
425*9880d681SAndroid Build Coastguard Worker  %add2 = add i64 %mul1, 5
426*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %add2
427*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx3, align 4
428*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %B.addr.01, i64 1
429*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %B.addr.01, align 4
430*9880d681SAndroid Build Coastguard Worker  %inc = add i64 %i.02, 1
431*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp ne i64 %inc, 1000
432*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.body, label %for.end
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
435*9880d681SAndroid Build Coastguard Worker  ret void
436*9880d681SAndroid Build Coastguard Worker}
437