diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2011-10-07 23:40:49 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2011-10-07 23:40:49 +0000 |
commit | 195464184e840965febb8eb55316c32995d37c8f (patch) | |
tree | ea4e0eea65ee434fe34155c18d40bdb6ea8ec567 /llvm/lib/Support/APInt.cpp | |
parent | 133a16871f4c71d833d9dd354052846dd90d3390 (diff) | |
download | llvm-195464184e840965febb8eb55316c32995d37c8f.zip llvm-195464184e840965febb8eb55316c32995d37c8f.tar.gz llvm-195464184e840965febb8eb55316c32995d37c8f.tar.bz2 |
Fix APInt::operator*= so that it computes the correct result for large integers where there is unsigned overflow. Fix APFloat::toString so that it doesn't depend on the incorrect behavior in common cases (and computes the correct result in some rare cases). Fixes PR11086.
llvm-svn: 141441
Diffstat (limited to 'llvm/lib/Support/APInt.cpp')
-rw-r--r-- | llvm/lib/Support/APInt.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/llvm/lib/Support/APInt.cpp b/llvm/lib/Support/APInt.cpp index 6eadaafd..3774c52 100644 --- a/llvm/lib/Support/APInt.cpp +++ b/llvm/lib/Support/APInt.cpp @@ -386,6 +386,7 @@ APInt& APInt::operator*=(const APInt& RHS) { clearAllBits(); unsigned wordsToCopy = destWords >= getNumWords() ? getNumWords() : destWords; memcpy(pVal, dest, wordsToCopy * APINT_WORD_SIZE); + clearUnusedBits(); // delete dest array and return delete[] dest; @@ -471,7 +472,7 @@ APInt APInt::operator*(const APInt& RHS) const { return APInt(BitWidth, VAL * RHS.VAL); APInt Result(*this); Result *= RHS; - return Result.clearUnusedBits(); + return Result; } APInt APInt::operator+(const APInt& RHS) const { |