diff options
author | Daniel Berlin <dberlin@dberlin.org> | 2007-09-16 23:59:53 +0000 |
---|---|---|
committer | Daniel Berlin <dberlin@dberlin.org> | 2007-09-16 23:59:53 +0000 |
commit | 90aaa1dcf7bac94faf1125a0345b41d7d68d0a4f (patch) | |
tree | f69afd4ef48a32a013861d8b788f42870d45fdcf /llvm | |
parent | c637abee96654c63b3e3578fcae9a758ef0b5145 (diff) | |
download | bcm5719-llvm-90aaa1dcf7bac94faf1125a0345b41d7d68d0a4f.tar.gz bcm5719-llvm-90aaa1dcf7bac94faf1125a0345b41d7d68d0a4f.zip |
Fix bug in andersen's related to test_and_set.
Add operator == and != to SparseBitVector.
Simplify code for test_and_set
llvm-svn: 42018
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/include/llvm/ADT/SparseBitVector.h | 30 | ||||
-rw-r--r-- | llvm/lib/Analysis/IPA/Andersens.cpp | 7 |
2 files changed, 29 insertions, 8 deletions
diff --git a/llvm/include/llvm/ADT/SparseBitVector.h b/llvm/include/llvm/ADT/SparseBitVector.h index 5622aab6540..6ffc6edcfc7 100644 --- a/llvm/include/llvm/ADT/SparseBitVector.h +++ b/llvm/include/llvm/ADT/SparseBitVector.h @@ -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. diff --git a/llvm/lib/Analysis/IPA/Andersens.cpp b/llvm/lib/Analysis/IPA/Andersens.cpp index fed246091d7..9a1ff569b88 100644 --- a/llvm/lib/Analysis/IPA/Andersens.cpp +++ b/llvm/lib/Analysis/IPA/Andersens.cpp @@ -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 |