[llvm] [InstCombine] Fold converted urem to 0 if there's no overlapping bits (PR #71528)

Graham Hunter via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 8 06:24:38 PST 2023


================
@@ -2662,6 +2662,16 @@ Instruction *InstCombinerImpl::visitAnd(BinaryOperator &I) {
   if (sinkNotIntoOtherHandOfLogicalOp(I))
     return &I;
 
+  // (x << N) & (add (x << M), -1) --> 0, where x is known to be a non-zero
+  // power of 2 and M <= N.
+  const APInt *Shift1, *Shift2;
+  if (match(&I, m_c_And(m_OneUse(m_Shl(m_Value(X), m_APInt(Shift1))),
+                        m_OneUse(m_Add(m_Shl(m_Value(Y), m_APInt(Shift2)),
+                                       m_AllOnes())))) &&
+      X == Y && isKnownToBeAPowerOfTwo(X, /*OrZero*/ false, 0, &I) &&
+      Shift1->uge(*Shift2))
----------------
huntergr-arm wrote:

I had to rearrange things a bit when moving to simplifyAndInst, since 'I' was no longer available (just Op0/Op1). I was able to use m_Specific as a result.

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


More information about the llvm-commits mailing list