diff options
author | Nikita Popov <npopov@redhat.com> | 2023-08-07 16:56:18 +0200 |
---|---|---|
committer | Nikita Popov <npopov@redhat.com> | 2023-08-07 17:04:55 +0200 |
commit | 5de89b4d99c913e3c7c2735886f2519a2ed39d8a (patch) | |
tree | 6c372b191aec1798fa4587cd36d9bb72d963d24f /llvm/lib | |
parent | 95cd6aedc152d9628a3f1404e18ec39989bc7ff2 (diff) | |
download | llvm-5de89b4d99c913e3c7c2735886f2519a2ed39d8a.zip llvm-5de89b4d99c913e3c7c2735886f2519a2ed39d8a.tar.gz llvm-5de89b4d99c913e3c7c2735886f2519a2ed39d8a.tar.bz2 |
[ValueTracking] Support non-zero pow2 for shl with nowrap flags
If the shl has either nuw or nsw flags, then we know that bits
cannot be shifted out, so a power of two cannot become zero.
Proofs: https://alive2.llvm.org/ce/z/4QfebE
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Analysis/ValueTracking.cpp | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 6fa7d5f..3198020 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2045,9 +2045,8 @@ bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero, unsigned Depth, case Instruction::ZExt: return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Depth, Q); case Instruction::Shl: - if (OrZero) - return isKnownToBeAPowerOfTwo(I->getOperand(0), /*OrZero*/ true, Depth, - Q); + if (OrZero || Q.IIQ.hasNoUnsignedWrap(I) || Q.IIQ.hasNoSignedWrap(I)) + return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Depth, Q); return false; case Instruction::LShr: if (OrZero || Q.IIQ.isExact(cast<BinaryOperator>(I))) |