Revert "[InstCombine] Support gep nuw in icmp folds" (#118698)
[llvm-project.git] / llvm / test / Transforms / InstCombine / pow_fp_int16.ll
blob8ba6b8a699ba90116734a93934bb8c0469d55d83
1 ; RUN: opt -mtriple msp430 -passes=instcombine -S < %s | FileCheck %s
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).
6 define 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]]
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
18 define 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]]
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
31 define 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]]
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
41 define 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]]
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
52 define 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]]
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
64 define 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]]
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
78 define 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]]
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
91 define 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]]
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
105 define 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]]
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
117 define 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]]
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
130 define 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]]
135   %subfp = sitofp i16 %x to double
136   %res = tail call afn double @llvm.pow.f64(double %base, double %subfp)
137   ret double %res
140 define 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]]
146   %subfp = uitofp i15 %x to double
147   %res = tail call afn double @llvm.pow.f64(double %base, double %subfp)
148   ret double %res
151 define 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]]
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
164 define 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]]
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
177 define 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]]
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
190 define 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]]
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
203 define 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]]
208   %res = tail call fast double @llvm.pow.f64(double %base, double 4.000000e+01)
209   ret double %res
212 define 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]]
217   %res = tail call fast double @llvm.pow.f64(double %base, double -4.000000e+01)
218   ret double %res
221 ; Negative tests
223 define 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]]
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
237 define 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]]
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
250 define 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]]
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
264 define 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]]
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
277 define 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]]
283   %subfp = uitofp i16 %x to double
284   %res = tail call fast double @llvm.pow.f64(double %base, double %subfp)
285   ret double %res
288 define 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]]
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
301 define 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]]
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
314 define 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]]
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
326 define 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]]
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
340 define 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]]
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
353 define 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]]
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
367 define 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]]
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
380 define 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]]
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
393 define 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]]
399   %subfp = sitofp i16 %x to double
400   %pow = tail call double @llvm.pow.f64(double %base, double %subfp)
401   ret double %pow
404 define 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]]
410   %subfp = uitofp i16 %x to double
411   %pow = tail call double @llvm.pow.f64(double %base, double %subfp)
412   ret double %pow
415 ; negative test - pow with no FMF is not the same as the loosely-specified powi
417 define 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]]
422   %res = tail call double @llvm.pow.f64(double %base, double 4.000000e+01)
423   ret double %res
426 define 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]]
433   %res = tail call fast double @llvm.pow.f64(double %base, double 3.750000e+01)
434   ret double %res
437 define 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]]
442   %res = tail call double @llvm.pow.f64(double %base, double 3.750000e+01)
443   ret double %res
446 ; negative test - pow with no FMF is not the same as the loosely-specified powi
448 define 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]]
453   %res = tail call double @llvm.pow.f64(double %base, double -4.000000e+01)
454   ret double %res
457 declare float @llvm.pow.f32(float, float)
458 declare double @llvm.pow.f64(double, double)