Ensure that dump calls that are associated with asserts are removed from
[oota-llvm.git] / lib / Analysis / AliasSetTracker.cpp
index 83ba69a69d0780ca072230c481347adf4d5f019b..16c652117f563040b23d29229cde46cb213b38d3 100644 (file)
@@ -359,16 +359,28 @@ void AliasSetTracker::add(const AliasSetTracker &AST) {
 /// remove - Remove the specified (potentially non-empty) alias set from the
 /// tracker.
 void AliasSetTracker::remove(AliasSet &AS) {
-  bool SetDead;
-  do {
-    AliasSet::iterator I = AS.begin();
-    Value *Ptr = I.getPointer(); ++I;
-
-    // deleteValue will delete the set automatically when the last pointer
-    // reference is destroyed.  "Predict" when this will happen.
-    SetDead = I == AS.end();
-    deleteValue(Ptr);  // Delete all of the pointers from the set
-  } while (!SetDead);
+  // Drop all call sites.
+  AS.CallSites.clear();
+  
+  // Clear the alias set.
+  unsigned NumRefs = 0;
+  while (!AS.empty()) {
+    AliasSet::HashNodePair *P = AS.PtrList;
+    
+    // Unlink from the list of values.
+    P->second.removeFromList();
+    
+    // Remember how many references need to be dropped.
+    ++NumRefs;
+
+    // Finally, remove the entry.
+    PointerMap.erase(P->first);
+  }
+  
+  // Stop using the alias set, removing it.
+  AS.RefCount -= NumRefs;
+  if (AS.RefCount == 0)
+    AS.removeFromTracker(*this);
 }
 
 bool AliasSetTracker::remove(Value *Ptr, unsigned Size) {