[llvm-commits] [llvm] r46753 - in /llvm/trunk/include/llvm/ADT: ImmutableMap.h ImmutableSet.h

Ted Kremenek kremenek at apple.com
Tue Feb 5 09:30:43 PST 2008


Author: kremenek
Date: Tue Feb  5 11:30:43 2008
New Revision: 46753

URL: http://llvm.org/viewvc/llvm-project?rev=46753&view=rev
Log:
Changed profiling method for ImmutableMap to once again just use its
unique ImutAVLTree* for profiling.

Modified ImutAVLTree:
 (1) changed ComputeHash() to ComputeDigest() and
 (2) changed Profile() to use the computed digest and
 (3) modified insertion of IMutAVLTree into the FoldingSet owned by
     the ImutAVLTreeFactory object to use profiling instead of computing
     a direct hash.  This fixes a bug where our abuse of the FoldingSet would
     not work when the FoldingSet was resized.

Modified:
    llvm/trunk/include/llvm/ADT/ImmutableMap.h
    llvm/trunk/include/llvm/ADT/ImmutableSet.h

Modified: llvm/trunk/include/llvm/ADT/ImmutableMap.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ImmutableMap.h?rev=46753&r1=46752&r2=46753&view=diff

==============================================================================
--- llvm/trunk/include/llvm/ADT/ImmutableMap.h (original)
+++ llvm/trunk/include/llvm/ADT/ImmutableMap.h Tue Feb  5 11:30:43 2008
@@ -206,7 +206,7 @@
   inline unsigned getHeight() const { return Root ? Root->getHeight() : 0; }
 
   static inline void Profile(FoldingSetNodeID& ID, const ImmutableMap& M) {
-    M.Root->Profile(ID);
+    ID.AddPointer(M.Root);
   }
   
   inline void Profile(FoldingSetNodeID& ID) const {

Modified: llvm/trunk/include/llvm/ADT/ImmutableSet.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/ImmutableSet.h?rev=46753&r1=46752&r2=46753&view=diff

==============================================================================
--- llvm/trunk/include/llvm/ADT/ImmutableSet.h (original)
+++ llvm/trunk/include/llvm/ADT/ImmutableSet.h Tue Feb  5 11:30:43 2008
@@ -203,13 +203,10 @@
     return getHeight();
   }
   
-  /// Profile - Profiling for ImutAVLTree.  This is not used by the
-  //    Factory object (which internally uses a FoldingSet), but can
-  //    be used by external clients that wish to insert an ImutAVLTree
-  //    object into a FoldingSet.
-  void Profile(llvm::FoldingSetNodeID& ID) const {
-    ID.AddPointer(this);
-  }   
+  /// Profile - Profiling for ImutAVLTree.
+  void Profile(llvm::FoldingSetNodeID& ID) {
+    ID.AddInteger(ComputeDigest());
+  }
   
   //===----------------------------------------------------===//  
   // Internal Values.
@@ -220,7 +217,7 @@
   ImutAVLTree*     Right;
   unsigned         Height;
   value_type       Value;
-  unsigned         Hash;
+  unsigned         Digest;
   
   //===----------------------------------------------------===//    
   // Internal methods (node manipulation; used by Factory).
@@ -234,7 +231,7 @@
   ///   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), Hash(0) {}
+    Right(r), Height(height), Value(v), Digest(0) {}
   
   
   /// isMutable - Returns true if the left and right subtree references
@@ -299,27 +296,27 @@
   
   
   static inline
-  unsigned ComputeHash(ImutAVLTree* L, ImutAVLTree* R, value_type_ref V) {
-    unsigned hash = 0;
+  unsigned ComputeDigest(ImutAVLTree* L, ImutAVLTree* R, value_type_ref V) {
+    unsigned digest = 0;
     
-    if (L) hash += L->ComputeHash();
+    if (L) digest += L->ComputeDigest();
     
-    { // Compute hash of stored data.
+    { // Compute digest of stored data.
       FoldingSetNodeID ID;
       ImutInfo::Profile(ID,V);
-      hash += ID.ComputeHash();
+      digest += ID.ComputeHash();
     }
     
-    if (R) hash += R->ComputeHash();
+    if (R) digest += R->ComputeDigest();
     
-    return hash;
+    return digest;
   }
   
-  inline unsigned ComputeHash() {
-    if (Hash) return Hash;
+  inline unsigned ComputeDigest() {
+    if (Digest) return Digest;
     
-    unsigned X = ComputeHash(getSafeLeft(), getRight(), getValue());
-    if (!isMutable()) Hash = X;
+    unsigned X = ComputeDigest(getSafeLeft(), getRight(), getValue());
+    if (!isMutable()) Digest = X;
     
     return X;
   }
@@ -408,15 +405,19 @@
   //===--------------------------------------------------===//
   
   TreeTy* CreateNode(TreeTy* L, value_type_ref V, TreeTy* R) {
-    // Search the FoldingSet bucket for a Tree with the same hash.
-    unsigned hash = TreeTy::ComputeHash(L, R, V);
+    // Search the FoldingSet bucket for a Tree with the same digest.
+    FoldingSetNodeID ID;
+    unsigned digest = TreeTy::ComputeDigest(L, R, V);
+    ID.AddInteger(digest);
+    unsigned hash = ID.ComputeHash();
+    
     typename CacheTy::bucket_iterator I = Cache.bucket_begin(hash);
     typename CacheTy::bucket_iterator E = Cache.bucket_end(hash);
     
     for (; I != E; ++I) {
       TreeTy* T = &*I;
 
-      if (T->ComputeHash() != hash)
+      if (T->ComputeDigest() != digest)
         continue;
       
       // We found a collision.  Perform a comparison of Contents('T')
@@ -454,7 +455,7 @@
 
     // We do not insert 'T' into the FoldingSet here.  This is because
     // this tree is still mutable and things may get rebalanced.
-    // Because our hash is associative and based on the contents of
+    // Because our digest is associative and based on the contents of
     // the set, this should hopefully not cause any strange bugs.
     // 'T' is inserted by 'MarkImmutable'.
 
@@ -592,7 +593,9 @@
         
     // Now that the node is immutable it can safely be inserted
     // into the node cache.
-    Cache.InsertNode(T, (void*) &*Cache.bucket_end(T->ComputeHash()));
+    llvm::FoldingSetNodeID ID;
+    ID.AddInteger(T->ComputeDigest());
+    Cache.InsertNode(T, (void*) &*Cache.bucket_end(ID.ComputeHash()));
   }
 };
   





More information about the llvm-commits mailing list