From: Chris Lattner Date: Sat, 19 Mar 2005 20:42:43 +0000 (+0000) Subject: add some methods, fix a major bug in getLeader() that was causing things to X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=67823970461ba101fbb3704b016182e19bc5e2df;p=oota-llvm.git add some methods, fix a major bug in getLeader() that was causing things to not be unified correctly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@20691 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ADT/EquivalenceClasses.h b/include/llvm/ADT/EquivalenceClasses.h index e318919421d..ca9ca63ada9 100644 --- a/include/llvm/ADT/EquivalenceClasses.h +++ b/include/llvm/ADT/EquivalenceClasses.h @@ -73,7 +73,7 @@ class EquivalenceClasses { 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 @@ public: 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 @@ public: } - //===--------------------------------------------------------------------===// // Mutation methods @@ -183,7 +206,8 @@ public: /// 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!");