[llvm-commits] CVS: llvm/include/llvm/ADT/EquivalenceClasses.h

Chris Lattner lattner at cs.uiuc.edu
Sat Mar 19 12:43:00 PST 2005



Changes in directory llvm/include/llvm/ADT:

EquivalenceClasses.h updated: 1.10 -> 1.11
---
Log message:

add some methods, fix a major bug in getLeader() that was causing things to
not be unified correctly.


---
Diffs of the changes:  (+27 -3)

 EquivalenceClasses.h |   30 +++++++++++++++++++++++++++---
 1 files changed, 27 insertions(+), 3 deletions(-)


Index: llvm/include/llvm/ADT/EquivalenceClasses.h
diff -u llvm/include/llvm/ADT/EquivalenceClasses.h:1.10 llvm/include/llvm/ADT/EquivalenceClasses.h:1.11
--- llvm/include/llvm/ADT/EquivalenceClasses.h:1.10	Sat Mar 19 13:26:14 2005
+++ llvm/include/llvm/ADT/EquivalenceClasses.h	Sat Mar 19 14:42:43 2005
@@ -73,7 +73,7 @@
 
     const ECValue *getLeader() const {
       if (isLeader()) return this;
-      if (Leader->isLeader() == 0) return Leader;
+      if (Leader->isLeader()) return Leader;
       // Path compression.
       return Leader = Leader->getLeader();
     }
@@ -146,6 +146,30 @@
     return member_iterator(0);
   }
 
+  /// findValue - Return an iterator to the specified value.  If it does not
+  /// exist, end() is returned.
+  iterator findValue(const ElemTy &V) const {
+    return TheMapping.find(V);
+  }
+
+  /// getLeaderValue - Return the leader for the specified value that is in the
+  /// set.  It is an error to call this method for a value that is not yet in
+  /// the set.  For that, call getOrInsertLeaderValue(V).
+  const ElemTy &getLeaderValue(const ElemTy &V) const {
+    member_iterator MI = findLeader(V);
+    assert(MI != member_end() && "Value is not in the set!");
+    return *MI;
+  }
+
+  /// getOrInsertLeaderValue - Return the leader for the specified value that is
+  /// in the set.  If the member is not in the set, it is inserted, then
+  /// returned.
+  const ElemTy &getOrInsertLeaderValue(const ElemTy &V) const {
+    member_iterator MI = findLeader(insert(V));
+    assert(MI != member_end() && "Value is not in the set!");
+    return *MI;
+  }
+
   /// getNumClasses - Return the number of equivalence classes in this set.
   /// Note that this is a linear time operation.
   unsigned getNumClasses() const {
@@ -156,7 +180,6 @@
   }
 
 
-
   //===--------------------------------------------------------------------===//
   // Mutation methods
 
@@ -183,7 +206,8 @@
   /// union - Merge the two equivalence sets for the specified values, inserting
   /// them if they do not already exist in the equivalence set.
   member_iterator unionSets(const ElemTy &V1, const ElemTy &V2) {
-    return unionSets(findLeader(insert(V1)), findLeader(insert(V2)));
+    iterator V1I = insert(V1), V2I = insert(V2);
+    return unionSets(findLeader(V1I), findLeader(V2I));
   }
   member_iterator unionSets(member_iterator L1, member_iterator L2) {
     assert(L1 != member_end() && L2 != member_end() && "Illegal inputs!");






More information about the llvm-commits mailing list