LLVM API Documentation
#include <SparseSet.h>
Public Types | |
typedef ValueT | value_type |
typedef ValueT & | reference |
typedef const ValueT & | const_reference |
typedef ValueT * | pointer |
typedef const ValueT * | const_pointer |
typedef DenseT::iterator | iterator |
typedef DenseT::const_iterator | const_iterator |
Public Member Functions | |
SparseSet () | |
~SparseSet () | |
void | setUniverse (unsigned U) |
const_iterator | begin () const |
const_iterator | end () const |
iterator | begin () |
iterator | end () |
bool | empty () const |
size_type | size () const |
void | clear () |
iterator | findIndex (unsigned Idx) |
iterator | find (const KeyT &Key) |
const_iterator | find (const KeyT &Key) const |
size_type | count (const KeyT &Key) const |
std::pair< iterator, bool > | insert (const ValueT &Val) |
ValueT & | operator[] (const KeyT &Key) |
iterator | erase (iterator I) |
bool | erase (const KeyT &Key) |
SparseSet - Fast set implmentation for objects that can be identified by small unsigned keys.
SparseSet allocates memory proportional to the size of the key universe, so it is not recommended for building composite data structures. It is useful for algorithms that require a single set with fast operations.
Compared to DenseSet and DenseMap, SparseSet provides constant-time fast clear() and iteration as fast as a vector. The find(), insert(), and erase() operations are all constant time, and typically faster than a hash table. The iteration order doesn't depend on numerical key values, it only depends on the order of insert() and erase() operations. When no elements have been erased, the iteration order is the insertion order.
Compared to BitVector, SparseSet<unsigned> uses 8x-40x more memory, but offers constant-time clear() and size() operations as well as fast iteration independent on the size of the universe.
SparseSet contains a dense vector holding all the objects and a sparse array holding indexes into the dense vector. Most of the memory is used by the sparse array which is the size of the key universe. The SparseT template parameter provides a space/speed tradeoff for sets holding many elements.
When SparseT is uint32_t, find() only touches 2 cache lines, but the sparse array uses 4 x Universe bytes.
When SparseT is uint8_t (the default), find() touches up to 2+[N/256] cache lines, but the sparse array is 4x smaller. N is the number of elements in the set.
For sets that may grow to thousands of elements, SparseT should be set to uint16_t or uint32_t.
ValueT | The type of objects in the set. |
KeyFunctorT | A functor that computes an unsigned index from KeyT. |
SparseT | An unsigned integer type. See above. |
Definition at line 120 of file SparseSet.h.
typedef DenseT::const_iterator llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::const_iterator |
Definition at line 172 of file SparseSet.h.
typedef const ValueT* llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::const_pointer |
Definition at line 144 of file SparseSet.h.
typedef const ValueT& llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::const_reference |
Definition at line 142 of file SparseSet.h.
typedef DenseT::iterator llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::iterator |
Definition at line 171 of file SparseSet.h.
typedef ValueT* llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::pointer |
Definition at line 143 of file SparseSet.h.
typedef ValueT& llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::reference |
Definition at line 141 of file SparseSet.h.
typedef ValueT llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::value_type |
Definition at line 140 of file SparseSet.h.
llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::SparseSet | ( | ) | [inline] |
Definition at line 146 of file SparseSet.h.
llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::~SparseSet | ( | ) | [inline] |
Definition at line 147 of file SparseSet.h.
const_iterator llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::begin | ( | ) | const [inline] |
Definition at line 174 of file SparseSet.h.
Referenced by llvm::LivePhysRegs::begin(), llvm::RegPressureTracker::closeBottom(), llvm::RegPressureTracker::closeTop(), llvm::SparseSet< RootData >::erase(), llvm::SchedDFSImpl::finalize(), llvm::SparseSet< RootData >::findIndex(), and llvm::LivePhysRegs::removeRegsInMask().
iterator llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::begin | ( | ) | [inline] |
Definition at line 176 of file SparseSet.h.
void llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::clear | ( | ) | [inline] |
clear - Clears the set. This is a very fast constant time operation.
Definition at line 194 of file SparseSet.h.
Referenced by llvm::ScheduleDAGInstrs::buildSchedGraph(), llvm::LivePhysRegs::clear(), llvm::LivePhysRegs::init(), and llvm::RegPressureTracker::reset().
size_type llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::count | ( | const KeyT & | Key | ) | const [inline] |
count - Returns 1 if this set contains an element identified by Key, 0 otherwise.
Definition at line 235 of file SparseSet.h.
Referenced by llvm::LivePhysRegs::contains(), llvm::LiveRegSet::contains(), and llvm::RegPressureTracker::hasUntiedDef().
bool llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::empty | ( | ) | const [inline] |
empty - Returns true if the set is empty.
This is not the same as BitVector::empty().
Definition at line 183 of file SparseSet.h.
Referenced by llvm::ScheduleDAGInstrs::buildSchedGraph(), llvm::RegPressureTracker::closeRegion(), llvm::LivePhysRegs::empty(), and llvm::SparseSet< RootData >::setUniverse().
const_iterator llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::end | ( | ) | const [inline] |
Definition at line 175 of file SparseSet.h.
Referenced by llvm::ScheduleDAGInstrs::addVRegDefDeps(), llvm::ScheduleDAGInstrs::addVRegUseDeps(), llvm::RegPressureTracker::closeBottom(), llvm::RegPressureTracker::closeTop(), llvm::SparseSet< RootData >::count(), llvm::LivePhysRegs::end(), llvm::SparseSet< RootData >::erase(), llvm::SparseSet< RootData >::findIndex(), llvm::SparseSet< RootData >::insert(), llvm::LivePhysRegs::removeRegsInMask(), updatePhysDepsDownwards(), and updatePhysDepsUpwards().
iterator llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::end | ( | ) | [inline] |
Definition at line 177 of file SparseSet.h.
iterator llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::erase | ( | iterator | I | ) | [inline] |
erase - Erases an existing element identified by a valid iterator.
This invalidates all iterators, but erase() returns an iterator pointing to the next element. This makes it possible to erase selected elements while iterating over the set:
for (SparseSet::iterator I = Set.begin(); I != Set.end();) if (test(*I)) I = Set.erase(I); else ++I;
Note that end() changes when elements are erased, unlike std::list.
Definition at line 280 of file SparseSet.h.
Referenced by llvm::LiveRegSet::erase(), llvm::SparseSet< RootData >::erase(), llvm::LivePhysRegs::removeReg(), llvm::LivePhysRegs::removeRegsInMask(), updatePhysDepsDownwards(), and updatePhysDepsUpwards().
bool llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::erase | ( | const KeyT & | Key | ) | [inline] |
erase - Erases an element identified by Key, if it exists.
Key | The key identifying the element to erase. |
Definition at line 299 of file SparseSet.h.
iterator llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::find | ( | const KeyT & | Key | ) | [inline] |
find - Find an element by its key.
Key | A valid key to find. |
Definition at line 224 of file SparseSet.h.
Referenced by llvm::ScheduleDAGInstrs::addVRegDefDeps(), llvm::ScheduleDAGInstrs::addVRegUseDeps(), llvm::SparseSet< RootData >::count(), llvm::SparseSet< RootData >::erase(), updatePhysDepsDownwards(), and updatePhysDepsUpwards().
const_iterator llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::find | ( | const KeyT & | Key | ) | const [inline] |
Definition at line 228 of file SparseSet.h.
iterator llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::findIndex | ( | unsigned | Idx | ) | [inline] |
findIndex - Find an element by its index.
Idx | A valid index to find. |
Definition at line 204 of file SparseSet.h.
Referenced by llvm::SparseSet< RootData >::find(), and llvm::SparseSet< RootData >::insert().
std::pair<iterator, bool> llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::insert | ( | const ValueT & | Val | ) | [inline] |
insert - Attempts to insert a new element.
If Val is successfully inserted, return (I, true), where I is an iterator pointing to the newly inserted element.
If the set already contains an element with the same key as Val, return (I, false), where I is an iterator pointing to the existing element.
Insertion invalidates all iterators.
Definition at line 249 of file SparseSet.h.
Referenced by llvm::LivePhysRegs::addReg(), llvm::ScheduleDAGInstrs::addVRegDefDeps(), llvm::LiveRegSet::insert(), llvm::SparseSet< RootData >::operator[](), and llvm::RegPressureTracker::recede().
ValueT& llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::operator[] | ( | const KeyT & | Key | ) | [inline] |
array subscript - If an element already exists with this key, return it. Otherwise, automatically construct a new value from Key, insert it, and return the newly inserted element.
Definition at line 262 of file SparseSet.h.
void llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::setUniverse | ( | unsigned | U | ) | [inline] |
setUniverse - Set the universe size which determines the largest key the set can hold. The universe must be sized before any elements can be added.
U | Universe size. All object keys must be less than U. |
Definition at line 155 of file SparseSet.h.
Referenced by llvm::ScheduleDAGInstrs::buildSchedGraph(), llvm::LivePhysRegs::init(), llvm::RegPressureTracker::init(), and llvm::LivePhysRegs::LivePhysRegs().
size_type llvm::SparseSet< ValueT, KeyFunctorT, SparseT >::size | ( | ) | const [inline] |
size - Returns the number of elements in the set.
This is not the same as BitVector::size() which returns the size of the universe.
Definition at line 190 of file SparseSet.h.
Referenced by llvm::RegPressureTracker::closeBottom(), llvm::RegPressureTracker::closeTop(), llvm::SparseSet< RootData >::erase(), llvm::SparseSet< RootData >::findIndex(), and llvm::SparseSet< RootData >::insert().