[llvm] r296997 - [APInt] Move operator~ out of line to make it better able to reused memory allocation from temporary objects
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Sun Mar 5 22:30:47 PST 2017
Author: ctopper
Date: Mon Mar 6 00:30:47 2017
New Revision: 296997
URL: http://llvm.org/viewvc/llvm-project?rev=296997&view=rev
Log:
[APInt] Move operator~ out of line to make it better able to reused memory allocation from temporary objects
Summary:
This makes operator~ take the APInt by value so if it came from a temporary APInt the move constructor will get invoked and it will be able to reuse the memory allocation from the temporary.
This is similar to what was already done for 2s complement negation.
Reviewers: hans, davide, RKSimon
Reviewed By: davide
Subscribers: llvm-commits
Differential Revision: https://reviews.llvm.org/D30614
Modified:
llvm/trunk/include/llvm/ADT/APInt.h
llvm/trunk/unittests/ADT/APIntTest.cpp
Modified: llvm/trunk/include/llvm/ADT/APInt.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/APInt.h?rev=296997&r1=296996&r2=296997&view=diff
==============================================================================
--- llvm/trunk/include/llvm/ADT/APInt.h (original)
+++ llvm/trunk/include/llvm/ADT/APInt.h Mon Mar 6 00:30:47 2017
@@ -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, cons
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;
Modified: llvm/trunk/unittests/ADT/APIntTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ADT/APIntTest.cpp?rev=296997&r1=296996&r2=296997&view=diff
==============================================================================
--- llvm/trunk/unittests/ADT/APIntTest.cpp (original)
+++ llvm/trunk/unittests/ADT/APIntTest.cpp Mon Mar 6 00:30:47 2017
@@ -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) {
More information about the llvm-commits
mailing list