[llvm] [InstCombine] Fold umax(nuw_mul(x, C0), x + 1) into (x == 0 ? 1 : nuw_mul(x, C0)) (PR #123468)

via llvm-commits llvm-commits at lists.llvm.org
Sat Jan 18 16:03:15 PST 2025


================
@@ -1847,6 +1847,35 @@ Instruction *InstCombinerImpl::visitCallInst(CallInst &CI) {
         return CastInst::Create(Instruction::ZExt, NarrowMaxMin, II->getType());
       }
     }
+    // If C0 is not 0:
+    //   umax(nuw_shl(x, C0), x + 1) -> x == 0 ? 1 : nuw_shl(x, C0)
+    // If C0 is not 0 or 1:
+    //   umax(nuw_mul(x, C0), x + 1) -> x == 0 ? 1 : nuw_mul(x, C0)
+    auto foldMaxMulShift = [&](Value *A, Value *B) -> Instruction * {
+      const APInt *C0;
+      Value *X;
+      auto matchShiftOrMul = [&](Value *I) {
+        return ((match(I, m_NUWShl(m_Value(X), m_APInt(C0)))) ||
+                (match(I, m_NUWMul(m_Value(X), m_APInt(C0))) &&
+                 !C0->isOne())) &&
+               !C0->isZero();
----------------
goldsteinn wrote:

nit: Stylistically for a single constant we typically just use `C` (in comments/code).

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


More information about the llvm-commits mailing list