aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2020-07-30 11:25:55 -0700
committerCraig Topper <craig.topper@intel.com>2020-07-30 16:26:54 -0700
commit24f5235d936537148fbfea0a6583ad7f2f775402 (patch)
treedb47b049cef2d8d9157676dfbbe024d62ffd49ac /llvm/lib/Analysis/ValueTracking.cpp
parent896f797b8bb7683f7e52c6dc94979f3c449bc37d (diff)
downloadllvm-24f5235d936537148fbfea0a6583ad7f2f775402.zip
llvm-24f5235d936537148fbfea0a6583ad7f2f775402.tar.gz
llvm-24f5235d936537148fbfea0a6583ad7f2f775402.tar.bz2
[ValueTracking] Add basic computeKnownBits support for llvm.abs intrinsic
This includes basic support for computeKnownBits on abs. I've left FIXMEs for more complicated things we could do. Differential Revision: https://reviews.llvm.org/D84963
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 3bf09b3..3b8c0fc 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -1642,6 +1642,17 @@ static void computeKnownBitsFromOperator(const Operator *I,
if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(I)) {
switch (II->getIntrinsicID()) {
default: break;
+ case Intrinsic::abs:
+ computeKnownBits(I->getOperand(0), Known2, Depth + 1, Q);
+ // Otherwise, if this call is undefined for INT_MIN, the result is
+ // positive.
+ if (match(II->getArgOperand(1), m_One()))
+ Known.Zero.setSignBit();
+ // Absolute value preserves trailing zero count.
+ Known.Zero.setLowBits(Known2.Zero.countTrailingOnes());
+ // FIXME: Handle known negative/non-negative input?
+ // FIXME: Calculate the negated Known bits and combine them?
+ break;
case Intrinsic::bitreverse:
computeKnownBits(I->getOperand(0), DemandedElts, Known2, Depth + 1, Q);
Known.Zero |= Known2.Zero.reverseBits();