xref: /aosp_15_r20/external/llvm/test/CodeGen/X86/misched-balance.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core2 -pre-RA-sched=source -enable-misched -verify-machineinstrs | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; Verify that misched resource/latency balancy heuristics are sane.
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine void @unrolled_mmult1(i32* %tmp55, i32* %tmp56, i32* %pre, i32* %pre94,
6*9880d681SAndroid Build Coastguard Worker  i32* %pre95, i32* %pre96, i32* %pre97, i32* %pre98, i32* %pre99,
7*9880d681SAndroid Build Coastguard Worker i32* %pre100, i32* %pre101, i32* %pre102, i32* %pre103, i32* %pre104)
8*9880d681SAndroid Build Coastguard Worker  nounwind uwtable ssp {
9*9880d681SAndroid Build Coastguard Workerentry:
10*9880d681SAndroid Build Coastguard Worker  br label %for.body
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; imull folded loads should be in order and interleaved with addl, never
13*9880d681SAndroid Build Coastguard Worker; adjacent. Also check that we have no spilling.
14*9880d681SAndroid Build Coastguard Worker;
15*9880d681SAndroid Build Coastguard Worker; Since mmult1 IR is already in good order, this effectively ensure
16*9880d681SAndroid Build Coastguard Worker; the scheduler maintains source order.
17*9880d681SAndroid Build Coastguard Worker;
18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %for.body
19*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %rsp
20*9880d681SAndroid Build Coastguard Worker; CHECK: imull 4
21*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
22*9880d681SAndroid Build Coastguard Worker; CHECK: addl
23*9880d681SAndroid Build Coastguard Worker; CHECK: imull 8
24*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
25*9880d681SAndroid Build Coastguard Worker; CHECK: addl
26*9880d681SAndroid Build Coastguard Worker; CHECK: imull 12
27*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
28*9880d681SAndroid Build Coastguard Worker; CHECK: addl
29*9880d681SAndroid Build Coastguard Worker; CHECK: imull 16
30*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
31*9880d681SAndroid Build Coastguard Worker; CHECK: addl
32*9880d681SAndroid Build Coastguard Worker; CHECK: imull 20
33*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
34*9880d681SAndroid Build Coastguard Worker; CHECK: addl
35*9880d681SAndroid Build Coastguard Worker; CHECK: imull 24
36*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
37*9880d681SAndroid Build Coastguard Worker; CHECK: addl
38*9880d681SAndroid Build Coastguard Worker; CHECK: imull 28
39*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
40*9880d681SAndroid Build Coastguard Worker; CHECK: addl
41*9880d681SAndroid Build Coastguard Worker; CHECK: imull 32
42*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
43*9880d681SAndroid Build Coastguard Worker; CHECK: addl
44*9880d681SAndroid Build Coastguard Worker; CHECK: imull 36
45*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
46*9880d681SAndroid Build Coastguard Worker; CHECK: addl
47*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %end
49*9880d681SAndroid Build Coastguard Workerfor.body:
50*9880d681SAndroid Build Coastguard Worker  %indvars.iv42.i = phi i64 [ %indvars.iv.next43.i, %for.body ], [ 0, %entry ]
51*9880d681SAndroid Build Coastguard Worker  %tmp57 = load i32, i32* %tmp56, align 4
52*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61 = getelementptr inbounds i32, i32* %pre, i64 %indvars.iv42.i
53*9880d681SAndroid Build Coastguard Worker  %tmp58 = load i32, i32* %arrayidx12.us.i61, align 4
54*9880d681SAndroid Build Coastguard Worker  %mul.us.i = mul nsw i32 %tmp58, %tmp57
55*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.1 = getelementptr inbounds i32, i32* %tmp56, i64 1
56*9880d681SAndroid Build Coastguard Worker  %tmp59 = load i32, i32* %arrayidx8.us.i.1, align 4
57*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.1 = getelementptr inbounds i32, i32* %pre94, i64 %indvars.iv42.i
58*9880d681SAndroid Build Coastguard Worker  %tmp60 = load i32, i32* %arrayidx12.us.i61.1, align 4
59*9880d681SAndroid Build Coastguard Worker  %mul.us.i.1 = mul nsw i32 %tmp60, %tmp59
60*9880d681SAndroid Build Coastguard Worker  %add.us.i.1 = add nsw i32 %mul.us.i.1, %mul.us.i
61*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.2 = getelementptr inbounds i32, i32* %tmp56, i64 2
62*9880d681SAndroid Build Coastguard Worker  %tmp61 = load i32, i32* %arrayidx8.us.i.2, align 4
63*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.2 = getelementptr inbounds i32, i32* %pre95, i64 %indvars.iv42.i
64*9880d681SAndroid Build Coastguard Worker  %tmp62 = load i32, i32* %arrayidx12.us.i61.2, align 4
65*9880d681SAndroid Build Coastguard Worker  %mul.us.i.2 = mul nsw i32 %tmp62, %tmp61
66*9880d681SAndroid Build Coastguard Worker  %add.us.i.2 = add nsw i32 %mul.us.i.2, %add.us.i.1
67*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.3 = getelementptr inbounds i32, i32* %tmp56, i64 3
68*9880d681SAndroid Build Coastguard Worker  %tmp63 = load i32, i32* %arrayidx8.us.i.3, align 4
69*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.3 = getelementptr inbounds i32, i32* %pre96, i64 %indvars.iv42.i
70*9880d681SAndroid Build Coastguard Worker  %tmp64 = load i32, i32* %arrayidx12.us.i61.3, align 4
71*9880d681SAndroid Build Coastguard Worker  %mul.us.i.3 = mul nsw i32 %tmp64, %tmp63
72*9880d681SAndroid Build Coastguard Worker  %add.us.i.3 = add nsw i32 %mul.us.i.3, %add.us.i.2
73*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.4 = getelementptr inbounds i32, i32* %tmp56, i64 4
74*9880d681SAndroid Build Coastguard Worker  %tmp65 = load i32, i32* %arrayidx8.us.i.4, align 4
75*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.4 = getelementptr inbounds i32, i32* %pre97, i64 %indvars.iv42.i
76*9880d681SAndroid Build Coastguard Worker  %tmp66 = load i32, i32* %arrayidx12.us.i61.4, align 4
77*9880d681SAndroid Build Coastguard Worker  %mul.us.i.4 = mul nsw i32 %tmp66, %tmp65
78*9880d681SAndroid Build Coastguard Worker  %add.us.i.4 = add nsw i32 %mul.us.i.4, %add.us.i.3
79*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.5 = getelementptr inbounds i32, i32* %tmp56, i64 5
80*9880d681SAndroid Build Coastguard Worker  %tmp67 = load i32, i32* %arrayidx8.us.i.5, align 4
81*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.5 = getelementptr inbounds i32, i32* %pre98, i64 %indvars.iv42.i
82*9880d681SAndroid Build Coastguard Worker  %tmp68 = load i32, i32* %arrayidx12.us.i61.5, align 4
83*9880d681SAndroid Build Coastguard Worker  %mul.us.i.5 = mul nsw i32 %tmp68, %tmp67
84*9880d681SAndroid Build Coastguard Worker  %add.us.i.5 = add nsw i32 %mul.us.i.5, %add.us.i.4
85*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.6 = getelementptr inbounds i32, i32* %tmp56, i64 6
86*9880d681SAndroid Build Coastguard Worker  %tmp69 = load i32, i32* %arrayidx8.us.i.6, align 4
87*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.6 = getelementptr inbounds i32, i32* %pre99, i64 %indvars.iv42.i
88*9880d681SAndroid Build Coastguard Worker  %tmp70 = load i32, i32* %arrayidx12.us.i61.6, align 4
89*9880d681SAndroid Build Coastguard Worker  %mul.us.i.6 = mul nsw i32 %tmp70, %tmp69
90*9880d681SAndroid Build Coastguard Worker  %add.us.i.6 = add nsw i32 %mul.us.i.6, %add.us.i.5
91*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.7 = getelementptr inbounds i32, i32* %tmp56, i64 7
92*9880d681SAndroid Build Coastguard Worker  %tmp71 = load i32, i32* %arrayidx8.us.i.7, align 4
93*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.7 = getelementptr inbounds i32, i32* %pre100, i64 %indvars.iv42.i
94*9880d681SAndroid Build Coastguard Worker  %tmp72 = load i32, i32* %arrayidx12.us.i61.7, align 4
95*9880d681SAndroid Build Coastguard Worker  %mul.us.i.7 = mul nsw i32 %tmp72, %tmp71
96*9880d681SAndroid Build Coastguard Worker  %add.us.i.7 = add nsw i32 %mul.us.i.7, %add.us.i.6
97*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.8 = getelementptr inbounds i32, i32* %tmp56, i64 8
98*9880d681SAndroid Build Coastguard Worker  %tmp73 = load i32, i32* %arrayidx8.us.i.8, align 4
99*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.8 = getelementptr inbounds i32, i32* %pre101, i64 %indvars.iv42.i
100*9880d681SAndroid Build Coastguard Worker  %tmp74 = load i32, i32* %arrayidx12.us.i61.8, align 4
101*9880d681SAndroid Build Coastguard Worker  %mul.us.i.8 = mul nsw i32 %tmp74, %tmp73
102*9880d681SAndroid Build Coastguard Worker  %add.us.i.8 = add nsw i32 %mul.us.i.8, %add.us.i.7
103*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.9 = getelementptr inbounds i32, i32* %tmp56, i64 9
104*9880d681SAndroid Build Coastguard Worker  %tmp75 = load i32, i32* %arrayidx8.us.i.9, align 4
105*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.9 = getelementptr inbounds i32, i32* %pre102, i64 %indvars.iv42.i
106*9880d681SAndroid Build Coastguard Worker  %tmp76 = load i32, i32* %arrayidx12.us.i61.9, align 4
107*9880d681SAndroid Build Coastguard Worker  %mul.us.i.9 = mul nsw i32 %tmp76, %tmp75
108*9880d681SAndroid Build Coastguard Worker  %add.us.i.9 = add nsw i32 %mul.us.i.9, %add.us.i.8
109*9880d681SAndroid Build Coastguard Worker  %arrayidx16.us.i = getelementptr inbounds i32, i32* %tmp55, i64 %indvars.iv42.i
110*9880d681SAndroid Build Coastguard Worker  store i32 %add.us.i.9, i32* %arrayidx16.us.i, align 4
111*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next43.i = add i64 %indvars.iv42.i, 1
112*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next43.i to i32
113*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %lftr.wideiv, 10
114*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %end, label %for.body
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Workerend:
117*9880d681SAndroid Build Coastguard Worker  ret void
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker; Unlike the above loop, this IR starts out bad and must be
121*9880d681SAndroid Build Coastguard Worker; rescheduled.
122*9880d681SAndroid Build Coastguard Worker;
123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %for.body
124*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %rsp
125*9880d681SAndroid Build Coastguard Worker; CHECK: imull 4
126*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
127*9880d681SAndroid Build Coastguard Worker; CHECK: addl
128*9880d681SAndroid Build Coastguard Worker; CHECK: imull 8
129*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
130*9880d681SAndroid Build Coastguard Worker; CHECK: addl
131*9880d681SAndroid Build Coastguard Worker; CHECK: imull 12
132*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
133*9880d681SAndroid Build Coastguard Worker; CHECK: addl
134*9880d681SAndroid Build Coastguard Worker; CHECK: imull 16
135*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
136*9880d681SAndroid Build Coastguard Worker; CHECK: addl
137*9880d681SAndroid Build Coastguard Worker; CHECK: imull 20
138*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
139*9880d681SAndroid Build Coastguard Worker; CHECK: addl
140*9880d681SAndroid Build Coastguard Worker; CHECK: imull 24
141*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
142*9880d681SAndroid Build Coastguard Worker; CHECK: addl
143*9880d681SAndroid Build Coastguard Worker; CHECK: imull 28
144*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
145*9880d681SAndroid Build Coastguard Worker; CHECK: addl
146*9880d681SAndroid Build Coastguard Worker; CHECK: imull 32
147*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
148*9880d681SAndroid Build Coastguard Worker; CHECK: addl
149*9880d681SAndroid Build Coastguard Worker; CHECK: imull 36
150*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
151*9880d681SAndroid Build Coastguard Worker; CHECK: addl
152*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: {{imull|rsp}}
153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %end
154*9880d681SAndroid Build Coastguard Workerdefine void @unrolled_mmult2(i32* %tmp55, i32* %tmp56, i32* %pre, i32* %pre94,
155*9880d681SAndroid Build Coastguard Worker  i32* %pre95, i32* %pre96, i32* %pre97, i32* %pre98, i32* %pre99,
156*9880d681SAndroid Build Coastguard Worker  i32* %pre100, i32* %pre101, i32* %pre102, i32* %pre103, i32* %pre104)
157*9880d681SAndroid Build Coastguard Worker  nounwind uwtable ssp {
158*9880d681SAndroid Build Coastguard Workerentry:
159*9880d681SAndroid Build Coastguard Worker  br label %for.body
160*9880d681SAndroid Build Coastguard Workerfor.body:
161*9880d681SAndroid Build Coastguard Worker  %indvars.iv42.i = phi i64 [ %indvars.iv.next43.i, %for.body ], [ 0, %entry ]
162*9880d681SAndroid Build Coastguard Worker  %tmp57 = load i32, i32* %tmp56, align 4
163*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61 = getelementptr inbounds i32, i32* %pre, i64 %indvars.iv42.i
164*9880d681SAndroid Build Coastguard Worker  %tmp58 = load i32, i32* %arrayidx12.us.i61, align 4
165*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.1 = getelementptr inbounds i32, i32* %tmp56, i64 1
166*9880d681SAndroid Build Coastguard Worker  %tmp59 = load i32, i32* %arrayidx8.us.i.1, align 4
167*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.1 = getelementptr inbounds i32, i32* %pre94, i64 %indvars.iv42.i
168*9880d681SAndroid Build Coastguard Worker  %tmp60 = load i32, i32* %arrayidx12.us.i61.1, align 4
169*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.2 = getelementptr inbounds i32, i32* %tmp56, i64 2
170*9880d681SAndroid Build Coastguard Worker  %tmp61 = load i32, i32* %arrayidx8.us.i.2, align 4
171*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.2 = getelementptr inbounds i32, i32* %pre95, i64 %indvars.iv42.i
172*9880d681SAndroid Build Coastguard Worker  %tmp62 = load i32, i32* %arrayidx12.us.i61.2, align 4
173*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.3 = getelementptr inbounds i32, i32* %tmp56, i64 3
174*9880d681SAndroid Build Coastguard Worker  %tmp63 = load i32, i32* %arrayidx8.us.i.3, align 4
175*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.3 = getelementptr inbounds i32, i32* %pre96, i64 %indvars.iv42.i
176*9880d681SAndroid Build Coastguard Worker  %tmp64 = load i32, i32* %arrayidx12.us.i61.3, align 4
177*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.4 = getelementptr inbounds i32, i32* %tmp56, i64 4
178*9880d681SAndroid Build Coastguard Worker  %tmp65 = load i32, i32* %arrayidx8.us.i.4, align 4
179*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.4 = getelementptr inbounds i32, i32* %pre97, i64 %indvars.iv42.i
180*9880d681SAndroid Build Coastguard Worker  %tmp66 = load i32, i32* %arrayidx12.us.i61.4, align 4
181*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.5 = getelementptr inbounds i32, i32* %tmp56, i64 5
182*9880d681SAndroid Build Coastguard Worker  %tmp67 = load i32, i32* %arrayidx8.us.i.5, align 4
183*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.5 = getelementptr inbounds i32, i32* %pre98, i64 %indvars.iv42.i
184*9880d681SAndroid Build Coastguard Worker  %tmp68 = load i32, i32* %arrayidx12.us.i61.5, align 4
185*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.6 = getelementptr inbounds i32, i32* %tmp56, i64 6
186*9880d681SAndroid Build Coastguard Worker  %tmp69 = load i32, i32* %arrayidx8.us.i.6, align 4
187*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.6 = getelementptr inbounds i32, i32* %pre99, i64 %indvars.iv42.i
188*9880d681SAndroid Build Coastguard Worker  %tmp70 = load i32, i32* %arrayidx12.us.i61.6, align 4
189*9880d681SAndroid Build Coastguard Worker  %mul.us.i = mul nsw i32 %tmp58, %tmp57
190*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.7 = getelementptr inbounds i32, i32* %tmp56, i64 7
191*9880d681SAndroid Build Coastguard Worker  %tmp71 = load i32, i32* %arrayidx8.us.i.7, align 4
192*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.7 = getelementptr inbounds i32, i32* %pre100, i64 %indvars.iv42.i
193*9880d681SAndroid Build Coastguard Worker  %tmp72 = load i32, i32* %arrayidx12.us.i61.7, align 4
194*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.8 = getelementptr inbounds i32, i32* %tmp56, i64 8
195*9880d681SAndroid Build Coastguard Worker  %tmp73 = load i32, i32* %arrayidx8.us.i.8, align 4
196*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.8 = getelementptr inbounds i32, i32* %pre101, i64 %indvars.iv42.i
197*9880d681SAndroid Build Coastguard Worker  %tmp74 = load i32, i32* %arrayidx12.us.i61.8, align 4
198*9880d681SAndroid Build Coastguard Worker  %arrayidx8.us.i.9 = getelementptr inbounds i32, i32* %tmp56, i64 9
199*9880d681SAndroid Build Coastguard Worker  %tmp75 = load i32, i32* %arrayidx8.us.i.9, align 4
200*9880d681SAndroid Build Coastguard Worker  %arrayidx12.us.i61.9 = getelementptr inbounds i32, i32* %pre102, i64 %indvars.iv42.i
201*9880d681SAndroid Build Coastguard Worker  %tmp76 = load i32, i32* %arrayidx12.us.i61.9, align 4
202*9880d681SAndroid Build Coastguard Worker  %mul.us.i.1 = mul nsw i32 %tmp60, %tmp59
203*9880d681SAndroid Build Coastguard Worker  %add.us.i.1 = add nsw i32 %mul.us.i.1, %mul.us.i
204*9880d681SAndroid Build Coastguard Worker  %mul.us.i.2 = mul nsw i32 %tmp62, %tmp61
205*9880d681SAndroid Build Coastguard Worker  %add.us.i.2 = add nsw i32 %mul.us.i.2, %add.us.i.1
206*9880d681SAndroid Build Coastguard Worker  %mul.us.i.3 = mul nsw i32 %tmp64, %tmp63
207*9880d681SAndroid Build Coastguard Worker  %add.us.i.3 = add nsw i32 %mul.us.i.3, %add.us.i.2
208*9880d681SAndroid Build Coastguard Worker  %mul.us.i.4 = mul nsw i32 %tmp66, %tmp65
209*9880d681SAndroid Build Coastguard Worker  %add.us.i.4 = add nsw i32 %mul.us.i.4, %add.us.i.3
210*9880d681SAndroid Build Coastguard Worker  %mul.us.i.5 = mul nsw i32 %tmp68, %tmp67
211*9880d681SAndroid Build Coastguard Worker  %add.us.i.5 = add nsw i32 %mul.us.i.5, %add.us.i.4
212*9880d681SAndroid Build Coastguard Worker  %mul.us.i.6 = mul nsw i32 %tmp70, %tmp69
213*9880d681SAndroid Build Coastguard Worker  %add.us.i.6 = add nsw i32 %mul.us.i.6, %add.us.i.5
214*9880d681SAndroid Build Coastguard Worker  %mul.us.i.7 = mul nsw i32 %tmp72, %tmp71
215*9880d681SAndroid Build Coastguard Worker  %add.us.i.7 = add nsw i32 %mul.us.i.7, %add.us.i.6
216*9880d681SAndroid Build Coastguard Worker  %mul.us.i.8 = mul nsw i32 %tmp74, %tmp73
217*9880d681SAndroid Build Coastguard Worker  %add.us.i.8 = add nsw i32 %mul.us.i.8, %add.us.i.7
218*9880d681SAndroid Build Coastguard Worker  %mul.us.i.9 = mul nsw i32 %tmp76, %tmp75
219*9880d681SAndroid Build Coastguard Worker  %add.us.i.9 = add nsw i32 %mul.us.i.9, %add.us.i.8
220*9880d681SAndroid Build Coastguard Worker  %arrayidx16.us.i = getelementptr inbounds i32, i32* %tmp55, i64 %indvars.iv42.i
221*9880d681SAndroid Build Coastguard Worker  store i32 %add.us.i.9, i32* %arrayidx16.us.i, align 4
222*9880d681SAndroid Build Coastguard Worker  %indvars.iv.next43.i = add i64 %indvars.iv42.i, 1
223*9880d681SAndroid Build Coastguard Worker  %lftr.wideiv = trunc i64 %indvars.iv.next43.i to i32
224*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %lftr.wideiv, 10
225*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %end, label %for.body
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workerend:
228*9880d681SAndroid Build Coastguard Worker  ret void
229*9880d681SAndroid Build Coastguard Worker}
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Worker; A mildly interesting little block extracted from a cipher.  The
232*9880d681SAndroid Build Coastguard Worker; balanced heuristics are interesting here because we have resource,
233*9880d681SAndroid Build Coastguard Worker; latency, and register limits all at once. For now, simply check that
234*9880d681SAndroid Build Coastguard Worker; we don't use any callee-saves.
235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @encpc1
236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: %entry
237*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: push
238*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pop
239*9880d681SAndroid Build Coastguard Worker; CHECK: ret
240*9880d681SAndroid Build Coastguard Worker@a = external global i32, align 4
241*9880d681SAndroid Build Coastguard Worker@b = external global i32, align 4
242*9880d681SAndroid Build Coastguard Worker@c = external global i32, align 4
243*9880d681SAndroid Build Coastguard Worker@d = external global i32, align 4
244*9880d681SAndroid Build Coastguard Workerdefine i32 @encpc1() nounwind {
245*9880d681SAndroid Build Coastguard Workerentry:
246*9880d681SAndroid Build Coastguard Worker  %l1 = load i32, i32* @a, align 16
247*9880d681SAndroid Build Coastguard Worker  %conv = shl i32 %l1, 8
248*9880d681SAndroid Build Coastguard Worker  %s5 = lshr i32 %l1, 8
249*9880d681SAndroid Build Coastguard Worker  %add = or i32 %conv, %s5
250*9880d681SAndroid Build Coastguard Worker  store i32 %add, i32* @b
251*9880d681SAndroid Build Coastguard Worker  %l6 = load i32, i32* @a
252*9880d681SAndroid Build Coastguard Worker  %l7 = load i32, i32* @c
253*9880d681SAndroid Build Coastguard Worker  %add.i = add i32 %l7, %l6
254*9880d681SAndroid Build Coastguard Worker  %idxprom.i = zext i32 %l7 to i64
255*9880d681SAndroid Build Coastguard Worker  %arrayidx.i = getelementptr inbounds i32, i32* @d, i64 %idxprom.i
256*9880d681SAndroid Build Coastguard Worker  %l8 = load i32, i32* %arrayidx.i
257*9880d681SAndroid Build Coastguard Worker  store i32 346, i32* @c
258*9880d681SAndroid Build Coastguard Worker  store i32 20021, i32* @d
259*9880d681SAndroid Build Coastguard Worker  %l9 = load i32, i32* @a
260*9880d681SAndroid Build Coastguard Worker  store i32 %l8, i32* @a
261*9880d681SAndroid Build Coastguard Worker  store i32 %l9, i32* @b
262*9880d681SAndroid Build Coastguard Worker  store i32 %add.i, i32* @c
263*9880d681SAndroid Build Coastguard Worker  store i32 %l9, i32* @d
264*9880d681SAndroid Build Coastguard Worker  %cmp.i = icmp eq i32 %add.i, 0
265*9880d681SAndroid Build Coastguard Worker  %s10 = lshr i32 %l1, 16
266*9880d681SAndroid Build Coastguard Worker  %s12 = lshr i32 %l1, 24
267*9880d681SAndroid Build Coastguard Worker  %s14 = lshr i32 %l1, 30
268*9880d681SAndroid Build Coastguard Worker  br i1 %cmp.i, label %if, label %return
269*9880d681SAndroid Build Coastguard Workerif:
270*9880d681SAndroid Build Coastguard Worker  %sa = add i32 %s5, %s10
271*9880d681SAndroid Build Coastguard Worker  %sb = add i32 %sa, %s12
272*9880d681SAndroid Build Coastguard Worker  %sc = add i32 %sb, %s14
273*9880d681SAndroid Build Coastguard Worker  br label %return
274*9880d681SAndroid Build Coastguard Workerreturn:
275*9880d681SAndroid Build Coastguard Worker  %result = phi i32 [0, %entry], [%sc, %if]
276*9880d681SAndroid Build Coastguard Worker  ret i32 %result
277*9880d681SAndroid Build Coastguard Worker}
278