Skip to content

Commit

Permalink
[SimplifyLibCalls] pow(x, -0.5) -> 1.0 / sqrt(x).
Browse files Browse the repository at this point in the history
Differential Revision:  https://reviews.llvm.org/D28479

llvm-svn: 291486
  • Loading branch information
dcci committed Jan 9, 2017
1 parent d4b24ed commit 472684e
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 1 deletion.
18 changes: 18 additions & 0 deletions llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
Expand Up @@ -1074,6 +1074,24 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {
if (Op2C->getValueAPF().isZero()) // pow(x, 0.0) -> 1.0
return ConstantFP::get(CI->getType(), 1.0);

if (Op2C->isExactlyValue(-0.5) &&
hasUnaryFloatFn(TLI, Op2->getType(), LibFunc::sqrt, LibFunc::sqrtf,
LibFunc::sqrtl)) {
// If -ffast-math:
// pow(x, -0.5) -> 1.0 / sqrt(x)
if (CI->hasUnsafeAlgebra()) {
IRBuilder<>::FastMathFlagGuard Guard(B);
B.setFastMathFlags(CI->getFastMathFlags());

// Here we cannot lower to an intrinsic because C99 sqrt() and llvm.sqrt
// are not guaranteed to have the same semantics.
Value *Sqrt = emitUnaryFloatFnCall(Op1, TLI->getName(LibFunc::sqrt), B,
Callee->getAttributes());

return B.CreateFDiv(ConstantFP::get(CI->getType(), 1.0), Sqrt, "sqrtrecip");
}
}

if (Op2C->isExactlyValue(0.5) &&
hasUnaryFloatFn(TLI, Op2->getType(), LibFunc::sqrt, LibFunc::sqrtf,
LibFunc::sqrtl) &&
Expand Down
11 changes: 10 additions & 1 deletion llvm/test/Transforms/InstCombine/pow-sqrt.ll
Expand Up @@ -9,5 +9,14 @@ define double @pow_half(double %x) {
; CHECK-NEXT: %sqrt = call fast double @sqrt(double %x)
; CHECK-NEXT: ret double %sqrt

declare double @llvm.pow.f64(double, double)
define double @pow_neghalf(double %x) {
%pow = call fast double @llvm.pow.f64(double %x, double -5.000000e-01)
ret double %pow
}

; CHECK-LABEL: define double @pow_neghalf(
; CHECK-NEXT: %sqrt = call fast double @sqrt(double %x) #0
; CHECK-NEXT: %sqrtrecip = fdiv fast double 1.000000e+00, %sqrt
; CHECK-NEXT: ret double %sqrtrecip

declare double @llvm.pow.f64(double, double)

0 comments on commit 472684e

Please sign in to comment.