Fix bug in andersen's related to test_and_set.

Add operator == and != to SparseBitVector.
Simplify code for test_and_set

llvm-svn: 42018
This commit is contained in:
Daniel Berlin 2007-09-16 23:59:53 +00:00
parent c637abee96
commit 90aaa1dcf7
2 changed files with 29 additions and 8 deletions

View File

@ -128,9 +128,11 @@ public:
bool test_and_set (unsigned Idx) {
bool old = test(Idx);
if (!old)
if (!old) {
set(Idx);
return !old;
return true;
}
return false;
}
void reset(unsigned Idx) {
@ -533,9 +535,29 @@ public:
bool test_and_set (unsigned Idx) {
bool old = test(Idx);
if (!old)
if (!old) {
set(Idx);
return !old;
return true;
}
return false;
}
bool operator!=(const SparseBitVector &RHS) {
return !(*this == RHS);
}
bool operator==(const SparseBitVector &RHS) {
ElementListConstIter Iter1 = Elements.begin();
ElementListConstIter Iter2 = RHS.Elements.begin();
while (Iter2 != RHS.Elements.end()) {
if (Iter1->index() != Iter2->index()
|| *Iter1 != *Iter2)
return false;
++Iter1;
++Iter2;
}
return Iter1 == Elements.end();
}
// Union our bitmap with the RHS and return true if we changed.

View File

@ -1212,10 +1212,9 @@ void Andersens::SolveConstraints() {
}
do {
Changed = false;
Changed = false;
++NumIters;
DOUT << "Starting iteration #" << Iteration++ << "!\n";
DOUT << "Starting iteration #" << Iteration++;
// TODO: In the microoptimization category, we could just make Topo2Node
// a fast map and thus only contain the visited nodes.
for (unsigned i = 0; i < GraphNodes.size(); ++i) {
@ -1295,7 +1294,7 @@ void Andersens::SolveConstraints() {
// Add an edge to the graph, so we can just do regular bitmap ior next
// time. It may also let us notice a cycle.
if (!GraphNodes[*Src].Edges->test_and_set(*Dest)) {
if (GraphNodes[*Src].Edges->test_and_set(*Dest)) {
if (GraphNodes[*Dest].PointsTo |= *(GraphNodes[*Src].PointsTo)) {
GraphNodes[*Dest].Changed = true;
// If we changed a node we've already processed, we need another