forked from OSchip/llvm-project
[SimplifyLibCalls] pow(x, -0.5) -> 1.0 / sqrt(x).
Differential Revision: https://reviews.llvm.org/D28479 llvm-svn: 291486
This commit is contained in:
parent
d4b24eda73
commit
472684eaf5
|
@ -1074,6 +1074,24 @@ Value *LibCallSimplifier::optimizePow(CallInst *CI, IRBuilder<> &B) {
|
||||||
if (Op2C->getValueAPF().isZero()) // pow(x, 0.0) -> 1.0
|
if (Op2C->getValueAPF().isZero()) // pow(x, 0.0) -> 1.0
|
||||||
return ConstantFP::get(CI->getType(), 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) &&
|
if (Op2C->isExactlyValue(0.5) &&
|
||||||
hasUnaryFloatFn(TLI, Op2->getType(), LibFunc::sqrt, LibFunc::sqrtf,
|
hasUnaryFloatFn(TLI, Op2->getType(), LibFunc::sqrt, LibFunc::sqrtf,
|
||||||
LibFunc::sqrtl) &&
|
LibFunc::sqrtl) &&
|
||||||
|
|
|
@ -9,5 +9,14 @@ define double @pow_half(double %x) {
|
||||||
; CHECK-NEXT: %sqrt = call fast double @sqrt(double %x)
|
; CHECK-NEXT: %sqrt = call fast double @sqrt(double %x)
|
||||||
; CHECK-NEXT: ret double %sqrt
|
; 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)
|
||||||
|
|
Loading…
Reference in New Issue