aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Analysis/ValueTracking.cpp
diff options
context:
space:
mode:
authorAndreas Jonson <andjo403@hotmail.com>2025-02-10 18:14:09 +0100
committerGitHub <noreply@github.com>2025-02-10 18:14:09 +0100
commit9e0077c921ebf505afa117cf520c628ace1a29cf (patch)
tree3d71bc0b198ac68f505b0bed3587cd6c9d1642fc /llvm/lib/Analysis/ValueTracking.cpp
parente42fdcb41fdcfe7bf302b40f20afb4e9cda5602d (diff)
downloadllvm-9e0077c921ebf505afa117cf520c628ace1a29cf.zip
llvm-9e0077c921ebf505afa117cf520c628ace1a29cf.tar.gz
llvm-9e0077c921ebf505afa117cf520c628ace1a29cf.tar.bz2
[ValueTracking] Handle not in dominating condition. (#126423)
General handling of not in dominating condition. proof: https://alive2.llvm.org/ce/z/FjJN8q
Diffstat (limited to 'llvm/lib/Analysis/ValueTracking.cpp')
-rw-r--r--llvm/lib/Analysis/ValueTracking.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ValueTracking.cpp b/llvm/lib/Analysis/ValueTracking.cpp
index 8a9ad55..fb744d6 100644
--- a/llvm/lib/Analysis/ValueTracking.cpp
+++ b/llvm/lib/Analysis/ValueTracking.cpp
@@ -801,6 +801,9 @@ static void computeKnownBitsFromCond(const Value *V, Value *Cond,
if (auto *Cmp = dyn_cast<ICmpInst>(Cond))
computeKnownBitsFromICmpCond(V, Cmp, Known, SQ, Invert);
+
+ if (Depth < MaxAnalysisRecursionDepth && match(Cond, m_Not(m_Value(A))))
+ computeKnownBitsFromCond(V, A, Known, Depth + 1, SQ, !Invert);
}
void llvm::computeKnownBitsFromContext(const Value *V, KnownBits &Known,
@@ -4934,6 +4937,11 @@ static void computeKnownFPClassFromCond(const Value *V, Value *Cond,
KnownFromContext);
return;
}
+ if (Depth < MaxAnalysisRecursionDepth && match(Cond, m_Not(m_Value(A)))) {
+ computeKnownFPClassFromCond(V, A, Depth + 1, !CondIsTrue, CxtI,
+ KnownFromContext);
+ return;
+ }
CmpPredicate Pred;
Value *LHS;
uint64_t ClassVal = 0;
@@ -10272,6 +10280,9 @@ void llvm::findValuesAffectedByCondition(
m_Value()))) {
// Handle patterns that computeKnownFPClass() support.
AddAffected(A);
+ } else if (!IsAssume && match(V, m_Not(m_Value(X)))) {
+ // Assume is checked here to avoid issues with ephemeral values
+ Worklist.push_back(X);
}
}
}