Add/edit tests to include instruction-level FMF on calls
[oota-llvm.git] / test / Transforms / InstCombine / pow-4.ll
1 ; Test that the pow library call simplifier works correctly.
2
3 ; RUN: opt -instcombine -S < %s | FileCheck %s
4
5 ; Function Attrs: nounwind readnone
6 declare double @llvm.pow.f64(double, double)
7 declare float @llvm.pow.f32(float, float)
8
9 ; pow(x, 4.0f)
10 define float @test_simplify_4f(float %x) #0 {
11 ; CHECK-LABEL: @test_simplify_4f(
12 ; CHECK-NOT: pow
13 ; CHECK-NEXT: %1 = fmul float %x, %x
14 ; CHECK-NEXT: %2 = fmul float %1, %1
15 ; CHECK-NEXT: ret float %2
16   %1 = call float @llvm.pow.f32(float %x, float 4.000000e+00)
17   ret float %1
18 }
19
20 ; pow(x, 3.0)
21 define double @test_simplify_3(double %x) #0 {
22 ; CHECK-LABEL: @test_simplify_3(
23 ; CHECK-NOT: pow
24 ; CHECK-NEXT: %1 = fmul double %x, %x
25 ; CHECK-NEXT: %2 = fmul double %1, %x
26 ; CHECK-NEXT: ret double %2
27   %1 = call double @llvm.pow.f64(double %x, double 3.000000e+00)
28   ret double %1
29 }
30
31 ; pow(x, 4.0)
32 define double @test_simplify_4(double %x) #0 {
33 ; CHECK-LABEL: @test_simplify_4(
34 ; CHECK-NOT: pow
35 ; CHECK-NEXT: %1 = fmul double %x, %x
36 ; CHECK-NEXT: %2 = fmul double %1, %1
37 ; CHECK-NEXT: ret double %2
38   %1 = call double @llvm.pow.f64(double %x, double 4.000000e+00)
39   ret double %1
40 }
41
42 ; pow(x, 15.0)
43 define double @test_simplify_15(double %x) #0 {
44 ; CHECK-LABEL: @test_simplify_15(
45 ; CHECK-NOT: pow
46 ; CHECK-NEXT: %1 = fmul double %x, %x
47 ; CHECK-NEXT: %2 = fmul double %1, %x
48 ; CHECK-NEXT: %3 = fmul double %2, %2
49 ; CHECK-NEXT: %4 = fmul double %3, %3
50 ; CHECK-NEXT: %5 = fmul double %2, %4
51 ; CHECK-NEXT: ret double %5
52   %1 = call double @llvm.pow.f64(double %x, double 1.500000e+01)
53   ret double %1
54 }
55
56 ; pow(x, -7.0)
57 define double @test_simplify_neg_7(double %x) #0 {
58 ; CHECK-LABEL: @test_simplify_neg_7(
59 ; CHECK-NOT: pow
60 ; CHECK-NEXT: %1 = fmul double %x, %x
61 ; CHECK-NEXT: %2 = fmul double %1, %x
62 ; CHECK-NEXT: %3 = fmul double %1, %2
63 ; CHECK-NEXT: %4 = fmul double %1, %3
64 ; CHECK-NEXT: %5 = fdiv double 1.000000e+00, %4
65 ; CHECK-NEXT: ret double %5
66   %1 = call double @llvm.pow.f64(double %x, double -7.000000e+00)
67   ret double %1
68 }
69
70 ; pow(x, -19.0)
71 define double @test_simplify_neg_19(double %x) #0 {
72 ; CHECK-LABEL: @test_simplify_neg_19(
73 ; CHECK-NOT: pow
74 ; CHECK-NEXT: %1 = fmul double %x, %x
75 ; CHECK-NEXT: %2 = fmul double %1, %1
76 ; CHECK-NEXT: %3 = fmul double %2, %2
77 ; CHECK-NEXT: %4 = fmul double %3, %3
78 ; CHECK-NEXT: %5 = fmul double %1, %4
79 ; CHECK-NEXT: %6 = fmul double %5, %x
80 ; CHECK-NEXT: %7 = fdiv double 1.000000e+00, %6
81 ; CHECK-NEXT: ret double %7
82   %1 = call double @llvm.pow.f64(double %x, double -1.900000e+01)
83   ret double %1
84 }
85
86 ; pow(x, 11.23)
87 define double @test_simplify_11_23(double %x) #0 {
88 ; CHECK-LABEL: @test_simplify_11_23(
89 ; CHECK-NOT: fmul
90 ; CHECK-NEXT: %1 = call double @llvm.pow.f64(double %x, double 1.123000e+01)
91 ; CHECK-NEXT: ret double %1
92   %1 = call double @llvm.pow.f64(double %x, double 1.123000e+01)
93   ret double %1
94 }
95
96 ; pow(x, 32.0)
97 define double @test_simplify_32(double %x) #0 {
98 ; CHECK-LABEL: @test_simplify_32(
99 ; CHECK-NOT: pow
100 ; CHECK-NEXT: %1 = fmul double %x, %x
101 ; CHECK-NEXT: %2 = fmul double %1, %1
102 ; CHECK-NEXT: %3 = fmul double %2, %2
103 ; CHECK-NEXT: %4 = fmul double %3, %3
104 ; CHECK-NEXT: %5 = fmul double %4, %4
105 ; CHECK-NEXT: ret double %5
106   %1 = call double @llvm.pow.f64(double %x, double 3.200000e+01)
107   ret double %1
108 }
109
110 ; pow(x, 33.0)
111 define double @test_simplify_33(double %x) #0 {
112 ; CHECK-LABEL: @test_simplify_33(
113 ; CHECK-NOT: fmul
114 ; CHECK-NEXT: %1 = call double @llvm.pow.f64(double %x, double 3.300000e+01)
115 ; CHECK-NEXT: ret double %1
116   %1 = call double @llvm.pow.f64(double %x, double 3.300000e+01)
117   ret double %1
118 }
119
120 attributes #0 = { nounwind readnone "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="true" "no-nans-fp-math"="true" "stack-protector-buffer-size"="8" "target-cpu"="generic" "target-features"="+neon" "unsafe-fp-math"="true" "use-soft-float"="false" }