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

Nikita Popov via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 13 13:00:25 PDT 2025


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

```suggestion
  // Create new icmp eq (num & mask), 0
```

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


More information about the llvm-commits mailing list