summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
diff options
context:
space:
mode:
authorEvandro Menezes <e.menezes@samsung.com>2018-08-06 19:40:17 +0000
committerEvandro Menezes <e.menezes@samsung.com>2018-08-06 19:40:17 +0000
commit6e137cb9f0a2b83001f3f81c5923d1c6f638aab4 (patch)
treebbac1ffebaf221597b1dad498a569fa2f8bbe8f3 /llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
parent741cc3531a6a372f8b5524362eb7930905e983bb (diff)
downloadbcm5719-llvm-6e137cb9f0a2b83001f3f81c5923d1c6f638aab4.tar.gz
bcm5719-llvm-6e137cb9f0a2b83001f3f81c5923d1c6f638aab4.zip
[SLC] Fix shrinking of pow()
Properly shrink `pow()` to `powf()` as a binary function and, when no other simplification applies, do not discard it. Differential revision: https://reviews.llvm.org/D50113 llvm-svn: 339046
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp30
1 files changed, 17 insertions, 13 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index f378b0d4b1a..33371e71b91 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -965,12 +965,14 @@ static Value *valueHasFloatPrecision(Value *Val) {
/// Shrink double -> float functions.
static Value *optimizeDoubleFP(CallInst *CI, IRBuilder<> &B,
- bool isBinary, bool doResultCheck = false) {
+ bool isBinary, bool isPrecise = false) {
if (!CI->getType()->isDoubleTy())
return nullptr;
- // Check if all the uses of the function are converted to float.
- if (doResultCheck)
+ // If not all the uses of the function are converted to float, then bail out.
+ // This matters if the precision of the result is more important than the
+ // precision of the arguments.
+ if (isPrecise)
for (User *U : CI->users()) {
FPTruncInst *Cast = dyn_cast<FPTruncInst>(U);
if (!Cast || !Cast->getType()->isFloatTy())
@@ -1022,14 +1024,14 @@ static Value *optimizeDoubleFP(CallInst *CI, IRBuilder<> &B,
/// Shrink double -> float for unary functions.
static Value *optimizeUnaryDoubleFP(CallInst *CI, IRBuilder<> &B,
- bool doResultCheck = false) {
- return optimizeDoubleFP(CI, B, false, doResultCheck);
+ bool isPrecise = false) {
+ return optimizeDoubleFP(CI, B, false, isPrecise);
}
/// Shrink double -> float for binary functions.
static Value *optimizeBinaryDoubleFP(CallInst *CI, IRBuilder<> &B,
- bool doResultCheck = false) {
- return optimizeDoubleFP(CI, B, true, doResultCheck);
+ bool isPrecise = false) {
+ return optimizeDoubleFP(CI, B, true, isPrecise);
}
// cabs(z) -> sqrt((creal(z)*creal(z)) + (cimag(z)*cimag(z)))
@@ -1150,14 +1152,16 @@ Value *LibCallSimplifier::optimizePow(CallInst *Pow, IRBuilder<> &B) {
Value *Shrunk = nullptr;
bool Ignored;
- if (UnsafeFPShrink &&
- Name == TLI->getName(LibFunc_pow) && hasFloatVersion(Name))
- Shrunk = optimizeUnaryDoubleFP(Pow, B, true);
-
// Propagate the math semantics from the call to any created instructions.
IRBuilder<>::FastMathFlagGuard Guard(B);
B.setFastMathFlags(Pow->getFastMathFlags());
+ // Shrink pow() to powf() if the arguments are single precision,
+ // unless the result is expected to be double precision.
+ if (UnsafeFPShrink &&
+ Name == TLI->getName(LibFunc_pow) && hasFloatVersion(Name))
+ Shrunk = optimizeBinaryDoubleFP(Pow, B, true);
+
// Evaluate special cases related to the base.
// pow(1.0, x) -> 1.0
@@ -1252,7 +1256,7 @@ Value *LibCallSimplifier::optimizePow(CallInst *Pow, IRBuilder<> &B) {
if (!ExpoA.isInteger() ||
ExpoA.compare
(APFloat(ExpoA.getSemantics(), 32.0)) == APFloat::cmpGreaterThan)
- return nullptr;
+ return Shrunk;
// We will memoize intermediate products of the Addition Chain.
Value *InnerChain[33] = {nullptr};
@@ -1270,7 +1274,7 @@ Value *LibCallSimplifier::optimizePow(CallInst *Pow, IRBuilder<> &B) {
return FMul;
}
- return nullptr;
+ return Shrunk;
}
Value *LibCallSimplifier::optimizeExp2(CallInst *CI, IRBuilder<> &B) {
OpenPOWER on IntegriCloud