xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/pow-4.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; Test that the pow library call simplifier works correctly.
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; RUN: opt -instcombine -S < %s | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone
6*9880d681SAndroid Build Coastguard Workerdeclare double @llvm.pow.f64(double, double)
7*9880d681SAndroid Build Coastguard Workerdeclare float @llvm.pow.f32(float, float)
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; pow(x, 4.0f)
10*9880d681SAndroid Build Coastguard Workerdefine float @test_simplify_4f(float %x) {
11*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify_4f(
12*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pow
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = fmul float %x, %x
14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = fmul float %1, %1
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float %2
16*9880d681SAndroid Build Coastguard Worker  %1 = call fast float @llvm.pow.f32(float %x, float 4.000000e+00)
17*9880d681SAndroid Build Coastguard Worker  ret float %1
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker; pow(x, 3.0)
21*9880d681SAndroid Build Coastguard Workerdefine double @test_simplify_3(double %x) {
22*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify_3(
23*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pow
24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = fmul double %x, %x
25*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = fmul double %1, %x
26*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %2
27*9880d681SAndroid Build Coastguard Worker  %1 = call fast double @llvm.pow.f64(double %x, double 3.000000e+00)
28*9880d681SAndroid Build Coastguard Worker  ret double %1
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; pow(x, 4.0)
32*9880d681SAndroid Build Coastguard Workerdefine double @test_simplify_4(double %x) {
33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify_4(
34*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pow
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = fmul double %x, %x
36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = fmul double %1, %1
37*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %2
38*9880d681SAndroid Build Coastguard Worker  %1 = call fast double @llvm.pow.f64(double %x, double 4.000000e+00)
39*9880d681SAndroid Build Coastguard Worker  ret double %1
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker; pow(x, 15.0)
43*9880d681SAndroid Build Coastguard Workerdefine double @test_simplify_15(double %x) {
44*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify_15(
45*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pow
46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = fmul double %x, %x
47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = fmul double %1, %x
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %3 = fmul double %2, %2
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %4 = fmul double %3, %3
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %5 = fmul double %2, %4
51*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %5
52*9880d681SAndroid Build Coastguard Worker  %1 = call fast double @llvm.pow.f64(double %x, double 1.500000e+01)
53*9880d681SAndroid Build Coastguard Worker  ret double %1
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Worker; pow(x, -7.0)
57*9880d681SAndroid Build Coastguard Workerdefine double @test_simplify_neg_7(double %x) {
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify_neg_7(
59*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pow
60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = fmul double %x, %x
61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = fmul double %1, %x
62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %3 = fmul double %1, %2
63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %4 = fmul double %1, %3
64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %5 = fdiv double 1.000000e+00, %4
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %5
66*9880d681SAndroid Build Coastguard Worker  %1 = call fast double @llvm.pow.f64(double %x, double -7.000000e+00)
67*9880d681SAndroid Build Coastguard Worker  ret double %1
68*9880d681SAndroid Build Coastguard Worker}
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Worker; pow(x, -19.0)
71*9880d681SAndroid Build Coastguard Workerdefine double @test_simplify_neg_19(double %x) {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify_neg_19(
73*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pow
74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = fmul double %x, %x
75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = fmul double %1, %1
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %3 = fmul double %2, %2
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %4 = fmul double %3, %3
78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %5 = fmul double %1, %4
79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %6 = fmul double %5, %x
80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %7 = fdiv double 1.000000e+00, %6
81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %7
82*9880d681SAndroid Build Coastguard Worker  %1 = call fast double @llvm.pow.f64(double %x, double -1.900000e+01)
83*9880d681SAndroid Build Coastguard Worker  ret double %1
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; pow(x, 11.23)
87*9880d681SAndroid Build Coastguard Workerdefine double @test_simplify_11_23(double %x) {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify_11_23(
89*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmul
90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = call fast double @llvm.pow.f64(double %x, double 1.123000e+01)
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %1
92*9880d681SAndroid Build Coastguard Worker  %1 = call fast double @llvm.pow.f64(double %x, double 1.123000e+01)
93*9880d681SAndroid Build Coastguard Worker  ret double %1
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; pow(x, 32.0)
97*9880d681SAndroid Build Coastguard Workerdefine double @test_simplify_32(double %x) {
98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify_32(
99*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: pow
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = fmul double %x, %x
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %2 = fmul double %1, %1
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %3 = fmul double %2, %2
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %4 = fmul double %3, %3
104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %5 = fmul double %4, %4
105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %5
106*9880d681SAndroid Build Coastguard Worker  %1 = call fast double @llvm.pow.f64(double %x, double 3.200000e+01)
107*9880d681SAndroid Build Coastguard Worker  ret double %1
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; pow(x, 33.0)
111*9880d681SAndroid Build Coastguard Workerdefine double @test_simplify_33(double %x) {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify_33(
113*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: fmul
114*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = call fast double @llvm.pow.f64(double %x, double 3.300000e+01)
115*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret double %1
116*9880d681SAndroid Build Coastguard Worker  %1 = call fast double @llvm.pow.f64(double %x, double 3.300000e+01)
117*9880d681SAndroid Build Coastguard Worker  ret double %1
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120