diff options
author | Amjad Aboud <amjad.aboud@intel.com> | 2017-08-18 22:56:55 +0000 |
---|---|---|
committer | Amjad Aboud <amjad.aboud@intel.com> | 2017-08-18 22:56:55 +0000 |
commit | 88ffa3afe289b02889957070ba6ac132fd4f2ce4 (patch) | |
tree | c47525f9947988d97a38d0dc1fec9db93302e61b /llvm/lib/Analysis/ValueTracking.cpp | |
parent | 0aaf8c16acad178afa75f50252ea58a15d852bd9 (diff) | |
download | bcm5719-llvm-88ffa3afe289b02889957070ba6ac132fd4f2ce4.tar.gz bcm5719-llvm-88ffa3afe289b02889957070ba6ac132fd4f2ce4.zip |
[InstCombine] Teach ComputeNumSignBitsImpl to handle integer multiply instruction.
Differential Revision: https://reviews.llvm.org/D36679
llvm-svn: 311206
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 d73e5f25119..d936c48a3a6 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2196,6 +2196,17 @@ static unsigned ComputeNumSignBitsImpl(const Value *V, unsigned Depth, if (Tmp == 1) return 1; // Early out. return std::min(Tmp, Tmp2)-1; + case Instruction::Mul: { + // The output of the Mul can be at most twice the valid bits in the inputs. + unsigned SignBitsOp0 = ComputeNumSignBits(U->getOperand(0), Depth + 1, Q); + if (SignBitsOp0 == 1) return 1; // Early out. + unsigned SignBitsOp1 = ComputeNumSignBits(U->getOperand(1), Depth + 1, Q); + if (SignBitsOp1 == 1) return 1; + unsigned OutValidBits = + (TyBits - SignBitsOp0 + 1) + (TyBits - SignBitsOp1 + 1); + return OutValidBits > TyBits ? 1 : TyBits - OutValidBits + 1; + } + case Instruction::PHI: { const PHINode *PN = cast<PHINode>(U); unsigned NumIncomingValues = PN->getNumIncomingValues(); |