diff options
author | Andreas Jonson <andjo403@hotmail.com> | 2025-02-10 18:14:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-10 18:14:09 +0100 |
commit | 9e0077c921ebf505afa117cf520c628ace1a29cf (patch) | |
tree | 3d71bc0b198ac68f505b0bed3587cd6c9d1642fc /llvm/lib/Analysis/ValueTracking.cpp | |
parent | e42fdcb41fdcfe7bf302b40f20afb4e9cda5602d (diff) | |
download | llvm-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.cpp | 11 |
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); } } } |