diff --git a/llvm/include/llvm/Support/KnownBits.h b/llvm/include/llvm/Support/KnownBits.h index de1c0cdf917743..40470b6e0f7ba2 100644 --- a/llvm/include/llvm/Support/KnownBits.h +++ b/llvm/include/llvm/Support/KnownBits.h @@ -97,6 +97,9 @@ struct KnownBits { /// Returns true if this value is known to be non-negative. bool isNonNegative() const { return Zero.isSignBitSet(); } + /// Returns true if this value is known to be non-zero. + bool isNonZero() const { return One.countPopulation() != 0; } + /// Returns true if this value is known to be positive. bool isStrictlyPositive() const { return Zero.isSignBitSet() && !One.isNullValue(); } diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp index 44cf4f80b59d4d..db591ce67709f1 100644 --- a/llvm/lib/Analysis/ValueTracking.cpp +++ b/llvm/lib/Analysis/ValueTracking.cpp @@ -436,10 +436,10 @@ static void computeKnownBitsMul(const Value *Op0, const Value *Op1, bool NSW, // The product of a negative number and a non-negative number is either // negative or zero. if (!isKnownNonNegative) - isKnownNegative = (isKnownNegativeOp1 && isKnownNonNegativeOp0 && - isKnownNonZero(Op0, Depth, Q)) || - (isKnownNegativeOp0 && isKnownNonNegativeOp1 && - isKnownNonZero(Op1, Depth, Q)); + isKnownNegative = + (isKnownNegativeOp1 && isKnownNonNegativeOp0 && + Known2.isNonZero()) || + (isKnownNegativeOp0 && isKnownNonNegativeOp1 && Known.isNonZero()); } }