Implement the getHashValue method.
authorReid Spencer <rspencer@reidspencer.com>
Mon, 26 Feb 2007 21:02:27 +0000 (21:02 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Mon, 26 Feb 2007 21:02:27 +0000 (21:02 +0000)
Fix toString use of getValue to use getZExtValue()

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34642 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Support/APInt.cpp

index 1a2f0e0b94ca57c26a1ab7475c1ab6de44137d86..44aed755491fca2100ea22dc9d8b58aae79acdb0 100644 (file)
@@ -661,6 +661,21 @@ APInt APInt::getNullValue(uint32_t numBits) {
   return getMinValue(numBits, false);
 }
 
+uint64_t APInt::getHashValue() const {
+  // LLVM only supports bit widths up to 2^23 so shift the bitwidth into the
+  // high range. This makes the hash unique for integer values < 2^41 bits and
+  // doesn't hurt for larger values.
+  uint64_t hash = uint64_t(BitWidth) << (APINT_BITS_PER_WORD - 23);
+
+  // Add the sum of the words to the hash.
+  if (isSingleWord())
+    hash += VAL;
+  else
+    for (uint32_t i = 0; i < getNumWords(); ++i)
+      hash += pVal[i];
+  return hash;
+}
+
 /// HiBits - This function returns the high "numBits" bits of this APInt.
 APInt APInt::getHiBits(uint32_t numBits) const {
   return APIntOps::lshr(*this, BitWidth - numBits);
@@ -1660,7 +1675,7 @@ std::string APInt::toString(uint8_t radix, bool wantSigned) const {
     APInt tmp2(tmp.getBitWidth(), 0);
     divide(tmp, tmp.getNumWords(), divisor, divisor.getNumWords(), &tmp2, 
            &APdigit);
-    uint32_t digit = APdigit.getValue();
+    uint32_t digit = APdigit.getZExtValue();
     assert(digit < radix && "divide failed");
     result.insert(insert_at,digits[digit]);
     tmp = tmp2;