[llvm] Simplify `(a % b) lt/ge (b-1)` into `(a % b) eq/ne (b-1)` (PR #72504)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Mon Jan 8 12:40:48 PST 2024


================
@@ -6855,6 +6855,52 @@ Instruction *InstCombinerImpl::visitICmpInst(ICmpInst &I) {
   if (Value *V = simplifyICmpInst(I.getPredicate(), Op0, Op1, Q))
     return replaceInstUsesWith(I, V);
 
+  {
+    Value *X;
+    const APInt *C1, *C2;
+    ICmpInst::Predicate Pred;
+    if ((match(&I, m_ICmp(Pred, m_SRem(m_Value(X), m_NonNegative(C1)),
+                          m_APInt(C2))) &&
+         ((Pred == ICmpInst::ICMP_SLT && *C2 == *C1 - 1) ||
+          (Pred == ICmpInst::ICMP_SGT && *C2 == *C1 - 2))) ||
+        (match(&I,
+               m_ICmp(Pred, m_SRem(m_Value(X), m_Negative(C1)), m_APInt(C2))) &&
+         *C2 == *C1 + 1 &&
+         (Pred == ICmpInst::ICMP_SGT || Pred == ICmpInst::ICMP_SLE))) {
+      // icmp slt (X s% C), (C - 1) --> icmp ne (X s% C), (C - 1), if C >= 0
+      // icmp sgt (X s% C), (C - 2) --> icmp eq (X s% C), (C - 1), if C >= 0
+      // icmp sgt (X s% C), (C + 1) --> icmp ne (X s% C), (C + 1), if C < 0
+      // icmp sle (X s% C), (C + 1) --> icmp eq (X s% C), (C + 1), if C < 0
+      return CmpInst::Create(
+          Instruction::ICmp,
+          (Pred == ICmpInst::ICMP_SLT ||
+           (Pred == ICmpInst::ICMP_SGT && *C2 == *C1 - 1))
+              ? ICmpInst::ICMP_NE
+              : ICmpInst::ICMP_EQ,
+          Op0,
+          Constant::getIntegerValue(Op1->getType(), *C2 + (*C2 == *C1 - 2)));
+    }
+
+    if (match(&I, m_ICmp(Pred, m_URem(m_Value(X), m_NonNegative(C1)),
+                         m_APInt(C2))) &&
+        (((Pred == ICmpInst::ICMP_SLT || Pred == ICmpInst::ICMP_UGE ||
+           Pred == ICmpInst::ICMP_ULT) &&
+          (*C2 == *C1 - 1)) ||
+         (Pred == ICmpInst::ICMP_SGT && *C2 == *C1 - 2))) {
+      // icmp slt (X u% C), (C - 1) --> icmp ne (X u% C), (C - 1), if C >= 0
+      // icmp ult (X u% C), (C - 1) --> icmp eq (X u% C), (C - 1), if C >= 0
+      // icmp sgt (X u% C), (C - 2) --> icmp eq (X u% C), (C - 1), if C >= 0
+      // icmp uge (X u% C), (C - 1) --> icmp ne (X u% C), (C - 1), if C >= 0
----------------
dtcxzyw wrote:

```suggestion
      // icmp ugt (X u% C), (C - 2) --> icmp ne (X u% C), (C - 1), if C >= 0
```


https://github.com/llvm/llvm-project/pull/72504


More information about the llvm-commits mailing list