[APInt] In udivrem, remember the bit width in a local variable so we don't reread...
authorCraig Topper <craig.topper@gmail.com>
Fri, 12 May 2017 21:45:44 +0000 (21:45 +0000)
committerCraig Topper <craig.topper@gmail.com>
Fri, 12 May 2017 21:45:44 +0000 (21:45 +0000)
This helped the compiler generate better code for the single word case. It was able to remember that the bit width was still a single word when it created the Remainder APInt and not create code for it possibly being multiword.

llvm-svn: 302952

llvm/lib/Support/APInt.cpp

index f4aa627..25d3977 100644 (file)
@@ -1648,14 +1648,15 @@ APInt APInt::srem(const APInt &RHS) const {
 void APInt::udivrem(const APInt &LHS, const APInt &RHS,
                     APInt &Quotient, APInt &Remainder) {
   assert(LHS.BitWidth == RHS.BitWidth && "Bit widths must be the same");
+  unsigned BitWidth = LHS.BitWidth;
 
   // First, deal with the easy case
   if (LHS.isSingleWord()) {
     assert(RHS.U.VAL != 0 && "Divide by zero?");
     uint64_t QuotVal = LHS.U.VAL / RHS.U.VAL;
     uint64_t RemVal = LHS.U.VAL % RHS.U.VAL;
-    Quotient = APInt(LHS.BitWidth, QuotVal);
-    Remainder = APInt(LHS.BitWidth, RemVal);
+    Quotient = APInt(BitWidth, QuotVal);
+    Remainder = APInt(BitWidth, RemVal);
     return;
   }
 
@@ -1688,8 +1689,8 @@ void APInt::udivrem(const APInt &LHS, const APInt &RHS,
     uint64_t lhsValue = LHS.U.pVal[0];
     uint64_t rhsValue = RHS.U.pVal[0];
     // Make sure there is enough space to hold the results.
-    Quotient.reallocate(LHS.BitWidth);
-    Remainder.reallocate(LHS.BitWidth);
+    Quotient.reallocate(BitWidth);
+    Remainder.reallocate(BitWidth);
     Quotient = lhsValue / rhsValue;
     Remainder = lhsValue % rhsValue;
     return;