Don't implement AliasSetTracker::remove in terms of deleteValue. deleteValue
authorChris Lattner <sabre@nondot.org>
Tue, 27 Jun 2006 23:48:59 +0000 (23:48 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 27 Jun 2006 23:48:59 +0000 (23:48 +0000)
causes the pointer to be removed from the underlying alias analysis
implementation as well.  This impl of remove is also significantly faster than
the old one.  This fixes:
Regression/Transforms/DeadStoreElimination/2006-06-27-AST-Remove.ll

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

lib/Analysis/AliasSetTracker.cpp

index 83ba69a69d0780ca072230c481347adf4d5f019b..f805a43b4e78ace61ef1197d70e9d779870472f4 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.
+  assert(AS.RefCount == NumRefs);
+  AS.RefCount = 0;
+  AS.removeFromTracker(*this);
 }
 
 bool AliasSetTracker::remove(Value *Ptr, unsigned Size) {