diff options
author | Craig Topper <craig.topper@intel.com> | 2020-07-30 11:25:55 -0700 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2020-07-30 16:26:54 -0700 |
commit | 24f5235d936537148fbfea0a6583ad7f2f775402 (patch) | |
tree | db47b049cef2d8d9157676dfbbe024d62ffd49ac /llvm/lib/Analysis/ValueTracking.cpp | |
parent | 896f797b8bb7683f7e52c6dc94979f3c449bc37d (diff) | |
download | llvm-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.cpp | 11 |
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(); |