Fix bug in andersen's related to test_and_set.
authorDaniel Berlin <dberlin@dberlin.org>
Sun, 16 Sep 2007 23:59:53 +0000 (23:59 +0000)
committerDaniel Berlin <dberlin@dberlin.org>
Sun, 16 Sep 2007 23:59:53 +0000 (23:59 +0000)
Add operator == and != to SparseBitVector.
Simplify code for test_and_set

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42018 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ADT/SparseBitVector.h
lib/Analysis/IPA/Andersens.cpp

index 5622aab6540a535fbb0c0fd024a32b214909fb0e..6ffc6edcfc78927a4d44a2b853d91269308d3837 100644 (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.
index fed246091d75636d83031d955d00b6fe2d1ca5c2..9a1ff569b8859fd32c3e6a5443caf6a76155c12c 100644 (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