[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