[llvm] Fixies missed optimization (x + y) & (2^C) -> x & 2^C when y % 2^(C+1) == 0 (PR #157072)
    Yingwei Zheng via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Sun Sep  7 07:31:41 PDT 2025
    
    
  
================
@@ -2476,6 +2476,20 @@ Instruction *InstCombinerImpl::visitAnd(BinaryOperator &I) {
     return SelectInst::Create(Cmp, ConstantInt::getNullValue(Ty), Y);
   }
 
+  // (x + y) & (2^C) -> x & 2^C when y % 2^(C+1) == 0
+  if (match(Op0, m_Add(m_Value(X), m_Value(Y)))) {
+    const APInt *PowerC;
+    if (match(Op1, m_Power2(PowerC)) && !PowerC->isOne()) {
+      KnownBits YKnown = computeKnownBits(Y, &I);
+      unsigned ShiftAmount = PowerC->logBase2() + 1;
+
+      APInt YMod = YKnown.Zero;
+      if (YMod.getLoBits(ShiftAmount).isZero()) {
----------------
dtcxzyw wrote:
Use `YMod.countMinTrailingZeros() > PowerC->logBase2()`.
https://github.com/llvm/llvm-project/pull/157072
    
    
More information about the llvm-commits
mailing list