From: Craig Topper Date: Mon, 27 Mar 2017 18:16:17 +0000 (+0000) Subject: [APInt] Move operator&=(uint64_t) inline and use memset to clear the upper words. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0532ee926c28ac0abda1d4181123974ec6bd1507;p=llvm [APInt] Move operator&=(uint64_t) inline and use memset to clear the upper words. This method is pretty new and probably isn't use much in the code base so this should have a negligible size impact. The OR and XOR operators are already inline. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298870 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/APInt.h b/include/llvm/ADT/APInt.h index 220e408da15..a29cfe5fbca 100644 --- a/include/llvm/ADT/APInt.h +++ b/include/llvm/ADT/APInt.h @@ -691,7 +691,15 @@ public: /// Performs a bitwise AND operation on this APInt and RHS. RHS is /// logically zero-extended or truncated to match the bit-width of /// the LHS. - APInt &operator&=(uint64_t RHS); + APInt &operator&=(uint64_t RHS) { + if (isSingleWord()) { + VAL &= RHS; + return *this; + } + pVal[0] &= RHS; + memset(pVal+1, 0, (getNumWords() - 1) * APINT_WORD_SIZE); + return *this; + } /// \brief Bitwise OR assignment operator. /// diff --git a/lib/Support/APInt.cpp b/lib/Support/APInt.cpp index aacb7440313..ebcbb151867 100644 --- a/lib/Support/APInt.cpp +++ b/lib/Support/APInt.cpp @@ -428,18 +428,6 @@ APInt& APInt::operator&=(const APInt& RHS) { return *this; } -APInt &APInt::operator&=(uint64_t RHS) { - if (isSingleWord()) { - VAL &= RHS; - return *this; - } - pVal[0] &= RHS; - unsigned numWords = getNumWords(); - for (unsigned i = 1; i < numWords; ++i) - pVal[i] = 0; - return *this; -} - APInt& APInt::operator|=(const APInt& RHS) { assert(BitWidth == RHS.BitWidth && "Bit widths must be the same"); if (isSingleWord()) {