[llvm] e26d2d9 - [CmpInstAnalysis] Further canonicalize the predicate (NFC)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 2 03:20:22 PDT 2024
Author: Nikita Popov
Date: 2024-10-02T12:20:13+02:00
New Revision: e26d2d98f71579ef2a131bbfd0ecdabe12193e48
URL: https://github.com/llvm/llvm-project/commit/e26d2d98f71579ef2a131bbfd0ecdabe12193e48
DIFF: https://github.com/llvm/llvm-project/commit/e26d2d98f71579ef2a131bbfd0ecdabe12193e48.diff
LOG: [CmpInstAnalysis] Further canonicalize the predicate (NFC)
Canonicalize le to lt predicate by adjusting the constant by one.
As such, we only have to handle slt and ult.
This will make it easier to handle additional cases.
Added:
Modified:
llvm/lib/Analysis/CmpInstAnalysis.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Analysis/CmpInstAnalysis.cpp b/llvm/lib/Analysis/CmpInstAnalysis.cpp
index 1d0a5e329a1407..ad111559b0d850 100644
--- a/llvm/lib/Analysis/CmpInstAnalysis.cpp
+++ b/llvm/lib/Analysis/CmpInstAnalysis.cpp
@@ -78,8 +78,8 @@ llvm::decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred,
bool LookThruTrunc) {
using namespace PatternMatch;
- const APInt *C;
- if (!ICmpInst::isRelational(Pred) || !match(RHS, m_APIntAllowPoison(C)))
+ const APInt *OrigC;
+ if (!ICmpInst::isRelational(Pred) || !match(RHS, m_APIntAllowPoison(OrigC)))
return std::nullopt;
bool Inverted = false;
@@ -88,36 +88,30 @@ llvm::decomposeBitTestICmp(Value *LHS, Value *RHS, CmpInst::Predicate Pred,
Pred = ICmpInst::getInversePredicate(Pred);
}
+ APInt C = *OrigC;
+ if (ICmpInst::isLE(Pred)) {
+ if (ICmpInst::isSigned(Pred) ? C.isMaxSignedValue() : C.isMaxValue())
+ return std::nullopt;
+ ++C;
+ Pred = ICmpInst::getStrictPredicate(Pred);
+ }
+
DecomposedBitTest Result;
switch (Pred) {
default:
llvm_unreachable("Unexpected predicate");
case ICmpInst::ICMP_SLT:
// X < 0 is equivalent to (X & SignMask) != 0.
- if (!C->isZero())
+ if (!C.isZero())
return std::nullopt;
- Result.Mask = APInt::getSignMask(C->getBitWidth());
- Result.Pred = ICmpInst::ICMP_NE;
- break;
- case ICmpInst::ICMP_SLE:
- // X <= -1 is equivalent to (X & SignMask) != 0.
- if (!C->isAllOnes())
- return std::nullopt;
- Result.Mask = APInt::getSignMask(C->getBitWidth());
+ Result.Mask = APInt::getSignMask(C.getBitWidth());
Result.Pred = ICmpInst::ICMP_NE;
break;
case ICmpInst::ICMP_ULT:
// X <u 2^n is equivalent to (X & ~(2^n-1)) == 0.
- if (!C->isPowerOf2())
- return std::nullopt;
- Result.Mask = -*C;
- Result.Pred = ICmpInst::ICMP_EQ;
- break;
- case ICmpInst::ICMP_ULE:
- // X <=u 2^n-1 is equivalent to (X & ~(2^n-1)) == 0.
- if (!(*C + 1).isPowerOf2())
+ if (!C.isPowerOf2())
return std::nullopt;
- Result.Mask = ~*C;
+ Result.Mask = -C;
Result.Pred = ICmpInst::ICMP_EQ;
break;
}
More information about the llvm-commits
mailing list