1; RUN: opt < %s -instcombine -enable-double-float-shrink -S | FileCheck %s
2
3target 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"
4target triple = "x86_64-unknown-linux-gnu"
5
6define float @acos_test(float %f) nounwind readnone {
7; CHECK: acos_test
8   %conv = fpext float %f to double
9   %call = call double @acos(double %conv)
10   %conv1 = fptrunc double %call to float
11   ret float %conv1
12; CHECK: call float @acosf(float %f)
13}
14
15define double @acos_test2(float %f) nounwind readnone {
16; CHECK: acos_test2
17   %conv = fpext float %f to double
18   %call = call double @acos(double %conv)
19   ret double %call
20; CHECK: call double @acos(double %conv)
21}
22
23define float @acosh_test(float %f) nounwind readnone {
24; CHECK: acosh_test
25   %conv = fpext float %f to double
26   %call = call double @acosh(double %conv)
27   %conv1 = fptrunc double %call to float
28   ret float %conv1
29; CHECK: call float @acoshf(float %f)
30}
31
32define double @acosh_test2(float %f) nounwind readnone {
33; CHECK: acosh_test2
34   %conv = fpext float %f to double
35   %call = call double @acosh(double %conv)
36   ret double %call
37; CHECK: call double @acosh(double %conv)
38}
39
40define float @asin_test(float %f) nounwind readnone {
41; CHECK: asin_test
42   %conv = fpext float %f to double
43   %call = call double @asin(double %conv)
44   %conv1 = fptrunc double %call to float
45   ret float %conv1
46; CHECK: call float @asinf(float %f)
47}
48
49define double @asin_test2(float %f) nounwind readnone {
50; CHECK: asin_test2
51   %conv = fpext float %f to double
52   %call = call double @asin(double %conv)
53   ret double %call
54; CHECK: call double @asin(double %conv)
55}
56
57define float @asinh_test(float %f) nounwind readnone {
58; CHECK: asinh_test
59   %conv = fpext float %f to double
60   %call = call double @asinh(double %conv)
61   %conv1 = fptrunc double %call to float
62   ret float %conv1
63; CHECK: call float @asinhf(float %f)
64}
65
66define double @asinh_test2(float %f) nounwind readnone {
67; CHECK: asinh_test2
68   %conv = fpext float %f to double
69   %call = call double @asinh(double %conv)
70   ret double %call
71; CHECK: call double @asinh(double %conv)
72}
73
74define float @atan_test(float %f) nounwind readnone {
75; CHECK: atan_test
76   %conv = fpext float %f to double
77   %call = call double @atan(double %conv)
78   %conv1 = fptrunc double %call to float
79   ret float %conv1
80; CHECK: call float @atanf(float %f)
81}
82
83define double @atan_test2(float %f) nounwind readnone {
84; CHECK: atan_test2
85   %conv = fpext float %f to double
86   %call = call double @atan(double %conv)
87   ret double %call
88; CHECK: call double @atan(double %conv)
89}
90define float @atanh_test(float %f) nounwind readnone {
91; CHECK: atanh_test
92   %conv = fpext float %f to double
93   %call = call double @atanh(double %conv)
94   %conv1 = fptrunc double %call to float
95   ret float %conv1
96; CHECK: call float @atanhf(float %f)
97}
98
99define double @atanh_test2(float %f) nounwind readnone {
100; CHECK: atanh_test2
101    %conv = fpext float %f to double
102    %call = call double @atanh(double %conv)
103    ret double %call
104; CHECK: call double @atanh(double %conv)
105}
106define float @cbrt_test(float %f) nounwind readnone {
107; CHECK: cbrt_test
108   %conv = fpext float %f to double
109   %call = call double @cbrt(double %conv)
110   %conv1 = fptrunc double %call to float
111   ret float %conv1
112; CHECK: call float @cbrtf(float %f)
113}
114
115define double @cbrt_test2(float %f) nounwind readnone {
116; CHECK: cbrt_test2
117   %conv = fpext float %f to double
118   %call = call double @cbrt(double %conv)
119   ret double %call
120; CHECK: call double @cbrt(double %conv)
121}
122define float @exp_test(float %f) nounwind readnone {
123; CHECK: exp_test
124   %conv = fpext float %f to double
125   %call = call double @exp(double %conv)
126   %conv1 = fptrunc double %call to float
127   ret float %conv1
128; CHECK: call float @expf(float %f)
129}
130
131define double @exp_test2(float %f) nounwind readnone {
132; CHECK: exp_test2
133   %conv = fpext float %f to double
134   %call = call double @exp(double %conv)
135   ret double %call
136; CHECK: call double @exp(double %conv)
137}
138define float @expm1_test(float %f) nounwind readnone {
139; CHECK: expm1_test
140   %conv = fpext float %f to double
141   %call = call double @expm1(double %conv)
142   %conv1 = fptrunc double %call to float
143   ret float %conv1
144; CHECK: call float @expm1f(float %f)
145}
146
147define double @expm1_test2(float %f) nounwind readnone {
148; CHECK: expm1_test2
149   %conv = fpext float %f to double
150   %call = call double @expm1(double %conv)
151   ret double %call
152; CHECK: call double @expm1(double %conv)
153}
154define float @exp10_test(float %f) nounwind readnone {
155; CHECK: exp10_test
156   %conv = fpext float %f to double
157   %call = call double @exp10(double %conv)
158   %conv1 = fptrunc double %call to float
159   ret float %conv1
160; CHECK: call float @exp10f(float %f)
161}
162
163define double @exp10_test2(float %f) nounwind readnone {
164; CHECK: exp10_test2
165   %conv = fpext float %f to double
166   %call = call double @exp10(double %conv)
167   ret double %call
168; CHECK: call double @exp10(double %conv)
169}
170define float @log_test(float %f) nounwind readnone {
171; CHECK: log_test
172   %conv = fpext float %f to double
173   %call = call double @log(double %conv)
174   %conv1 = fptrunc double %call to float
175   ret float %conv1
176; CHECK: call float @logf(float %f)
177}
178
179define double @log_test2(float %f) nounwind readnone {
180; CHECK: log_test2
181   %conv = fpext float %f to double
182   %call = call double @log(double %conv)
183   ret double %call
184; CHECK: call double @log(double %conv)
185}
186define float @log10_test(float %f) nounwind readnone {
187; CHECK: log10_test
188   %conv = fpext float %f to double
189   %call = call double @log10(double %conv)
190   %conv1 = fptrunc double %call to float
191   ret float %conv1
192; CHECK: call float @log10f(float %f)
193}
194
195define double @log10_test2(float %f) nounwind readnone {
196; CHECK: log10_test2
197   %conv = fpext float %f to double
198   %call = call double @log10(double %conv)
199   ret double %call
200; CHECK: call double @log10(double %conv)
201}
202define float @log1p_test(float %f) nounwind readnone {
203; CHECK: log1p_test
204   %conv = fpext float %f to double
205   %call = call double @log1p(double %conv)
206   %conv1 = fptrunc double %call to float
207   ret float %conv1
208; CHECK: call float @log1pf(float %f)
209}
210
211define double @log1p_test2(float %f) nounwind readnone {
212; CHECK: log1p_test2
213   %conv = fpext float %f to double
214   %call = call double @log1p(double %conv)
215   ret double %call
216; CHECK: call double @log1p(double %conv)
217}
218define float @log2_test(float %f) nounwind readnone {
219; CHECK: log2_test
220   %conv = fpext float %f to double
221   %call = call double @log2(double %conv)
222   %conv1 = fptrunc double %call to float
223   ret float %conv1
224; CHECK: call float @log2f(float %f)
225}
226
227define double @log2_test2(float %f) nounwind readnone {
228; CHECK: log2_test2
229   %conv = fpext float %f to double
230   %call = call double @log2(double %conv)
231   ret double %call
232; CHECK: call double @log2(double %conv)
233}
234define float @logb_test(float %f) nounwind readnone {
235; CHECK: logb_test
236   %conv = fpext float %f to double
237   %call = call double @logb(double %conv)
238   %conv1 = fptrunc double %call to float
239   ret float %conv1
240; CHECK: call float @logbf(float %f)
241}
242
243define double @logb_test2(float %f) nounwind readnone {
244; CHECK: logb_test2
245   %conv = fpext float %f to double
246   %call = call double @logb(double %conv)
247   ret double %call
248; CHECK: call double @logb(double %conv)
249}
250define float @sin_test(float %f) nounwind readnone {
251; CHECK: sin_test
252   %conv = fpext float %f to double
253   %call = call double @sin(double %conv)
254   %conv1 = fptrunc double %call to float
255   ret float %conv1
256; CHECK: call float @sinf(float %f)
257}
258
259define double @sin_test2(float %f) nounwind readnone {
260; CHECK: sin_test2
261   %conv = fpext float %f to double
262   %call = call double @sin(double %conv)
263   ret double %call
264; CHECK: call double @sin(double %conv)
265}
266
267define float @sqrt_test(float %f) nounwind readnone {
268; CHECK: sqrt_test
269   %conv = fpext float %f to double
270   %call = call double @sqrt(double %conv)
271   %conv1 = fptrunc double %call to float
272   ret float %conv1
273; CHECK: call float @sqrtf(float %f)
274}
275
276define float @sqrt_int_test(float %f) nounwind readnone {
277; CHECK: sqrt_int_test
278   %conv = fpext float %f to double
279   %call = call double @llvm.sqrt.f64(double %conv)
280   %conv1 = fptrunc double %call to float
281   ret float %conv1
282; CHECK: call float @llvm.sqrt.f32(float %f)
283}
284
285define double @sqrt_test2(float %f) nounwind readnone {
286; CHECK: sqrt_test2
287   %conv = fpext float %f to double
288   %call = call double @sqrt(double %conv)
289   ret double %call
290; CHECK: call double @sqrt(double %conv)
291}
292define float @tan_test(float %f) nounwind readnone {
293; CHECK: tan_test
294   %conv = fpext float %f to double
295   %call = call double @tan(double %conv)
296   %conv1 = fptrunc double %call to float
297   ret float %conv1
298; CHECK: call float @tanf(float %f)
299}
300
301define double @tan_test2(float %f) nounwind readnone {
302; CHECK: tan_test2
303   %conv = fpext float %f to double
304   %call = call double @tan(double %conv)
305   ret double %call
306; CHECK: call double @tan(double %conv)
307}
308define float @tanh_test(float %f) nounwind readnone {
309; CHECK: tanh_test
310   %conv = fpext float %f to double
311   %call = call double @tanh(double %conv)
312   %conv1 = fptrunc double %call to float
313   ret float %conv1
314; CHECK: call float @tanhf(float %f)
315}
316
317define double @tanh_test2(float %f) nounwind readnone {
318; CHECK: tanh_test2
319   %conv = fpext float %f to double
320   %call = call double @tanh(double %conv)
321   ret double %call
322; CHECK: call double @tanh(double %conv)
323}
324
325declare double @tanh(double) nounwind readnone
326declare double @tan(double) nounwind readnone
327declare double @sqrt(double) nounwind readnone
328declare double @sin(double) nounwind readnone
329declare double @log2(double) nounwind readnone
330declare double @log1p(double) nounwind readnone
331declare double @log10(double) nounwind readnone
332declare double @log(double) nounwind readnone
333declare double @logb(double) nounwind readnone
334declare double @exp10(double) nounwind readnone
335declare double @expm1(double) nounwind readnone
336declare double @exp(double) nounwind readnone
337declare double @cbrt(double) nounwind readnone
338declare double @atanh(double) nounwind readnone
339declare double @atan(double) nounwind readnone
340declare double @acos(double) nounwind readnone
341declare double @acosh(double) nounwind readnone
342declare double @asin(double) nounwind readnone
343declare double @asinh(double) nounwind readnone
344
345declare double @llvm.sqrt.f64(double) nounwind readnone
346
347