diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -2066,7 +2066,8 @@ switch (BO->getOpcode()) { case Instruction::Mul: // Power of two is closed under multiplication. - return (OrZero || BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap()) && + return (OrZero || Q.IIQ.hasNoUnsignedWrap(BO) || + Q.IIQ.hasNoSignedWrap(BO)) && isKnownToBeAPowerOfTwo(Step, OrZero, Depth, Q); case Instruction::SDiv: // Start value must not be signmask for signed division, so simply being a @@ -2080,7 +2081,7 @@ // division, same for Shr. return OrZero && isKnownToBeAPowerOfTwo(Step, false, Depth, Q); case Instruction::Shl: - return OrZero || BO->hasNoUnsignedWrap() || BO->hasNoSignedWrap(); + return OrZero || Q.IIQ.hasNoUnsignedWrap(BO) || Q.IIQ.hasNoSignedWrap(BO); case Instruction::AShr: if (!match(Start, m_Power2()) || match(Start, m_SignMask())) return false; @@ -2189,7 +2190,7 @@ Query RecQ = Q; // Check if it is an induction variable and always power of two. - if (Q.IIQ.UseInstrInfo && isPowerOfTwoRecurrence(PN, OrZero, Depth, RecQ)) + if (isPowerOfTwoRecurrence(PN, OrZero, Depth, RecQ)) return true; // Recursively check all incoming values. Limit recursion to 2 levels, so