xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/double-float-shrink-1.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*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"
4*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu"
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Check for and against shrinkage when using the
7*9880d681SAndroid Build Coastguard Worker; unsafe-fp-math function attribute on a math lib
8*9880d681SAndroid Build Coastguard Worker; function. This optimization may be overridden by
9*9880d681SAndroid Build Coastguard Worker; the -enable-double-float-shrink option.
10*9880d681SAndroid Build Coastguard Worker; PR17850: http://llvm.org/bugs/show_bug.cgi?id=17850
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine float @acos_test1(float %f)   {
13*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
14*9880d681SAndroid Build Coastguard Worker   %call = call fast double @acos(double %conv)
15*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
16*9880d681SAndroid Build Coastguard Worker   ret float %conv1
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: acos_test1
18*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @acosf(float %f)
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine double @acos_test2(float %f)   {
22*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
23*9880d681SAndroid Build Coastguard Worker   %call = call fast double @acos(double %conv)
24*9880d681SAndroid Build Coastguard Worker   ret double %call
25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: acos_test2
26*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @acos(double %conv)
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine float @acosh_test1(float %f)   {
30*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
31*9880d681SAndroid Build Coastguard Worker   %call = call fast double @acosh(double %conv)
32*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
33*9880d681SAndroid Build Coastguard Worker   ret float %conv1
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: acosh_test1
35*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @acoshf(float %f)
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine double @acosh_test2(float %f)   {
39*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
40*9880d681SAndroid Build Coastguard Worker   %call = call fast double @acosh(double %conv)
41*9880d681SAndroid Build Coastguard Worker   ret double %call
42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: acosh_test2
43*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @acosh(double %conv)
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine float @asin_test1(float %f)   {
47*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
48*9880d681SAndroid Build Coastguard Worker   %call = call fast double @asin(double %conv)
49*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
50*9880d681SAndroid Build Coastguard Worker   ret float %conv1
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: asin_test1
52*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @asinf(float %f)
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerdefine double @asin_test2(float %f)   {
56*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
57*9880d681SAndroid Build Coastguard Worker   %call = call fast double @asin(double %conv)
58*9880d681SAndroid Build Coastguard Worker   ret double %call
59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: asin_test2
60*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @asin(double %conv)
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine float @asinh_test1(float %f)   {
64*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
65*9880d681SAndroid Build Coastguard Worker   %call = call fast double @asinh(double %conv)
66*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
67*9880d681SAndroid Build Coastguard Worker   ret float %conv1
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: asinh_test1
69*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @asinhf(float %f)
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine double @asinh_test2(float %f)   {
73*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
74*9880d681SAndroid Build Coastguard Worker   %call = call fast double @asinh(double %conv)
75*9880d681SAndroid Build Coastguard Worker   ret double %call
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: asinh_test2
77*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @asinh(double %conv)
78*9880d681SAndroid Build Coastguard Worker}
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Workerdefine float @atan_test1(float %f)   {
81*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
82*9880d681SAndroid Build Coastguard Worker   %call = call fast double @atan(double %conv)
83*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
84*9880d681SAndroid Build Coastguard Worker   ret float %conv1
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atan_test1
86*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @atanf(float %f)
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine double @atan_test2(float %f)   {
90*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
91*9880d681SAndroid Build Coastguard Worker   %call = call fast double @atan(double %conv)
92*9880d681SAndroid Build Coastguard Worker   ret double %call
93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atan_test2
94*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @atan(double %conv)
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdefine float @atanh_test1(float %f)   {
98*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
99*9880d681SAndroid Build Coastguard Worker   %call = call fast double @atanh(double %conv)
100*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
101*9880d681SAndroid Build Coastguard Worker   ret float %conv1
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atanh_test1
103*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @atanhf(float %f)
104*9880d681SAndroid Build Coastguard Worker}
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerdefine double @atanh_test2(float %f)   {
107*9880d681SAndroid Build Coastguard Worker    %conv = fpext float %f to double
108*9880d681SAndroid Build Coastguard Worker    %call = call fast double @atanh(double %conv)
109*9880d681SAndroid Build Coastguard Worker    ret double %call
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: atanh_test2
111*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @atanh(double %conv)
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine float @cbrt_test1(float %f)   {
115*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
116*9880d681SAndroid Build Coastguard Worker   %call = call fast double @cbrt(double %conv)
117*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
118*9880d681SAndroid Build Coastguard Worker   ret float %conv1
119*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cbrt_test1
120*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @cbrtf(float %f)
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine double @cbrt_test2(float %f)   {
124*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
125*9880d681SAndroid Build Coastguard Worker   %call = call fast  double @cbrt(double %conv)
126*9880d681SAndroid Build Coastguard Worker   ret double %call
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: cbrt_test2
128*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @cbrt(double %conv)
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdefine float @exp_test1(float %f)   {
132*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
133*9880d681SAndroid Build Coastguard Worker   %call = call fast double @exp(double %conv)
134*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
135*9880d681SAndroid Build Coastguard Worker   ret float %conv1
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exp_test1
137*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @expf(float %f)
138*9880d681SAndroid Build Coastguard Worker}
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdefine double @exp_test2(float %f)   {
141*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
142*9880d681SAndroid Build Coastguard Worker   %call = call fast double @exp(double %conv)
143*9880d681SAndroid Build Coastguard Worker   ret double %call
144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exp_test2
145*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @exp(double %conv)
146*9880d681SAndroid Build Coastguard Worker}
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerdefine float @expm1_test1(float %f)   {
149*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
150*9880d681SAndroid Build Coastguard Worker   %call = call fast double @expm1(double %conv)
151*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
152*9880d681SAndroid Build Coastguard Worker   ret float %conv1
153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: expm1_test1
154*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @expm1f(float %f)
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerdefine double @expm1_test2(float %f)   {
158*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
159*9880d681SAndroid Build Coastguard Worker   %call = call fast double @expm1(double %conv)
160*9880d681SAndroid Build Coastguard Worker   ret double %call
161*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: expm1_test2
162*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @expm1(double %conv)
163*9880d681SAndroid Build Coastguard Worker}
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Worker; exp10f() doesn't exist for this triple, so it doesn't shrink.
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerdefine float @exp10_test1(float %f)   {
168*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
169*9880d681SAndroid Build Coastguard Worker   %call = call fast double @exp10(double %conv)
170*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
171*9880d681SAndroid Build Coastguard Worker   ret float %conv1
172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exp10_test1
173*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @exp10(double %conv)
174*9880d681SAndroid Build Coastguard Worker}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerdefine double @exp10_test2(float %f)   {
177*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
178*9880d681SAndroid Build Coastguard Worker   %call = call fast double @exp10(double %conv)
179*9880d681SAndroid Build Coastguard Worker   ret double %call
180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: exp10_test2
181*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @exp10(double %conv)
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerdefine float @log_test1(float %f)   {
185*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
186*9880d681SAndroid Build Coastguard Worker   %call = call fast double @log(double %conv)
187*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
188*9880d681SAndroid Build Coastguard Worker   ret float %conv1
189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log_test1
190*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @logf(float %f)
191*9880d681SAndroid Build Coastguard Worker}
192*9880d681SAndroid Build Coastguard Worker
193*9880d681SAndroid Build Coastguard Workerdefine double @log_test2(float %f)   {
194*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
195*9880d681SAndroid Build Coastguard Worker   %call = call fast double @log(double %conv)
196*9880d681SAndroid Build Coastguard Worker   ret double %call
197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log_test2
198*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @log(double %conv)
199*9880d681SAndroid Build Coastguard Worker}
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerdefine float @log10_test1(float %f)   {
202*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
203*9880d681SAndroid Build Coastguard Worker   %call = call fast double @log10(double %conv)
204*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
205*9880d681SAndroid Build Coastguard Worker   ret float %conv1
206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log10_test1
207*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @log10f(float %f)
208*9880d681SAndroid Build Coastguard Worker}
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Workerdefine double @log10_test2(float %f) {
211*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
212*9880d681SAndroid Build Coastguard Worker   %call = call fast double @log10(double %conv)
213*9880d681SAndroid Build Coastguard Worker   ret double %call
214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log10_test2
215*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @log10(double %conv)
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workerdefine float @log1p_test1(float %f)   {
219*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
220*9880d681SAndroid Build Coastguard Worker   %call = call fast double @log1p(double %conv)
221*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
222*9880d681SAndroid Build Coastguard Worker   ret float %conv1
223*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log1p_test1
224*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @log1pf(float %f)
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workerdefine double @log1p_test2(float %f)   {
228*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
229*9880d681SAndroid Build Coastguard Worker   %call = call fast double @log1p(double %conv)
230*9880d681SAndroid Build Coastguard Worker   ret double %call
231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log1p_test2
232*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @log1p(double %conv)
233*9880d681SAndroid Build Coastguard Worker}
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Workerdefine float @log2_test1(float %f)   {
236*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
237*9880d681SAndroid Build Coastguard Worker   %call = call fast double @log2(double %conv)
238*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
239*9880d681SAndroid Build Coastguard Worker   ret float %conv1
240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log2_test1
241*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @log2f(float %f)
242*9880d681SAndroid Build Coastguard Worker}
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerdefine double @log2_test2(float %f)   {
245*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
246*9880d681SAndroid Build Coastguard Worker   %call = call fast double @log2(double %conv)
247*9880d681SAndroid Build Coastguard Worker   ret double %call
248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: log2_test2
249*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @log2(double %conv)
250*9880d681SAndroid Build Coastguard Worker}
251*9880d681SAndroid Build Coastguard Worker
252*9880d681SAndroid Build Coastguard Workerdefine float @logb_test1(float %f)   {
253*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
254*9880d681SAndroid Build Coastguard Worker   %call = call fast double @logb(double %conv)
255*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
256*9880d681SAndroid Build Coastguard Worker   ret float %conv1
257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: logb_test1
258*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @logbf(float %f)
259*9880d681SAndroid Build Coastguard Worker}
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Workerdefine double @logb_test2(float %f)   {
262*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
263*9880d681SAndroid Build Coastguard Worker   %call = call fast double @logb(double %conv)
264*9880d681SAndroid Build Coastguard Worker   ret double %call
265*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: logb_test2
266*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @logb(double %conv)
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Workerdefine float @sin_test1(float %f)   {
270*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
271*9880d681SAndroid Build Coastguard Worker   %call = call fast double @sin(double %conv)
272*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
273*9880d681SAndroid Build Coastguard Worker   ret float %conv1
274*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sin_test1
275*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @sinf(float %f)
276*9880d681SAndroid Build Coastguard Worker}
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Workerdefine double @sin_test2(float %f) {
279*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
280*9880d681SAndroid Build Coastguard Worker   %call = call fast double @sin(double %conv)
281*9880d681SAndroid Build Coastguard Worker   ret double %call
282*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sin_test2
283*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @sin(double %conv)
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Workerdefine float @sqrt_test1(float %f) {
287*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
288*9880d681SAndroid Build Coastguard Worker   %call = call double @sqrt(double %conv)
289*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
290*9880d681SAndroid Build Coastguard Worker   ret float %conv1
291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sqrt_test1
292*9880d681SAndroid Build Coastguard Worker; CHECK: call float @sqrtf(float %f)
293*9880d681SAndroid Build Coastguard Worker}
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Workerdefine double @sqrt_test2(float %f) {
296*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
297*9880d681SAndroid Build Coastguard Worker   %call = call double @sqrt(double %conv)
298*9880d681SAndroid Build Coastguard Worker   ret double %call
299*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sqrt_test2
300*9880d681SAndroid Build Coastguard Worker; CHECK: call double @sqrt(double %conv)
301*9880d681SAndroid Build Coastguard Worker}
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Workerdefine float @sqrt_int_test1(float %f) {
304*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
305*9880d681SAndroid Build Coastguard Worker   %call = call double @llvm.sqrt.f64(double %conv)
306*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
307*9880d681SAndroid Build Coastguard Worker   ret float %conv1
308*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sqrt_int_test1
309*9880d681SAndroid Build Coastguard Worker; CHECK: call float @llvm.sqrt.f32(float %f)
310*9880d681SAndroid Build Coastguard Worker}
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Workerdefine double @sqrt_int_test2(float %f) {
313*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
314*9880d681SAndroid Build Coastguard Worker   %call = call double @llvm.sqrt.f64(double %conv)
315*9880d681SAndroid Build Coastguard Worker   ret double %call
316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sqrt_int_test2
317*9880d681SAndroid Build Coastguard Worker; CHECK: call double @llvm.sqrt.f64(double %conv)
318*9880d681SAndroid Build Coastguard Worker}
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Workerdefine float @tan_test1(float %f) {
321*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
322*9880d681SAndroid Build Coastguard Worker   %call = call fast double @tan(double %conv)
323*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
324*9880d681SAndroid Build Coastguard Worker   ret float %conv1
325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: tan_test1
326*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @tanf(float %f)
327*9880d681SAndroid Build Coastguard Worker}
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Workerdefine double @tan_test2(float %f) {
330*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
331*9880d681SAndroid Build Coastguard Worker   %call = call fast double @tan(double %conv)
332*9880d681SAndroid Build Coastguard Worker   ret double %call
333*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: tan_test2
334*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @tan(double %conv)
335*9880d681SAndroid Build Coastguard Worker}
336*9880d681SAndroid Build Coastguard Workerdefine float @tanh_test1(float %f) {
337*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
338*9880d681SAndroid Build Coastguard Worker   %call = call fast double @tanh(double %conv)
339*9880d681SAndroid Build Coastguard Worker   %conv1 = fptrunc double %call to float
340*9880d681SAndroid Build Coastguard Worker   ret float %conv1
341*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: tanh_test1
342*9880d681SAndroid Build Coastguard Worker; CHECK: call fast float @tanhf(float %f)
343*9880d681SAndroid Build Coastguard Worker}
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard Workerdefine double @tanh_test2(float %f) {
346*9880d681SAndroid Build Coastguard Worker   %conv = fpext float %f to double
347*9880d681SAndroid Build Coastguard Worker   %call = call fast double @tanh(double %conv)
348*9880d681SAndroid Build Coastguard Worker   ret double %call
349*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: tanh_test2
350*9880d681SAndroid Build Coastguard Worker; CHECK: call fast double @tanh(double %conv)
351*9880d681SAndroid Build Coastguard Worker}
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Worker; 'arcp' on an fmax() is meaningless. This test just proves that
354*9880d681SAndroid Build Coastguard Worker; flags are propagated for shrunken *binary* double FP calls.
355*9880d681SAndroid Build Coastguard Workerdefine float @max1(float %a, float %b) {
356*9880d681SAndroid Build Coastguard Worker  %c = fpext float %a to double
357*9880d681SAndroid Build Coastguard Worker  %d = fpext float %b to double
358*9880d681SAndroid Build Coastguard Worker  %e = call arcp double @fmax(double %c, double %d)
359*9880d681SAndroid Build Coastguard Worker  %f = fptrunc double %e to float
360*9880d681SAndroid Build Coastguard Worker  ret float %f
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: max1(
363*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  call arcp float @fmaxf(float %a, float %b)
364*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret
365*9880d681SAndroid Build Coastguard Worker}
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Worker; A function can have a name that matches a common libcall,
368*9880d681SAndroid Build Coastguard Worker; but with the wrong type(s). Let it be.
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Workerdefine float @fake_fmin(float %a, float %b) {
371*9880d681SAndroid Build Coastguard Worker  %c = fpext float %a to fp128
372*9880d681SAndroid Build Coastguard Worker  %d = fpext float %b to fp128
373*9880d681SAndroid Build Coastguard Worker  %e = call fp128 @fmin(fp128 %c, fp128 %d)
374*9880d681SAndroid Build Coastguard Worker  %f = fptrunc fp128 %e to float
375*9880d681SAndroid Build Coastguard Worker  ret float %f
376*9880d681SAndroid Build Coastguard Worker
377*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: fake_fmin(
378*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %c = fpext float %a to fp128
379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %d = fpext float %b to fp128
380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %e = call fp128 @fmin(fp128 %c, fp128 %d)
381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %f = fptrunc fp128 %e to float
382*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret float %f
383*9880d681SAndroid Build Coastguard Worker}
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Workerdeclare fp128 @fmin(fp128, fp128) ; This is not the 'fmin' you're looking for.
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerdeclare double @fmax(double, double)
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Workerdeclare double @tanh(double)
390*9880d681SAndroid Build Coastguard Workerdeclare double @tan(double)
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker; sqrt is a special case: the shrinking optimization
393*9880d681SAndroid Build Coastguard Worker; is valid even without unsafe-fp-math.
394*9880d681SAndroid Build Coastguard Workerdeclare double @sqrt(double)
395*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.sqrt.f64(double)
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Workerdeclare double @sin(double)
398*9880d681SAndroid Build Coastguard Workerdeclare double @log2(double)
399*9880d681SAndroid Build Coastguard Workerdeclare double @log1p(double)
400*9880d681SAndroid Build Coastguard Workerdeclare double @log10(double)
401*9880d681SAndroid Build Coastguard Workerdeclare double @log(double)
402*9880d681SAndroid Build Coastguard Workerdeclare double @logb(double)
403*9880d681SAndroid Build Coastguard Workerdeclare double @exp10(double)
404*9880d681SAndroid Build Coastguard Workerdeclare double @expm1(double)
405*9880d681SAndroid Build Coastguard Workerdeclare double @exp(double)
406*9880d681SAndroid Build Coastguard Workerdeclare double @cbrt(double)
407*9880d681SAndroid Build Coastguard Workerdeclare double @atanh(double)
408*9880d681SAndroid Build Coastguard Workerdeclare double @atan(double)
409*9880d681SAndroid Build Coastguard Workerdeclare double @acos(double)
410*9880d681SAndroid Build Coastguard Workerdeclare double @acosh(double)
411*9880d681SAndroid Build Coastguard Workerdeclare double @asin(double)
412*9880d681SAndroid Build Coastguard Workerdeclare double @asinh(double)
413*9880d681SAndroid Build Coastguard Worker
414