[llvm] [ValueTracking] Add support for `sub` in `isKnownNonEqual` (PR #87704)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 5 08:56:44 PDT 2024
================
@@ -3134,6 +3135,36 @@ static bool isNonEqualShl(const Value *V1, const Value *V2, unsigned Depth,
return false;
}
+/// Return true if V1 == V2 - X or V1 == X - V2 implies V2 != V1
+static bool isNonEqualSub(const Value *V1, const Value *V2, unsigned Depth,
+ const SimplifyQuery &Q) {
+ const BinaryOperator *BO = dyn_cast<BinaryOperator>(V1);
+ if (!BO || BO->getOpcode() != Instruction::Sub)
+ return false;
+
+ // -V2 != V2 iff V2 != 0 and V2 != INT_MIN
+ if (match(BO, m_Sub(m_Zero(), m_Specific(V2)))) {
+ const OverflowingBinaryOperator *OBO = cast<OverflowingBinaryOperator>(V1);
+ // nsw implies no INT_MIN case.
+ if (OBO->hasNoSignedWrap())
+ return isKnownNonZero(V2, Depth + 1, Q);
+ // Otherwise check for INT_MIN case directly.
+ KnownBits V2Known = computeKnownBits(V2, Depth + 1, Q);
+ if (V2Known.isNonNegative() ||
+ (!V2Known.One.isZero() && !V2Known.One.isMinSignedValue()))
+ return V2Known.isNonZero() || isKnownNonZero(V2, Depth + 1, Q);
+ }
+
+ // X - V2 != V2 if X != 0
----------------
goldsteinn wrote:
Fixed + updated proofs / commit / tests.
https://github.com/llvm/llvm-project/pull/87704
More information about the llvm-commits
mailing list