diff options
| author | Davide Italiano <davide@freebsd.org> | 2015-11-03 20:32:23 +0000 |
|---|---|---|
| committer | Davide Italiano <davide@freebsd.org> | 2015-11-03 20:32:23 +0000 |
| commit | c8a7913f23460112182b5216fa2cde084886cad4 (patch) | |
| tree | 185f7290a7891906d1949db19f21cd2105f57683 /llvm/test | |
| parent | e88dc04c4854124c6cf4c2d0fc554029ea190846 (diff) | |
| download | bcm5719-llvm-c8a7913f23460112182b5216fa2cde084886cad4.tar.gz bcm5719-llvm-c8a7913f23460112182b5216fa2cde084886cad4.zip | |
[SimplifyLibCalls] Add a new transformation: pow(exp(x), y) -> exp(x*y)
This one is enabled only under -ffast-math (due to rounding/overflows)
but allows us to emit shorter code.
Before (on FreeBSD x86-64):
4007f0: 50 push %rax
4007f1: f2 0f 11 0c 24 movsd %xmm1,(%rsp)
4007f6: e8 75 fd ff ff callq 400570 <exp2@plt>
4007fb: f2 0f 10 0c 24 movsd (%rsp),%xmm1
400800: 58 pop %rax
400801: e9 7a fd ff ff jmpq 400580 <pow@plt>
400806: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
40080d: 00 00 00
After:
4007b0: f2 0f 59 c1 mulsd %xmm1,%xmm0
4007b4: e9 87 fd ff ff jmpq 400540 <exp2@plt>
4007b9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
Differential Revision: http://reviews.llvm.org/D14045
llvm-svn: 251976
Diffstat (limited to 'llvm/test')
| -rw-r--r-- | llvm/test/Transforms/InstCombine/pow-exp-nofastmath.ll | 17 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/pow-exp.ll | 19 | ||||
| -rw-r--r-- | llvm/test/Transforms/InstCombine/pow-exp2.ll | 19 |
3 files changed, 55 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/pow-exp-nofastmath.ll b/llvm/test/Transforms/InstCombine/pow-exp-nofastmath.ll new file mode 100644 index 00000000000..9e596fa3a72 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/pow-exp-nofastmath.ll @@ -0,0 +1,17 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +define double @mypow(double %x, double %y) #0 { +entry: + %call = call double @exp(double %x) + %pow = call double @llvm.pow.f64(double %call, double %y) + ret double %pow +} + +; CHECK-LABEL: define double @mypow( +; CHECK: %call = call double @exp(double %x) +; CHECK: %pow = call double @llvm.pow.f64(double %call, double %y) +; CHECK: ret double %pow +; CHECK: } + +declare double @exp(double) #1 +declare double @llvm.pow.f64(double, double) diff --git a/llvm/test/Transforms/InstCombine/pow-exp.ll b/llvm/test/Transforms/InstCombine/pow-exp.ll new file mode 100644 index 00000000000..62e6fb4f3a3 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/pow-exp.ll @@ -0,0 +1,19 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +define double @mypow(double %x, double %y) #0 { +entry: + %call = call double @exp(double %x) + %pow = call double @llvm.pow.f64(double %call, double %y) + ret double %pow +} + +; CHECK-LABEL: define double @mypow( +; CHECK: %mul = fmul fast double %x, %y +; CHECK: %exp = call double @exp(double %mul) #0 +; CHECK: ret double %exp +; CHECK: } + +declare double @exp(double) #1 +declare double @llvm.pow.f64(double, double) +attributes #0 = { "unsafe-fp-math"="true" } +attributes #1 = { "unsafe-fp-math"="true" } diff --git a/llvm/test/Transforms/InstCombine/pow-exp2.ll b/llvm/test/Transforms/InstCombine/pow-exp2.ll new file mode 100644 index 00000000000..ad7931c07a6 --- /dev/null +++ b/llvm/test/Transforms/InstCombine/pow-exp2.ll @@ -0,0 +1,19 @@ +; RUN: opt < %s -instcombine -S | FileCheck %s + +define double @mypow(double %x, double %y) #0 { +entry: + %call = call double @exp2(double %x) + %pow = call double @llvm.pow.f64(double %call, double %y) + ret double %pow +} + +; CHECK-LABEL: define double @mypow( +; CHECK: %mul = fmul fast double %x, %y +; CHECK: %exp2 = call double @exp2(double %mul) #0 +; CHECK: ret double %exp2 +; CHECK: } + +declare double @exp2(double) #1 +declare double @llvm.pow.f64(double, double) +attributes #0 = { "unsafe-fp-math"="true" } +attributes #1 = { "unsafe-fp-math"="true" } |

