xref: /aosp_15_r20/external/llvm/test/Analysis/LoopAccessAnalysis/stride-access-dependence.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -loop-accesses -analyze < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt -passes='require<scalar-evolution>,require<aa>,loop(print-access-info)' -disable-output  < %s 2>&1 | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-i128:128-n32:64-S128"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Following cases are no dependence.
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; void nodep_Read_Write(int *A) {
9*9880d681SAndroid Build Coastguard Worker;   int *B = A + 1;
10*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=3)
11*9880d681SAndroid Build Coastguard Worker;     B[i] = A[i] + 1;
12*9880d681SAndroid Build Coastguard Worker; }
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; CHECK: function 'nodep_Read_Write':
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Memory dependences are safe
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
18*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Run-time memory checks:
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine void @nodep_Read_Write(i32* nocapture %A) {
21*9880d681SAndroid Build Coastguard Workerentry:
22*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i32, i32* %A, i64 1
23*9880d681SAndroid Build Coastguard Worker  br label %for.body
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
26*9880d681SAndroid Build Coastguard Worker  ret void
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
29*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
30*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
31*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
32*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %0, 1
33*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %add.ptr, i64 %indvars.iv
34*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* %arrayidx2, align 4
35*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 3
36*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
37*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Worker; int nodep_Write_Read(int *A) {
41*9880d681SAndroid Build Coastguard Worker;   int sum = 0;
42*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=4) {
43*9880d681SAndroid Build Coastguard Worker;     A[i] = i;
44*9880d681SAndroid Build Coastguard Worker;     sum += A[i+3];
45*9880d681SAndroid Build Coastguard Worker;   }
46*9880d681SAndroid Build Coastguard Worker;
47*9880d681SAndroid Build Coastguard Worker;   return sum;
48*9880d681SAndroid Build Coastguard Worker; }
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker; CHECK: function 'nodep_Write_Read':
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
52*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Memory dependences are safe
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Run-time memory checks:
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine i32 @nodep_Write_Read(i32* nocapture %A) {
57*9880d681SAndroid Build Coastguard Workerentry:
58*9880d681SAndroid Build Coastguard Worker  br label %for.body
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
61*9880d681SAndroid Build Coastguard Worker  ret i32 %add3
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
64*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
65*9880d681SAndroid Build Coastguard Worker  %sum.013 = phi i32 [ 0, %entry ], [ %add3, %for.body ]
66*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
67*9880d681SAndroid Build Coastguard Worker  %0 = trunc i64 %indvars.iv to i32
68*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %arrayidx, align 4
69*9880d681SAndroid Build Coastguard Worker  %1 = or i64 %indvars.iv, 3
70*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %1
71*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %arrayidx2, align 4
72*9880d681SAndroid Build Coastguard Worker  %add3 = add nsw i32 %2, %sum.013
73*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 4
74*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
75*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; void nodep_Write_Write(int *A) {
79*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=2) {
80*9880d681SAndroid Build Coastguard Worker;     A[i] = i;
81*9880d681SAndroid Build Coastguard Worker;     A[i+1] = i+1;
82*9880d681SAndroid Build Coastguard Worker;   }
83*9880d681SAndroid Build Coastguard Worker; }
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; CHECK: function 'nodep_Write_Write':
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Memory dependences are safe
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Run-time memory checks:
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdefine void @nodep_Write_Write(i32* nocapture %A) {
92*9880d681SAndroid Build Coastguard Workerentry:
93*9880d681SAndroid Build Coastguard Worker  br label %for.body
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
96*9880d681SAndroid Build Coastguard Worker  ret void
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
99*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
100*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
101*9880d681SAndroid Build Coastguard Worker  %0 = trunc i64 %indvars.iv to i32
102*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %arrayidx, align 4
103*9880d681SAndroid Build Coastguard Worker  %1 = or i64 %indvars.iv, 1
104*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %1
105*9880d681SAndroid Build Coastguard Worker  %2 = trunc i64 %1 to i32
106*9880d681SAndroid Build Coastguard Worker  store i32 %2, i32* %arrayidx3, align 4
107*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
108*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
109*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
110*9880d681SAndroid Build Coastguard Worker}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; Following cases are unsafe depdences and are not vectorizable.
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker; void unsafe_Read_Write(int *A) {
115*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=3)
116*9880d681SAndroid Build Coastguard Worker;     A[i+3] = A[i] + 1;
117*9880d681SAndroid Build Coastguard Worker; }
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker; CHECK: function 'unsafe_Read_Write':
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Report: unsafe dependent memory operations in loop
122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:      Backward:
124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           %0 = load i32, i32* %arrayidx, align 4 ->
125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %add, i32* %arrayidx3, align 4
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_Read_Write(i32* nocapture %A) {
128*9880d681SAndroid Build Coastguard Workerentry:
129*9880d681SAndroid Build Coastguard Worker  br label %for.body
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
132*9880d681SAndroid Build Coastguard Worker  ret void
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
135*9880d681SAndroid Build Coastguard Worker  %i.010 = phi i32 [ 0, %entry ], [ %add1, %for.body ]
136*9880d681SAndroid Build Coastguard Worker  %idxprom = zext i32 %i.010 to i64
137*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %idxprom
138*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
139*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %0, 1
140*9880d681SAndroid Build Coastguard Worker  %add1 = add i32 %i.010, 3
141*9880d681SAndroid Build Coastguard Worker  %idxprom2 = zext i32 %add1 to i64
142*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %idxprom2
143*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* %arrayidx3, align 4
144*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i32 %add1, 1024
145*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Worker; int unsafe_Write_Read(int *A) {
149*9880d681SAndroid Build Coastguard Worker;   int sum = 0;
150*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=4) {
151*9880d681SAndroid Build Coastguard Worker;     A[i] = i;
152*9880d681SAndroid Build Coastguard Worker;     sum += A[i+4];
153*9880d681SAndroid Build Coastguard Worker;   }
154*9880d681SAndroid Build Coastguard Worker;
155*9880d681SAndroid Build Coastguard Worker;   return sum;
156*9880d681SAndroid Build Coastguard Worker; }
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Worker; CHECK: function 'unsafe_Write_Read':
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Report: unsafe dependent memory operations in loop
161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:      Backward:
163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %0, i32* %arrayidx, align 4 ->
164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           %1 = load i32, i32* %arrayidx2, align 4
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Workerdefine i32 @unsafe_Write_Read(i32* nocapture %A) {
167*9880d681SAndroid Build Coastguard Workerentry:
168*9880d681SAndroid Build Coastguard Worker  br label %for.body
169*9880d681SAndroid Build Coastguard Worker
170*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
171*9880d681SAndroid Build Coastguard Worker  ret i32 %add3
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
174*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
175*9880d681SAndroid Build Coastguard Worker  %sum.013 = phi i32 [ 0, %entry ], [ %add3, %for.body ]
176*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
177*9880d681SAndroid Build Coastguard Worker  %0 = trunc i64 %indvars.iv to i32
178*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %arrayidx, align 4
179*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 4
180*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv.next
181*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %arrayidx2, align 4
182*9880d681SAndroid Build Coastguard Worker  %add3 = add nsw i32 %1, %sum.013
183*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
184*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; void unsafe_Write_Write(int *A) {
188*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=2) {
189*9880d681SAndroid Build Coastguard Worker;     A[i] = i;
190*9880d681SAndroid Build Coastguard Worker;     A[i+2] = i+1;
191*9880d681SAndroid Build Coastguard Worker;   }
192*9880d681SAndroid Build Coastguard Worker; }
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Worker; CHECK: function 'unsafe_Write_Write':
195*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Report: unsafe dependent memory operations in loop
197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:      Backward:
199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %0, i32* %arrayidx, align 4 ->
200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %2, i32* %arrayidx3, align 4
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_Write_Write(i32* nocapture %A) {
203*9880d681SAndroid Build Coastguard Workerentry:
204*9880d681SAndroid Build Coastguard Worker  br label %for.body
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
207*9880d681SAndroid Build Coastguard Worker  ret void
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
210*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
211*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
212*9880d681SAndroid Build Coastguard Worker  %0 = trunc i64 %indvars.iv to i32
213*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %arrayidx, align 4
214*9880d681SAndroid Build Coastguard Worker  %1 = or i64 %indvars.iv, 1
215*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
216*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds i32, i32* %A, i64 %indvars.iv.next
217*9880d681SAndroid Build Coastguard Worker  %2 = trunc i64 %1 to i32
218*9880d681SAndroid Build Coastguard Worker  store i32 %2, i32* %arrayidx3, align 4
219*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
220*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker; Following cases check that strided accesses can be vectorized.
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker; void vectorizable_Read_Write(int *A) {
226*9880d681SAndroid Build Coastguard Worker;   int *B = A + 4;
227*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=2)
228*9880d681SAndroid Build Coastguard Worker;     B[i] = A[i] + 1;
229*9880d681SAndroid Build Coastguard Worker; }
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker; CHECK: function 'vectorizable_Read_Write':
232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Memory dependences are safe
234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
235*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:       BackwardVectorizable:
236*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           %0 = load i32, i32* %arrayidx, align 4 ->
237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %add, i32* %arrayidx2, align 4
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerdefine void @vectorizable_Read_Write(i32* nocapture %A) {
240*9880d681SAndroid Build Coastguard Workerentry:
241*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i32, i32* %A, i64 4
242*9880d681SAndroid Build Coastguard Worker  br label %for.body
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
245*9880d681SAndroid Build Coastguard Worker  ret void
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
248*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
249*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
250*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
251*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %0, 1
252*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %add.ptr, i64 %indvars.iv
253*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* %arrayidx2, align 4
254*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
255*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
256*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker; int vectorizable_Write_Read(int *A) {
260*9880d681SAndroid Build Coastguard Worker;   int *B = A + 4;
261*9880d681SAndroid Build Coastguard Worker;   int sum = 0;
262*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=2) {
263*9880d681SAndroid Build Coastguard Worker;     A[i] = i;
264*9880d681SAndroid Build Coastguard Worker;     sum += B[i];
265*9880d681SAndroid Build Coastguard Worker;   }
266*9880d681SAndroid Build Coastguard Worker;
267*9880d681SAndroid Build Coastguard Worker;   return sum;
268*9880d681SAndroid Build Coastguard Worker; }
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker; CHECK: function 'vectorizable_Write_Read':
271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Memory dependences are safe
273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:       BackwardVectorizable:
275*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %0, i32* %arrayidx, align 4 ->
276*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           %1 = load i32, i32* %arrayidx2, align 4
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Workerdefine i32 @vectorizable_Write_Read(i32* nocapture %A) {
279*9880d681SAndroid Build Coastguard Workerentry:
280*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i32, i32* %A, i64 4
281*9880d681SAndroid Build Coastguard Worker  br label %for.body
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
284*9880d681SAndroid Build Coastguard Worker  ret i32 %add
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
287*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
288*9880d681SAndroid Build Coastguard Worker  %sum.013 = phi i32 [ 0, %entry ], [ %add, %for.body ]
289*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
290*9880d681SAndroid Build Coastguard Worker  %0 = trunc i64 %indvars.iv to i32
291*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %arrayidx, align 4
292*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %add.ptr, i64 %indvars.iv
293*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %arrayidx2, align 4
294*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %1, %sum.013
295*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
296*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
297*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
298*9880d681SAndroid Build Coastguard Worker}
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Worker; void vectorizable_Write_Write(int *A) {
301*9880d681SAndroid Build Coastguard Worker;   int *B = A + 4;
302*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=2) {
303*9880d681SAndroid Build Coastguard Worker;     A[i] = i;
304*9880d681SAndroid Build Coastguard Worker;     B[i] = i+1;
305*9880d681SAndroid Build Coastguard Worker;   }
306*9880d681SAndroid Build Coastguard Worker; }
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Worker; CHECK: function 'vectorizable_Write_Write':
309*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Memory dependences are safe
311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:       BackwardVectorizable:
313*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %0, i32* %arrayidx, align 4 ->
314*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %2, i32* %arrayidx2, align 4
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Workerdefine void @vectorizable_Write_Write(i32* nocapture %A) {
317*9880d681SAndroid Build Coastguard Workerentry:
318*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i32, i32* %A, i64 4
319*9880d681SAndroid Build Coastguard Worker  br label %for.body
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
322*9880d681SAndroid Build Coastguard Worker  ret void
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
325*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
326*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
327*9880d681SAndroid Build Coastguard Worker  %0 = trunc i64 %indvars.iv to i32
328*9880d681SAndroid Build Coastguard Worker  store i32 %0, i32* %arrayidx, align 4
329*9880d681SAndroid Build Coastguard Worker  %1 = or i64 %indvars.iv, 1
330*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %add.ptr, i64 %indvars.iv
331*9880d681SAndroid Build Coastguard Worker  %2 = trunc i64 %1 to i32
332*9880d681SAndroid Build Coastguard Worker  store i32 %2, i32* %arrayidx2, align 4
333*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
334*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
335*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
336*9880d681SAndroid Build Coastguard Worker}
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Worker; void vectorizable_unscaled_Read_Write(int *A) {
339*9880d681SAndroid Build Coastguard Worker;   int *B = (int *)((char *)A + 14);
340*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=2)
341*9880d681SAndroid Build Coastguard Worker;     B[i] = A[i] + 1;
342*9880d681SAndroid Build Coastguard Worker; }
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker; FIXME: This case looks like previous case @vectorizable_Read_Write. It sould
345*9880d681SAndroid Build Coastguard Worker; be vectorizable.
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Worker; CHECK: function 'vectorizable_unscaled_Read_Write':
348*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Report: unsafe dependent memory operations in loop
350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:       BackwardVectorizableButPreventsForwarding:
352*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           %2 = load i32, i32* %arrayidx, align 4 ->
353*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %add, i32* %arrayidx2, align 4
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Workerdefine void @vectorizable_unscaled_Read_Write(i32* nocapture %A) {
356*9880d681SAndroid Build Coastguard Workerentry:
357*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i32* %A to i8*
358*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %0, i64 14
359*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i8* %add.ptr to i32*
360*9880d681SAndroid Build Coastguard Worker  br label %for.body
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
363*9880d681SAndroid Build Coastguard Worker  ret void
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
366*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
367*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
368*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %arrayidx, align 4
369*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %2, 1
370*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %1, i64 %indvars.iv
371*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* %arrayidx2, align 4
372*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
373*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
374*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
375*9880d681SAndroid Build Coastguard Worker}
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Worker; int vectorizable_unscaled_Write_Read(int *A) {
378*9880d681SAndroid Build Coastguard Worker;   int *B = (int *)((char *)A + 17);
379*9880d681SAndroid Build Coastguard Worker;   int sum = 0;
380*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=2) {
381*9880d681SAndroid Build Coastguard Worker;     A[i] = i;
382*9880d681SAndroid Build Coastguard Worker;     sum += B[i];
383*9880d681SAndroid Build Coastguard Worker;   }
384*9880d681SAndroid Build Coastguard Worker;
385*9880d681SAndroid Build Coastguard Worker;   return sum;
386*9880d681SAndroid Build Coastguard Worker; }
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Worker; CHECK: function 'vectorizable_unscaled_Write_Read':
389*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
390*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Memory dependences are safe
391*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
392*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:       BackwardVectorizable:
393*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %2, i32* %arrayidx, align 4 ->
394*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           %3 = load i32, i32* %arrayidx2, align 4
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Workerdefine i32 @vectorizable_unscaled_Write_Read(i32* nocapture %A) {
397*9880d681SAndroid Build Coastguard Workerentry:
398*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i32* %A to i8*
399*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %0, i64 17
400*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i8* %add.ptr to i32*
401*9880d681SAndroid Build Coastguard Worker  br label %for.body
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
404*9880d681SAndroid Build Coastguard Worker  ret i32 %add
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
407*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
408*9880d681SAndroid Build Coastguard Worker  %sum.013 = phi i32 [ 0, %entry ], [ %add, %for.body ]
409*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
410*9880d681SAndroid Build Coastguard Worker  %2 = trunc i64 %indvars.iv to i32
411*9880d681SAndroid Build Coastguard Worker  store i32 %2, i32* %arrayidx, align 4
412*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %1, i64 %indvars.iv
413*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %arrayidx2, align 4
414*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %3, %sum.013
415*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
416*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
417*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
418*9880d681SAndroid Build Coastguard Worker}
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Worker; void unsafe_unscaled_Read_Write(int *A) {
421*9880d681SAndroid Build Coastguard Worker;   int *B = (int *)((char *)A + 11);
422*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=2)
423*9880d681SAndroid Build Coastguard Worker;     B[i] = A[i] + 1;
424*9880d681SAndroid Build Coastguard Worker; }
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Worker; CHECK: function 'unsafe_unscaled_Read_Write':
427*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
428*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Report: unsafe dependent memory operations in loop
429*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
430*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:       Backward:
431*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           %2 = load i32, i32* %arrayidx, align 4 ->
432*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %add, i32* %arrayidx2, align 4
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_unscaled_Read_Write(i32* nocapture %A) {
435*9880d681SAndroid Build Coastguard Workerentry:
436*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i32* %A to i8*
437*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %0, i64 11
438*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i8* %add.ptr to i32*
439*9880d681SAndroid Build Coastguard Worker  br label %for.body
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
442*9880d681SAndroid Build Coastguard Worker  ret void
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
445*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
446*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
447*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %arrayidx, align 4
448*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %2, 1
449*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %1, i64 %indvars.iv
450*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* %arrayidx2, align 4
451*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
452*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
453*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
454*9880d681SAndroid Build Coastguard Worker}
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Worker; CHECK: function 'unsafe_unscaled_Read_Write2':
457*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
458*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Report: unsafe dependent memory operations in loop
459*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
460*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:       Backward:
461*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           %2 = load i32, i32* %arrayidx, align 4 ->
462*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %add, i32* %arrayidx2, align 4
463*9880d681SAndroid Build Coastguard Worker
464*9880d681SAndroid Build Coastguard Worker; void unsafe_unscaled_Read_Write2(int *A) {
465*9880d681SAndroid Build Coastguard Worker;   int *B = (int *)((char *)A + 1);
466*9880d681SAndroid Build Coastguard Worker;   for (unsigned i = 0; i < 1024; i+=2)
467*9880d681SAndroid Build Coastguard Worker;     B[i] = A[i] + 1;
468*9880d681SAndroid Build Coastguard Worker; }
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Workerdefine void @unsafe_unscaled_Read_Write2(i32* nocapture %A) {
471*9880d681SAndroid Build Coastguard Workerentry:
472*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i32* %A to i8*
473*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %0, i64 1
474*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i8* %add.ptr to i32*
475*9880d681SAndroid Build Coastguard Worker  br label %for.body
476*9880d681SAndroid Build Coastguard Worker
477*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
478*9880d681SAndroid Build Coastguard Worker  ret void
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
481*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
482*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %A, i64 %indvars.iv
483*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %arrayidx, align 4
484*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %2, 1
485*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %1, i64 %indvars.iv
486*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* %arrayidx2, align 4
487*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
488*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ult i64 %indvars.iv.next, 1024
489*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
490*9880d681SAndroid Build Coastguard Worker}
491*9880d681SAndroid Build Coastguard Worker
492*9880d681SAndroid Build Coastguard Worker; Following case checks that interleaved stores have dependences with another
493*9880d681SAndroid Build Coastguard Worker; store and can not pass dependence check.
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard Worker; void interleaved_stores(int *A) {
496*9880d681SAndroid Build Coastguard Worker;   int *B = (int *) ((char *)A + 1);
497*9880d681SAndroid Build Coastguard Worker;   for(int i = 0; i < 1024; i+=2) {
498*9880d681SAndroid Build Coastguard Worker;     B[i]   = i;                // (1)
499*9880d681SAndroid Build Coastguard Worker;     A[i+1] = i + 1;            // (2)
500*9880d681SAndroid Build Coastguard Worker;     B[i+1] = i + 1;            // (3)
501*9880d681SAndroid Build Coastguard Worker;   }
502*9880d681SAndroid Build Coastguard Worker; }
503*9880d681SAndroid Build Coastguard Worker;
504*9880d681SAndroid Build Coastguard Worker; The access (2) has overlaps with (1) and (3).
505*9880d681SAndroid Build Coastguard Worker
506*9880d681SAndroid Build Coastguard Worker; CHECK: function 'interleaved_stores':
507*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   for.body:
508*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Report: unsafe dependent memory operations in loop
509*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:     Dependences:
510*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:       Backward:
511*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %4, i32* %arrayidx5, align 4 ->
512*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %4, i32* %arrayidx9, align 4
513*9880d681SAndroid Build Coastguard Worker; CHECK:       Backward:
514*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %2, i32* %arrayidx2, align 4 ->
515*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:           store i32 %4, i32* %arrayidx5, align 4
516*9880d681SAndroid Build Coastguard Worker
517*9880d681SAndroid Build Coastguard Workerdefine void @interleaved_stores(i32* nocapture %A) {
518*9880d681SAndroid Build Coastguard Workerentry:
519*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i32* %A to i8*
520*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i8, i8* %0, i64 1
521*9880d681SAndroid Build Coastguard Worker  %1 = bitcast i8* %incdec.ptr to i32*
522*9880d681SAndroid Build Coastguard Worker  br label %for.body
523*9880d681SAndroid Build Coastguard Worker
524*9880d681SAndroid Build Coastguard Workerfor.cond.cleanup:                                 ; preds = %for.body
525*9880d681SAndroid Build Coastguard Worker  ret void
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
528*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
529*9880d681SAndroid Build Coastguard Worker  %2 = trunc i64 %indvars.iv to i32
530*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds i32, i32* %1, i64 %indvars.iv
531*9880d681SAndroid Build Coastguard Worker  store i32 %2, i32* %arrayidx2, align 4
532*9880d681SAndroid Build Coastguard Worker  %3 = or i64 %indvars.iv, 1
533*9880d681SAndroid Build Coastguard Worker  %arrayidx5 = getelementptr inbounds i32, i32* %A, i64 %3
534*9880d681SAndroid Build Coastguard Worker  %4 = trunc i64 %3 to i32
535*9880d681SAndroid Build Coastguard Worker  store i32 %4, i32* %arrayidx5, align 4
536*9880d681SAndroid Build Coastguard Worker  %arrayidx9 = getelementptr inbounds i32, i32* %1, i64 %3
537*9880d681SAndroid Build Coastguard Worker  store i32 %4, i32* %arrayidx9, align 4
538*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 2
539*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i64 %indvars.iv.next, 1024
540*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.cond.cleanup
541*9880d681SAndroid Build Coastguard Worker}
542