mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
add some methods, fix a major bug in getLeader() that was causing things to
not be unified correctly. llvm-svn: 20691
This commit is contained in:
parent
e4d74b8d85
commit
d9b3369aa9
@ -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!");
|
||||
|
Loading…
Reference in New Issue
Block a user