diff --git a/include/llvm/ADT/APInt.h b/include/llvm/ADT/APInt.h index 2d3f6207505..af284aa491e 100644 --- a/include/llvm/ADT/APInt.h +++ b/include/llvm/ADT/APInt.h @@ -612,17 +612,6 @@ public: /// \returns *this decremented by one. APInt &operator--(); - /// \brief Unary bitwise complement operator. - /// - /// Performs a bitwise complement operation on this APInt. - /// - /// \returns an APInt that is the bitwise complement of *this - APInt operator~() const { - APInt Result(*this); - Result.flipAllBits(); - return Result; - } - /// \brief Logical negation operator. /// /// Performs logical negation operation on this APInt. @@ -1733,6 +1722,14 @@ inline bool operator==(uint64_t V1, const APInt &V2) { return V2 == V1; } inline bool operator!=(uint64_t V1, const APInt &V2) { return V2 != V1; } +/// \brief Unary bitwise complement operator. +/// +/// \returns an APInt that is the bitwise complement of \p v. +inline APInt operator~(APInt v) { + v.flipAllBits(); + return v; +} + inline APInt operator&(APInt a, uint64_t RHS) { a &= RHS; return a; diff --git a/unittests/ADT/APIntTest.cpp b/unittests/ADT/APIntTest.cpp index a818d26787e..aa1288e88a1 100644 --- a/unittests/ADT/APIntTest.cpp +++ b/unittests/ADT/APIntTest.cpp @@ -761,6 +761,30 @@ TEST(APIntTest, rvalue_arithmetic) { } } +TEST(APIntTest, rvalue_invert) { + // Lamdba to return an APInt by value, but also provide the raw value of the + // allocated data. + auto getRValue = [](const char *HexString, uint64_t const *&RawData) { + APInt V(129, HexString, 16); + RawData = V.getRawData(); + return V; + }; + + APInt One(129, 1); + APInt NegativeTwo(129, -2ULL, true); + + const uint64_t *RawData = nullptr; + + { + // ~1 = -2 + APInt NegL = ~One; + EXPECT_EQ(NegL, NegativeTwo); + + APInt NegR = ~getRValue("1", RawData); + EXPECT_EQ(NegR, NegativeTwo); + EXPECT_EQ(NegR.getRawData(), RawData); + } +} // Tests different div/rem varaints using scheme (a * b + c) / a void testDiv(APInt a, APInt b, APInt c) {