[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