From 2669f9b34e69ff2c603e32ccd440740c247431c2 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 6 Aug 2014 17:36:08 +0000 Subject: [PATCH] UseListOrder: Use std::vector I initially used a `SmallVector<>` for `UseListOrder::Shuffle`, which was a silly choice. When I realized my error I quickly rolled a custom data structure. This commit simplifies it to a `std::vector<>`. Now that I've had a chance to measure performance, this data structure isn't part of a bottleneck, so the additional complexity is unnecessary. This is part of PR5680. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@214979 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/IR/UseListOrder.h | 58 +----------------------------------------- 1 file changed, 1 insertion(+), 57 deletions(-) diff --git a/include/llvm/IR/UseListOrder.h b/include/llvm/IR/UseListOrder.h index 8a2a109578e..c4e476160aa 100644 --- a/include/llvm/IR/UseListOrder.h +++ b/include/llvm/IR/UseListOrder.h @@ -25,67 +25,11 @@ class Module; class Function; class Value; -/// \brief Structure to hold a use-list shuffle vector. -/// -/// Stores most use-lists locally, but large use-lists use an extra heap entry. -/// Costs two fewer pointers than the equivalent \a SmallVector. -class UseListShuffleVector { - unsigned Size; - union { - unsigned *Ptr; - unsigned Array[6]; - } Storage; - - bool isSmall() const { return Size <= 6; } - unsigned *data() { return isSmall() ? Storage.Array : Storage.Ptr; } - const unsigned *data() const { - return isSmall() ? Storage.Array : Storage.Ptr; - } - - void destroy() { - if (!isSmall()) - delete[] Storage.Ptr; - } - void moveUnchecked(UseListShuffleVector &X) { - std::memcpy(this, &X, sizeof(UseListShuffleVector)); - X.Size = 0; - } - - UseListShuffleVector(const UseListShuffleVector &X) LLVM_DELETED_FUNCTION; - UseListShuffleVector & - operator=(const UseListShuffleVector &X) LLVM_DELETED_FUNCTION; - -public: - UseListShuffleVector() : Size(0) {} - UseListShuffleVector(UseListShuffleVector &&X) { moveUnchecked(X); } - UseListShuffleVector &operator=(UseListShuffleVector &&X) { - destroy(); - moveUnchecked(X); - return *this; - } - explicit UseListShuffleVector(size_t Size) : Size(Size) { - if (!isSmall()) - Storage.Ptr = new unsigned[Size]; - } - ~UseListShuffleVector() { destroy(); } - - typedef unsigned *iterator; - typedef const unsigned *const_iterator; - - size_t size() const { return Size; } - iterator begin() { return data(); } - iterator end() { return begin() + size(); } - const_iterator begin() const { return data(); } - const_iterator end() const { return begin() + size(); } - unsigned &operator[](size_t I) { return data()[I]; } - unsigned operator[](size_t I) const { return data()[I]; } -}; - /// \brief Structure to hold a use-list order. struct UseListOrder { const Value *V; const Function *F; - UseListShuffleVector Shuffle; + std::vector Shuffle; UseListOrder(const Value *V, const Function *F, size_t ShuffleSize) : V(V), F(F), Shuffle(ShuffleSize) {} -- 2.11.0