[llvm] [SelectionDAG] Optimize 32-bit udiv with 33-bit magic constants on 64-bit targets (PR #181288)
MITSUNARI Shigeo via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 19 03:00:36 PST 2026
================
@@ -6812,23 +6817,49 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, SelectionDAG &DAG,
UnsignedDivisionByConstantInfo::get(
Divisor, std::min(KnownLeadingZeros, Divisor.countl_zero()));
- MagicFactor = DAG.getConstant(magics.Magic.zext(SVTBits), dl, SVT);
-
- assert(magics.PreShift < Divisor.getBitWidth() &&
- "We shouldn't generate an undefined shift!");
- assert(magics.PostShift < Divisor.getBitWidth() &&
- "We shouldn't generate an undefined shift!");
- assert((!magics.IsAdd || magics.PreShift == 0) &&
- "Unexpected pre-shift");
- PreShift = DAG.getConstant(magics.PreShift, dl, ShSVT);
- PostShift = DAG.getConstant(magics.PostShift, dl, ShSVT);
- NPQFactor = DAG.getConstant(
- magics.IsAdd ? APInt::getOneBitSet(SVTBits, EltBits - 1)
- : APInt::getZero(SVTBits),
- dl, SVT);
- UseNPQ |= magics.IsAdd;
- UsePreShift |= magics.PreShift != 0;
- UsePostShift |= magics.PostShift != 0;
+ // For 32-bit division with IsAdd (33-bit magic case), use optimized
+ // method: preshift c by (64-a) bits to eliminate runtime shift. This
+ // requires 64x64->128 bit multiplication. Only apply to scalar types
+ // since SIMD lacks 64x64->128 high multiply. Note: IsAdd=true implies
+ // PreShift=0 by algorithm design. Check if 64-bit MULHU is available
+ // before applying this optimization.
+ if (EltBits == 32 && !VT.isVector() &&
+ (HasWideVT64MULHU || HasWideVT64UMUL_LOHI) && magics.IsAdd) {
+ // For IsAdd case, actual magic constant is 2^32 + Magic (33-bit)
----------------
herumi wrote:
I moved the computation according to your idea and refactored them.
https://github.com/llvm/llvm-project/pull/181288/changes/1e2ca5eba2c578589f3d335482d20895c4828bd9
https://github.com/llvm/llvm-project/pull/181288
More information about the llvm-commits
mailing list