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