[llvm] [ValueTracking] Refactor `isKnownNonEqualFromContext` (PR #127388)
Ramkumar Ramachandra via llvm-commits
llvm-commits at lists.llvm.org
Sun Feb 16 03:48:30 PST 2025
================
@@ -3786,6 +3786,63 @@ static bool isNonEqualPointersWithRecursiveGEP(const Value *A, const Value *B,
(StartOffset.sle(OffsetB) && StepOffset.isNegative()));
}
+static bool isKnownNonEqualFromContext(const Value *V1, const Value *V2,
+ unsigned Depth, const SimplifyQuery &Q) {
+ if (!Q.CxtI)
+ return false;
+
+ // Try to infer NonEqual based on information from dominating conditions.
+ if (Q.DC && Q.DT) {
+ auto IsKnownNonEqualFromDominatingCondition = [&](const Value *V) {
+ for (BranchInst *BI : Q.DC->conditionsFor(V)) {
+ Value *Cond = BI->getCondition();
+ BasicBlockEdge Edge0(BI->getParent(), BI->getSuccessor(0));
+ if (Q.DT->dominates(Edge0, Q.CxtI->getParent()) &&
+ isImpliedCondition(Cond, ICmpInst::ICMP_NE, V1, V2, Q.DL,
+ /*LHSIsTrue=*/true, Depth)
+ .value_or(false))
+ return true;
+
+ BasicBlockEdge Edge1(BI->getParent(), BI->getSuccessor(1));
+ if (Q.DT->dominates(Edge1, Q.CxtI->getParent()) &&
+ isImpliedCondition(Cond, ICmpInst::ICMP_NE, V1, V2, Q.DL,
+ /*LHSIsTrue=*/false, Depth)
+ .value_or(false))
+ return true;
+ }
+
+ return false;
+ };
+
+ if (IsKnownNonEqualFromDominatingCondition(V1) ||
+ IsKnownNonEqualFromDominatingCondition(V2))
+ return true;
+ }
+
+ if (!Q.AC)
+ return false;
+
+ // Try to infer NonEqual based on information from assumptions.
+ for (auto &AssumeVH : Q.AC->assumptionsFor(V1)) {
+ if (!AssumeVH)
+ continue;
----------------
artagnon wrote:
I wonder if this check is dead?
https://github.com/llvm/llvm-project/pull/127388
More information about the llvm-commits
mailing list