16#ifndef LLVM_ADT_FOLDINGSET_H
17#define LLVM_ADT_FOLDINGSET_H
142 void *NextInFoldingSetBucket =
nullptr;
265template <
typename T,
typename Enable =
void>
270template<
typename T,
typename Ctx>
273 X.Profile(
ID, Context);
294 const unsigned *Data =
nullptr;
311 reinterpret_cast<const uint8_t *
>(Data),
sizeof(
unsigned) * Size)));
322 const unsigned *
getData()
const {
return Data; }
335 template <
typename T>
void AddIntegerImpl(
T I) {
336 static_assert(std::is_integral_v<T> &&
sizeof(
T) <=
sizeof(
unsigned) * 2,
337 "T must be an integer type no wider than 64 bits");
339 if constexpr (
sizeof(
unsigned) <
sizeof(
T))
340 Bits.push_back(
static_cast<unsigned long long>(
I) >> 32);
355 static_assert(
sizeof(uintptr_t) <=
sizeof(
unsigned long long),
356 "unexpected pointer size");
369 template <
typename T>
374 inline void clear() { Bits.clear(); }
428template<
typename T,
typename Ctx>
438template<
typename T,
typename Ctx>
497 return static_cast<T *
>(
506 ID, InsertPos, Derived::getFoldingSetInfo()));
521 assert(Inserted ==
N &&
"Node already inserted!");
543 T *TN =
static_cast<T *
>(
N);
552 T *TN =
static_cast<T *
>(
N);
560 T *TN =
static_cast<T *
>(
N);
566 GetNodeProfile, NodeEquals, ComputeNodeHash};
572 explicit FoldingSet(
unsigned Log2InitSize = 6) : Super(Log2InitSize) {}
586template <
class T,
class Ctx>
607 T *TN =
static_cast<T *
>(
N);
614 T *TN =
static_cast<T *
>(
N);
621 T *TN =
static_cast<T *
>(
N);
628 GetNodeProfile, NodeEquals, ComputeNodeHash};
635 : Super(Log2InitSize), Context(Context) {}
645template <
class T,
class VectorT = SmallVector<T*, 8>>
664 void clear() { Set.clear(); Vector.clear(); }
670 return Set.FindNodeOrInsertPos(
ID, InsertPos);
677 T *Result = Set.GetOrInsertNode(
N);
678 if (Result ==
N) Vector.push_back(
N);
686 Set.InsertNode(
N, InsertPos);
698 unsigned size()
const {
return Set.size(); }
701 bool empty()
const {
return Set.empty(); }
759 uintptr_t x =
reinterpret_cast<uintptr_t
>(Probe) & ~0x1;
760 Ptr =
reinterpret_cast<void*
>(x);
801 template <
typename... Ts>
803 : data(
std::forward<Ts>(Args)...) {}
810 operator T&() {
return data; }
811 operator const T&()
const {
return data; }
838template <
typename T1,
typename T2>
840 static inline void Profile(
const std::pair<T1, T2> &
P,
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the BumpPtrAllocator interface.
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
Analysis containing CSE Info
This file contains library features backported from future STL versions.
This file defines the SmallVector class.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
static unsigned getSize(unsigned Kind)
ContextualFoldingSet(Ctx Context, unsigned Log2InitSize=6)
FastFoldingSetNode(const FoldingSetNodeID &ID)
void Profile(FoldingSetNodeID &ID) const
Node - This class is used to maintain the singly linked bucket list in a folding set.
void * getNextInBucket() const
void SetNextInBucket(void *N)
FoldingSetBase - Implements the folding set functionality.
LLVM_ABI FoldingSetBase(unsigned Log2InitSize=6)
void ** Buckets
Buckets - Array of bucket chains.
unsigned size() const
size - Returns the number of nodes in the folding set.
LLVM_ABI void reserve(unsigned EltCount, const FoldingSetInfo &Info)
reserve - Increase the number of buckets such that adding the EltCount-th node won't cause a rebucket...
LLVM_ABI bool RemoveNode(Node *N)
RemoveNode - Remove a node from the folding set, returning true if one was removed or false if the no...
LLVM_ABI FoldingSetBase & operator=(FoldingSetBase &&RHS)
LLVM_ABI ~FoldingSetBase()
unsigned NumBuckets
NumBuckets - Length of the Buckets array. Always a power of 2.
unsigned NumNodes
NumNodes - Number of nodes in the folding set.
unsigned capacity()
capacity - Returns the number of nodes permitted in the folding set before a rebucket operation is pe...
LLVM_ABI Node * GetOrInsertNode(Node *N, const FoldingSetInfo &Info)
GetOrInsertNode - If there is an existing simple Node exactly equal to the specified node,...
bool empty() const
empty - Returns true if there are no nodes in the folding set.
LLVM_ABI void InsertNode(Node *N, void *InsertPos, const FoldingSetInfo &Info)
InsertNode - Insert the specified node into the folding set, knowing that it is not already in the fo...
LLVM_ABI void clear()
clear - Remove all nodes from the folding set.
LLVM_ABI Node * FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos, const FoldingSetInfo &Info)
FindNodeOrInsertPos - Look up the node specified by ID.
LLVM_ABI FoldingSetBucketIteratorImpl(void **Bucket)
FoldingSetBucketIteratorImpl(void **Bucket, bool)
bool operator!=(const FoldingSetBucketIteratorImpl &RHS) const
bool operator==(const FoldingSetBucketIteratorImpl &RHS) const
FoldingSetBucketIterator(void **Bucket, bool)
FoldingSetBucketIterator(void **Bucket)
FoldingSetBucketIterator operator++(int)
FoldingSetBucketIterator & operator++()
void reserve(unsigned EltCount)
reserve - Increase the number of buckets such that adding the EltCount-th node won't cause a rebucket...
FoldingSetIterator< T > iterator
const_iterator end() const
bucket_iterator bucket_begin(unsigned hash)
bool RemoveNode(T *N)
RemoveNode - Remove a node from the folding set, returning true if one was removed or false if the no...
~FoldingSetImpl()=default
FoldingSetImpl(FoldingSetImpl &&Arg)=default
FoldingSetBucketIterator< T > bucket_iterator
void InsertNode(T *N)
InsertNode - Insert the specified node into the folding set, knowing that it is not already in the fo...
void InsertNode(T *N, void *InsertPos)
InsertNode - Insert the specified node into the folding set, knowing that it is not already in the fo...
T * FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos)
FindNodeOrInsertPos - Look up the node specified by ID.
const_iterator begin() const
FoldingSetIterator< const T > const_iterator
FoldingSetImpl & operator=(FoldingSetImpl &&RHS)=default
T * GetOrInsertNode(T *N)
GetOrInsertNode - If there is an existing simple Node exactly equal to the specified node,...
FoldingSetImpl(unsigned Log2InitSize)
bucket_iterator bucket_end(unsigned hash)
LLVM_ABI FoldingSetIteratorImpl(void **Bucket)
bool operator==(const FoldingSetIteratorImpl &RHS) const
bool operator!=(const FoldingSetIteratorImpl &RHS) const
FoldingSetIterator(void **Bucket)
FoldingSetIterator operator++(int)
FoldingSetIterator & operator++()
FoldingSetNodeIDRef - This class describes a reference to an interned FoldingSetNodeID,...
unsigned computeStableHash() const
LLVM_ABI bool operator==(FoldingSetNodeIDRef) const
FoldingSetNodeIDRef(const unsigned *D, size_t S)
LLVM_ABI bool operator<(FoldingSetNodeIDRef) const
Used to compare the "ordering" of two nodes as defined by the profiled bits and their ordering define...
bool operator!=(FoldingSetNodeIDRef RHS) const
unsigned ComputeHash() const
FoldingSetNodeIDRef()=default
const unsigned * getData() const
FoldingSetNodeID - This class is used to gather all the unique data bits of a node.
LLVM_ABI FoldingSetNodeIDRef Intern(BumpPtrAllocator &Allocator) const
Intern - Copy this node's data to a memory region allocated from the given allocator and return a Fol...
void AddInteger(signed I)
void AddInteger(unsigned long I)
FoldingSetNodeID(FoldingSetNodeIDRef Ref)
unsigned computeStableHash() const
void AddPointer(const void *Ptr)
Add* - Add various data types to Bit data.
bool operator!=(const FoldingSetNodeIDRef RHS) const
void clear()
clear - Clear the accumulated profile, allowing this FoldingSetNodeID object to be used to compute a ...
void AddInteger(unsigned I)
FoldingSetNodeID()=default
LLVM_ABI bool operator==(const FoldingSetNodeID &RHS) const
operator== - Used to compare two nodes to each other.
bool operator!=(const FoldingSetNodeID &RHS) const
void AddInteger(unsigned long long I)
void AddInteger(long long I)
unsigned ComputeHash() const
LLVM_ABI bool operator<(const FoldingSetNodeID &RHS) const
Used to compare the "ordering" of two nodes as defined by the profiled bits and their ordering define...
LLVM_ABI void AddNodeID(const FoldingSetNodeID &ID)
LLVM_ABI void AddString(StringRef String)
Add* - Add various data types to Bit data.
FoldingSetNodeWrapper(Ts &&... Args)
const T & getValue() const
void Profile(FoldingSetNodeID &ID)
T * GetOrInsertNode(T *N)
GetOrInsertNode - If there is an existing simple Node exactly equal to the specified node,...
const_iterator end() const
void InsertNode(T *N)
InsertNode - Insert the specified node into the folding set, knowing that it is not already in the fo...
T * FindNodeOrInsertPos(const FoldingSetNodeID &ID, void *&InsertPos)
FindNodeOrInsertPos - Look up the node specified by ID.
unsigned size() const
size - Returns the number of nodes in the folding set.
pointee_iterator< typename VectorT::const_iterator > const_iterator
pointee_iterator< typename VectorT::iterator > iterator
void clear()
clear - Remove all nodes from the folding set.
bool empty() const
empty - Returns true if there are no nodes in the folding set.
FoldingSetVector(unsigned Log2InitSize=6)
void InsertNode(T *N, void *InsertPos)
InsertNode - Insert the specified node into the folding set, knowing that it is not already in the fo...
const_iterator begin() const
FoldingSet - This template class is used to instantiate a specialized implementation of the folding s...
FoldingSet(FoldingSet &&Arg)=default
FoldingSet(unsigned Log2InitSize=6)
FoldingSet & operator=(FoldingSet &&RHS)=default
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
This is an optimization pass for GlobalISel generic memory operations.
LLVM_ABI uint64_t xxh3_64bits(ArrayRef< uint8_t > data)
FoldingSetBase::Node FoldingSetNode
constexpr std::underlying_type_t< Enum > to_underlying(Enum E)
Returns underlying integer value of an enum.
BumpPtrAllocatorImpl BumpPtrAllocator
The standard BumpPtrAllocator which just uses the default template parameters.
@ Ref
The access may reference the value stored in memory.
ArrayRef(const T &OneElt) -> ArrayRef< T >
hash_code hash_combine_range(InputIteratorT first, InputIteratorT last)
Compute a hash_code for a sequence of values.
Implement std::hash so that hash_code can be used in STL containers.
ContextualFoldingSetTrait - Like FoldingSetTrait, but for ContextualFoldingSets.
DefaultContextualFoldingSetTrait - Like DefaultFoldingSetTrait, but for ContextualFoldingSets.
static bool Equals(T &X, const FoldingSetNodeID &ID, unsigned IDHash, FoldingSetNodeID &TempID, Ctx Context)
static void Profile(T &X, FoldingSetNodeID &ID, Ctx Context)
static unsigned ComputeHash(T &X, FoldingSetNodeID &TempID, Ctx Context)
DefaultFoldingSetTrait - This class provides default implementations for FoldingSetTrait implementati...
static void Profile(const T &X, FoldingSetNodeID &ID)
static unsigned ComputeHash(T &X, FoldingSetNodeID &TempID)
static bool Equals(T &X, const FoldingSetNodeID &ID, unsigned IDHash, FoldingSetNodeID &TempID)
static void Profile(T &X, FoldingSetNodeID &ID)
Functions provided by the derived class to compute folding properties.
unsigned(* ComputeNodeHash)(const FoldingSetBase *Self, Node *N, FoldingSetNodeID &TempID)
ComputeNodeHash - Instantiations of the FoldingSet template implement this function to compute a hash...
bool(* NodeEquals)(const FoldingSetBase *Self, Node *N, const FoldingSetNodeID &ID, unsigned IDHash, FoldingSetNodeID &TempID)
NodeEquals - Instantiations of the FoldingSet template implement this function to compare the given n...
void(* GetNodeProfile)(const FoldingSetBase *Self, Node *N, FoldingSetNodeID &ID)
GetNodeProfile - Instantiations of the FoldingSet template implement this function to gather data bit...
static void Profile(const T &X, FoldingSetNodeID &ID)
static void Profile(T *X, FoldingSetNodeID &ID)
static void Profile(const std::pair< T1, T2 > &P, FoldingSetNodeID &ID)
FoldingSetTrait - This trait class is used to define behavior of how to "profile" (in the FoldingSet ...
An iterator type that allows iterating over the pointees via some other iterator.