1 ; Test that the pow library call simplifier works correctly.
3 ; RUN: opt -instcombine -S < %s | FileCheck %s
5 ; Function Attrs: nounwind readnone
6 declare double @llvm.pow.f64(double, double)
7 declare float @llvm.pow.f32(float, float)
10 define float @test_simplify_4f(float %x) #0 {
11 ; CHECK-LABEL: @test_simplify_4f(
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)
21 define double @test_simplify_3(double %x) #0 {
22 ; CHECK-LABEL: @test_simplify_3(
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)
32 define double @test_simplify_4(double %x) #0 {
33 ; CHECK-LABEL: @test_simplify_4(
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)
43 define double @test_simplify_15(double %x) #0 {
44 ; CHECK-LABEL: @test_simplify_15(
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)
57 define double @test_simplify_neg_7(double %x) #0 {
58 ; CHECK-LABEL: @test_simplify_neg_7(
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)
71 define double @test_simplify_neg_19(double %x) #0 {
72 ; CHECK-LABEL: @test_simplify_neg_19(
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)
87 define double @test_simplify_11_23(double %x) #0 {
88 ; CHECK-LABEL: @test_simplify_11_23(
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)
97 define double @test_simplify_32(double %x) #0 {
98 ; CHECK-LABEL: @test_simplify_32(
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)
111 define double @test_simplify_33(double %x) #0 {
112 ; CHECK-LABEL: @test_simplify_33(
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)
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" }