16 #ifndef LLVM_ADT_FOLDINGSET_H
17 #define LLVM_ADT_FOLDINGSET_H
21 #include "llvm/Support/DataTypes.h"
26 class BumpPtrAllocator;
102 class FoldingSetNodeID;
136 void *NextInFoldingSetBucket;
140 Node() : NextInFoldingSetBucket(0) {}
174 assert(Inserted == N &&
"Node already inserted!");
187 void GrowHashTable();
239 template<
typename T>
struct FoldingSetTrait
240 :
public DefaultFoldingSetTrait<T> {};
246 template<
typename T,
typename Ctx>
249 X.Profile(ID, Context);
259 template<
typename T,
typename Ctx>
struct ContextualFoldingSetTrait
260 :
public DefaultContextualFoldingSetTrait<T, Ctx> {};
269 const unsigned *Data;
285 const unsigned *
getData()
const {
return Data; }
303 : Bits(Ref.getData(), Ref.getData() + Ref.getSize()) {}
318 template <
typename T>
366 template<
typename T,
typename Ctx>
376 template<
typename T,
typename Ctx>
395 T *TN =
static_cast<T *
>(
N);
402 T *TN =
static_cast<T *
>(
N);
408 T *TN =
static_cast<T *
>(
N);
459 template <
class T,
class Ctx>
473 T *TN =
static_cast<T *
>(
N);
479 T *TN =
static_cast<T *
>(
N);
485 T *TN =
static_cast<T *
>(
N);
537 template <
class T,
class VectorIteratorT>
543 VectorIteratorT Iterator;
549 return Iterator == RHS.Iterator;
552 return Iterator != RHS.Iterator;
575 template <
class T,
class VectorT = SmallVector<T*, 8> >
582 : Set(Log2InitSize) {
595 void clear() { Set.clear(); Vector.clear(); }
601 return Set.FindNodeOrInsertPos(ID, InsertPos);
608 T *Result = Set.GetOrInsertNode(N);
609 if (Result == N) Vector.push_back(N);
617 Set.InsertNode(N, InsertPos);
629 unsigned size()
const {
return Set.size(); }
632 bool empty()
const {
return Set.empty(); }
655 class FoldingSetIterator :
public FoldingSetIteratorImpl {
692 uintptr_t x =
reinterpret_cast<uintptr_t
>(Probe) & ~0x1;
693 Ptr =
reinterpret_cast<void*
>(x);
707 class FoldingSetBucketIterator :
public FoldingSetBucketIteratorImpl {
730 template <
typename T>
737 template<
typename A1>
741 template <
typename A1,
typename A2>
745 template <
typename A1,
typename A2,
typename A3>
749 template <
typename A1,
typename A2,
typename A3,
typename A4>
752 : data(a1,a2,a3,a4) {}
754 template <
typename A1,
typename A2,
typename A3,
typename A4,
typename A5>
756 const A4 &a4,
const A5 &a5)
757 : data(a1,a2,a3,a4,a5) {}
765 operator T&() {
return data; }
766 operator const T&()
const {
return data; }
Node * GetOrInsertNode(Node *N)
FoldingSetIterator< T > iterator
void AddPointer(const void *Ptr)
FoldingSetNodeIDRef(const unsigned *D, size_t S)
FoldingSetBucketIterator< T > bucket_iterator
ContextualFoldingSet(Ctx Context, unsigned Log2InitSize=6)
FoldingSetIterator< const T > const_iterator
bucket_iterator bucket_begin(unsigned hash)
FastFoldingSetNode(const FoldingSetNodeID &ID)
void InsertNode(Node *N, void *InsertPos)
FoldingSetNodeWrapper(const A1 &a1, const A2 &a2)
static void Profile(const T &X, FoldingSetNodeID &ID)
FoldingSet(unsigned Log2InitSize=6)
bool operator==(const SelfT &RHS) const
unsigned ComputeHash() const
static void Profile(T *X, FoldingSetNodeID &ID)
static unsigned ComputeHash(T &X, FoldingSetNodeID &TempID)
virtual void GetNodeProfile(Node *N, FoldingSetNodeID &ID) const =0
T * GetOrInsertNode(Node *N)
void AddInteger(signed I)
ID
LLVM Calling Convention Representation.
const_iterator end() const
bool operator==(const FoldingSetNodeID &RHS) const
FoldingSetNodeWrapper(const T &x)
const_iterator end() const
const_iterator begin() const
void Profile(FoldingSetNodeID &ID)
void clear()
clear - Remove all nodes from the folding set.
FoldingSetVectorIterator< const T, typename VectorT::const_iterator > const_iterator
FoldingSetNodeWrapper(const A1 &a1, const A2 &a2, const A3 &a3)
virtual unsigned ComputeNodeHash(Node *N, FoldingSetNodeID &TempID) const =0
void AddNodeID(const FoldingSetNodeID &ID)
const T & getValue() const
FoldingSetNodeWrapper(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5)
void * getNextInBucket() const
void Profile(FoldingSetNodeID &ID) const
static unsigned ComputeHash(T &X, FoldingSetNodeID &TempID, Ctx Context)
bool operator<(FoldingSetNodeIDRef) const
T * FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos)
T * FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos)
FoldingSetBucketIterator operator++(int)
bool empty() const
empty - Returns true if there are no nodes in the folding set.
Node * FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos)
T * FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos)
FoldingSetIterator operator++(int)
unsigned size() const
size - Returns the number of nodes in the folding set.
FoldingSetBucketIterator & operator++()
bucket_iterator bucket_end(unsigned hash)
void InsertNode(T *N, void *InsertPos)
FoldingSetImpl(unsigned Log2InitSize=6)
FoldingSetIterator< T > iterator
virtual ~FoldingSetNodeWrapper()
FoldingSetVector(unsigned Log2InitSize=6)
static bool Equals(T &X, const FoldingSetNodeID &ID, unsigned IDHash, FoldingSetNodeID &TempID)
bool empty() const
empty - Returns true if there are no nodes in the folding set.
bool operator<(const FoldingSetNodeID &RHS) const
unsigned size() const
size - Returns the number of nodes in the folding set.
FoldingSetNodeID(FoldingSetNodeIDRef Ref)
FoldingSetNodeWrapper(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4)
void SetNextInBucket(void *N)
FoldingSetBucketIterator(void **Bucket)
FoldingSetBucketIterator(void **Bucket, bool)
virtual ~FoldingSetImpl()
FoldingSetImpl::Node FoldingSetNode
T * GetOrInsertNode(Node *N)
FoldingSetIterator & operator++()
FoldingSetVectorIterator(VectorIteratorT I)
FoldingSetNodeWrapper(const A1 &a1)
static void Profile(T &X, FoldingSetNodeID &ID)
bool operator!=(const SelfT &RHS) const
const unsigned * getData() const
T * GetOrInsertNode(T *N)
FoldingSetIteratorImpl(void **Bucket)
unsigned ComputeHash() const
const_iterator end() const
bucket_iterator bucket_end(unsigned hash)
void AddString(StringRef String)
bool operator==(const FoldingSetIteratorImpl &RHS) const
FoldingSetVectorIterator< T, typename VectorT::iterator > iterator
const_iterator begin() const
FoldingSetBucketIteratorImpl(void **Bucket)
FoldingSetIterator(void **Bucket)
FoldingSetNodeIDRef Intern(BumpPtrAllocator &Allocator) const
bucket_iterator bucket_begin(unsigned hash)
virtual bool NodeEquals(Node *N, const FoldingSetNodeID &ID, unsigned IDHash, FoldingSetNodeID &TempID) const =0
const_iterator begin() const
bool operator==(const FoldingSetBucketIteratorImpl &RHS) const
void clear()
clear - Remove all nodes from the folding set.
static RegisterPass< NVPTXAllocaHoisting > X("alloca-hoisting","Hoisting alloca instructions in non-entry ""blocks to the entry block")
FoldingSetBucketIteratorImpl(void **Bucket, bool)
bool operator!=(const FoldingSetIteratorImpl &RHS) const
FoldingSetBucketIterator< T > bucket_iterator
bool operator!=(const FoldingSetBucketIteratorImpl &RHS) const
bool operator==(FoldingSetNodeIDRef) const
FoldingSetIterator< const T > const_iterator
static void Profile(T &X, FoldingSetNodeID &ID, Ctx Context)
static bool Equals(T &X, const FoldingSetNodeID &ID, unsigned IDHash, FoldingSetNodeID &TempID, Ctx Context)