[llvm] 0d821b2 - [InstSimplify] Generalize fold for icmp ugt/ule (pow2 << X), signmask

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 24 09:08:05 PDT 2023


Author: Yingwei Zheng
Date: 2023-09-25T00:07:20+08:00
New Revision: 0d821b22e01b8205b680ca302caeb6516611ecf8

URL: https://github.com/llvm/llvm-project/commit/0d821b22e01b8205b680ca302caeb6516611ecf8
DIFF: https://github.com/llvm/llvm-project/commit/0d821b22e01b8205b680ca302caeb6516611ecf8.diff

LOG: [InstSimplify] Generalize fold for icmp ugt/ule (pow2 << X), signmask

Alive2: https://alive2.llvm.org/ce/z/wZ41t7

Added: 
    

Modified: 
    llvm/lib/Analysis/InstructionSimplify.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index d8aa614cae53b10..552c0824713139a 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -3410,10 +3410,10 @@ static Value *simplifyICmpWithBinOp(CmpInst::Predicate Pred, Value *LHS,
     }
   }
 
-  // TODO: This is overly constrained. LHS can be any power-of-2.
-  // (1 << X)  >u 0x8000 --> false
-  // (1 << X) <=u 0x8000 --> true
-  if (match(LHS, m_Shl(m_One(), m_Value())) && match(RHS, m_SignMask())) {
+  // If C is a power-of-2:
+  // (C << X)  >u 0x8000 --> false
+  // (C << X) <=u 0x8000 --> true
+  if (match(LHS, m_Shl(m_Power2(), m_Value())) && match(RHS, m_SignMask())) {
     if (Pred == ICmpInst::ICMP_UGT)
       return ConstantInt::getFalse(getCompareTy(RHS));
     if (Pred == ICmpInst::ICMP_ULE)


        


More information about the llvm-commits mailing list