[Support][SelectionDAG][GlobalISel] Hoist PostShift adjustment for IsAdd into Unsigne...
authorCraig Topper <craig.topper@sifive.com>
Wed, 4 Jan 2023 22:17:56 +0000 (14:17 -0800)
committerCraig Topper <craig.topper@sifive.com>
Wed, 4 Jan 2023 23:18:12 +0000 (15:18 -0800)
Instead of doing the adjustment in 3 different places in the code
base, do it inside UnsignedDivideUsingMagic::get.

Differential Revision: https://reviews.llvm.org/D141014

llvm/include/llvm/Support/DivisionByConstantInfo.h
llvm/lib/CodeGen/GlobalISel/CombinerHelper.cpp
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
llvm/lib/Support/DivisionByConstantInfo.cpp
llvm/unittests/Support/DivisionByConstantTest.cpp

index 464e412..caa0b35 100644 (file)
@@ -31,7 +31,7 @@ struct UnsignedDivisionByConstantInfo {
       bool AllowEvenDivisorOptimization = true);
   APInt Magic;          ///< magic number
   bool IsAdd;           ///< add indicator
-  unsigned ShiftAmount; ///< shift amount
+  unsigned PostShift;   ///< post-shift amount
   unsigned PreShift;    ///< pre-shift amount
 };
 
index 9899875..01edd90 100644 (file)
@@ -4962,16 +4962,14 @@ MachineInstr *CombinerHelper::buildUDivUsingMul(MachineInstr &MI) {
 
       Magic = std::move(magics.Magic);
 
-      if (!magics.IsAdd) {
-        assert(magics.ShiftAmount < Divisor.getBitWidth() &&
-               "We shouldn't generate an undefined shift!");
-        PostShift = magics.ShiftAmount;
-        PreShift = magics.PreShift;
-      } else {
-        assert(magics.PreShift == 0 && "Unexpected pre-shift");
-        PostShift = magics.ShiftAmount - 1;
-        SelNPQ = true;
-      }
+      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 = magics.PreShift;
+      PostShift = magics.PostShift;
+      SelNPQ = magics.IsAdd;
     }
 
     PreShifts.push_back(
index 310fe14..f7e6003 100644 (file)
@@ -6056,16 +6056,15 @@ SDValue TargetLowering::BuildUDIV(SDNode *N, SelectionDAG &DAG,
 
       Magic = std::move(magics.Magic);
 
-      if (!magics.IsAdd) {
-        assert(magics.ShiftAmount < Divisor.getBitWidth() &&
-               "We shouldn't generate an undefined shift!");
-        PostShift = magics.ShiftAmount;
-        PreShift = magics.PreShift;
-      } else {
-        assert(magics.PreShift == 0 && "Unexpected pre-shift");
-        PostShift = magics.ShiftAmount - 1;
-        SelNPQ = true;
-      }
+      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 = magics.PreShift;
+      PostShift = magics.PostShift;
+      SelNPQ = magics.IsAdd;
     }
 
     PreShifts.push_back(DAG.getConstant(PreShift, dl, ShSVT));
index a40f49b..e7072d9 100644 (file)
@@ -143,7 +143,12 @@ UnsignedDivisionByConstantInfo::get(const APInt &D, unsigned LeadingZeros,
 
   Retval.Magic = std::move(Q2);             // resulting magic number
   ++Retval.Magic;
-  Retval.ShiftAmount = P - D.getBitWidth(); // resulting shift
+  Retval.PostShift = P - D.getBitWidth(); // resulting shift
+  // Reduce shift amount for IsAdd.
+  if (Retval.IsAdd) {
+    assert(Retval.PostShift > 0 && "Unexpected shift");
+    Retval.PostShift -= 1;
+  }
   Retval.PreShift = 0;
   return Retval;
 }
index 43e44c9..5d19bad 100644 (file)
@@ -116,22 +116,14 @@ APInt UnsignedDivideUsingMagic(const APInt &Numerator, const APInt &Divisor,
     }
   }
 
-  unsigned PreShift = 0;
-  unsigned PostShift = 0;
-  bool UseNPQ = false;
-  if (!Magics.IsAdd) {
-    assert(Magics.ShiftAmount < Divisor.getBitWidth() &&
-           "We shouldn't generate an undefined shift!");
-    PreShift = Magics.PreShift;
-    PostShift = Magics.ShiftAmount;
-    UseNPQ = false;
-  } else {
-    assert(Magics.PreShift == 0 && "Unexpected pre-shift");
-    PostShift = Magics.ShiftAmount - 1;
-    assert(PostShift < Divisor.getBitWidth() &&
-           "We shouldn't generate an undefined shift!");
-    UseNPQ = true;
-  }
+  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");
+  unsigned PreShift = Magics.PreShift;
+  unsigned PostShift = Magics.PostShift;
+  bool UseNPQ = Magics.IsAdd;
 
   APInt NPQFactor =
       UseNPQ ? APInt::getSignedMinValue(Bits) : APInt::getZero(Bits);