[llvm] [InstCombine] Fold umax(nuw_mul(x, C0), x + 1) into (x == 0 ? 1 : nuw_mul(x, C0)) (PR #123468)
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Sat Jan 18 11:41:25 PST 2025
================
@@ -1847,6 +1847,29 @@ 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)
+ const APInt *C0;
+ auto matchShiftOrMul = [&](Value *I) {
+ return ((match(I, m_OneUse(m_NUWShl(m_Value(X), m_APInt(C0))))) ||
+ (match(I, m_OneUse(m_NUWMul(m_Value(X), m_APInt(C0)))) &&
+ !C0->isOne())) &&
+ !C0->isZero();
+ };
+ bool matchI0 = false;
+ if (IID == Intrinsic::umax &&
+ (((matchI0 = matchShiftOrMul(I0)) &&
+ match(I1, m_OneUse(m_Add(m_Specific(X), m_One())))) ||
+ (matchShiftOrMul(I1) &&
+ match(I0, m_OneUse(m_Add(m_Specific(X), m_One())))))) {
----------------
nikic wrote:
I think it would be cleaner if you structured the fold like moveNotAfterMinMax below (i.e. implement it in a lambda, call with commuted args).
https://github.com/llvm/llvm-project/pull/123468
More information about the llvm-commits
mailing list