[llvm] [SelectionDAG] Optimize 32-bit udiv with 33-bit magic constants on 64-bit targets (PR #181288)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 19 09:48:20 PST 2026
================
@@ -6808,27 +6813,44 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, SelectionDAG &DAG,
PreShift = PostShift = DAG.getUNDEF(ShSVT);
MagicFactor = NPQFactor = DAG.getUNDEF(SVT);
} else {
+ const bool AllowWiden = (EltBits == 32 && !VT.isVector() &&
+ (HasWideVT64MULHU || HasWideVT64UMUL_LOHI));
UnsignedDivisionByConstantInfo magics =
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;
+ Divisor, std::min(KnownLeadingZeros, Divisor.countl_zero()),
+ /*AllowEvenDivisorOptimization=*/true,
+ /*AllowWidenOptimization=*/AllowWiden);
+
+ UseWiden = magics.Widen;
+ // Use pre-computed widened magic for 64x64->128 bit multiplication.
+ if (UseWiden) {
+ MagicFactor = DAG.getConstant(magics.Magic, dl,
+ EVT::getIntegerVT(*DAG.getContext(), 64));
+ PreShift = DAG.getConstant(0, dl, ShSVT);
----------------
topperc wrote:
Can't we use the `PreShift = DAG.getConstant(magics.PreShift, dl, ShSVT);` code from the default path? The magics.PreShift value should be 0.
Same for NPQ and PostShift.
https://github.com/llvm/llvm-project/pull/181288
More information about the llvm-commits
mailing list