aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorNoah Goldstein <goldstein.w.n@gmail.com>2023-08-07 10:35:27 -0500
committerNoah Goldstein <goldstein.w.n@gmail.com>2023-08-09 14:42:55 -0500
commitdff3d8a279c660694b50271523edbc98c3eb2ab6 (patch)
treea548de399660ed5bed38ca8dc54d3957c91a864f /llvm/lib/Analysis/ValueTracking.cpp
parent4f818daca64ccec5557c10a05186837cf9fcd0f7 (diff)
downloadllvm-dff3d8a279c660694b50271523edbc98c3eb2ab6.zip
llvm-dff3d8a279c660694b50271523edbc98c3eb2ab6.tar.gz
llvm-dff3d8a279c660694b50271523edbc98c3eb2ab6.tar.bz2
[ValueTracking] Add support for `mul` in `isKnownToBeAPowerOfTwo`
pow2 * pow2 is a power of 2 or zero. Proof: https://alive2.llvm.org/ce/z/FNiiXd Differential Revision: https://reviews.llvm.org/D157308
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index f408946..d82c83c 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -2050,6 +2050,10 @@ bool isKnownToBeAPowerOfTwo(const Value *V, bool OrZero, unsigned Depth,
if (Q.IIQ.isExact(cast<BinaryOperator>(I)))
return isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Depth, Q);
return false;
+ case Instruction::Mul:
+ return OrZero &&
+ isKnownToBeAPowerOfTwo(I->getOperand(1), OrZero, Depth, Q) &&
+ isKnownToBeAPowerOfTwo(I->getOperand(0), OrZero, Depth, Q);
case Instruction::And:
if (OrZero) {
// A power of two and'd with anything is a power of two or zero.