From b72103e73d0544e018fea890385b7d957759fa26 Mon Sep 17 00:00:00 2001 From: Camsyn Date: Fri, 31 Oct 2025 22:34:36 +0800 Subject: [PATCH] [SCCP] Simplify general icmp instructions --- llvm/lib/Transforms/Utils/SCCPSolver.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Utils/SCCPSolver.cpp b/llvm/lib/Transforms/Utils/SCCPSolver.cpp index 4947d03a2dc66..21cd21f214d67 100644 --- a/llvm/lib/Transforms/Utils/SCCPSolver.cpp +++ b/llvm/lib/Transforms/Utils/SCCPSolver.cpp @@ -299,6 +299,7 @@ static Value *simplifyInstruction(SCCPSolver &Solver, Value *LHS = ICmp->getOperand(0); ICmpInst::Predicate Pred = ICmp->getPredicate(); const APInt *Offset; + // Match icmp X + Offset, C if (match(LHS, m_OneUse(m_AddLike(m_Value(X), m_APInt(Offset))))) return ConstantRange::makeExactICmpRegion(Pred, *RHSC).sub(*Offset); // Match icmp eq/ne X & NegPow2, C @@ -310,7 +311,10 @@ static Value *simplifyInstruction(SCCPSolver &Solver, return Pred == ICmpInst::ICMP_EQ ? CR : CR.inverse(); } } - return std::nullopt; + // Fallback: Match icmp X, C + // E.g., if X ∈ [0, 4], this can simplify icmp uge X, 4 to icmp eq X, 4 + X = LHS; + return ConstantRange::makeExactICmpRegion(Pred, *RHSC); }; if (auto CR = MatchTwoInstructionExactRangeCheck()) {