[llvm] [InstCombine] Fold commuted add of udiv/urem by two (#206272) (PR #207462)
Igor Shevlyakov via llvm-commits
llvm-commits at lists.llvm.org
Sun Jul 5 09:10:19 PDT 2026
================
@@ -1192,34 +1192,41 @@ Value *InstCombinerImpl::SimplifyAddWithRemainder(BinaryOperator &I) {
}
}
- // Match I = (X / C0) * C1 + (X % C0) * C2
- Value *Div, *Rem;
- APInt C1, C2;
- if (!LHS->hasOneUse() || !MatchMul(LHS, Div, C1))
- Div = LHS, C1 = APInt(I.getType()->getScalarSizeInBits(), 1);
- if (!RHS->hasOneUse() || !MatchMul(RHS, Rem, C2))
- Rem = RHS, C2 = APInt(I.getType()->getScalarSizeInBits(), 1);
- if (match(Div, m_IRem(m_Value(), m_Value()))) {
- std::swap(Div, Rem);
- std::swap(C1, C2);
- }
- Value *DivOpV;
- APInt DivOpC;
- if (MatchRem(Rem, X, C0, IsSigned) &&
- MatchDiv(Div, DivOpV, DivOpC, IsSigned) && X == DivOpV && C0 == DivOpC &&
- // Avoid unprofitable replacement of and with mul.
- !(C1.isOne() && !IsSigned && DivOpC.isPowerOf2() && DivOpC != 2)) {
- APInt NewC = C1 - C2 * C0;
- if (!NewC.isZero() && !Rem->hasOneUse())
- return nullptr;
- if (!isGuaranteedNotToBeUndef(X, &AC, &I, &DT))
- return nullptr;
- Value *MulXC2 = Builder.CreateMul(X, ConstantInt::get(X->getType(), C2));
- if (NewC.isZero())
- return MulXC2;
- return Builder.CreateAdd(
- Builder.CreateMul(Div, ConstantInt::get(X->getType(), NewC)), MulXC2);
- }
+ // Match I = (X / C0) * C1 + (X % C0) * C2. The division and remainder may
+ // appear in either operand order, and the remainder may be spelled
----------------
ishevlyakov wrote:
I trimmed comment back to the original form
https://github.com/llvm/llvm-project/pull/207462
More information about the llvm-commits
mailing list