summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorDmitry Venikov <quolyk@gmail.com>2018-01-03 14:37:42 +0000
committerDmitry Venikov <quolyk@gmail.com>2018-01-03 14:37:42 +0000
commit3d8cd34a5df84e94b7d7d437711f2cf7a8f416af (patch)
tree5a0893d19fdb9a545aa5f33c2f754055f4b3a31f /llvm/lib
parent1d18713486a076634a289f6b47f7eb8679a0e3fb (diff)
downloadbcm5719-llvm-3d8cd34a5df84e94b7d7d437711f2cf7a8f416af.tar.gz
bcm5719-llvm-3d8cd34a5df84e94b7d7d437711f2cf7a8f416af.zip
[InstSimplify] Missed optimization in math expression: squashing exp(log), log(exp)
Summary: This patch enables folding following expressions under -ffast-math flag: exp(log(x)) -> x, exp2(log2(x)) -> x, log(exp(x)) -> x, log2(exp2(x)) -> x Reviewers: spatel, hfinkel, davide Reviewed By: spatel, hfinkel, davide Subscribers: scanon, llvm-commits Differential Revision: https://reviews.llvm.org/D41381 llvm-svn: 321710
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp39
1 files changed, 33 insertions, 6 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 882d2ce86b1..f382a1f5018 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -4493,28 +4493,55 @@ static Value *SimplifyIntrinsic(Function *F, IterTy ArgBegin, IterTy ArgEnd,
}
}
+ Value *IIOperand = *ArgBegin;
+ Value *X;
switch (IID) {
case Intrinsic::fabs: {
- if (SignBitMustBeZero(*ArgBegin, Q.TLI))
- return *ArgBegin;
+ if (SignBitMustBeZero(IIOperand, Q.TLI))
+ return IIOperand;
return nullptr;
}
case Intrinsic::bswap: {
- Value *IIOperand = *ArgBegin;
- Value *X = nullptr;
// bswap(bswap(x)) -> x
if (match(IIOperand, m_BSwap(m_Value(X))))
return X;
return nullptr;
}
case Intrinsic::bitreverse: {
- Value *IIOperand = *ArgBegin;
- Value *X = nullptr;
// bitreverse(bitreverse(x)) -> x
if (match(IIOperand, m_BitReverse(m_Value(X))))
return X;
return nullptr;
}
+ case Intrinsic::exp: {
+ // exp(log(x)) -> x
+ if (Q.CxtI->isFast() &&
+ match(IIOperand, m_Intrinsic<Intrinsic::log>(m_Value(X))))
+ return X;
+ return nullptr;
+ }
+ case Intrinsic::exp2: {
+ // exp2(log2(x)) -> x
+ if (Q.CxtI->isFast() &&
+ match(IIOperand, m_Intrinsic<Intrinsic::log2>(m_Value(X))))
+ return X;
+ return nullptr;
+ }
+ case Intrinsic::log: {
+ // log(exp(x)) -> x
+ if (Q.CxtI->isFast() &&
+ match(IIOperand, m_Intrinsic<Intrinsic::exp>(m_Value(X))))
+ return X;
+ return nullptr;
+ }
+ case Intrinsic::log2: {
+ // log2(exp2(x)) -> x
+ if (Q.CxtI->isFast() &&
+ match(IIOperand, m_Intrinsic<Intrinsic::exp2>(m_Value(X)))) {
+ return X;
+ }
+ return nullptr;
+ }
default:
return nullptr;
}
OpenPOWER on IntegriCloud