[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