[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / InstCombine / pow-exp.ll
blob2077c6993dd55da6cc19c923d25df6b673e199c8
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
4 define float @powf_expf(float %x, float %y) {
5 ; CHECK-LABEL: @powf_expf(
6 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]]
7 ; CHECK-NEXT:    [[EXP:%.*]] = call fast float @llvm.exp.f32(float [[MUL]])
8 ; CHECK-NEXT:    ret float [[EXP]]
10   %call = call fast float @expf(float %x) nounwind readnone
11   %pow = call fast float @llvm.pow.f32(float %call, float %y)
12   ret float %pow
15 define float @powf_expf_libcall(float %x, float %y) {
16 ; CHECK-LABEL: @powf_expf_libcall(
17 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]]
18 ; CHECK-NEXT:    [[EXPF:%.*]] = call fast float @expf(float [[MUL]])
19 ; CHECK-NEXT:    ret float [[EXPF]]
21   %call = call fast float @expf(float %x)
22   %pow = call fast float @powf(float %call, float %y)
23   ret float %pow
26 define double @pow_exp(double %x, double %y) {
27 ; CHECK-LABEL: @pow_exp(
28 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]]
29 ; CHECK-NEXT:    [[EXP:%.*]] = call fast double @llvm.exp.f64(double [[MUL]])
30 ; CHECK-NEXT:    ret double [[EXP]]
32   %call = call fast double @exp(double %x) nounwind readnone
33   %pow = call fast double @llvm.pow.f64(double %call, double %y)
34   ret double %pow
37 define double @pow_exp_not_intrinsic(double %x, double %y) {
38 ; CHECK-LABEL: @pow_exp_not_intrinsic(
39 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]]
40 ; CHECK-NEXT:    [[EXP:%.*]] = call fast double @llvm.exp.f64(double [[MUL]])
41 ; CHECK-NEXT:    ret double [[EXP]]
43   %call = call fast double @exp(double %x) nounwind readnone
44   %pow = call fast double @pow(double %call, double %y) nounwind readnone
45   ret double %pow
48 define fp128 @powl_expl(fp128 %x, fp128 %y) {
49 ; CHECK-LABEL: @powl_expl(
50 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast fp128 [[X:%.*]], [[Y:%.*]]
51 ; CHECK-NEXT:    [[EXP:%.*]] = call fast fp128 @llvm.exp.f128(fp128 [[MUL]])
52 ; CHECK-NEXT:    ret fp128 [[EXP]]
54   %call = call fast fp128 @expl(fp128 %x) nounwind readnone
55   %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)
56   ret fp128 %pow
59 define fp128 @powl_expl_not_fast(fp128 %x, fp128 %y) {
60 ; CHECK-LABEL: @powl_expl_not_fast(
61 ; CHECK-NEXT:    [[CALL:%.*]] = call fp128 @expl(fp128 [[X:%.*]])
62 ; CHECK-NEXT:    [[POW:%.*]] = call fast fp128 @llvm.pow.f128(fp128 [[CALL]], fp128 [[Y:%.*]])
63 ; CHECK-NEXT:    ret fp128 [[POW]]
65   %call = call fp128 @expl(fp128 %x)
66   %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)
67   ret fp128 %pow
70 define float @powf_exp2f(float %x, float %y) {
71 ; CHECK-LABEL: @powf_exp2f(
72 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]]
73 ; CHECK-NEXT:    [[EXP2:%.*]] = call fast float @llvm.exp2.f32(float [[MUL]])
74 ; CHECK-NEXT:    ret float [[EXP2]]
76   %call = call fast float @exp2f(float %x) nounwind readnone
77   %pow = call fast float @llvm.pow.f32(float %call, float %y)
78   ret float %pow
81 define float @powf_exp2f_not_intrinsic(float %x, float %y) {
82 ; CHECK-LABEL: @powf_exp2f_not_intrinsic(
83 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]]
84 ; CHECK-NEXT:    [[EXP2:%.*]] = call fast float @llvm.exp2.f32(float [[MUL]])
85 ; CHECK-NEXT:    ret float [[EXP2]]
87   %call = call fast float @exp2f(float %x) nounwind readnone
88   %pow = call fast float @powf(float %call, float %y) nounwind readnone
89   ret float %pow
92 define double @pow_exp2(double %x, double %y) {
93 ; CHECK-LABEL: @pow_exp2(
94 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]]
95 ; CHECK-NEXT:    [[EXP2:%.*]] = call fast double @llvm.exp2.f64(double [[MUL]])
96 ; CHECK-NEXT:    ret double [[EXP2]]
98   %call = call fast double @exp2(double %x) nounwind readnone
99   %pow = call fast double @llvm.pow.f64(double %call, double %y)
100   ret double %pow
103 define double @pow_exp2_libcall(double %x, double %y) {
104 ; CHECK-LABEL: @pow_exp2_libcall(
105 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]]
106 ; CHECK-NEXT:    [[EXP2:%.*]] = call fast double @exp2(double [[MUL]])
107 ; CHECK-NEXT:    ret double [[EXP2]]
109   %call = call fast double @exp2(double %x)
110   %pow = call fast double @pow(double %call, double %y)
111   ret double %pow
114 define fp128 @powl_exp2l(fp128 %x, fp128 %y) {
115 ; CHECK-LABEL: @powl_exp2l(
116 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast fp128 [[X:%.*]], [[Y:%.*]]
117 ; CHECK-NEXT:    [[EXP2:%.*]] = call fast fp128 @llvm.exp2.f128(fp128 [[MUL]])
118 ; CHECK-NEXT:    ret fp128 [[EXP2]]
120   %call = call fast fp128 @exp2l(fp128 %x) nounwind readnone
121   %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)
122   ret fp128 %pow
125 define fp128 @powl_exp2l_not_fast(fp128 %x, fp128 %y) {
126 ; CHECK-LABEL: @powl_exp2l_not_fast(
127 ; CHECK-NEXT:    [[CALL:%.*]] = call fp128 @exp2l(fp128 [[X:%.*]])
128 ; CHECK-NEXT:    [[POW:%.*]] = call fast fp128 @llvm.pow.f128(fp128 [[CALL]], fp128 [[Y:%.*]])
129 ; CHECK-NEXT:    ret fp128 [[POW]]
131   %call = call fp128 @exp2l(fp128 %x)
132   %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)
133   ret fp128 %pow
136 ; TODO: exp10() is not widely enabled by many targets yet.
138 define float @powf_exp10f(float %x, float %y) {
139 ; CHECK-LABEL: @powf_exp10f(
140 ; CHECK-NEXT:    [[CALL:%.*]] = call fast float @exp10f(float [[X:%.*]]) #1
141 ; CHECK-NEXT:    [[POW:%.*]] = call fast float @llvm.pow.f32(float [[CALL]], float [[Y:%.*]])
142 ; CHECK-NEXT:    ret float [[POW]]
144   %call = call fast float @exp10f(float %x) nounwind readnone
145   %pow = call fast float @llvm.pow.f32(float %call, float %y)
146   ret float %pow
149 define double @pow_exp10(double %x, double %y) {
150 ; CHECK-LABEL: @pow_exp10(
151 ; CHECK-NEXT:    [[CALL:%.*]] = call fast double @exp10(double [[X:%.*]]) #1
152 ; CHECK-NEXT:    [[POW:%.*]] = call fast double @llvm.pow.f64(double [[CALL]], double [[Y:%.*]])
153 ; CHECK-NEXT:    ret double [[POW]]
155   %call = call fast double @exp10(double %x) nounwind readnone
156   %pow = call fast double @llvm.pow.f64(double %call, double %y)
157   ret double %pow
160 define fp128 @pow_exp10l(fp128 %x, fp128 %y) {
161 ; CHECK-LABEL: @pow_exp10l(
162 ; CHECK-NEXT:    [[CALL:%.*]] = call fast fp128 @exp10l(fp128 [[X:%.*]]) #1
163 ; CHECK-NEXT:    [[POW:%.*]] = call fast fp128 @llvm.pow.f128(fp128 [[CALL]], fp128 [[Y:%.*]])
164 ; CHECK-NEXT:    ret fp128 [[POW]]
166   %call = call fast fp128 @exp10l(fp128 %x) nounwind readnone
167   %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)
168   ret fp128 %pow
171 define float @reuse_fast(float %x, float %y, float * %p) {
172 ; CHECK-LABEL: @reuse_fast(
173 ; CHECK-NEXT:    [[EXP:%.*]] = call fast float @expf(float [[X:%.*]])
174 ; CHECK-NEXT:    [[POW:%.*]] = call fast float @powf(float [[EXP]], float [[Y:%.*]])
175 ; CHECK-NEXT:    store float [[EXP]], float* [[P:%.*]], align 4
176 ; CHECK-NEXT:    ret float [[POW]]
178   %exp = call fast float @expf(float %x)
179   %pow = call fast float @powf(float %exp, float %y)
180   store float %exp, float *%p, align 4
181   ret float %pow
184 define fp128 @reuse_libcall(fp128 %x, fp128 %y, fp128 * %p) {
185 ; CHECK-LABEL: @reuse_libcall(
186 ; CHECK-NEXT:    [[EXP:%.*]] = call fp128 @expl(fp128 [[X:%.*]])
187 ; CHECK-NEXT:    [[POW:%.*]] = call fp128 @powl(fp128 [[EXP]], fp128 [[Y:%.*]])
188 ; CHECK-NEXT:    store fp128 [[EXP]], fp128* [[P:%.*]], align 16
189 ; CHECK-NEXT:    ret fp128 [[POW]]
191   %exp = call fp128 @expl(fp128 %x)
192   %pow = call fp128 @powl(fp128 %exp, fp128 %y)
193   store fp128 %exp, fp128 *%p, align 16
194   ret fp128 %pow
197 define double @function_pointer(double ()* %fptr, double %p1) {
198 ; CHECK-LABEL: @function_pointer(
199 ; CHECK-NEXT:    [[CALL1:%.*]] = call fast double [[FPTR:%.*]]()
200 ; CHECK-NEXT:    [[POW:%.*]] = call fast double @llvm.pow.f64(double [[CALL1]], double [[P1:%.*]])
201 ; CHECK-NEXT:    ret double [[POW]]
203   %call1 = call fast double %fptr()
204   %pow = call fast double @llvm.pow.f64(double %call1, double %p1)
205   ret double %pow
208 ; pow(C,x) -> exp2(log2(C)*x)
210 declare void @use_d(double)
211 declare void @use_f(float)
213 define double @pow_ok_base(double %e) {
214 ; CHECK-LABEL: @pow_ok_base(
215 ; Do not change 0xBFE0776{{.*}} to the exact constant, see PR42740
216 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0xBFE0776{{.*}}
217 ; CHECK-NEXT:    [[EXP2:%.*]] = call nnan ninf afn double @exp2(double [[MUL]])
218 ; CHECK-NEXT:    ret double [[EXP2]]
220   %call = tail call afn nnan ninf double @pow(double 0x3FE6666666666666, double %e)
221   ret double %call
224 define double @pow_ok_base_fast(double %e) {
225 ; CHECK-LABEL: @pow_ok_base_fast(
226 ; CHECK-NEXT:    [[MUL:%.*]] = fmul fast double [[E:%.*]], 0xBFE0776{{.*}}
227 ; CHECK-NEXT:    [[EXP2:%.*]] = call fast double @exp2(double [[MUL]])
228 ; CHECK-NEXT:    ret double [[EXP2]]
230   %call = tail call fast double @pow(double 0x3FE6666666666666, double %e)
231   ret double %call
234 define double @pow_ok_base2(double %e) {
235 ; CHECK-LABEL: @pow_ok_base2(
236 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x4010952{{.*}}
237 ; CHECK-NEXT:    [[EXP2:%.*]] = call nnan ninf afn double @exp2(double [[MUL]])
238 ; CHECK-NEXT:    ret double [[EXP2]]
240   %call = tail call afn nnan ninf double @pow(double 1.770000e+01, double %e)
241   ret double %call
244 define double @pow_ok_base3(double %e) {
245 ; CHECK-LABEL: @pow_ok_base3(
246 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x400AB0B5{{.*}}
247 ; CHECK-NEXT:    [[EXP2:%.*]] = call nnan ninf afn double @exp2(double [[MUL]])
248 ; CHECK-NEXT:    ret double [[EXP2]]
250   %call = tail call afn nnan ninf double @pow(double 1.010000e+01, double %e)
251   ret double %call
254 define double @pow_ok_ten_base(double %e) {
255 ; CHECK-LABEL: @pow_ok_ten_base(
256 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x400A934F{{.*}}
257 ; CHECK-NEXT:    [[EXP2:%.*]] = call nnan ninf afn double @exp2(double [[MUL]])
258 ; CHECK-NEXT:    ret double [[EXP2]]
260   %call = tail call afn nnan ninf double @pow(double 1.000000e+01, double %e)
261   ret double %call
264 define double @pow_ok_denorm_base(double %e) {
265 ; CHECK-LABEL: @pow_ok_denorm_base(
266 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0xC0904800000005C5
267 ; CHECK-NEXT:    [[EXP2:%.*]] = call nnan ninf afn double @exp2(double [[MUL]])
268 ; CHECK-NEXT:    ret double [[EXP2]]
270   %call = tail call afn nnan ninf double @pow(double 0x00000000FFFFFFFF, double %e)
271   ret double %call
274 define float @powf_ok_base(float %e) {
275 ; CHECK-LABEL: @powf_ok_base(
276 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0xBFE07762{{.*}}
277 ; CHECK-NEXT:    [[EXP2F:%.*]] = call nnan ninf afn float @exp2f(float [[MUL]])
278 ; CHECK-NEXT:    ret float [[EXP2F]]
280   %call = tail call afn nnan ninf float @powf(float 0x3FE6666660000000, float %e)
281   ret float %call
284 define float @powf_ok_base2(float %e) {
285 ; CHECK-LABEL: @powf_ok_base2(
286 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x4010952{{.*}}
287 ; CHECK-NEXT:    [[EXP2F:%.*]] = call nnan ninf afn float @exp2f(float [[MUL]])
288 ; CHECK-NEXT:    ret float [[EXP2F]]
290   %call = tail call afn nnan ninf float @powf(float 0x4031B33340000000, float %e)
291   ret float %call
294 define float @powf_ok_base3(float %e) {
295 ; CHECK-LABEL: @powf_ok_base3(
296 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x400AB0B5{{.*}}
297 ; CHECK-NEXT:    [[EXP2F:%.*]] = call nnan ninf afn float @exp2f(float [[MUL]])
298 ; CHECK-NEXT:    ret float [[EXP2F]]
300   %call = tail call afn nnan ninf float @powf(float 0x4024333340000000, float %e)
301   ret float %call
304 define float @powf_ok_ten_base(float %e) {
305 ; CHECK-LABEL: @powf_ok_ten_base(
306 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x400A934{{.*}}
307 ; CHECK-NEXT:    [[EXP2F:%.*]] = call nnan ninf afn float @exp2f(float [[MUL]])
308 ; CHECK-NEXT:    ret float [[EXP2F]]
310   %call = tail call afn nnan ninf float @powf(float 1.000000e+01, float %e)
311   ret float %call
314 define float @powf_ok_denorm_base(float %e) {
315 ; CHECK-LABEL: @powf_ok_denorm_base(
316 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], -1.350000e+02
317 ; CHECK-NEXT:    [[EXP2F:%.*]] = call nnan ninf afn float @exp2f(float [[MUL]])
318 ; CHECK-NEXT:    ret float [[EXP2F]]
320   %call = tail call afn nnan ninf float @powf(float 0x3780000000000000, float %e)
321   ret float %call
324 ; Negative tests
326 define double @pow_zero_base(double %e) {
327 ; CHECK-LABEL: @pow_zero_base(
328 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn double @pow(double 0.000000e+00, double [[E:%.*]])
329 ; CHECK-NEXT:    ret double [[CALL]]
331   %call = tail call afn nnan ninf double @pow(double 0.000000e+00, double %e)
332   ret double %call
335 define double @pow_zero_base2(double %e) {
336 ; CHECK-LABEL: @pow_zero_base2(
337 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn double @pow(double -0.000000e+00, double [[E:%.*]])
338 ; CHECK-NEXT:    ret double [[CALL]]
340   %call = tail call afn nnan ninf double @pow(double -0.000000e+00, double %e)
341   ret double %call
344 define double @pow_inf_base(double %e) {
345 ; CHECK-LABEL: @pow_inf_base(
346 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn double @pow(double 0x7FF0000000000000, double [[E:%.*]])
347 ; CHECK-NEXT:    ret double [[CALL]]
349   %call = tail call afn nnan ninf double @pow(double 0x7FF0000000000000, double %e)
350   ret double %call
353 define double @pow_nan_base(double %e) {
354 ; CHECK-LABEL: @pow_nan_base(
355 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn double @pow(double 0x7FF8000000000000, double [[E:%.*]])
356 ; CHECK-NEXT:    ret double [[CALL]]
358   %call = tail call afn nnan ninf double @pow(double 0x7FF8000000000000, double %e)
359   ret double %call
362 define double @pow_negative_base(double %e) {
363 ; CHECK-LABEL: @pow_negative_base(
364 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn double @pow(double -4.000000e+00, double [[E:%.*]])
365 ; CHECK-NEXT:    ret double [[CALL]]
367   %call = tail call afn nnan ninf double @pow(double -4.000000e+00, double %e)
368   ret double %call
371 define double @pow_multiuse(double %e) {
372 ; CHECK-LABEL: @pow_multiuse(
373 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x4002934{{.*}}
374 ; CHECK-NEXT:    [[EXP2:%.*]] = call nnan ninf afn double @exp2(double [[MUL]])
375 ; CHECK-NEXT:    tail call void @use_d(double [[EXP2]])
376 ; CHECK-NEXT:    ret double [[EXP2]]
378   %call = tail call afn nnan ninf double @pow(double 5.000000e+00, double %e)
379   tail call void @use_d(double %call)
380   ret double %call
383 define double @pow_ok_base_no_afn(double %e) {
384 ; CHECK-LABEL: @pow_ok_base_no_afn(
385 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf double @pow(double 0x3FE6666666666666, double [[E:%.*]])
386 ; CHECK-NEXT:    ret double [[CALL]]
388   %call = tail call nnan ninf double @pow(double 0x3FE6666666666666, double %e)
389   ret double %call
392 define double @pow_ok_base_no_nnan(double %e) {
393 ; CHECK-LABEL: @pow_ok_base_no_nnan(
394 ; CHECK-NEXT:    [[CALL:%.*]] = tail call ninf afn double @pow(double 0x3FE6666666666666, double [[E:%.*]])
395 ; CHECK-NEXT:    ret double [[CALL]]
397   %call = tail call afn ninf double @pow(double 0x3FE6666666666666, double %e)
398   ret double %call
401 define double @pow_ok_base_no_ninf(double %e) {
402 ; CHECK-LABEL: @pow_ok_base_no_ninf(
403 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan afn double [[E:%.*]], 0xBFE0776{{.*}}
404 ; CHECK-NEXT:    [[EXP2:%.*]] = call nnan afn double @exp2(double [[MUL]])
405 ; CHECK-NEXT:    ret double [[EXP2]]
407   %call = tail call afn nnan double @pow(double 0x3FE6666666666666, double %e)
408   ret double %call
411 define float @powf_zero_base(float %e) {
412 ; CHECK-LABEL: @powf_zero_base(
413 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn float @powf(float 0.000000e+00, float [[E:%.*]])
414 ; CHECK-NEXT:    ret float [[CALL]]
416   %call = tail call afn nnan ninf float @powf(float 0.000000e+00, float %e)
417   ret float %call
420 define float @powf_zero_base2(float %e) {
421 ; CHECK-LABEL: @powf_zero_base2(
422 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn float @powf(float -0.000000e+00, float [[E:%.*]])
423 ; CHECK-NEXT:    ret float [[CALL]]
425   %call = tail call afn nnan ninf float @powf(float -0.000000e+00, float %e)
426   ret float %call
429 define float @powf_inf_base(float %e) {
430 ; CHECK-LABEL: @powf_inf_base(
431 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn float @powf(float 0x7FF0000000000000, float [[E:%.*]])
432 ; CHECK-NEXT:    ret float [[CALL]]
434   %call = tail call afn nnan ninf float @powf(float 0x7FF0000000000000, float %e)
435   ret float %call
438 define float @powf_nan_base(float %e) {
439 ; CHECK-LABEL: @powf_nan_base(
440 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn float @powf(float 0x7FF8000000000000, float [[E:%.*]])
441 ; CHECK-NEXT:    ret float [[CALL]]
443   %call = tail call afn nnan ninf float @powf(float 0x7FF8000000000000, float %e)
444   ret float %call
447 define float @powf_negative_base(float %e) {
448 ; CHECK-LABEL: @powf_negative_base(
449 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn float @powf(float -4.000000e+00, float [[E:%.*]])
450 ; CHECK-NEXT:    ret float [[CALL]]
452   %call = tail call afn nnan ninf float @powf(float -4.000000e+00, float %e)
453   ret float %call
456 define float @powf_multiuse(float %e) {
457 ; CHECK-LABEL: @powf_multiuse(
458 ; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x4002934{{.*}}
459 ; CHECK-NEXT:    [[EXP2F:%.*]] = call nnan ninf afn float @exp2f(float [[MUL]])
460 ; CHECK-NEXT:    tail call void @use_f(float [[EXP2F]])
461 ; CHECK-NEXT:    ret float [[EXP2F]]
463   %call = tail call afn nnan ninf float @powf(float 5.000000e+00, float %e)
464   tail call void @use_f(float %call)
465   ret float %call
468 define float @powf_ok_base_no_afn(float %e) {
469 ; CHECK-LABEL: @powf_ok_base_no_afn(
470 ; CHECK-NEXT:    [[CALL:%.*]] = tail call float @powf(float 0x3FE6666660000000, float [[E:%.*]])
471 ; CHECK-NEXT:    ret float [[CALL]]
473   %call = tail call float @powf(float 0x3FE6666660000000, float %e)
474   ret float %call
477 define fp128 @powl_long_dbl_no_fold(fp128 %e) {
478 ; CHECK-LABEL: @powl_long_dbl_no_fold(
479 ; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn fp128 @powl(fp128 0xL00000000000000005001000000000000, fp128 [[E:%.*]])
480 ; CHECK-NEXT:    ret fp128 [[CALL]]
482   %call = tail call afn nnan ninf fp128 @powl(fp128 0xL00000000000000005001000000000000, fp128 %e)
483   ret fp128 %call
486 declare float @expf(float)
487 declare double @exp(double)
488 declare fp128 @expl(fp128)
489 declare float @exp2f(float)
490 declare double @exp2(double)
491 declare fp128 @exp2l(fp128)
492 declare float @exp10f(float)
493 declare double @exp10(double)
494 declare fp128 @exp10l(fp128)
495 declare float @powf(float, float)
496 declare double @pow(double, double)
497 declare fp128 @powl(fp128, fp128)
498 declare float @llvm.pow.f32(float, float)
499 declare double @llvm.pow.f64(double, double)
500 declare fp128 @llvm.pow.f128(fp128, fp128)