[llvm] [llvm] [InstCombine] fold "icmp eq (X + (V - 1)) & -V, X" to "icmp eq 0, (and X, V - 1)" (PR #152851)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Sun Aug 10 18:48:21 PDT 2025


================
@@ -1320,6 +1320,56 @@ Instruction *InstCombinerImpl::foldICmpWithZero(ICmpInst &Cmp) {
   return nullptr;
 }
 
+// Fold icmp eq (num + (val - 1)) & -val, num
+//      to
+//      icmp eq 0, (and num, val - 1)
+// For value being power of two
+Instruction *InstCombinerImpl::foldIsMultipleOfAPowerOfTwo(ICmpInst &Cmp) {
+  Value *Neg, *Num, *Mask, *Value;
+  CmpPredicate Pred;
+  const APInt *NegConst, *MaskConst;
+
+  if (!match(&Cmp, m_c_ICmp(Pred, m_Value(Num),
+                            m_OneUse(m_c_And(m_OneUse(m_c_Add(m_Deferred(Num),
+                                                              m_Value(Mask))),
+                                             m_Value(Neg))))))
+    return nullptr;
+
+  if (!ICmpInst::isEquality(Pred))
+    return nullptr;
+
+  // Check the constant case
+  if (match(Neg, m_APInt(NegConst)) && match(Mask, m_LowBitMask(MaskConst))) {
+    // Neg = -(Mask + 1)
+    if (*NegConst != -(*MaskConst + 1))
----------------
dtcxzyw wrote:

```suggestion
    if (*NegConst != ~*MaskConst))
```
https://alive2.llvm.org/ce/z/vFdSLj



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


More information about the llvm-commits mailing list