forked from OSchip/llvm-project
Don't allocate unnecessarily in APInt::operator[+-]. NFC.
APInt::operator+(uint64_t) just forwarded to operator+(const APInt&). Constructing the APInt for the RHS takes an allocation which isn't required. Also, for APInt's in the slow path, operator+ would call add() internally which iterates over both arrays of values. Instead we can use add_1 and sub_1 which only iterate while there is something to do. Using the memory for 'opt -O2 verify-uselistorder.lto.opt.bc -o opt.bc' (see r236629 for details), this reduces the number of allocations from 23.9M to 22.7M. llvm-svn: 270959
This commit is contained in:
parent
8c11fce707
commit
18e9102a85
|
@ -835,13 +835,13 @@ public:
|
|||
///
|
||||
/// Adds RHS to this APInt and returns the result.
|
||||
APInt operator+(const APInt &RHS) const;
|
||||
APInt operator+(uint64_t RHS) const { return (*this) + APInt(BitWidth, RHS); }
|
||||
APInt operator+(uint64_t RHS) const;
|
||||
|
||||
/// \brief Subtraction operator.
|
||||
///
|
||||
/// Subtracts RHS from this APInt and returns the result.
|
||||
APInt operator-(const APInt &RHS) const;
|
||||
APInt operator-(uint64_t RHS) const { return (*this) - APInt(BitWidth, RHS); }
|
||||
APInt operator-(uint64_t RHS) const;
|
||||
|
||||
/// \brief Left logical shift operator.
|
||||
///
|
||||
|
|
|
@ -480,6 +480,15 @@ APInt APInt::operator+(const APInt& RHS) const {
|
|||
return Result;
|
||||
}
|
||||
|
||||
APInt APInt::operator+(uint64_t RHS) const {
|
||||
if (isSingleWord())
|
||||
return APInt(BitWidth, VAL + RHS);
|
||||
APInt Result(*this);
|
||||
add_1(Result.pVal, Result.pVal, getNumWords(), RHS);
|
||||
Result.clearUnusedBits();
|
||||
return Result;
|
||||
}
|
||||
|
||||
APInt APInt::operator-(const APInt& RHS) const {
|
||||
assert(BitWidth == RHS.BitWidth && "Bit widths must be the same");
|
||||
if (isSingleWord())
|
||||
|
@ -490,6 +499,15 @@ APInt APInt::operator-(const APInt& RHS) const {
|
|||
return Result;
|
||||
}
|
||||
|
||||
APInt APInt::operator-(uint64_t RHS) const {
|
||||
if (isSingleWord())
|
||||
return APInt(BitWidth, VAL - RHS);
|
||||
APInt Result(*this);
|
||||
sub_1(Result.pVal, getNumWords(), RHS);
|
||||
Result.clearUnusedBits();
|
||||
return Result;
|
||||
}
|
||||
|
||||
bool APInt::EqualSlowCase(const APInt& RHS) const {
|
||||
return std::equal(pVal, pVal + getNumWords(), RHS.pVal);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue