diff options
author | Nikita Popov <npopov@redhat.com> | 2023-11-27 16:50:05 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-11-27 16:50:05 +0100 |
commit | 28a5e6b069ee7540cd0965a0ad6cf0475db8d68c (patch) | |
tree | bc3c50003f2fcd9f6a40fa6d55dd1f04a9248b12 /llvm/lib/Analysis/AssumptionCache.cpp | |
parent | 936180a5e8816b2d02393b8faa535bcd37ac9b42 (diff) | |
download | llvm-28a5e6b069ee7540cd0965a0ad6cf0475db8d68c.zip llvm-28a5e6b069ee7540cd0965a0ad6cf0475db8d68c.tar.gz llvm-28a5e6b069ee7540cd0965a0ad6cf0475db8d68c.tar.bz2 |
[InstCombine] Remove over-generalization from computeKnownBitsFromCmp() (#72637)
For most practical purposes, the only KnownBits patterns we care about are
those involving a constant comparison RHS and constant mask. However,
the actual implementation is written in a very general way -- and of
course, with basically no test coverage of those generalizations.
This patch reduces the implementation to only handle cases with constant
operands. The test changes are all in "make sure we don't crash" tests.
The motivation for this change is an upcoming patch to handling dominating
conditions in computeKnownBits(). Handling non-constant RHS would add
significant additional compile-time overhead in that case, without any
significant impact on optimization quality.
Diffstat (limited to 'llvm/lib/Analysis/AssumptionCache.cpp')
-rw-r--r-- | llvm/lib/Analysis/AssumptionCache.cpp | 32 |
1 files changed, 11 insertions, 21 deletions
diff --git a/llvm/lib/Analysis/AssumptionCache.cpp b/llvm/lib/Analysis/AssumptionCache.cpp index 81b2667..3139b3e 100644 --- a/llvm/lib/Analysis/AssumptionCache.cpp +++ b/llvm/lib/Analysis/AssumptionCache.cpp @@ -92,29 +92,19 @@ findAffectedValues(CallBase *CI, TargetTransformInfo *TTI, AddAffected(B); if (Pred == ICmpInst::ICMP_EQ) { - // For equality comparisons, we handle the case of bit inversion. - auto AddAffectedFromEq = [&AddAffected](Value *V) { - Value *A, *B; - // (A & B) or (A | B) or (A ^ B). - if (match(V, m_BitwiseLogic(m_Value(A), m_Value(B)))) { - AddAffected(A); - AddAffected(B); - // (A << C) or (A >>_s C) or (A >>_u C) where C is some constant. - } else if (match(V, m_Shift(m_Value(A), m_ConstantInt()))) { - AddAffected(A); - } - }; - - AddAffectedFromEq(A); - AddAffectedFromEq(B); + if (match(B, m_ConstantInt())) { + Value *X; + // (X & C) or (X | C) or (X ^ C). + // (X << C) or (X >>_s C) or (X >>_u C). + if (match(A, m_BitwiseLogic(m_Value(X), m_ConstantInt())) || + match(A, m_Shift(m_Value(X), m_ConstantInt()))) + AddAffected(X); + } } else if (Pred == ICmpInst::ICMP_NE) { - Value *X, *Y; - // Handle (a & b != 0). If a/b is a power of 2 we can use this - // information. - if (match(A, m_And(m_Value(X), m_Value(Y))) && match(B, m_Zero())) { + Value *X; + // Handle (X & pow2 != 0). + if (match(A, m_And(m_Value(X), m_Power2())) && match(B, m_Zero())) AddAffected(X); - AddAffected(Y); - } } else if (Pred == ICmpInst::ICMP_ULT) { Value *X; // Handle (A + C1) u< C2, which is the canonical form of A > C3 && A < C4, |