summaryrefslogtreecommitdiffstats
path: root/include/llvm/ADT
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/ADT')
-rw-r--r--include/llvm/ADT/ImmutableSet.h29
1 files changed, 23 insertions, 6 deletions
diff --git a/include/llvm/ADT/ImmutableSet.h b/include/llvm/ADT/ImmutableSet.h
index e77deeb..5118b0d 100644
--- a/include/llvm/ADT/ImmutableSet.h
+++ b/include/llvm/ADT/ImmutableSet.h
@@ -198,6 +198,7 @@ private:
ImutAVLTree* Right;
unsigned Height;
value_type Value;
+ unsigned Hash;
//===----------------------------------------------------===//
// Profiling or FoldingSet.
@@ -205,22 +206,38 @@ private:
private:
+ static inline
+ unsigned ComputeHash(ImutAVLTree* L, ImutAVLTree* R, value_type_ref V) {
+ FoldingSetNodeID ID;
+
+ ID.AddInteger(L ? L->ComputeHash() : 0);
+ ImutInfo::Profile(ID,V);
+ ID.AddInteger(R ? R->ComputeHash() : 0);
+
+ return ID.ComputeHash();
+ }
+
+ inline unsigned ComputeHash() {
+ if (!isMutable() && Hash) return Hash;
+ Hash = ComputeHash(getSafeLeft(), getRight(), getValue());
+ return Hash;
+ }
+
/// Profile - Generates a FoldingSet profile for a tree node before it is
/// created. This is used by the ImutAVLFactory when creating
/// trees.
static inline
void Profile(FoldingSetNodeID& ID, ImutAVLTree* L, ImutAVLTree* R,
- value_type_ref V) {
- ID.AddPointer(L);
- ID.AddPointer(R);
- ImutInfo::Profile(ID,V);
+ value_type_ref V) {
+
+ ID.AddInteger(ComputeHash(L, R, V));
}
public:
/// Profile - Generates a FoldingSet profile for an existing tree node.
void Profile(FoldingSetNodeID& ID) {
- Profile(ID,getSafeLeft(),getRight(),getValue());
+ ID.AddInteger(ComputeHash());
}
//===----------------------------------------------------===//
@@ -235,7 +252,7 @@ private:
/// ImutAVLFactory.
ImutAVLTree(ImutAVLTree* l, ImutAVLTree* r, value_type_ref v, unsigned height)
: Left(reinterpret_cast<uintptr_t>(l) | Mutable),
- Right(r), Height(height), Value(v) {}
+ Right(r), Height(height), Value(v), Hash(0) {}
/// isMutable - Returns true if the left and right subtree references