xref: /aosp_15_r20/external/llvm/test/Transforms/LoopReroll/basic.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -loop-reroll -S | FileCheck %s
2*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"
3*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; int foo(int a);
6*9880d681SAndroid Build Coastguard Worker; void bar(int *x) {
7*9880d681SAndroid Build Coastguard Worker;   for (int i = 0; i < 500; i += 3) {
8*9880d681SAndroid Build Coastguard Worker;     foo(i);
9*9880d681SAndroid Build Coastguard Worker;     foo(i+1);
10*9880d681SAndroid Build Coastguard Worker;     foo(i+2);
11*9880d681SAndroid Build Coastguard Worker;   }
12*9880d681SAndroid Build Coastguard Worker; }
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable
15*9880d681SAndroid Build Coastguard Workerdefine void @bar(i32* nocapture readnone %x) #0 {
16*9880d681SAndroid Build Coastguard Workerentry:
17*9880d681SAndroid Build Coastguard Worker  br label %for.body
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
20*9880d681SAndroid Build Coastguard Worker  %i.08 = phi i32 [ 0, %entry ], [ %add3, %for.body ]
21*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @foo(i32 %i.08) #1
22*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %i.08, 1
23*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 @foo(i32 %add) #1
24*9880d681SAndroid Build Coastguard Worker  %add2 = add nsw i32 %i.08, 2
25*9880d681SAndroid Build Coastguard Worker  %call3 = tail call i32 @foo(i32 %add2) #1
26*9880d681SAndroid Build Coastguard Worker  %add3 = add nsw i32 %i.08, 3
27*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp sge i32 %add3, 500
28*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
33*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar = phi i32 [ %indvar.next, %for.body ], [ 0, %entry ]
34*9880d681SAndroid Build Coastguard Worker; CHECK: %call = tail call i32 @foo(i32 %indvar) #1
35*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar.next = add i32 %indvar, 1
36*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond1 = icmp eq i32 %indvar, 500
37*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond1, label %for.end, label %for.body
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK: ret
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
42*9880d681SAndroid Build Coastguard Worker  ret void
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerdeclare i32 @foo(i32)
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker; void hi1(int *x) {
48*9880d681SAndroid Build Coastguard Worker;   for (int i = 0; i < 1500; i += 3) {
49*9880d681SAndroid Build Coastguard Worker;     x[i] = foo(0);
50*9880d681SAndroid Build Coastguard Worker;     x[i+1] = foo(0);
51*9880d681SAndroid Build Coastguard Worker;     x[i+2] = foo(0);
52*9880d681SAndroid Build Coastguard Worker;   }
53*9880d681SAndroid Build Coastguard Worker; }
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable
56*9880d681SAndroid Build Coastguard Workerdefine void @hi1(i32* nocapture %x) #0 {
57*9880d681SAndroid Build Coastguard Workerentry:
58*9880d681SAndroid Build Coastguard Worker  br label %for.body
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
61*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
62*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @foo(i32 0) #1
63*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvars.iv
64*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx, align 4
65*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 @foo(i32 0) #1
66*9880d681SAndroid Build Coastguard Worker  %0 = add nsw i64 %indvars.iv, 1
67*9880d681SAndroid Build Coastguard Worker  %arrayidx3 = getelementptr inbounds i32, i32* %x, i64 %0
68*9880d681SAndroid Build Coastguard Worker  store i32 %call1, i32* %arrayidx3, align 4
69*9880d681SAndroid Build Coastguard Worker  %call4 = tail call i32 @foo(i32 0) #1
70*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i64 %indvars.iv, 2
71*9880d681SAndroid Build Coastguard Worker  %arrayidx7 = getelementptr inbounds i32, i32* %x, i64 %1
72*9880d681SAndroid Build Coastguard Worker  store i32 %call4, i32* %arrayidx7, align 4
73*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 3
74*9880d681SAndroid Build Coastguard Worker  %2 = trunc i64 %indvars.iv.next to i32
75*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %2, 1500
76*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.end
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @hi1
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
81*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar = phi i64 [ %indvar.next, %for.body ], [ 0, %entry ]
82*9880d681SAndroid Build Coastguard Worker; CHECK: %call = tail call i32 @foo(i32 0) #1
83*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvar
84*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %call, i32* %arrayidx, align 4
85*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar.next = add i64 %indvar, 1
86*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i64 %indvar, 1499
87*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.end, label %for.body
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Worker; CHECK: ret
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
92*9880d681SAndroid Build Coastguard Worker  ret void
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker; void hi2(int *x) {
96*9880d681SAndroid Build Coastguard Worker;   for (int i = 0; i < 500; ++i) {
97*9880d681SAndroid Build Coastguard Worker;     x[3*i] = foo(0);
98*9880d681SAndroid Build Coastguard Worker;     x[3*i+1] = foo(0);
99*9880d681SAndroid Build Coastguard Worker;     x[3*i+2] = foo(0);
100*9880d681SAndroid Build Coastguard Worker;   }
101*9880d681SAndroid Build Coastguard Worker; }
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable
104*9880d681SAndroid Build Coastguard Workerdefine void @hi2(i32* nocapture %x) #0 {
105*9880d681SAndroid Build Coastguard Workerentry:
106*9880d681SAndroid Build Coastguard Worker  br label %for.body
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
109*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
110*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @foo(i32 0) #1
111*9880d681SAndroid Build Coastguard Worker  %0 = mul nsw i64 %indvars.iv, 3
112*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %x, i64 %0
113*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx, align 4
114*9880d681SAndroid Build Coastguard Worker  %call1 = tail call i32 @foo(i32 0) #1
115*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i64 %0, 1
116*9880d681SAndroid Build Coastguard Worker  %arrayidx4 = getelementptr inbounds i32, i32* %x, i64 %1
117*9880d681SAndroid Build Coastguard Worker  store i32 %call1, i32* %arrayidx4, align 4
118*9880d681SAndroid Build Coastguard Worker  %call5 = tail call i32 @foo(i32 0) #1
119*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i64 %0, 2
120*9880d681SAndroid Build Coastguard Worker  %arrayidx9 = getelementptr inbounds i32, i32* %x, i64 %2
121*9880d681SAndroid Build Coastguard Worker  store i32 %call5, i32* %arrayidx9, align 4
122*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
123*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %indvars.iv.next, 500
124*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @hi2
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
129*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
130*9880d681SAndroid Build Coastguard Worker; CHECK: %call = tail call i32 @foo(i32 0) #1
131*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvars.iv
132*9880d681SAndroid Build Coastguard Worker; CHECK: store i32 %call, i32* %arrayidx, align 4
133*9880d681SAndroid Build Coastguard Worker; CHECK: %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
134*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond1 = icmp eq i64 %indvars.iv, 1499
135*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond1, label %for.end, label %for.body
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Worker; CHECK: ret
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
140*9880d681SAndroid Build Coastguard Worker  ret void
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker; void goo(float alpha, float *a, float *b) {
144*9880d681SAndroid Build Coastguard Worker;   for (int i = 0; i < 3200; i += 5) {
145*9880d681SAndroid Build Coastguard Worker;     a[i] += alpha * b[i];
146*9880d681SAndroid Build Coastguard Worker;     a[i + 1] += alpha * b[i + 1];
147*9880d681SAndroid Build Coastguard Worker;     a[i + 2] += alpha * b[i + 2];
148*9880d681SAndroid Build Coastguard Worker;     a[i + 3] += alpha * b[i + 3];
149*9880d681SAndroid Build Coastguard Worker;     a[i + 4] += alpha * b[i + 4];
150*9880d681SAndroid Build Coastguard Worker;   }
151*9880d681SAndroid Build Coastguard Worker; }
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable
154*9880d681SAndroid Build Coastguard Workerdefine void @goo(float %alpha, float* nocapture %a, float* nocapture readonly %b) #0 {
155*9880d681SAndroid Build Coastguard Workerentry:
156*9880d681SAndroid Build Coastguard Worker  br label %for.body
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
159*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
160*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds float, float* %b, i64 %indvars.iv
161*9880d681SAndroid Build Coastguard Worker  %0 = load float, float* %arrayidx, align 4
162*9880d681SAndroid Build Coastguard Worker  %mul = fmul float %0, %alpha
163*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds float, float* %a, i64 %indvars.iv
164*9880d681SAndroid Build Coastguard Worker  %1 = load float, float* %arrayidx2, align 4
165*9880d681SAndroid Build Coastguard Worker  %add = fadd float %1, %mul
166*9880d681SAndroid Build Coastguard Worker  store float %add, float* %arrayidx2, align 4
167*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i64 %indvars.iv, 1
168*9880d681SAndroid Build Coastguard Worker  %arrayidx5 = getelementptr inbounds float, float* %b, i64 %2
169*9880d681SAndroid Build Coastguard Worker  %3 = load float, float* %arrayidx5, align 4
170*9880d681SAndroid Build Coastguard Worker  %mul6 = fmul float %3, %alpha
171*9880d681SAndroid Build Coastguard Worker  %arrayidx9 = getelementptr inbounds float, float* %a, i64 %2
172*9880d681SAndroid Build Coastguard Worker  %4 = load float, float* %arrayidx9, align 4
173*9880d681SAndroid Build Coastguard Worker  %add10 = fadd float %4, %mul6
174*9880d681SAndroid Build Coastguard Worker  store float %add10, float* %arrayidx9, align 4
175*9880d681SAndroid Build Coastguard Worker  %5 = add nsw i64 %indvars.iv, 2
176*9880d681SAndroid Build Coastguard Worker  %arrayidx13 = getelementptr inbounds float, float* %b, i64 %5
177*9880d681SAndroid Build Coastguard Worker  %6 = load float, float* %arrayidx13, align 4
178*9880d681SAndroid Build Coastguard Worker  %mul14 = fmul float %6, %alpha
179*9880d681SAndroid Build Coastguard Worker  %arrayidx17 = getelementptr inbounds float, float* %a, i64 %5
180*9880d681SAndroid Build Coastguard Worker  %7 = load float, float* %arrayidx17, align 4
181*9880d681SAndroid Build Coastguard Worker  %add18 = fadd float %7, %mul14
182*9880d681SAndroid Build Coastguard Worker  store float %add18, float* %arrayidx17, align 4
183*9880d681SAndroid Build Coastguard Worker  %8 = add nsw i64 %indvars.iv, 3
184*9880d681SAndroid Build Coastguard Worker  %arrayidx21 = getelementptr inbounds float, float* %b, i64 %8
185*9880d681SAndroid Build Coastguard Worker  %9 = load float, float* %arrayidx21, align 4
186*9880d681SAndroid Build Coastguard Worker  %mul22 = fmul float %9, %alpha
187*9880d681SAndroid Build Coastguard Worker  %arrayidx25 = getelementptr inbounds float, float* %a, i64 %8
188*9880d681SAndroid Build Coastguard Worker  %10 = load float, float* %arrayidx25, align 4
189*9880d681SAndroid Build Coastguard Worker  %add26 = fadd float %10, %mul22
190*9880d681SAndroid Build Coastguard Worker  store float %add26, float* %arrayidx25, align 4
191*9880d681SAndroid Build Coastguard Worker  %11 = add nsw i64 %indvars.iv, 4
192*9880d681SAndroid Build Coastguard Worker  %arrayidx29 = getelementptr inbounds float, float* %b, i64 %11
193*9880d681SAndroid Build Coastguard Worker  %12 = load float, float* %arrayidx29, align 4
194*9880d681SAndroid Build Coastguard Worker  %mul30 = fmul float %12, %alpha
195*9880d681SAndroid Build Coastguard Worker  %arrayidx33 = getelementptr inbounds float, float* %a, i64 %11
196*9880d681SAndroid Build Coastguard Worker  %13 = load float, float* %arrayidx33, align 4
197*9880d681SAndroid Build Coastguard Worker  %add34 = fadd float %13, %mul30
198*9880d681SAndroid Build Coastguard Worker  store float %add34, float* %arrayidx33, align 4
199*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 5
200*9880d681SAndroid Build Coastguard Worker  %14 = trunc i64 %indvars.iv.next to i32
201*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %14, 3200
202*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.end
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @goo
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
207*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar = phi i64 [ %indvar.next, %for.body ], [ 0, %entry ]
208*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds float, float* %b, i64 %indvar
209*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = load float, float* %arrayidx, align 4
210*9880d681SAndroid Build Coastguard Worker; CHECK: %mul = fmul float %0, %alpha
211*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx2 = getelementptr inbounds float, float* %a, i64 %indvar
212*9880d681SAndroid Build Coastguard Worker; CHECK: %1 = load float, float* %arrayidx2, align 4
213*9880d681SAndroid Build Coastguard Worker; CHECK: %add = fadd float %1, %mul
214*9880d681SAndroid Build Coastguard Worker; CHECK: store float %add, float* %arrayidx2, align 4
215*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar.next = add i64 %indvar, 1
216*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i64 %indvar, 3199
217*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.end, label %for.body
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker; CHECK: ret
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
222*9880d681SAndroid Build Coastguard Worker  ret void
223*9880d681SAndroid Build Coastguard Worker}
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker; void hoo(float alpha, float *a, float *b, int *ip) {
226*9880d681SAndroid Build Coastguard Worker;   for (int i = 0; i < 3200; i += 5) {
227*9880d681SAndroid Build Coastguard Worker;     a[i] += alpha * b[ip[i]];
228*9880d681SAndroid Build Coastguard Worker;     a[i + 1] += alpha * b[ip[i + 1]];
229*9880d681SAndroid Build Coastguard Worker;     a[i + 2] += alpha * b[ip[i + 2]];
230*9880d681SAndroid Build Coastguard Worker;     a[i + 3] += alpha * b[ip[i + 3]];
231*9880d681SAndroid Build Coastguard Worker;     a[i + 4] += alpha * b[ip[i + 4]];
232*9880d681SAndroid Build Coastguard Worker;   }
233*9880d681SAndroid Build Coastguard Worker; }
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable
236*9880d681SAndroid Build Coastguard Workerdefine void @hoo(float %alpha, float* nocapture %a, float* nocapture readonly %b, i32* nocapture readonly %ip) #0 {
237*9880d681SAndroid Build Coastguard Workerentry:
238*9880d681SAndroid Build Coastguard Worker  br label %for.body
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %entry, %for.body
241*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
242*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %ip, i64 %indvars.iv
243*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
244*9880d681SAndroid Build Coastguard Worker  %idxprom1 = sext i32 %0 to i64
245*9880d681SAndroid Build Coastguard Worker  %arrayidx2 = getelementptr inbounds float, float* %b, i64 %idxprom1
246*9880d681SAndroid Build Coastguard Worker  %1 = load float, float* %arrayidx2, align 4
247*9880d681SAndroid Build Coastguard Worker  %mul = fmul float %1, %alpha
248*9880d681SAndroid Build Coastguard Worker  %arrayidx4 = getelementptr inbounds float, float* %a, i64 %indvars.iv
249*9880d681SAndroid Build Coastguard Worker  %2 = load float, float* %arrayidx4, align 4
250*9880d681SAndroid Build Coastguard Worker  %add = fadd float %2, %mul
251*9880d681SAndroid Build Coastguard Worker  store float %add, float* %arrayidx4, align 4
252*9880d681SAndroid Build Coastguard Worker  %3 = add nsw i64 %indvars.iv, 1
253*9880d681SAndroid Build Coastguard Worker  %arrayidx7 = getelementptr inbounds i32, i32* %ip, i64 %3
254*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* %arrayidx7, align 4
255*9880d681SAndroid Build Coastguard Worker  %idxprom8 = sext i32 %4 to i64
256*9880d681SAndroid Build Coastguard Worker  %arrayidx9 = getelementptr inbounds float, float* %b, i64 %idxprom8
257*9880d681SAndroid Build Coastguard Worker  %5 = load float, float* %arrayidx9, align 4
258*9880d681SAndroid Build Coastguard Worker  %mul10 = fmul float %5, %alpha
259*9880d681SAndroid Build Coastguard Worker  %arrayidx13 = getelementptr inbounds float, float* %a, i64 %3
260*9880d681SAndroid Build Coastguard Worker  %6 = load float, float* %arrayidx13, align 4
261*9880d681SAndroid Build Coastguard Worker  %add14 = fadd float %6, %mul10
262*9880d681SAndroid Build Coastguard Worker  store float %add14, float* %arrayidx13, align 4
263*9880d681SAndroid Build Coastguard Worker  %7 = add nsw i64 %indvars.iv, 2
264*9880d681SAndroid Build Coastguard Worker  %arrayidx17 = getelementptr inbounds i32, i32* %ip, i64 %7
265*9880d681SAndroid Build Coastguard Worker  %8 = load i32, i32* %arrayidx17, align 4
266*9880d681SAndroid Build Coastguard Worker  %idxprom18 = sext i32 %8 to i64
267*9880d681SAndroid Build Coastguard Worker  %arrayidx19 = getelementptr inbounds float, float* %b, i64 %idxprom18
268*9880d681SAndroid Build Coastguard Worker  %9 = load float, float* %arrayidx19, align 4
269*9880d681SAndroid Build Coastguard Worker  %mul20 = fmul float %9, %alpha
270*9880d681SAndroid Build Coastguard Worker  %arrayidx23 = getelementptr inbounds float, float* %a, i64 %7
271*9880d681SAndroid Build Coastguard Worker  %10 = load float, float* %arrayidx23, align 4
272*9880d681SAndroid Build Coastguard Worker  %add24 = fadd float %10, %mul20
273*9880d681SAndroid Build Coastguard Worker  store float %add24, float* %arrayidx23, align 4
274*9880d681SAndroid Build Coastguard Worker  %11 = add nsw i64 %indvars.iv, 3
275*9880d681SAndroid Build Coastguard Worker  %arrayidx27 = getelementptr inbounds i32, i32* %ip, i64 %11
276*9880d681SAndroid Build Coastguard Worker  %12 = load i32, i32* %arrayidx27, align 4
277*9880d681SAndroid Build Coastguard Worker  %idxprom28 = sext i32 %12 to i64
278*9880d681SAndroid Build Coastguard Worker  %arrayidx29 = getelementptr inbounds float, float* %b, i64 %idxprom28
279*9880d681SAndroid Build Coastguard Worker  %13 = load float, float* %arrayidx29, align 4
280*9880d681SAndroid Build Coastguard Worker  %mul30 = fmul float %13, %alpha
281*9880d681SAndroid Build Coastguard Worker  %arrayidx33 = getelementptr inbounds float, float* %a, i64 %11
282*9880d681SAndroid Build Coastguard Worker  %14 = load float, float* %arrayidx33, align 4
283*9880d681SAndroid Build Coastguard Worker  %add34 = fadd float %14, %mul30
284*9880d681SAndroid Build Coastguard Worker  store float %add34, float* %arrayidx33, align 4
285*9880d681SAndroid Build Coastguard Worker  %15 = add nsw i64 %indvars.iv, 4
286*9880d681SAndroid Build Coastguard Worker  %arrayidx37 = getelementptr inbounds i32, i32* %ip, i64 %15
287*9880d681SAndroid Build Coastguard Worker  %16 = load i32, i32* %arrayidx37, align 4
288*9880d681SAndroid Build Coastguard Worker  %idxprom38 = sext i32 %16 to i64
289*9880d681SAndroid Build Coastguard Worker  %arrayidx39 = getelementptr inbounds float, float* %b, i64 %idxprom38
290*9880d681SAndroid Build Coastguard Worker  %17 = load float, float* %arrayidx39, align 4
291*9880d681SAndroid Build Coastguard Worker  %mul40 = fmul float %17, %alpha
292*9880d681SAndroid Build Coastguard Worker  %arrayidx43 = getelementptr inbounds float, float* %a, i64 %15
293*9880d681SAndroid Build Coastguard Worker  %18 = load float, float* %arrayidx43, align 4
294*9880d681SAndroid Build Coastguard Worker  %add44 = fadd float %18, %mul40
295*9880d681SAndroid Build Coastguard Worker  store float %add44, float* %arrayidx43, align 4
296*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 5
297*9880d681SAndroid Build Coastguard Worker  %19 = trunc i64 %indvars.iv.next to i32
298*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %19, 3200
299*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.body, label %for.end
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @hoo
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
304*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar = phi i64 [ %indvar.next, %for.body ], [ 0, %entry ]
305*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx = getelementptr inbounds i32, i32* %ip, i64 %indvar
306*9880d681SAndroid Build Coastguard Worker; CHECK: %0 = load i32, i32* %arrayidx, align 4
307*9880d681SAndroid Build Coastguard Worker; CHECK: %idxprom1 = sext i32 %0 to i64
308*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx2 = getelementptr inbounds float, float* %b, i64 %idxprom1
309*9880d681SAndroid Build Coastguard Worker; CHECK: %1 = load float, float* %arrayidx2, align 4
310*9880d681SAndroid Build Coastguard Worker; CHECK: %mul = fmul float %1, %alpha
311*9880d681SAndroid Build Coastguard Worker; CHECK: %arrayidx4 = getelementptr inbounds float, float* %a, i64 %indvar
312*9880d681SAndroid Build Coastguard Worker; CHECK: %2 = load float, float* %arrayidx4, align 4
313*9880d681SAndroid Build Coastguard Worker; CHECK: %add = fadd float %2, %mul
314*9880d681SAndroid Build Coastguard Worker; CHECK: store float %add, float* %arrayidx4, align 4
315*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar.next = add i64 %indvar, 1
316*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond = icmp eq i64 %indvar, 3199
317*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond, label %for.end, label %for.body
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker; CHECK: ret
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
322*9880d681SAndroid Build Coastguard Worker  ret void
323*9880d681SAndroid Build Coastguard Worker}
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Worker; void multi1(int *x) {
326*9880d681SAndroid Build Coastguard Worker;   y = foo(0)
327*9880d681SAndroid Build Coastguard Worker;   for (int i = 0; i < 500; ++i) {
328*9880d681SAndroid Build Coastguard Worker;     x[3*i] = y;
329*9880d681SAndroid Build Coastguard Worker;     x[3*i+1] = y;
330*9880d681SAndroid Build Coastguard Worker;     x[3*i+2] = y;
331*9880d681SAndroid Build Coastguard Worker;     x[3*i+6] = y;
332*9880d681SAndroid Build Coastguard Worker;     x[3*i+7] = y;
333*9880d681SAndroid Build Coastguard Worker;     x[3*i+8] = y;
334*9880d681SAndroid Build Coastguard Worker;   }
335*9880d681SAndroid Build Coastguard Worker; }
336*9880d681SAndroid Build Coastguard Worker
337*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable
338*9880d681SAndroid Build Coastguard Workerdefine void @multi1(i32* nocapture %x) #0 {
339*9880d681SAndroid Build Coastguard Workerentry:
340*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @foo(i32 0) #1
341*9880d681SAndroid Build Coastguard Worker  br label %for.body
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
344*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
345*9880d681SAndroid Build Coastguard Worker  %0 = mul nsw i64 %indvars.iv, 3
346*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %x, i64 %0
347*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx, align 4
348*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i64 %0, 1
349*9880d681SAndroid Build Coastguard Worker  %arrayidx4 = getelementptr inbounds i32, i32* %x, i64 %1
350*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx4, align 4
351*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i64 %0, 2
352*9880d681SAndroid Build Coastguard Worker  %arrayidx9 = getelementptr inbounds i32, i32* %x, i64 %2
353*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx9, align 4
354*9880d681SAndroid Build Coastguard Worker  %3 = add nsw i64 %0, 6
355*9880d681SAndroid Build Coastguard Worker  %arrayidx6 = getelementptr inbounds i32, i32* %x, i64 %3
356*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx6, align 4
357*9880d681SAndroid Build Coastguard Worker  %4 = add nsw i64 %0, 7
358*9880d681SAndroid Build Coastguard Worker  %arrayidx7 = getelementptr inbounds i32, i32* %x, i64 %4
359*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx7, align 4
360*9880d681SAndroid Build Coastguard Worker  %5 = add nsw i64 %0, 8
361*9880d681SAndroid Build Coastguard Worker  %arrayidx8 = getelementptr inbounds i32, i32* %x, i64 %5
362*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx8, align 4
363*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
364*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %indvars.iv.next, 500
365*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @multi1
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Worker; CHECK:for.body:
370*9880d681SAndroid Build Coastguard Worker; CHECK:  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
371*9880d681SAndroid Build Coastguard Worker; CHECK:  %0 = add i64 %indvars.iv, 6
372*9880d681SAndroid Build Coastguard Worker; CHECK:  %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvars.iv
373*9880d681SAndroid Build Coastguard Worker; CHECK:  store i32 %call, i32* %arrayidx, align 4
374*9880d681SAndroid Build Coastguard Worker; CHECK:  %arrayidx6 = getelementptr inbounds i32, i32* %x, i64 %0
375*9880d681SAndroid Build Coastguard Worker; CHECK:  store i32 %call, i32* %arrayidx6, align 4
376*9880d681SAndroid Build Coastguard Worker; CHECK:  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
377*9880d681SAndroid Build Coastguard Worker; CHECK:  %exitcond2 = icmp eq i64 %0, 1505
378*9880d681SAndroid Build Coastguard Worker; CHECK:  br i1 %exitcond2, label %for.end, label %for.body
379*9880d681SAndroid Build Coastguard Worker
380*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
381*9880d681SAndroid Build Coastguard Worker  ret void
382*9880d681SAndroid Build Coastguard Worker}
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Worker; void multi2(int *x) {
385*9880d681SAndroid Build Coastguard Worker;   y = foo(0)
386*9880d681SAndroid Build Coastguard Worker;   for (int i = 0; i < 500; ++i) {
387*9880d681SAndroid Build Coastguard Worker;     x[3*i] = y;
388*9880d681SAndroid Build Coastguard Worker;     x[3*i+1] = y;
389*9880d681SAndroid Build Coastguard Worker;     x[3*i+2] = y;
390*9880d681SAndroid Build Coastguard Worker;     x[3*(i+1)] = y;
391*9880d681SAndroid Build Coastguard Worker;     x[3*(i+1)+1] = y;
392*9880d681SAndroid Build Coastguard Worker;     x[3*(i+1)+2] = y;
393*9880d681SAndroid Build Coastguard Worker;   }
394*9880d681SAndroid Build Coastguard Worker; }
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable
397*9880d681SAndroid Build Coastguard Workerdefine void @multi2(i32* nocapture %x) #0 {
398*9880d681SAndroid Build Coastguard Workerentry:
399*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @foo(i32 0) #1
400*9880d681SAndroid Build Coastguard Worker  br label %for.body
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
403*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
404*9880d681SAndroid Build Coastguard Worker  %0 = mul nsw i64 %indvars.iv, 3
405*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %indvars.iv, 1
406*9880d681SAndroid Build Coastguard Worker  %newmul = mul nsw i64 %add, 3
407*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %x, i64 %0
408*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx, align 4
409*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i64 %0, 1
410*9880d681SAndroid Build Coastguard Worker  %arrayidx4 = getelementptr inbounds i32, i32* %x, i64 %1
411*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx4, align 4
412*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i64 %0, 2
413*9880d681SAndroid Build Coastguard Worker  %arrayidx9 = getelementptr inbounds i32, i32* %x, i64 %2
414*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx9, align 4
415*9880d681SAndroid Build Coastguard Worker  %arrayidx6 = getelementptr inbounds i32, i32* %x, i64 %newmul
416*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx6, align 4
417*9880d681SAndroid Build Coastguard Worker  %3 = add nsw i64 %newmul, 1
418*9880d681SAndroid Build Coastguard Worker  %arrayidx7 = getelementptr inbounds i32, i32* %x, i64 %3
419*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx7, align 4
420*9880d681SAndroid Build Coastguard Worker  %4 = add nsw i64 %newmul, 2
421*9880d681SAndroid Build Coastguard Worker  %arrayidx8 = getelementptr inbounds i32, i32* %x, i64 %4
422*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx8, align 4
423*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
424*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %indvars.iv.next, 500
425*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @multi2
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard Worker; CHECK:for.body:
430*9880d681SAndroid Build Coastguard Worker; CHECK:  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
431*9880d681SAndroid Build Coastguard Worker; CHECK:  %0 = add i64 %indvars.iv, 3
432*9880d681SAndroid Build Coastguard Worker; CHECK:  %arrayidx = getelementptr inbounds i32, i32* %x, i64 %indvars.iv
433*9880d681SAndroid Build Coastguard Worker; CHECK:  store i32 %call, i32* %arrayidx, align 4
434*9880d681SAndroid Build Coastguard Worker; CHECK:  %arrayidx6 = getelementptr inbounds i32, i32* %x, i64 %0
435*9880d681SAndroid Build Coastguard Worker; CHECK:  store i32 %call, i32* %arrayidx6, align 4
436*9880d681SAndroid Build Coastguard Worker; CHECK:  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
437*9880d681SAndroid Build Coastguard Worker; CHECK:  %exitcond2 = icmp eq i64 %indvars.iv, 1499
438*9880d681SAndroid Build Coastguard Worker; CHECK:  br i1 %exitcond2, label %for.end, label %for.body
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
441*9880d681SAndroid Build Coastguard Worker  ret void
442*9880d681SAndroid Build Coastguard Worker}
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Worker; void multi3(int *x) {
445*9880d681SAndroid Build Coastguard Worker;   y = foo(0)
446*9880d681SAndroid Build Coastguard Worker;   for (int i = 0; i < 500; ++i) {
447*9880d681SAndroid Build Coastguard Worker;     // Note: No zero index
448*9880d681SAndroid Build Coastguard Worker;     x[3*i+3] = y;
449*9880d681SAndroid Build Coastguard Worker;     x[3*i+4] = y;
450*9880d681SAndroid Build Coastguard Worker;     x[3*i+5] = y;
451*9880d681SAndroid Build Coastguard Worker;   }
452*9880d681SAndroid Build Coastguard Worker; }
453*9880d681SAndroid Build Coastguard Worker
454*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable
455*9880d681SAndroid Build Coastguard Workerdefine void @multi3(i32* nocapture %x) #0 {
456*9880d681SAndroid Build Coastguard Workerentry:
457*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @foo(i32 0) #1
458*9880d681SAndroid Build Coastguard Worker  br label %for.body
459*9880d681SAndroid Build Coastguard Worker
460*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
461*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
462*9880d681SAndroid Build Coastguard Worker  %0 = mul nsw i64 %indvars.iv, 3
463*9880d681SAndroid Build Coastguard Worker  %x0 = add nsw i64 %0, 3
464*9880d681SAndroid Build Coastguard Worker  %add = add nsw i64 %indvars.iv, 1
465*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %x, i64 %x0
466*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx, align 4
467*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i64 %0, 4
468*9880d681SAndroid Build Coastguard Worker  %arrayidx4 = getelementptr inbounds i32, i32* %x, i64 %1
469*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx4, align 4
470*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i64 %0, 5
471*9880d681SAndroid Build Coastguard Worker  %arrayidx9 = getelementptr inbounds i32, i32* %x, i64 %2
472*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx9, align 4
473*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
474*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %indvars.iv.next, 500
475*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
476*9880d681SAndroid Build Coastguard Worker
477*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @multi3
478*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
479*9880d681SAndroid Build Coastguard Worker; CHECK:   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
480*9880d681SAndroid Build Coastguard Worker; CHECK:   %0 = add i64 %indvars.iv, 3
481*9880d681SAndroid Build Coastguard Worker; CHECK:   %arrayidx = getelementptr inbounds i32, i32* %x, i64 %0
482*9880d681SAndroid Build Coastguard Worker; CHECK:   store i32 %call, i32* %arrayidx, align 4
483*9880d681SAndroid Build Coastguard Worker; CHECK:   %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
484*9880d681SAndroid Build Coastguard Worker; CHECK:   %exitcond1 = icmp eq i64 %0, 1502
485*9880d681SAndroid Build Coastguard Worker; CHECK:   br i1 %exitcond1, label %for.end, label %for.body
486*9880d681SAndroid Build Coastguard Worker
487*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
488*9880d681SAndroid Build Coastguard Worker  ret void
489*9880d681SAndroid Build Coastguard Worker}
490*9880d681SAndroid Build Coastguard Worker
491*9880d681SAndroid Build Coastguard Worker; int foo(int a);
492*9880d681SAndroid Build Coastguard Worker; void bar2(int *x, int y, int z) {
493*9880d681SAndroid Build Coastguard Worker;   for (int i = 0; i < 500; i += 3) {
494*9880d681SAndroid Build Coastguard Worker;     foo(i+y+i*z); // Slightly reordered instruction order
495*9880d681SAndroid Build Coastguard Worker;     foo(i+1+y+(i+1)*z);
496*9880d681SAndroid Build Coastguard Worker;     foo(i+2+y+(i+2)*z);
497*9880d681SAndroid Build Coastguard Worker;   }
498*9880d681SAndroid Build Coastguard Worker; }
499*9880d681SAndroid Build Coastguard Worker
500*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable
501*9880d681SAndroid Build Coastguard Workerdefine void @bar2(i32* nocapture readnone %x, i32 %y, i32 %z) #0 {
502*9880d681SAndroid Build Coastguard Workerentry:
503*9880d681SAndroid Build Coastguard Worker  br label %for.body
504*9880d681SAndroid Build Coastguard Worker
505*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
506*9880d681SAndroid Build Coastguard Worker  %i.08 = phi i32 [ 0, %entry ], [ %add3, %for.body ]
507*9880d681SAndroid Build Coastguard Worker
508*9880d681SAndroid Build Coastguard Worker  %tmp1 = add i32 %i.08, %y
509*9880d681SAndroid Build Coastguard Worker  %tmp2 = mul i32 %i.08, %z
510*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i32 %tmp2, %tmp1
511*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @foo(i32 %tmp3) #1
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %i.08, 1
514*9880d681SAndroid Build Coastguard Worker  %tmp2a = mul i32 %add, %z
515*9880d681SAndroid Build Coastguard Worker  %tmp1a = add i32 %add, %y
516*9880d681SAndroid Build Coastguard Worker  %tmp3a = add i32 %tmp2a, %tmp1a
517*9880d681SAndroid Build Coastguard Worker  %calla = tail call i32 @foo(i32 %tmp3a) #1
518*9880d681SAndroid Build Coastguard Worker
519*9880d681SAndroid Build Coastguard Worker  %add2 = add nsw i32 %i.08, 2
520*9880d681SAndroid Build Coastguard Worker  %tmp2b = mul i32 %add2, %z
521*9880d681SAndroid Build Coastguard Worker  %tmp1b = add i32 %add2, %y
522*9880d681SAndroid Build Coastguard Worker  %tmp3b = add i32 %tmp2b, %tmp1b
523*9880d681SAndroid Build Coastguard Worker  %callb = tail call i32 @foo(i32 %tmp3b) #1
524*9880d681SAndroid Build Coastguard Worker
525*9880d681SAndroid Build Coastguard Worker  %add3 = add nsw i32 %i.08, 3
526*9880d681SAndroid Build Coastguard Worker
527*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp sge i32 %add3, 500
528*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
529*9880d681SAndroid Build Coastguard Worker
530*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @bar2
531*9880d681SAndroid Build Coastguard Worker
532*9880d681SAndroid Build Coastguard Worker; CHECK: for.body:
533*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar = phi i32 [ %indvar.next, %for.body ], [ 0, %entry ]
534*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp1 = add i32 %indvar, %y
535*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp2 = mul i32 %indvar, %z
536*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp3 = add i32 %tmp2, %tmp1
537*9880d681SAndroid Build Coastguard Worker; CHECK: %call = tail call i32 @foo(i32 %tmp3) #1
538*9880d681SAndroid Build Coastguard Worker; CHECK: %indvar.next = add i32 %indvar, 1
539*9880d681SAndroid Build Coastguard Worker; CHECK: %exitcond1 = icmp eq i32 %indvar, 500
540*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %exitcond1, label %for.end, label %for.body
541*9880d681SAndroid Build Coastguard Worker
542*9880d681SAndroid Build Coastguard Worker; CHECK: ret
543*9880d681SAndroid Build Coastguard Worker
544*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
545*9880d681SAndroid Build Coastguard Worker  ret void
546*9880d681SAndroid Build Coastguard Worker}
547*9880d681SAndroid Build Coastguard Worker
548*9880d681SAndroid Build Coastguard Worker%struct.s = type { i32, i32 }
549*9880d681SAndroid Build Coastguard Worker
550*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind uwtable
551*9880d681SAndroid Build Coastguard Workerdefine void @gep1(%struct.s* nocapture %x) #0 {
552*9880d681SAndroid Build Coastguard Workerentry:
553*9880d681SAndroid Build Coastguard Worker  %call = tail call i32 @foo(i32 0) #1
554*9880d681SAndroid Build Coastguard Worker  br label %for.body
555*9880d681SAndroid Build Coastguard Worker
556*9880d681SAndroid Build Coastguard Workerfor.body:                                         ; preds = %for.body, %entry
557*9880d681SAndroid Build Coastguard Worker  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
558*9880d681SAndroid Build Coastguard Worker  %0 = mul nsw i64 %indvars.iv, 3
559*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds %struct.s, %struct.s* %x, i64 %0, i32 0
560*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx, align 4
561*9880d681SAndroid Build Coastguard Worker  %1 = add nsw i64 %0, 1
562*9880d681SAndroid Build Coastguard Worker  %arrayidx4 = getelementptr inbounds %struct.s, %struct.s* %x, i64 %1, i32 0
563*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx4, align 4
564*9880d681SAndroid Build Coastguard Worker  %2 = add nsw i64 %0, 2
565*9880d681SAndroid Build Coastguard Worker  %arrayidx9 = getelementptr inbounds %struct.s, %struct.s* %x, i64 %2, i32 0
566*9880d681SAndroid Build Coastguard Worker  store i32 %call, i32* %arrayidx9, align 4
567*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
568*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i64 %indvars.iv.next, 500
569*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %for.end, label %for.body
570*9880d681SAndroid Build Coastguard Worker
571*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @gep1
572*9880d681SAndroid Build Coastguard Worker; This test is a crash test only.
573*9880d681SAndroid Build Coastguard Worker; CHECK: ret
574*9880d681SAndroid Build Coastguard Workerfor.end:                                          ; preds = %for.body
575*9880d681SAndroid Build Coastguard Worker  ret void
576*9880d681SAndroid Build Coastguard Worker}
577*9880d681SAndroid Build Coastguard Worker
578*9880d681SAndroid Build Coastguard Worker
579*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind uwtable }
580*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind }
581*9880d681SAndroid Build Coastguard Worker
582