aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/ADT/SparseBitVector.h
diff options
context:
space:
mode:
authorDaniel Berlin <dberlin@dberlin.org>2007-09-16 22:31:47 +0000
committerDaniel Berlin <dberlin@dberlin.org>2007-09-16 22:31:47 +0000
commit7f44657c2f4409416a083a9e63d2b4ea7cdca43e (patch)
tree994cc8030cda3c8dbce3a044b62138adb20c1633 /include/llvm/ADT/SparseBitVector.h
parentaad158891c1881a81cbb8bf296d31aab91ffeb2b (diff)
downloadexternal_llvm-7f44657c2f4409416a083a9e63d2b4ea7cdca43e.zip
external_llvm-7f44657c2f4409416a083a9e63d2b4ea7cdca43e.tar.gz
external_llvm-7f44657c2f4409416a083a9e63d2b4ea7cdca43e.tar.bz2
Fix a few bugs related to zero'ing of elements
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@42017 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/ADT/SparseBitVector.h')
-rw-r--r--include/llvm/ADT/SparseBitVector.h59
1 files changed, 14 insertions, 45 deletions
diff --git a/include/llvm/ADT/SparseBitVector.h b/include/llvm/ADT/SparseBitVector.h
index cfa57f4..5622aab 100644
--- a/include/llvm/ADT/SparseBitVector.h
+++ b/include/llvm/ADT/SparseBitVector.h
@@ -212,7 +212,7 @@ public:
BitWord old = changed ? 0 : Bits[i];
Bits[i] |= RHS.Bits[i];
- if (old != Bits[i])
+ if (!changed && old != Bits[i])
changed = true;
}
return changed;
@@ -242,17 +242,17 @@ public:
if (Bits[i] != 0)
allzero = false;
- if (old != Bits[i])
+ if (!changed && old != Bits[i])
changed = true;
}
- BecameZero = !allzero;
+ BecameZero = allzero;
return changed;
}
// Intersect this Element with the complement of RHS and return true if this
// one changed. BecameZero is set to true if this element became all-zero
// bits.
bool intersectWithComplement(const SparseBitVectorElement &RHS,
- bool &BecameZero) {
+ bool &BecameZero) {
bool changed = false;
bool allzero = true;
@@ -264,10 +264,10 @@ public:
if (Bits[i] != 0)
allzero = false;
- if (old != Bits[i])
+ if (!changed && old != Bits[i])
changed = true;
}
- BecameZero = !allzero;
+ BecameZero = allzero;
return changed;
}
// Three argument version of intersectWithComplement that intersects
@@ -283,7 +283,7 @@ public:
if (Bits[i] != 0)
allzero = false;
}
- BecameZero = !allzero;
+ BecameZero = allzero;
}
};
@@ -548,12 +548,6 @@ public:
if (Elements.empty() && RHS.Elements.empty())
return false;
- // See if the first bitmap element is the same in both. This is only
- // possible if they are the same bitmap.
- if (Iter1 != Elements.end() && Iter2 != RHS.Elements.end())
- if (*Iter1 == *Iter2)
- return false;
-
while (Iter2 != RHS.Elements.end()) {
if (Iter1 == Elements.end() || Iter1->index() > Iter2->index()) {
Elements.insert(Iter1,
@@ -582,12 +576,6 @@ public:
if (Elements.empty() && RHS.Elements.empty())
return false;
- // See if the first bitmap element is the same in both. This is only
- // possible if they are the same bitmap.
- if (Iter1 != Elements.end() && Iter2 != RHS.Elements.end())
- if (*Iter1 == *Iter2)
- return false;
-
// Loop through, intersecting as we go, erasing elements when necessary.
while (Iter2 != RHS.Elements.end()) {
if (Iter1 == Elements.end())
@@ -600,9 +588,11 @@ public:
changed |= Iter1->intersectWith(*Iter2, BecameZero);
if (BecameZero) {
ElementListIter IterTmp = Iter1;
+ ++Iter1;
Elements.erase(IterTmp);
+ } else {
+ ++Iter1;
}
- ++Iter1;
++Iter2;
} else {
ElementListIter IterTmp = Iter1;
@@ -626,14 +616,6 @@ public:
if (Elements.empty() && RHS.Elements.empty())
return false;
- // See if the first bitmap element is the same in both. This is only
- // possible if they are the same bitmap.
- if (Iter1 != Elements.end() && Iter2 != RHS.Elements.end())
- if (*Iter1 == *Iter2) {
- Elements.clear();
- return true;
- }
-
// Loop through, intersecting as we go, erasing elements when necessary.
while (Iter2 != RHS.Elements.end()) {
if (Iter1 == Elements.end())
@@ -646,9 +628,11 @@ public:
changed |= Iter1->intersectWithComplement(*Iter2, BecameZero);
if (BecameZero) {
ElementListIter IterTmp = Iter1;
+ ++Iter1;
Elements.erase(IterTmp);
+ } else {
+ ++Iter1;
}
- ++Iter1;
++Iter2;
} else {
ElementListIter IterTmp = Iter1;
@@ -678,13 +662,6 @@ public:
if (RHS1.empty() && RHS2.empty())
return;
- // See if the first bitmap element is the same in both. This is only
- // possible if they are the same bitmap.
- if (Iter1 != RHS1.Elements.end() && Iter2 != RHS2.Elements.end())
- if (*Iter1 == *Iter2) {
- return;
- }
-
// Loop through, intersecting as we go, erasing elements when necessary.
while (Iter2 != RHS2.Elements.end()) {
if (Iter1 == RHS1.Elements.end())
@@ -702,7 +679,6 @@ public:
}
else
delete NewElement;
-
++Iter1;
++Iter2;
} else {
@@ -740,13 +716,6 @@ public:
if (Elements.empty() && RHS.Elements.empty())
return false;
- // See if the first bitmap element is the same in both. This is only
- // possible if they are the same bitmap.
- if (Iter1 != Elements.end() && Iter2 != RHS.Elements.end())
- if (*Iter1 == *Iter2) {
- return true;
- }
-
// Loop through, intersecting stopping when we hit bits in common.
while (Iter2 != RHS.Elements.end()) {
if (Iter1 == Elements.end())
@@ -824,7 +793,7 @@ inline bool operator &=(SparseBitVector<ElementSize> &LHS,
const SparseBitVector<ElementSize> *RHS) {
return LHS &= (*RHS);
}
-
+
// Dump a SparseBitVector to a stream
template <unsigned ElementSize>