aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib
diff options
context:
space:
mode:
authorNikita Popov <npopov@redhat.com>2023-08-07 16:56:18 +0200
committerNikita Popov <npopov@redhat.com>2023-08-07 17:04:55 +0200
commit5de89b4d99c913e3c7c2735886f2519a2ed39d8a (patch)
tree6c372b191aec1798fa4587cd36d9bb72d963d24f /llvm/lib
parent95cd6aedc152d9628a3f1404e18ec39989bc7ff2 (diff)
downloadllvm-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.cpp5
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)))