xref: /llvm-project/llvm/test/Transforms/InstCombine/pow-exp.ll (revision eefef900c6a24f2acd724726bc52884e058575da)
1; NOTE: Do not autogenerate
2;       Assertions were previously autogenerated by utils/update_test_checks.py
3;       but some hand modifications were needed to account for rounding errors
4;       in constant folding that depend on the compiler's math library version.
5; RUN: opt < %s -passes=instcombine -S | FileCheck %s
6
7define float @powf_expf(float %x, float %y) {
8; CHECK-LABEL: @powf_expf(
9; CHECK-NEXT:    [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]]
10; CHECK-NEXT:    [[EXP:%.*]] = call fast float @llvm.exp.f32(float [[MUL]])
11; CHECK-NEXT:    ret float [[EXP]]
12;
13  %call = call fast float @expf(float %x) nounwind readnone
14  %pow = call fast float @llvm.pow.f32(float %call, float %y)
15  ret float %pow
16}
17
18define float @powf_expf_libcall(float %x, float %y) {
19; CHECK-LABEL: @powf_expf_libcall(
20; CHECK-NEXT:    [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]]
21; CHECK-NEXT:    [[EXPF:%.*]] = call fast float @expf(float [[MUL]])
22; CHECK-NEXT:    ret float [[EXPF]]
23;
24  %call = call fast float @expf(float %x)
25  %pow = call fast float @powf(float %call, float %y)
26  ret float %pow
27}
28
29define double @pow_exp(double %x, double %y) {
30; CHECK-LABEL: @pow_exp(
31; CHECK-NEXT:    [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]]
32; CHECK-NEXT:    [[EXP:%.*]] = call fast double @llvm.exp.f64(double [[MUL]])
33; CHECK-NEXT:    ret double [[EXP]]
34;
35  %call = call fast double @exp(double %x) nounwind readnone
36  %pow = call fast double @llvm.pow.f64(double %call, double %y)
37  ret double %pow
38}
39
40define double @pow_exp_not_intrinsic(double %x, double %y) {
41; CHECK-LABEL: @pow_exp_not_intrinsic(
42; CHECK-NEXT:    [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]]
43; CHECK-NEXT:    [[EXP:%.*]] = call fast double @llvm.exp.f64(double [[MUL]])
44; CHECK-NEXT:    ret double [[EXP]]
45;
46  %call = call fast double @exp(double %x) nounwind readnone
47  %pow = call fast double @pow(double %call, double %y) nounwind readnone
48  ret double %pow
49}
50
51define fp128 @powl_expl(fp128 %x, fp128 %y) {
52; CHECK-LABEL: @powl_expl(
53; CHECK-NEXT:    [[MUL:%.*]] = fmul fast fp128 [[X:%.*]], [[Y:%.*]]
54; CHECK-NEXT:    [[EXP:%.*]] = call fast fp128 @llvm.exp.f128(fp128 [[MUL]])
55; CHECK-NEXT:    ret fp128 [[EXP]]
56;
57  %call = call fast fp128 @expl(fp128 %x) nounwind readnone
58  %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)
59  ret fp128 %pow
60}
61
62define fp128 @powl_expl_not_fast(fp128 %x, fp128 %y) {
63; CHECK-LABEL: @powl_expl_not_fast(
64; CHECK-NEXT:    [[CALL:%.*]] = call fp128 @expl(fp128 [[X:%.*]])
65; CHECK-NEXT:    [[POW:%.*]] = call fast fp128 @llvm.pow.f128(fp128 [[CALL]], fp128 [[Y:%.*]])
66; CHECK-NEXT:    ret fp128 [[POW]]
67;
68  %call = call fp128 @expl(fp128 %x)
69  %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)
70  ret fp128 %pow
71}
72
73define float @powf_exp2f(float %x, float %y) {
74; CHECK-LABEL: @powf_exp2f(
75; CHECK-NEXT:    [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]]
76; CHECK-NEXT:    [[EXP2:%.*]] = call fast float @llvm.exp2.f32(float [[MUL]])
77; CHECK-NEXT:    ret float [[EXP2]]
78;
79  %call = call fast float @exp2f(float %x) nounwind readnone
80  %pow = call fast float @llvm.pow.f32(float %call, float %y)
81  ret float %pow
82}
83
84define float @powf_exp2f_not_intrinsic(float %x, float %y) {
85; CHECK-LABEL: @powf_exp2f_not_intrinsic(
86; CHECK-NEXT:    [[MUL:%.*]] = fmul fast float [[X:%.*]], [[Y:%.*]]
87; CHECK-NEXT:    [[EXP2:%.*]] = call fast float @llvm.exp2.f32(float [[MUL]])
88; CHECK-NEXT:    ret float [[EXP2]]
89;
90  %call = call fast float @exp2f(float %x) nounwind readnone
91  %pow = call fast float @powf(float %call, float %y) nounwind readnone
92  ret float %pow
93}
94
95define double @pow_exp2(double %x, double %y) {
96; CHECK-LABEL: @pow_exp2(
97; CHECK-NEXT:    [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]]
98; CHECK-NEXT:    [[EXP2:%.*]] = call fast double @llvm.exp2.f64(double [[MUL]])
99; CHECK-NEXT:    ret double [[EXP2]]
100;
101  %call = call fast double @exp2(double %x) nounwind readnone
102  %pow = call fast double @llvm.pow.f64(double %call, double %y)
103  ret double %pow
104}
105
106define double @pow_exp2_libcall(double %x, double %y) {
107; CHECK-LABEL: @pow_exp2_libcall(
108; CHECK-NEXT:    [[MUL:%.*]] = fmul fast double [[X:%.*]], [[Y:%.*]]
109; CHECK-NEXT:    [[EXP2:%.*]] = call fast double @exp2(double [[MUL]])
110; CHECK-NEXT:    ret double [[EXP2]]
111;
112  %call = call fast double @exp2(double %x)
113  %pow = call fast double @pow(double %call, double %y)
114  ret double %pow
115}
116
117define fp128 @powl_exp2l(fp128 %x, fp128 %y) {
118; CHECK-LABEL: @powl_exp2l(
119; CHECK-NEXT:    [[MUL:%.*]] = fmul fast fp128 [[X:%.*]], [[Y:%.*]]
120; CHECK-NEXT:    [[EXP2:%.*]] = call fast fp128 @llvm.exp2.f128(fp128 [[MUL]])
121; CHECK-NEXT:    ret fp128 [[EXP2]]
122;
123  %call = call fast fp128 @exp2l(fp128 %x) nounwind readnone
124  %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)
125  ret fp128 %pow
126}
127
128define fp128 @powl_exp2l_not_fast(fp128 %x, fp128 %y) {
129; CHECK-LABEL: @powl_exp2l_not_fast(
130; CHECK-NEXT:    [[CALL:%.*]] = call fp128 @exp2l(fp128 [[X:%.*]])
131; CHECK-NEXT:    [[POW:%.*]] = call fast fp128 @llvm.pow.f128(fp128 [[CALL]], fp128 [[Y:%.*]])
132; CHECK-NEXT:    ret fp128 [[POW]]
133;
134  %call = call fp128 @exp2l(fp128 %x)
135  %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)
136  ret fp128 %pow
137}
138
139; TODO: exp10() is not widely enabled by many targets yet.
140
141define float @powf_exp10f(float %x, float %y) {
142; CHECK-LABEL: @powf_exp10f(
143; CHECK-NEXT:    [[CALL:%.*]] = call fast float @exp10f(float [[X:%.*]]) #[[ATTR1:[0-9]+]]
144; CHECK-NEXT:    [[POW:%.*]] = call fast float @llvm.pow.f32(float [[CALL]], float [[Y:%.*]])
145; CHECK-NEXT:    ret float [[POW]]
146;
147  %call = call fast float @exp10f(float %x) nounwind readnone
148  %pow = call fast float @llvm.pow.f32(float %call, float %y)
149  ret float %pow
150}
151
152define double @pow_exp10(double %x, double %y) {
153; CHECK-LABEL: @pow_exp10(
154; CHECK-NEXT:    [[CALL:%.*]] = call fast double @exp10(double [[X:%.*]]) #[[ATTR1]]
155; CHECK-NEXT:    [[POW:%.*]] = call fast double @llvm.pow.f64(double [[CALL]], double [[Y:%.*]])
156; CHECK-NEXT:    ret double [[POW]]
157;
158  %call = call fast double @exp10(double %x) nounwind readnone
159  %pow = call fast double @llvm.pow.f64(double %call, double %y)
160  ret double %pow
161}
162
163define fp128 @pow_exp10l(fp128 %x, fp128 %y) {
164; CHECK-LABEL: @pow_exp10l(
165; CHECK-NEXT:    [[CALL:%.*]] = call fast fp128 @exp10l(fp128 [[X:%.*]]) #[[ATTR1]]
166; CHECK-NEXT:    [[POW:%.*]] = call fast fp128 @llvm.pow.f128(fp128 [[CALL]], fp128 [[Y:%.*]])
167; CHECK-NEXT:    ret fp128 [[POW]]
168;
169  %call = call fast fp128 @exp10l(fp128 %x) nounwind readnone
170  %pow = call fast fp128 @llvm.pow.f128(fp128 %call, fp128 %y)
171  ret fp128 %pow
172}
173
174define float @reuse_fast(float %x, float %y, ptr %p) {
175; CHECK-LABEL: @reuse_fast(
176; CHECK-NEXT:    [[EXP:%.*]] = call fast float @expf(float [[X:%.*]])
177; CHECK-NEXT:    [[POW:%.*]] = call fast float @powf(float [[EXP]], float [[Y:%.*]])
178; CHECK-NEXT:    store float [[EXP]], ptr [[P:%.*]], align 4
179; CHECK-NEXT:    ret float [[POW]]
180;
181  %exp = call fast float @expf(float %x)
182  %pow = call fast float @powf(float %exp, float %y)
183  store float %exp, ptr %p, align 4
184  ret float %pow
185}
186
187define fp128 @reuse_libcall(fp128 %x, fp128 %y, ptr %p) {
188; CHECK-LABEL: @reuse_libcall(
189; CHECK-NEXT:    [[EXP:%.*]] = call fp128 @expl(fp128 [[X:%.*]])
190; CHECK-NEXT:    [[POW:%.*]] = call fp128 @powl(fp128 [[EXP]], fp128 [[Y:%.*]])
191; CHECK-NEXT:    store fp128 [[EXP]], ptr [[P:%.*]], align 16
192; CHECK-NEXT:    ret fp128 [[POW]]
193;
194  %exp = call fp128 @expl(fp128 %x)
195  %pow = call fp128 @powl(fp128 %exp, fp128 %y)
196  store fp128 %exp, ptr %p, align 16
197  ret fp128 %pow
198}
199
200define double @function_pointer(ptr %fptr, double %p1) {
201; CHECK-LABEL: @function_pointer(
202; CHECK-NEXT:    [[CALL1:%.*]] = call fast double [[FPTR:%.*]]()
203; CHECK-NEXT:    [[POW:%.*]] = call fast double @llvm.pow.f64(double [[CALL1]], double [[P1:%.*]])
204; CHECK-NEXT:    ret double [[POW]]
205;
206  %call1 = call fast double %fptr()
207  %pow = call fast double @llvm.pow.f64(double %call1, double %p1)
208  ret double %pow
209}
210
211; pow(C,x) -> exp2(log2(C)*x)
212
213declare void @use_d(double)
214declare void @use_f(float)
215
216define double @pow_ok_base(double %e) {
217; CHECK-LABEL: @pow_ok_base(
218; Do not change 0xBFE0776{{.*}} to the exact constant, see PR42740
219; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0xBFE0776{{.*}}
220; CHECK-NEXT:    [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]])
221; CHECK-NEXT:    ret double [[EXP2]]
222;
223  %call = tail call afn nnan ninf double @pow(double 0x3FE6666666666666, double %e)
224  ret double %call
225}
226
227define double @pow_ok_base_fast(double %e) {
228; CHECK-LABEL: @pow_ok_base_fast(
229; CHECK-NEXT:    [[MUL:%.*]] = fmul fast double [[E:%.*]], 0xBFE0776{{.*}}
230; CHECK-NEXT:    [[EXP2:%.*]] = tail call fast double @exp2(double [[MUL]])
231; CHECK-NEXT:    ret double [[EXP2]]
232;
233  %call = tail call fast double @pow(double 0x3FE6666666666666, double %e)
234  ret double %call
235}
236
237define double @pow_ok_base2(double %e) {
238; CHECK-LABEL: @pow_ok_base2(
239; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x4010952{{.*}}
240; CHECK-NEXT:    [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]])
241; CHECK-NEXT:    ret double [[EXP2]]
242;
243  %call = tail call afn nnan ninf double @pow(double 1.770000e+01, double %e)
244  ret double %call
245}
246
247define double @pow_ok_base3(double %e) {
248; CHECK-LABEL: @pow_ok_base3(
249; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x400AB0B5{{.*}}
250; CHECK-NEXT:    [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]])
251; CHECK-NEXT:    ret double [[EXP2]]
252;
253  %call = tail call afn nnan ninf double @pow(double 1.010000e+01, double %e)
254  ret double %call
255}
256
257define double @pow_ok_ten_base(double %e) {
258; CHECK-LABEL: @pow_ok_ten_base(
259; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x400A934F{{.*}}
260; CHECK-NEXT:    [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]])
261; CHECK-NEXT:    ret double [[EXP2]]
262;
263  %call = tail call afn nnan ninf double @pow(double 1.000000e+01, double %e)
264  ret double %call
265}
266
267define double @pow_ok_denorm_base(double %e) {
268; CHECK-LABEL: @pow_ok_denorm_base(
269; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0xC0904800000005C5
270; CHECK-NEXT:    [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]])
271; CHECK-NEXT:    ret double [[EXP2]]
272;
273  %call = tail call afn nnan ninf double @pow(double 0x00000000FFFFFFFF, double %e)
274  ret double %call
275}
276
277define float @powf_ok_base(float %e) {
278; CHECK-LABEL: @powf_ok_base(
279; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0xBFE07762{{.*}}
280; CHECK-NEXT:    [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]])
281; CHECK-NEXT:    ret float [[EXP2F]]
282;
283  %call = tail call afn nnan ninf float @powf(float 0x3FE6666660000000, float %e)
284  ret float %call
285}
286
287define float @powf_ok_base2(float %e) {
288; CHECK-LABEL: @powf_ok_base2(
289; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x4010952{{.*}}
290; CHECK-NEXT:    [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]])
291; CHECK-NEXT:    ret float [[EXP2F]]
292;
293  %call = tail call afn nnan ninf float @powf(float 0x4031B33340000000, float %e)
294  ret float %call
295}
296
297define float @powf_ok_base3(float %e) {
298; CHECK-LABEL: @powf_ok_base3(
299; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x400AB0B5{{.*}}
300; CHECK-NEXT:    [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]])
301; CHECK-NEXT:    ret float [[EXP2F]]
302;
303  %call = tail call afn nnan ninf float @powf(float 0x4024333340000000, float %e)
304  ret float %call
305}
306
307define float @powf_ok_ten_base(float %e) {
308; CHECK-LABEL: @powf_ok_ten_base(
309; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x400A934{{.*}}
310; CHECK-NEXT:    [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]])
311; CHECK-NEXT:    ret float [[EXP2F]]
312;
313  %call = tail call afn nnan ninf float @powf(float 1.000000e+01, float %e)
314  ret float %call
315}
316
317define float @powf_ok_denorm_base(float %e) {
318; CHECK-LABEL: @powf_ok_denorm_base(
319; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], -1.350000e+02
320; CHECK-NEXT:    [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]])
321; CHECK-NEXT:    ret float [[EXP2F]]
322;
323  %call = tail call afn nnan ninf float @powf(float 0x3780000000000000, float %e)
324  ret float %call
325}
326
327; Negative tests
328
329define double @pow_zero_base(double %e) {
330; CHECK-LABEL: @pow_zero_base(
331; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn double @pow(double 0.000000e+00, double [[E:%.*]])
332; CHECK-NEXT:    ret double [[CALL]]
333;
334  %call = tail call afn nnan ninf double @pow(double 0.000000e+00, double %e)
335  ret double %call
336}
337
338define double @pow_zero_base2(double %e) {
339; CHECK-LABEL: @pow_zero_base2(
340; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn double @pow(double -0.000000e+00, double [[E:%.*]])
341; CHECK-NEXT:    ret double [[CALL]]
342;
343  %call = tail call afn nnan ninf double @pow(double -0.000000e+00, double %e)
344  ret double %call
345}
346
347define double @pow_inf_base(double %e) {
348; CHECK-LABEL: @pow_inf_base(
349; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn double @pow(double 0x7FF0000000000000, double [[E:%.*]])
350; CHECK-NEXT:    ret double [[CALL]]
351;
352  %call = tail call afn nnan ninf double @pow(double 0x7FF0000000000000, double %e)
353  ret double %call
354}
355
356define double @pow_nan_base(double %e) {
357; CHECK-LABEL: @pow_nan_base(
358; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn double @pow(double 0x7FF8000000000000, double [[E:%.*]])
359; CHECK-NEXT:    ret double [[CALL]]
360;
361  %call = tail call afn nnan ninf double @pow(double 0x7FF8000000000000, double %e)
362  ret double %call
363}
364
365define double @pow_negative_base(double %e) {
366; CHECK-LABEL: @pow_negative_base(
367; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn double @pow(double -4.000000e+00, double [[E:%.*]])
368; CHECK-NEXT:    ret double [[CALL]]
369;
370  %call = tail call afn nnan ninf double @pow(double -4.000000e+00, double %e)
371  ret double %call
372}
373
374define double @pow_multiuse(double %e) {
375; CHECK-LABEL: @pow_multiuse(
376; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn double [[E:%.*]], 0x4002934{{.*}}
377; CHECK-NEXT:    [[EXP2:%.*]] = tail call nnan ninf afn double @exp2(double [[MUL]])
378; CHECK-NEXT:    tail call void @use_d(double [[EXP2]])
379; CHECK-NEXT:    ret double [[EXP2]]
380;
381  %call = tail call afn nnan ninf double @pow(double 5.000000e+00, double %e)
382  tail call void @use_d(double %call)
383  ret double %call
384}
385
386define double @pow_ok_base_no_afn(double %e) {
387; CHECK-LABEL: @pow_ok_base_no_afn(
388; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf double @pow(double 0x3FE6666666666666, double [[E:%.*]])
389; CHECK-NEXT:    ret double [[CALL]]
390;
391  %call = tail call nnan ninf double @pow(double 0x3FE6666666666666, double %e)
392  ret double %call
393}
394
395define double @pow_ok_base_no_nnan(double %e) {
396; CHECK-LABEL: @pow_ok_base_no_nnan(
397; CHECK-NEXT:    [[CALL:%.*]] = tail call ninf afn double @pow(double 0x3FE6666666666666, double [[E:%.*]])
398; CHECK-NEXT:    ret double [[CALL]]
399;
400  %call = tail call afn ninf double @pow(double 0x3FE6666666666666, double %e)
401  ret double %call
402}
403
404define double @pow_ok_base_no_ninf(double %e) {
405; CHECK-LABEL: @pow_ok_base_no_ninf(
406; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan afn double [[E:%.*]], 0xBFE0776{{.*}}
407; CHECK-NEXT:    [[EXP2:%.*]] = tail call nnan afn double @exp2(double [[MUL]])
408; CHECK-NEXT:    ret double [[EXP2]]
409;
410  %call = tail call afn nnan double @pow(double 0x3FE6666666666666, double %e)
411  ret double %call
412}
413
414define float @powf_zero_base(float %e) {
415; CHECK-LABEL: @powf_zero_base(
416; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn float @powf(float 0.000000e+00, float [[E:%.*]])
417; CHECK-NEXT:    ret float [[CALL]]
418;
419  %call = tail call afn nnan ninf float @powf(float 0.000000e+00, float %e)
420  ret float %call
421}
422
423define float @powf_zero_base2(float %e) {
424; CHECK-LABEL: @powf_zero_base2(
425; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn float @powf(float -0.000000e+00, float [[E:%.*]])
426; CHECK-NEXT:    ret float [[CALL]]
427;
428  %call = tail call afn nnan ninf float @powf(float -0.000000e+00, float %e)
429  ret float %call
430}
431
432define float @powf_inf_base(float %e) {
433; CHECK-LABEL: @powf_inf_base(
434; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn float @powf(float 0x7FF0000000000000, float [[E:%.*]])
435; CHECK-NEXT:    ret float [[CALL]]
436;
437  %call = tail call afn nnan ninf float @powf(float 0x7FF0000000000000, float %e)
438  ret float %call
439}
440
441define float @powf_nan_base(float %e) {
442; CHECK-LABEL: @powf_nan_base(
443; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn float @powf(float 0x7FF8000000000000, float [[E:%.*]])
444; CHECK-NEXT:    ret float [[CALL]]
445;
446  %call = tail call afn nnan ninf float @powf(float 0x7FF8000000000000, float %e)
447  ret float %call
448}
449
450define float @powf_negative_base(float %e) {
451; CHECK-LABEL: @powf_negative_base(
452; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn float @powf(float -4.000000e+00, float [[E:%.*]])
453; CHECK-NEXT:    ret float [[CALL]]
454;
455  %call = tail call afn nnan ninf float @powf(float -4.000000e+00, float %e)
456  ret float %call
457}
458
459define float @powf_multiuse(float %e) {
460; CHECK-LABEL: @powf_multiuse(
461; CHECK-NEXT:    [[MUL:%.*]] = fmul nnan ninf afn float [[E:%.*]], 0x4002934{{.*}}
462; CHECK-NEXT:    [[EXP2F:%.*]] = tail call nnan ninf afn float @exp2f(float [[MUL]])
463; CHECK-NEXT:    tail call void @use_f(float [[EXP2F]])
464; CHECK-NEXT:    ret float [[EXP2F]]
465;
466  %call = tail call afn nnan ninf float @powf(float 5.000000e+00, float %e)
467  tail call void @use_f(float %call)
468  ret float %call
469}
470
471define float @powf_ok_base_no_afn(float %e) {
472; CHECK-LABEL: @powf_ok_base_no_afn(
473; CHECK-NEXT:    [[CALL:%.*]] = tail call float @powf(float 0x3FE6666660000000, float [[E:%.*]])
474; CHECK-NEXT:    ret float [[CALL]]
475;
476  %call = tail call float @powf(float 0x3FE6666660000000, float %e)
477  ret float %call
478}
479
480define fp128 @powl_long_dbl_no_fold(fp128 %e) {
481; CHECK-LABEL: @powl_long_dbl_no_fold(
482; CHECK-NEXT:    [[CALL:%.*]] = tail call nnan ninf afn fp128 @powl(fp128 0xL00000000000000005001000000000000, fp128 [[E:%.*]])
483; CHECK-NEXT:    ret fp128 [[CALL]]
484;
485  %call = tail call afn nnan ninf fp128 @powl(fp128 0xL00000000000000005001000000000000, fp128 %e)
486  ret fp128 %call
487}
488
489declare float @expf(float)
490declare double @exp(double)
491declare fp128 @expl(fp128)
492declare float @exp2f(float)
493declare double @exp2(double)
494declare fp128 @exp2l(fp128)
495declare float @exp10f(float)
496declare double @exp10(double)
497declare fp128 @exp10l(fp128)
498declare float @powf(float, float)
499declare double @pow(double, double)
500declare fp128 @powl(fp128, fp128)
501declare float @llvm.pow.f32(float, float)
502declare double @llvm.pow.f64(double, double)
503declare fp128 @llvm.pow.f128(fp128, fp128)
504