mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
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:
parent
688e8d9b60
commit
d44b2016ca
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user