From 7f44657c2f4409416a083a9e63d2b4ea7cdca43e Mon Sep 17 00:00:00 2001 From: Daniel Berlin Date: Sun, 16 Sep 2007 22:31:47 +0000 Subject: 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 --- include/llvm/ADT/SparseBitVector.h | 59 +++++++++----------------------------- 1 file changed, 14 insertions(+), 45 deletions(-) (limited to 'include/llvm/ADT/SparseBitVector.h') 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 &LHS, const SparseBitVector *RHS) { return LHS &= (*RHS); } - + // Dump a SparseBitVector to a stream template -- cgit v1.1