FoldingSet: Push the hash through FoldingSetTraits::Equals, so clients can use it.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@154496 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Benjamin Kramer 2012-04-11 14:06:47 +00:00
parent 7484920cf5
commit f7c3e5f051
3 changed files with 18 additions and 18 deletions

View File

@ -193,12 +193,11 @@ protected:
virtual void GetNodeProfile(Node *N, FoldingSetNodeID &ID) const = 0; virtual void GetNodeProfile(Node *N, FoldingSetNodeID &ID) const = 0;
/// NodeEquals - Instantiations of the FoldingSet template implement /// NodeEquals - Instantiations of the FoldingSet template implement
/// this function to compare the given node with the given ID. /// this function to compare the given node with the given ID.
virtual bool NodeEquals(Node *N, const FoldingSetNodeID &ID, virtual bool NodeEquals(Node *N, const FoldingSetNodeID &ID, unsigned IDHash,
FoldingSetNodeID &TempID) const=0; FoldingSetNodeID &TempID) const=0;
/// NodeEquals - Instantiations of the FoldingSet template implement /// ComputeNodeHash - Instantiations of the FoldingSet template implement
/// this function to compute a hash value for the given node. /// this function to compute a hash value for the given node.
virtual unsigned ComputeNodeHash(Node *N, virtual unsigned ComputeNodeHash(Node *N, FoldingSetNodeID &TempID) const = 0;
FoldingSetNodeID &TempID) const = 0;
}; };
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
@ -220,7 +219,7 @@ template<typename T> struct DefaultFoldingSetTrait {
// to compute a temporary ID if necessary. The default implementation // to compute a temporary ID if necessary. The default implementation
// just calls Profile and does a regular comparison. Implementations // just calls Profile and does a regular comparison. Implementations
// can override this to provide more efficient implementations. // can override this to provide more efficient implementations.
static inline bool Equals(T &X, const FoldingSetNodeID &ID, static inline bool Equals(T &X, const FoldingSetNodeID &ID, unsigned IDHash,
FoldingSetNodeID &TempID); FoldingSetNodeID &TempID);
// ComputeHash - Compute a hash value for X, using TempID to // ComputeHash - Compute a hash value for X, using TempID to
@ -249,7 +248,7 @@ struct DefaultContextualFoldingSetTrait {
static void Profile(T &X, FoldingSetNodeID &ID, Ctx Context) { static void Profile(T &X, FoldingSetNodeID &ID, Ctx Context) {
X.Profile(ID, Context); X.Profile(ID, Context);
} }
static inline bool Equals(T &X, const FoldingSetNodeID &ID, static inline bool Equals(T &X, const FoldingSetNodeID &ID, unsigned IDHash,
FoldingSetNodeID &TempID, Ctx Context); FoldingSetNodeID &TempID, Ctx Context);
static inline unsigned ComputeHash(T &X, FoldingSetNodeID &TempID, static inline unsigned ComputeHash(T &X, FoldingSetNodeID &TempID,
Ctx Context); Ctx Context);
@ -344,7 +343,7 @@ template<class T> class FoldingSetBucketIterator;
template<typename T> template<typename T>
inline bool inline bool
DefaultFoldingSetTrait<T>::Equals(T &X, const FoldingSetNodeID &ID, DefaultFoldingSetTrait<T>::Equals(T &X, const FoldingSetNodeID &ID,
FoldingSetNodeID &TempID) { unsigned IDHash, FoldingSetNodeID &TempID) {
FoldingSetTrait<T>::Profile(X, TempID); FoldingSetTrait<T>::Profile(X, TempID);
return TempID == ID; return TempID == ID;
} }
@ -358,6 +357,7 @@ template<typename T, typename Ctx>
inline bool inline bool
DefaultContextualFoldingSetTrait<T, Ctx>::Equals(T &X, DefaultContextualFoldingSetTrait<T, Ctx>::Equals(T &X,
const FoldingSetNodeID &ID, const FoldingSetNodeID &ID,
unsigned IDHash,
FoldingSetNodeID &TempID, FoldingSetNodeID &TempID,
Ctx Context) { Ctx Context) {
ContextualFoldingSetTrait<T, Ctx>::Profile(X, TempID, Context); ContextualFoldingSetTrait<T, Ctx>::Profile(X, TempID, Context);
@ -387,15 +387,14 @@ private:
} }
/// NodeEquals - Instantiations may optionally provide a way to compare a /// NodeEquals - Instantiations may optionally provide a way to compare a
/// node with a specified ID. /// node with a specified ID.
virtual bool NodeEquals(Node *N, const FoldingSetNodeID &ID, virtual bool NodeEquals(Node *N, const FoldingSetNodeID &ID, unsigned IDHash,
FoldingSetNodeID &TempID) const { FoldingSetNodeID &TempID) const {
T *TN = static_cast<T *>(N); T *TN = static_cast<T *>(N);
return FoldingSetTrait<T>::Equals(*TN, ID, TempID); return FoldingSetTrait<T>::Equals(*TN, ID, IDHash, TempID);
} }
/// NodeEquals - Instantiations may optionally provide a way to compute a /// ComputeNodeHash - Instantiations may optionally provide a way to compute a
/// hash value directly from a node. /// hash value directly from a node.
virtual unsigned ComputeNodeHash(Node *N, virtual unsigned ComputeNodeHash(Node *N, FoldingSetNodeID &TempID) const {
FoldingSetNodeID &TempID) const {
T *TN = static_cast<T *>(N); T *TN = static_cast<T *>(N);
return FoldingSetTrait<T>::ComputeHash(*TN, TempID); return FoldingSetTrait<T>::ComputeHash(*TN, TempID);
} }
@ -465,10 +464,11 @@ private:
ContextualFoldingSetTrait<T, Ctx>::Profile(*TN, ID, Context); ContextualFoldingSetTrait<T, Ctx>::Profile(*TN, ID, Context);
} }
virtual bool NodeEquals(FoldingSetImpl::Node *N, virtual bool NodeEquals(FoldingSetImpl::Node *N,
const FoldingSetNodeID &ID, const FoldingSetNodeID &ID, unsigned IDHash,
FoldingSetNodeID &TempID) const { FoldingSetNodeID &TempID) const {
T *TN = static_cast<T *>(N); T *TN = static_cast<T *>(N);
return ContextualFoldingSetTrait<T, Ctx>::Equals(*TN, ID, TempID, Context); return ContextualFoldingSetTrait<T, Ctx>::Equals(*TN, ID, IDHash, TempID,
Context);
} }
virtual unsigned ComputeNodeHash(FoldingSetImpl::Node *N, virtual unsigned ComputeNodeHash(FoldingSetImpl::Node *N,
FoldingSetNodeID &TempID) const { FoldingSetNodeID &TempID) const {

View File

@ -140,7 +140,7 @@ namespace llvm {
ID = X.FastID; ID = X.FastID;
} }
static bool Equals(const SCEV &X, const FoldingSetNodeID &ID, static bool Equals(const SCEV &X, const FoldingSetNodeID &ID,
FoldingSetNodeID &TempID) { unsigned IDHash, FoldingSetNodeID &TempID) {
return ID == X.FastID; return ID == X.FastID;
} }
static unsigned ComputeHash(const SCEV &X, FoldingSetNodeID &TempID) { static unsigned ComputeHash(const SCEV &X, FoldingSetNodeID &TempID) {

View File

@ -265,15 +265,15 @@ void FoldingSetImpl::GrowHashTable() {
FoldingSetImpl::Node FoldingSetImpl::Node
*FoldingSetImpl::FindNodeOrInsertPos(const FoldingSetNodeID &ID, *FoldingSetImpl::FindNodeOrInsertPos(const FoldingSetNodeID &ID,
void *&InsertPos) { void *&InsertPos) {
unsigned IDHash = ID.ComputeHash();
void **Bucket = GetBucketFor(ID.ComputeHash(), Buckets, NumBuckets); void **Bucket = GetBucketFor(IDHash, Buckets, NumBuckets);
void *Probe = *Bucket; void *Probe = *Bucket;
InsertPos = 0; InsertPos = 0;
FoldingSetNodeID TempID; FoldingSetNodeID TempID;
while (Node *NodeInBucket = GetNextPtr(Probe)) { while (Node *NodeInBucket = GetNextPtr(Probe)) {
if (NodeEquals(NodeInBucket, ID, TempID)) if (NodeEquals(NodeInBucket, ID, IDHash, TempID))
return NodeInBucket; return NodeInBucket;
TempID.clear(); TempID.clear();