[llvm-commits] CVS: llvm/lib/Support/LeakDetector.cpp

Chris Lattner lattner at apoc.cs.uiuc.edu
Thu Sep 19 14:23:00 PDT 2002


Changes in directory llvm/lib/Support:

LeakDetector.cpp updated: 1.2 -> 1.3

---
Log message:

Add an optimization to support the most common access pattern for the 
library.  This speeds debug builds up significantly.


---
Diffs of the changes:

Index: llvm/lib/Support/LeakDetector.cpp
diff -u llvm/lib/Support/LeakDetector.cpp:1.2 llvm/lib/Support/LeakDetector.cpp:1.3
--- llvm/lib/Support/LeakDetector.cpp:1.2	Tue Sep 10 10:43:30 2002
+++ llvm/lib/Support/LeakDetector.cpp	Thu Sep 19 14:22:11 2002
@@ -12,6 +12,13 @@
 static std::set<const void*> *Objects = 0;
 static std::set<const Value*> *LLVMObjects = 0;
 
+// Because the most common usage pattern, by far, is to add a garbage object,
+// then remove it immediately, we optimize this case.  When an object is added,
+// it is not added to the set immediately, it is added to the CachedValue Value.
+// If it is immediately removed, no set search need be performed.
+//
+static const Value *CachedValue;
+
 void LeakDetector::addGarbageObjectImpl(void *Object) {
   if (Objects == 0)
     Objects = new std::set<const void*>();
@@ -25,18 +32,28 @@
 }
 
 void LeakDetector::addGarbageObjectImpl(const Value *Object) {
-  if (LLVMObjects == 0)
-    LLVMObjects = new std::set<const Value*>();
-  assert(LLVMObjects->count(Object) == 0 && "Object already in set!");
-  LLVMObjects->insert(Object);
+  if (CachedValue) {
+    if (LLVMObjects == 0)
+      LLVMObjects = new std::set<const Value*>();
+    assert(LLVMObjects->count(CachedValue) == 0 && "Object already in set!");
+    LLVMObjects->insert(CachedValue);
+  }
+  CachedValue = Object;
 }
 
 void LeakDetector::removeGarbageObjectImpl(const Value *Object) {
-  if (LLVMObjects)
+  if (Object == CachedValue)
+    CachedValue = 0;             // Cache hit!
+  else if (LLVMObjects)
     LLVMObjects->erase(Object);
 }
 
 void LeakDetector::checkForGarbageImpl(const std::string &Message) {
+  if (CachedValue)  // Flush the cache to the set...
+    addGarbageObjectImpl((Value*)0);
+
+  assert(CachedValue == 0 && "No value should be cached anymore!");
+
   if ((Objects && !Objects->empty()) || (LLVMObjects && !LLVMObjects->empty())){
     std::cerr << "Leaked objects found: " << Message << "\n";
 





More information about the llvm-commits mailing list