xref: /llvm-project/llvm/test/Transforms/InstCombine/pow_fp_int16.ll (revision f5c8242042c959cbf476778e1d8a874fc8747801)
1; RUN: opt -mtriple msp430 -passes=instcombine -S < %s | FileCheck %s
2
3; Test case was copied from pow_fp_int.ll but adjusted for 16-bit int.
4; Assuming that we can't generate test checks for the same reason (PR42740).
5
6define double @pow_sitofp_const_base_fast(i16 %x) {
7; CHECK-LABEL: @pow_sitofp_const_base_fast(
8; CHECK-NEXT:    [[TMP1:%.*]] = tail call afn float @llvm.powi.f32.i16(float 7.000000e+00, i16 [[X:%.*]])
9; CHECK-NEXT:    [[RES:%.*]] = fpext float [[TMP1]] to double
10; CHECK-NEXT:    ret double [[RES]]
11;
12  %subfp = sitofp i16 %x to float
13  %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp)
14  %res = fpext float %pow to double
15  ret double %res
16}
17
18define double @pow_uitofp_const_base_fast(i15 %x) {
19; CHECK-LABEL: @pow_uitofp_const_base_fast(
20; CHECK-NEXT:    [[TMP1:%.*]] = zext i15 [[X:%.*]] to i16
21; CHECK-NEXT:    [[TMP2:%.*]] = tail call afn float @llvm.powi.f32.i16(float 7.000000e+00, i16 [[TMP1]])
22; CHECK-NEXT:    [[RES:%.*]] = fpext float [[TMP2]] to double
23; CHECK-NEXT:    ret double [[RES]]
24;
25  %subfp = uitofp i15 %x to float
26  %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp)
27  %res = fpext float %pow to double
28  ret double %res
29}
30
31define double @pow_sitofp_double_const_base_fast(i16 %x) {
32; CHECK-LABEL: @pow_sitofp_double_const_base_fast(
33; CHECK-NEXT:    [[TMP1:%.*]] = tail call afn double @llvm.powi.f64.i16(double 7.000000e+00, i16 [[X:%.*]])
34; CHECK-NEXT:    ret double [[TMP1]]
35;
36  %subfp = sitofp i16 %x to double
37  %pow = tail call afn double @llvm.pow.f64(double 7.000000e+00, double %subfp)
38  ret double %pow
39}
40
41define double @pow_uitofp_double_const_base_fast(i15 %x) {
42; CHECK-LABEL: @pow_uitofp_double_const_base_fast(
43; CHECK-NEXT:    [[TMP1:%.*]] = zext i15 [[X:%.*]] to i16
44; CHECK-NEXT:    [[TMP2:%.*]] = tail call afn double @llvm.powi.f64.i16(double 7.000000e+00, i16 [[TMP1]])
45; CHECK-NEXT:    ret double [[TMP2]]
46;
47  %subfp = uitofp i15 %x to double
48  %pow = tail call afn double @llvm.pow.f64(double 7.000000e+00, double %subfp)
49  ret double %pow
50}
51
52define double @pow_sitofp_double_const_base_2_fast(i16 %x) {
53; CHECK-LABEL: @pow_sitofp_double_const_base_2_fast(
54; CHECK-NEXT:    [[LDEXPF:%.*]] = tail call afn float @llvm.ldexp.f32.i16(float 1.000000e+00, i16 [[X:%.*]])
55; CHECK-NEXT:    [[RES:%.*]] = fpext float [[LDEXPF]] to double
56; CHECK-NEXT:    ret double [[RES]]
57;
58  %subfp = sitofp i16 %x to float
59  %pow = tail call afn float @llvm.pow.f32(float 2.000000e+00, float %subfp)
60  %res = fpext float %pow to double
61  ret double %res
62}
63
64define double @pow_sitofp_double_const_base_power_of_2_fast(i16 %x) {
65; CHECK-LABEL: @pow_sitofp_double_const_base_power_of_2_fast(
66; CHECK-NEXT:    [[SUBFP:%.*]] = sitofp i16 [[X:%.*]] to float
67; CHECK-NEXT:    [[MUL:%.*]] = fmul afn float [[SUBFP]], 4.000000e+00
68; CHECK-NEXT:    [[EXP2:%.*]] = tail call afn float @llvm.exp2.f32(float [[MUL]])
69; CHECK-NEXT:    [[RES:%.*]] = fpext float [[EXP2]] to double
70; CHECK-NEXT:    ret double [[RES]]
71;
72  %subfp = sitofp i16 %x to float
73  %pow = tail call afn float @llvm.pow.f32(float 16.000000e+00, float %subfp)
74  %res = fpext float %pow to double
75  ret double %res
76}
77
78define double @pow_uitofp_const_base_2_fast(i15 %x) {
79; CHECK-LABEL: @pow_uitofp_const_base_2_fast(
80; CHECK-NEXT:    [[TMP1:%.*]] = zext i15 [[X:%.*]] to i16
81; CHECK-NEXT:    [[LDEXPF:%.*]] = tail call afn float @llvm.ldexp.f32.i16(float 1.000000e+00, i16 [[TMP1]])
82; CHECK-NEXT:    [[RES:%.*]] = fpext float [[LDEXPF]] to double
83; CHECK-NEXT:    ret double [[RES]]
84;
85  %subfp = uitofp i15 %x to float
86  %pow = tail call afn float @llvm.pow.f32(float 2.000000e+00, float %subfp)
87  %res = fpext float %pow to double
88  ret double %res
89}
90
91define double @pow_uitofp_const_base_power_of_2_fast(i15 %x) {
92; CHECK-LABEL: @pow_uitofp_const_base_power_of_2_fast(
93; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i15 [[X:%.*]] to float
94; CHECK-NEXT:    [[MUL:%.*]] = fmul afn float [[SUBFP]], 4.000000e+00
95; CHECK-NEXT:    [[EXP2:%.*]] = tail call afn float @llvm.exp2.f32(float [[MUL]])
96; CHECK-NEXT:    [[RES:%.*]] = fpext float [[EXP2]] to double
97; CHECK-NEXT:    ret double [[RES]]
98;
99  %subfp = uitofp i15 %x to float
100  %pow = tail call afn float @llvm.pow.f32(float 16.000000e+00, float %subfp)
101  %res = fpext float %pow to double
102  ret double %res
103}
104
105define double @pow_sitofp_float_base_fast(float %base, i16 %x) {
106; CHECK-LABEL: @pow_sitofp_float_base_fast(
107; CHECK-NEXT:    [[TMP1:%.*]] = tail call afn float @llvm.powi.f32.i16(float [[BASE:%.*]], i16 [[X:%.*]])
108; CHECK-NEXT:    [[RES:%.*]] = fpext float [[TMP1]] to double
109; CHECK-NEXT:    ret double [[RES]]
110;
111  %subfp = sitofp i16 %x to float
112  %pow = tail call afn float @llvm.pow.f32(float %base, float %subfp)
113  %res = fpext float %pow to double
114  ret double %res
115}
116
117define double @pow_uitofp_float_base_fast(float %base, i15 %x) {
118; CHECK-LABEL: @pow_uitofp_float_base_fast(
119; CHECK-NEXT:    [[TMP1:%.*]] = zext i15 [[X:%.*]] to i16
120; CHECK-NEXT:    [[TMP2:%.*]] = tail call afn float @llvm.powi.f32.i16(float [[BASE:%.*]], i16 [[TMP1]])
121; CHECK-NEXT:    [[RES:%.*]] = fpext float [[TMP2]] to double
122; CHECK-NEXT:    ret double [[RES]]
123;
124  %subfp = uitofp i15 %x to float
125  %pow = tail call afn float @llvm.pow.f32(float %base, float %subfp)
126  %res = fpext float %pow to double
127  ret double %res
128}
129
130define double @pow_sitofp_double_base_fast(double %base, i16 %x) {
131; CHECK-LABEL: @pow_sitofp_double_base_fast(
132; CHECK-NEXT:    [[TMP1:%.*]] = tail call afn double @llvm.powi.f64.i16(double [[BASE:%.*]], i16 [[X:%.*]])
133; CHECK-NEXT:    ret double [[TMP1]]
134;
135  %subfp = sitofp i16 %x to double
136  %res = tail call afn double @llvm.pow.f64(double %base, double %subfp)
137  ret double %res
138}
139
140define double @pow_uitofp_double_base_fast(double %base, i15 %x) {
141; CHECK-LABEL: @pow_uitofp_double_base_fast(
142; CHECK-NEXT:    [[TMP1:%.*]] = zext i15 [[X:%.*]] to i16
143; CHECK-NEXT:    [[TMP2:%.*]] = tail call afn double @llvm.powi.f64.i16(double [[BASE:%.*]], i16 [[TMP1]])
144; CHECK-NEXT:    ret double [[TMP2]]
145;
146  %subfp = uitofp i15 %x to double
147  %res = tail call afn double @llvm.pow.f64(double %base, double %subfp)
148  ret double %res
149}
150
151define double @pow_sitofp_const_base_fast_i8(i8 %x) {
152; CHECK-LABEL: @pow_sitofp_const_base_fast_i8(
153; CHECK-NEXT:    [[TMP1:%.*]] = sext i8 [[X:%.*]] to i16
154; CHECK-NEXT:    [[TMP2:%.*]] = tail call afn float @llvm.powi.f32.i16(float 7.000000e+00, i16 [[TMP1]])
155; CHECK-NEXT:    [[RES:%.*]] = fpext float [[TMP2]] to double
156; CHECK-NEXT:    ret double [[RES]]
157;
158  %subfp = sitofp i8 %x to float
159  %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp)
160  %res = fpext float %pow to double
161  ret double %res
162}
163
164define double @pow_sitofp_const_base_fast_i16(i16 %x) {
165; CHECK-LABEL: @pow_sitofp_const_base_fast_i16(
166; CHECK-NEXT:    [[TMP1:%.*]] = tail call afn float @llvm.powi.f32.i16(float 7.000000e+00, i16 [[X:%.*]])
167; CHECK-NEXT:    [[RES:%.*]] = fpext float [[TMP1]] to double
168; CHECK-NEXT:    ret double [[RES]]
169;
170  %subfp = sitofp i16 %x to float
171  %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp)
172  %res = fpext float %pow to double
173  ret double %res
174}
175
176
177define double @pow_uitofp_const_base_fast_i8(i8 %x) {
178; CHECK-LABEL: @pow_uitofp_const_base_fast_i8(
179; CHECK-NEXT:    [[TMP1:%.*]] = zext i8 [[X:%.*]] to i16
180; CHECK-NEXT:    [[TMP2:%.*]] = tail call afn float @llvm.powi.f32.i16(float 7.000000e+00, i16 [[TMP1]])
181; CHECK-NEXT:    [[RES:%.*]] = fpext float [[TMP2]] to double
182; CHECK-NEXT:    ret double [[RES]]
183;
184  %subfp = uitofp i8 %x to float
185  %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp)
186  %res = fpext float %pow to double
187  ret double %res
188}
189
190define double @pow_uitofp_const_base_afn_i16(i16 %x) {
191; CHECK-LABEL: @pow_uitofp_const_base_afn_i16(
192; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float
193; CHECK-NEXT:    [[POW:%.*]] = tail call afn float @llvm.pow.f32(float 7.000000e+00, float [[SUBFP]])
194; CHECK-NEXT:    [[RES:%.*]] = fpext float [[POW]] to double
195; CHECK-NEXT:    ret double [[RES]]
196;
197  %subfp = uitofp i16 %x to float
198  %pow = tail call afn float @llvm.pow.f32(float 7.000000e+00, float %subfp)
199  %res = fpext float %pow to double
200  ret double %res
201}
202
203define double @powf_exp_const_int_fast(double %base) {
204; CHECK-LABEL: @powf_exp_const_int_fast(
205; CHECK-NEXT:    [[TMP1:%.*]] = tail call fast double @llvm.powi.f64.i16(double [[BASE:%.*]], i16 40)
206; CHECK-NEXT:    ret double [[TMP1]]
207;
208  %res = tail call fast double @llvm.pow.f64(double %base, double 4.000000e+01)
209  ret double %res
210}
211
212define double @powf_exp_const2_int_fast(double %base) {
213; CHECK-LABEL: @powf_exp_const2_int_fast(
214; CHECK-NEXT:    [[TMP1:%.*]] = tail call fast double @llvm.powi.f64.i16(double [[BASE:%.*]], i16 -40)
215; CHECK-NEXT:    ret double [[TMP1]]
216;
217  %res = tail call fast double @llvm.pow.f64(double %base, double -4.000000e+01)
218  ret double %res
219}
220
221; Negative tests
222
223define double @pow_uitofp_const_base_fast_i16(i16 %x) {
224; CHECK-LABEL: @pow_uitofp_const_base_fast_i16(
225; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float
226; CHECK-NEXT:    [[MUL:%.*]] = fmul fast float [[SUBFP]], 0x4006757{{.*}}
227; CHECK-NEXT:    [[EXP2:%.*]] = tail call fast float @llvm.exp2.f32(float [[MUL]])
228; CHECK-NEXT:    [[RES:%.*]] = fpext float [[EXP2]] to double
229; CHECK-NEXT:    ret double [[RES]]
230;
231  %subfp = uitofp i16 %x to float
232  %pow = tail call fast float @llvm.pow.f32(float 7.000000e+00, float %subfp)
233  %res = fpext float %pow to double
234  ret double %res
235}
236
237define double @pow_uitofp_const_base_2_fast_i16(i16 %x) {
238; CHECK-LABEL: @pow_uitofp_const_base_2_fast_i16(
239; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float
240; CHECK-NEXT:    [[EXP2:%.*]] = tail call fast float @llvm.exp2.f32(float [[SUBFP]])
241; CHECK-NEXT:    [[RES:%.*]] = fpext float [[EXP2]] to double
242; CHECK-NEXT:    ret double [[RES]]
243;
244  %subfp = uitofp i16 %x to float
245  %pow = tail call fast float @llvm.pow.f32(float 2.000000e+00, float %subfp)
246  %res = fpext float %pow to double
247  ret double %res
248}
249
250define double @pow_uitofp_const_base_power_of_2_fast_i16(i16 %x) {
251; CHECK-LABEL: @pow_uitofp_const_base_power_of_2_fast_i16(
252; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float
253; CHECK-NEXT:    [[MUL:%.*]] = fmul fast float [[SUBFP]], 4.000000e+00
254; CHECK-NEXT:    [[EXP2:%.*]] = tail call fast float @llvm.exp2.f32(float [[MUL]])
255; CHECK-NEXT:    [[RES:%.*]] = fpext float [[EXP2]] to double
256; CHECK-NEXT:    ret double [[RES]]
257;
258  %subfp = uitofp i16 %x to float
259  %pow = tail call fast float @llvm.pow.f32(float 16.000000e+00, float %subfp)
260  %res = fpext float %pow to double
261  ret double %res
262}
263
264define double @pow_uitofp_float_base_fast_i16(float %base, i16 %x) {
265; CHECK-LABEL: @pow_uitofp_float_base_fast_i16(
266; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float
267; CHECK-NEXT:    [[POW:%.*]] = tail call fast float @llvm.pow.f32(float [[BASE:%.*]], float [[SUBFP]])
268; CHECK-NEXT:    [[RES:%.*]] = fpext float [[POW]] to double
269; CHECK-NEXT:    ret double [[RES]]
270;
271  %subfp = uitofp i16 %x to float
272  %pow = tail call fast float @llvm.pow.f32(float %base, float %subfp)
273  %res = fpext float %pow to double
274  ret double %res
275}
276
277define double @pow_uitofp_double_base_fast_i16(double %base, i16 %x) {
278; CHECK-LABEL: @pow_uitofp_double_base_fast_i16(
279; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to double
280; CHECK-NEXT:    [[RES:%.*]] = tail call fast double @llvm.pow.f64(double [[BASE:%.*]], double [[SUBFP]])
281; CHECK-NEXT:    ret double [[RES]]
282;
283  %subfp = uitofp i16 %x to double
284  %res = tail call fast double @llvm.pow.f64(double %base, double %subfp)
285  ret double %res
286}
287
288define double @pow_sitofp_const_base_no_fast(i16 %x) {
289; CHECK-LABEL: @pow_sitofp_const_base_no_fast(
290; CHECK-NEXT:    [[SUBFP:%.*]] = sitofp i16 [[X:%.*]] to float
291; CHECK-NEXT:    [[POW:%.*]] = tail call float @llvm.pow.f32(float 7.000000e+00, float [[SUBFP]])
292; CHECK-NEXT:    [[RES:%.*]] = fpext float [[POW]] to double
293; CHECK-NEXT:    ret double [[RES]]
294;
295  %subfp = sitofp i16 %x to float
296  %pow = tail call float @llvm.pow.f32(float 7.000000e+00, float %subfp)
297  %res = fpext float %pow to double
298  ret double %res
299}
300
301define double @pow_uitofp_const_base_no_fast(i16 %x) {
302; CHECK-LABEL: @pow_uitofp_const_base_no_fast(
303; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float
304; CHECK-NEXT:    [[POW:%.*]] = tail call float @llvm.pow.f32(float 7.000000e+00, float [[SUBFP]])
305; CHECK-NEXT:    [[RES:%.*]] = fpext float [[POW]] to double
306; CHECK-NEXT:    ret double [[RES]]
307;
308  %subfp = uitofp i16 %x to float
309  %pow = tail call float @llvm.pow.f32(float 7.000000e+00, float %subfp)
310  %res = fpext float %pow to double
311  ret double %res
312}
313
314define double @pow_sitofp_const_base_2_no_fast(i16 %x) {
315; CHECK-LABEL: @pow_sitofp_const_base_2_no_fast(
316; CHECK-NEXT:    [[LDEXPF:%.*]] = tail call float @llvm.ldexp.f32.i16(float 1.000000e+00, i16 [[X:%.*]])
317; CHECK-NEXT:    [[RES:%.*]] = fpext float [[LDEXPF]] to double
318; CHECK-NEXT:    ret double [[RES]]
319;
320  %subfp = sitofp i16 %x to float
321  %pow = tail call float @llvm.pow.f32(float 2.000000e+00, float %subfp)
322  %res = fpext float %pow to double
323  ret double %res
324}
325
326define double @pow_sitofp_const_base_power_of_2_no_fast(i16 %x) {
327; CHECK-LABEL: @pow_sitofp_const_base_power_of_2_no_fast(
328; CHECK-NEXT:    [[SUBFP:%.*]] = sitofp i16 [[X:%.*]] to float
329; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[SUBFP]], 4.000000e+00
330; CHECK-NEXT:    [[EXP2:%.*]] = tail call float @llvm.exp2.f32(float [[MUL]])
331; CHECK-NEXT:    [[RES:%.*]] = fpext float [[EXP2]] to double
332; CHECK-NEXT:    ret double [[RES]]
333;
334  %subfp = sitofp i16 %x to float
335  %pow = tail call float @llvm.pow.f32(float 16.000000e+00, float %subfp)
336  %res = fpext float %pow to double
337  ret double %res
338}
339
340define double @pow_uitofp_const_base_2_no_fast(i16 %x) {
341; CHECK-LABEL: @pow_uitofp_const_base_2_no_fast(
342; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float
343; CHECK-NEXT:    [[EXP2:%.*]] = tail call float @llvm.exp2.f32(float [[SUBFP]])
344; CHECK-NEXT:    [[RES:%.*]] = fpext float [[EXP2]] to double
345; CHECK-NEXT:    ret double [[RES]]
346;
347  %subfp = uitofp i16 %x to float
348  %pow = tail call float @llvm.pow.f32(float 2.000000e+00, float %subfp)
349  %res = fpext float %pow to double
350  ret double %res
351}
352
353define double @pow_uitofp_const_base_power_of_2_no_fast(i16 %x) {
354; CHECK-LABEL: @pow_uitofp_const_base_power_of_2_no_fast(
355; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float
356; CHECK-NEXT:    [[MUL:%.*]] = fmul float [[SUBFP]], 4.000000e+00
357; CHECK-NEXT:    [[EXP2:%.*]] = tail call float @llvm.exp2.f32(float [[MUL]])
358; CHECK-NEXT:    [[RES:%.*]] = fpext float [[EXP2]] to double
359; CHECK-NEXT:    ret double [[RES]]
360;
361  %subfp = uitofp i16 %x to float
362  %pow = tail call float @llvm.pow.f32(float 16.000000e+00, float %subfp)
363  %res = fpext float %pow to double
364  ret double %res
365}
366
367define double @pow_sitofp_float_base_no_fast(float %base, i16 %x) {
368; CHECK-LABEL: @pow_sitofp_float_base_no_fast(
369; CHECK-NEXT:    [[SUBFP:%.*]] = sitofp i16 [[X:%.*]] to float
370; CHECK-NEXT:    [[POW:%.*]] = tail call float @llvm.pow.f32(float [[BASE:%.*]], float [[SUBFP]])
371; CHECK-NEXT:    [[RES:%.*]] = fpext float [[POW]] to double
372; CHECK-NEXT:    ret double [[RES]]
373;
374  %subfp = sitofp i16 %x to float
375  %pow = tail call float @llvm.pow.f32(float %base, float %subfp)
376  %res = fpext float %pow to double
377  ret double %res
378}
379
380define double @pow_uitofp_float_base_no_fast(float %base, i16 %x) {
381; CHECK-LABEL: @pow_uitofp_float_base_no_fast(
382; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to float
383; CHECK-NEXT:    [[POW:%.*]] = tail call float @llvm.pow.f32(float [[BASE:%.*]], float [[SUBFP]])
384; CHECK-NEXT:    [[RES:%.*]] = fpext float [[POW]] to double
385; CHECK-NEXT:    ret double [[RES]]
386;
387  %subfp = uitofp i16 %x to float
388  %pow = tail call float @llvm.pow.f32(float %base, float %subfp)
389  %res = fpext float %pow to double
390  ret double %res
391}
392
393define double @pow_sitofp_double_base_no_fast(double %base, i16 %x) {
394; CHECK-LABEL: @pow_sitofp_double_base_no_fast(
395; CHECK-NEXT:    [[SUBFP:%.*]] = sitofp i16 [[X:%.*]] to double
396; CHECK-NEXT:    [[POW:%.*]] = tail call double @llvm.pow.f64(double [[BASE:%.*]], double [[SUBFP]])
397; CHECK-NEXT:    ret double [[POW]]
398;
399  %subfp = sitofp i16 %x to double
400  %pow = tail call double @llvm.pow.f64(double %base, double %subfp)
401  ret double %pow
402}
403
404define double @pow_uitofp_double_base_no_fast(double %base, i16 %x) {
405; CHECK-LABEL: @pow_uitofp_double_base_no_fast(
406; CHECK-NEXT:    [[SUBFP:%.*]] = uitofp i16 [[X:%.*]] to double
407; CHECK-NEXT:    [[POW:%.*]] = tail call double @llvm.pow.f64(double [[BASE:%.*]], double [[SUBFP]])
408; CHECK-NEXT:    ret double [[POW]]
409;
410  %subfp = uitofp i16 %x to double
411  %pow = tail call double @llvm.pow.f64(double %base, double %subfp)
412  ret double %pow
413}
414
415; negative test - pow with no FMF is not the same as the loosely-specified powi
416
417define double @powf_exp_const_int_no_fast(double %base) {
418; CHECK-LABEL: @powf_exp_const_int_no_fast(
419; CHECK-NEXT:    [[RES:%.*]] = tail call double @llvm.pow.f64(double [[BASE:%.*]], double 4.000000e+01)
420; CHECK-NEXT:    ret double [[RES]]
421;
422  %res = tail call double @llvm.pow.f64(double %base, double 4.000000e+01)
423  ret double %res
424}
425
426define double @powf_exp_const_not_int_fast(double %base) {
427; CHECK-LABEL: @powf_exp_const_not_int_fast(
428; CHECK-NEXT:    [[SQRT:%.*]] = call fast double @llvm.sqrt.f64(double [[BASE:%.*]])
429; CHECK-NEXT:    [[POWI:%.*]] = tail call fast double @llvm.powi.f64.i16(double [[BASE]], i16 37)
430; CHECK-NEXT:    [[RES:%.*]] = fmul fast double [[POWI]], [[SQRT]]
431; CHECK-NEXT:    ret double [[RES]]
432;
433  %res = tail call fast double @llvm.pow.f64(double %base, double 3.750000e+01)
434  ret double %res
435}
436
437define double @powf_exp_const_not_int_no_fast(double %base) {
438; CHECK-LABEL: @powf_exp_const_not_int_no_fast(
439; CHECK-NEXT:    [[RES:%.*]] = tail call double @llvm.pow.f64(double [[BASE:%.*]], double 3.750000e+01)
440; CHECK-NEXT:    ret double [[RES]]
441;
442  %res = tail call double @llvm.pow.f64(double %base, double 3.750000e+01)
443  ret double %res
444}
445
446; negative test - pow with no FMF is not the same as the loosely-specified powi
447
448define double @powf_exp_const2_int_no_fast(double %base) {
449; CHECK-LABEL: @powf_exp_const2_int_no_fast(
450; CHECK-NEXT:    [[RES:%.*]] = tail call double @llvm.pow.f64(double [[BASE:%.*]], double -4.000000e+01)
451; CHECK-NEXT:    ret double [[RES]]
452;
453  %res = tail call double @llvm.pow.f64(double %base, double -4.000000e+01)
454  ret double %res
455}
456
457declare float @llvm.pow.f32(float, float)
458declare double @llvm.pow.f64(double, double)
459