Home | History | Annotate | Download | only in InstCombine
      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" }
    121