[PATCH] D14466: [SimplifyLibCalls] pow(x, 0.5) -> sqrt(x) in fast-math mode
Davide Italiano via llvm-commits
llvm-commits at lists.llvm.org
Wed Nov 18 15:24:13 PST 2015
This revision was automatically updated to reflect the committed changes.
Closed by commit rL253521: [SimplifyLibCalls] New trick: pow(x, 0.5) -> sqrt(x) under -ffast-math. (authored by davide).
Changed prior to commit:
http://reviews.llvm.org/D14466?vs=39591&id=40572#toc
Repository:
rL LLVM
http://reviews.llvm.org/D14466
Files:
llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
llvm/trunk/test/Transforms/InstCombine/pow-sqrt.ll
Index: llvm/trunk/test/Transforms/InstCombine/pow-sqrt.ll
===================================================================
--- llvm/trunk/test/Transforms/InstCombine/pow-sqrt.ll
+++ llvm/trunk/test/Transforms/InstCombine/pow-sqrt.ll
@@ -0,0 +1,15 @@
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+define double @mypow(double %x) #0 {
+entry:
+ %pow = call double @llvm.pow.f64(double %x, double 5.000000e-01)
+ ret double %pow
+}
+
+; CHECK-LABEL: define double @mypow(
+; CHECK: %sqrt = call double @sqrt(double %x) #1
+; CHECK: ret double %sqrt
+; CHECK: }
+
+declare double @llvm.pow.f64(double, double)
+attributes #0 = { "unsafe-fp-math"="true" }
Index: llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
===================================================================
--- llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ llvm/trunk/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -1096,14 +1096,16 @@
Callee->getAttributes());
}
+ bool unsafeFPMath = canUseUnsafeFPMath(CI->getParent()->getParent());
+
// pow(exp(x), y) -> exp(x*y)
// pow(exp2(x), y) -> exp2(x * y)
// We enable these only under fast-math. Besides rounding
// differences the transformation changes overflow and
// underflow behavior quite dramatically.
// Example: x = 1000, y = 0.001.
// pow(exp(x), y) = pow(inf, 0.001) = inf, whereas exp(x*y) = exp(1).
- if (canUseUnsafeFPMath(CI->getParent()->getParent())) {
+ if (unsafeFPMath) {
if (auto *OpC = dyn_cast<CallInst>(Op1)) {
IRBuilder<>::FastMathFlagGuard Guard(B);
FastMathFlags FMF;
@@ -1134,10 +1136,15 @@
LibFunc::sqrtl) &&
hasUnaryFloatFn(TLI, Op2->getType(), LibFunc::fabs, LibFunc::fabsf,
LibFunc::fabsl)) {
+
+ // In -ffast-math, pow(x, 0.5) -> sqrt(x).
+ if (unsafeFPMath)
+ return EmitUnaryFloatFnCall(Op1, TLI->getName(LibFunc::sqrt), B,
+ Callee->getAttributes());
+
// Expand pow(x, 0.5) to (x == -infinity ? +infinity : fabs(sqrt(x))).
// This is faster than calling pow, and still handles negative zero
// and negative infinity correctly.
- // TODO: In fast-math mode, this could be just sqrt(x).
// TODO: In finite-only mode, this could be just fabs(sqrt(x)).
Value *Inf = ConstantFP::getInfinity(CI->getType());
Value *NegInf = ConstantFP::getInfinity(CI->getType(), true);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D14466.40572.patch
Type: text/x-patch
Size: 2457 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20151118/f1c5d8b5/attachment.bin>
More information about the llvm-commits
mailing list