xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/machine-combiner.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-gnu-linux -mcpu=cortex-a57 -enable-unsafe-fp-math -disable-post-ra < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Verify that the first two adds are independent regardless of how the inputs are
4*9880d681SAndroid Build Coastguard Worker; commuted. The destination registers are used as source registers for the third add.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds1(float %x0, float %x1, float %x2, float %x3) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_adds1:
8*9880d681SAndroid Build Coastguard Worker; CHECK:         fadd  s0, s0, s1
9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s1, s2, s3
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s0, s0, s1
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
12*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
13*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %t0, %x2
14*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %t1, %x3
15*9880d681SAndroid Build Coastguard Worker  ret float %t2
16*9880d681SAndroid Build Coastguard Worker}
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds2(float %x0, float %x1, float %x2, float %x3) {
19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_adds2:
20*9880d681SAndroid Build Coastguard Worker; CHECK:         fadd  s0, s0, s1
21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s1, s2, s3
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s0, s0, s1
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
24*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
25*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %x2, %t0
26*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %t1, %x3
27*9880d681SAndroid Build Coastguard Worker  ret float %t2
28*9880d681SAndroid Build Coastguard Worker}
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds3(float %x0, float %x1, float %x2, float %x3) {
31*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_adds3:
32*9880d681SAndroid Build Coastguard Worker; CHECK:         s0, s0, s1
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    s1, s2, s3
34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    s0, s0, s1
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
36*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
37*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %t0, %x2
38*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %x3, %t1
39*9880d681SAndroid Build Coastguard Worker  ret float %t2
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds4(float %x0, float %x1, float %x2, float %x3) {
43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_adds4:
44*9880d681SAndroid Build Coastguard Worker; CHECK:         s0, s0, s1
45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    s1, s2, s3
46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    s0, s0, s1
47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
48*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
49*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %x2, %t0
50*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %x3, %t1
51*9880d681SAndroid Build Coastguard Worker  ret float %t2
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker; Verify that we reassociate some of these ops. The optimal balanced tree of adds is not
55*9880d681SAndroid Build Coastguard Worker; produced because that would cost more compile time.
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds5(float %x0, float %x1, float %x2, float %x3, float %x4, float %x5, float %x6, float %x7) {
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_adds5:
59*9880d681SAndroid Build Coastguard Worker; CHECK:         fadd  s0, s0, s1
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s1, s2, s3
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s0, s0, s1
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s1, s4, s5
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s1, s1, s6
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s0, s0, s1
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s0, s0, s7
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
67*9880d681SAndroid Build Coastguard Worker  %t0 = fadd float %x0, %x1
68*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %t0, %x2
69*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %t1, %x3
70*9880d681SAndroid Build Coastguard Worker  %t3 = fadd float %t2, %x4
71*9880d681SAndroid Build Coastguard Worker  %t4 = fadd float %t3, %x5
72*9880d681SAndroid Build Coastguard Worker  %t5 = fadd float %t4, %x6
73*9880d681SAndroid Build Coastguard Worker  %t6 = fadd float %t5, %x7
74*9880d681SAndroid Build Coastguard Worker  ret float %t6
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker; Verify that we only need two associative operations to reassociate the operands.
78*9880d681SAndroid Build Coastguard Worker; Also, we should reassociate such that the result of the high latency division
79*9880d681SAndroid Build Coastguard Worker; is used by the final 'add' rather than reassociating the %x3 operand with the
80*9880d681SAndroid Build Coastguard Worker; division. The latter reassociation would not improve anything.
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_adds6(float %x0, float %x1, float %x2, float %x3) {
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_adds6:
84*9880d681SAndroid Build Coastguard Worker; CHECK:         fdiv  s0, s0, s1
85*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s1, s2, s3
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  s0, s0, s1
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
88*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv float %x0, %x1
89*9880d681SAndroid Build Coastguard Worker  %t1 = fadd float %x2, %t0
90*9880d681SAndroid Build Coastguard Worker  %t2 = fadd float %x3, %t1
91*9880d681SAndroid Build Coastguard Worker  ret float %t2
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker; Verify that scalar single-precision multiplies are reassociated.
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine float @reassociate_muls1(float %x0, float %x1, float %x2, float %x3) {
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_muls1:
98*9880d681SAndroid Build Coastguard Worker; CHECK:         fdiv  s0, s0, s1
99*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fmul  s1, s2, s3
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fmul  s0, s0, s1
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
102*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv float %x0, %x1
103*9880d681SAndroid Build Coastguard Worker  %t1 = fmul float %x2, %t0
104*9880d681SAndroid Build Coastguard Worker  %t2 = fmul float %x3, %t1
105*9880d681SAndroid Build Coastguard Worker  ret float %t2
106*9880d681SAndroid Build Coastguard Worker}
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker; Verify that scalar double-precision adds are reassociated.
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workerdefine double @reassociate_adds_double(double %x0, double %x1, double %x2, double %x3) {
111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_adds_double:
112*9880d681SAndroid Build Coastguard Worker; CHECK:         fdiv  d0, d0, d1
113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  d1, d2, d3
114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  d0, d0, d1
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
116*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv double %x0, %x1
117*9880d681SAndroid Build Coastguard Worker  %t1 = fadd double %x2, %t0
118*9880d681SAndroid Build Coastguard Worker  %t2 = fadd double %x3, %t1
119*9880d681SAndroid Build Coastguard Worker  ret double %t2
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; Verify that scalar double-precision multiplies are reassociated.
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workerdefine double @reassociate_muls_double(double %x0, double %x1, double %x2, double %x3) {
125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_muls_double:
126*9880d681SAndroid Build Coastguard Worker; CHECK:         fdiv  d0, d0, d1
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fmul  d1, d2, d3
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fmul  d0, d0, d1
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
130*9880d681SAndroid Build Coastguard Worker  %t0 = fdiv double %x0, %x1
131*9880d681SAndroid Build Coastguard Worker  %t1 = fmul double %x2, %t0
132*9880d681SAndroid Build Coastguard Worker  %t2 = fmul double %x3, %t1
133*9880d681SAndroid Build Coastguard Worker  ret double %t2
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker; Verify that we reassociate vector instructions too.
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vector_reassociate_adds1(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   vector_reassociate_adds1:
140*9880d681SAndroid Build Coastguard Worker; CHECK:         fadd  v0.4s, v0.4s, v1.4s
141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  v1.4s, v2.4s, v3.4s
142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  v0.4s, v0.4s, v1.4s
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
144*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
145*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <4 x float> %t0, %x2
146*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <4 x float> %t1, %x3
147*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vector_reassociate_adds2(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   vector_reassociate_adds2:
152*9880d681SAndroid Build Coastguard Worker; CHECK:         fadd  v0.4s, v0.4s, v1.4s
153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  v1.4s, v2.4s, v3.4s
154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  v0.4s, v0.4s, v1.4s
155*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
156*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <4 x float> %x2, %t0
157*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <4 x float> %t1, %x3
158*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vector_reassociate_adds3(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   vector_reassociate_adds3:
163*9880d681SAndroid Build Coastguard Worker; CHECK:         fadd  v0.4s, v0.4s, v1.4s
164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  v1.4s, v2.4s, v3.4s
165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  v0.4s, v0.4s, v1.4s
166*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
167*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <4 x float> %t0, %x2
168*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <4 x float> %x3, %t1
169*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @vector_reassociate_adds4(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   vector_reassociate_adds4:
174*9880d681SAndroid Build Coastguard Worker; CHECK:         fadd  v0.4s, v0.4s, v1.4s
175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  v1.4s, v2.4s, v3.4s
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fadd  v0.4s, v0.4s, v1.4s
177*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
178*9880d681SAndroid Build Coastguard Worker  %t1 = fadd <4 x float> %x2, %t0
179*9880d681SAndroid Build Coastguard Worker  %t2 = fadd <4 x float> %x3, %t1
180*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker; Verify that 128-bit vector single-precision multiplies are reassociated.
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @reassociate_muls_v4f32(<4 x float> %x0, <4 x float> %x1, <4 x float> %x2, <4 x float> %x3) {
185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_muls_v4f32:
186*9880d681SAndroid Build Coastguard Worker; CHECK:         fadd  v0.4s, v0.4s, v1.4s
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fmul  v1.4s, v2.4s, v3.4s
188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fmul  v0.4s, v0.4s, v1.4s
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
190*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <4 x float> %x0, %x1
191*9880d681SAndroid Build Coastguard Worker  %t1 = fmul <4 x float> %x2, %t0
192*9880d681SAndroid Build Coastguard Worker  %t2 = fmul <4 x float> %x3, %t1
193*9880d681SAndroid Build Coastguard Worker  ret <4 x float> %t2
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker; Verify that 128-bit vector double-precision multiplies are reassociated.
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @reassociate_muls_v2f64(<2 x double> %x0, <2 x double> %x1, <2 x double> %x2, <2 x double> %x3) {
199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL:   reassociate_muls_v2f64:
200*9880d681SAndroid Build Coastguard Worker; CHECK:         fadd  v0.2d, v0.2d, v1.2d
201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fmul  v1.2d, v2.2d, v3.2d
202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    fmul  v0.2d, v0.2d, v1.2d
203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret
204*9880d681SAndroid Build Coastguard Worker  %t0 = fadd <2 x double> %x0, %x1
205*9880d681SAndroid Build Coastguard Worker  %t1 = fmul <2 x double> %x2, %t0
206*9880d681SAndroid Build Coastguard Worker  %t2 = fmul <2 x double> %x3, %t1
207*9880d681SAndroid Build Coastguard Worker  ret <2 x double> %t2
208*9880d681SAndroid Build Coastguard Worker}
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker; PR25016: https://llvm.org/bugs/show_bug.cgi?id=25016
211*9880d681SAndroid Build Coastguard Worker; Verify that reassociation is not happening needlessly or wrongly.
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdeclare double @bar()
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerdefine double @reassociate_adds_from_calls() {
216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: reassociate_adds_from_calls:
217*9880d681SAndroid Build Coastguard Worker; CHECK:       bl   bar
218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  mov  v8.16b, v0.16b
219*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  bl   bar
220*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  mov  v9.16b, v0.16b
221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  bl   bar
222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  mov  v10.16b, v0.16b
223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  bl   bar
224*9880d681SAndroid Build Coastguard Worker; CHECK:       fadd d1, d8, d9
225*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  fadd d0, d10, d0
226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  fadd d0, d1, d0
227*9880d681SAndroid Build Coastguard Worker  %x0 = call double @bar()
228*9880d681SAndroid Build Coastguard Worker  %x1 = call double @bar()
229*9880d681SAndroid Build Coastguard Worker  %x2 = call double @bar()
230*9880d681SAndroid Build Coastguard Worker  %x3 = call double @bar()
231*9880d681SAndroid Build Coastguard Worker  %t0 = fadd double %x0, %x1
232*9880d681SAndroid Build Coastguard Worker  %t1 = fadd double %t0, %x2
233*9880d681SAndroid Build Coastguard Worker  %t2 = fadd double %t1, %x3
234*9880d681SAndroid Build Coastguard Worker  ret double %t2
235*9880d681SAndroid Build Coastguard Worker}
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Workerdefine double @already_reassociated() {
238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: already_reassociated:
239*9880d681SAndroid Build Coastguard Worker; CHECK:       bl   bar
240*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  mov  v8.16b, v0.16b
241*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  bl   bar
242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  mov  v9.16b, v0.16b
243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  bl   bar
244*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  mov  v10.16b, v0.16b
245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  bl   bar
246*9880d681SAndroid Build Coastguard Worker; CHECK:       fadd d1, d8, d9
247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  fadd d0, d10, d0
248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  fadd d0, d1, d0
249*9880d681SAndroid Build Coastguard Worker  %x0 = call double @bar()
250*9880d681SAndroid Build Coastguard Worker  %x1 = call double @bar()
251*9880d681SAndroid Build Coastguard Worker  %x2 = call double @bar()
252*9880d681SAndroid Build Coastguard Worker  %x3 = call double @bar()
253*9880d681SAndroid Build Coastguard Worker  %t0 = fadd double %x0, %x1
254*9880d681SAndroid Build Coastguard Worker  %t1 = fadd double %x2, %x3
255*9880d681SAndroid Build Coastguard Worker  %t2 = fadd double %t0, %t1
256*9880d681SAndroid Build Coastguard Worker  ret double %t2
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259