[llvm-commits] [llvm] r99883 - in /llvm/trunk: include/llvm/CodeGen/LiveInterval.h include/llvm/Support/Allocator.h lib/CodeGen/LiveInterval.cpp lib/CodeGen/LiveIntervalAnalysis.cpp lib/Support/Allocator.cpp

Torok Edwin edwintorok at gmail.com
Tue Mar 30 04:17:48 PDT 2010


Author: edwin
Date: Tue Mar 30 06:17:48 2010
New Revision: 99883

URL: http://llvm.org/viewvc/llvm-project?rev=99883&view=rev
Log:
Reapply r99881 with some fixes: only call destructor in releaseMemory!

Modified:
    llvm/trunk/include/llvm/CodeGen/LiveInterval.h
    llvm/trunk/include/llvm/Support/Allocator.h
    llvm/trunk/lib/CodeGen/LiveInterval.cpp
    llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
    llvm/trunk/lib/Support/Allocator.cpp

Modified: llvm/trunk/include/llvm/CodeGen/LiveInterval.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/CodeGen/LiveInterval.h?rev=99883&r1=99882&r2=99883&view=diff
==============================================================================
--- llvm/trunk/include/llvm/CodeGen/LiveInterval.h (original)
+++ llvm/trunk/include/llvm/CodeGen/LiveInterval.h Tue Mar 30 06:17:48 2010
@@ -330,12 +330,7 @@
     }
     
     void clear() {
-      while (!valnos.empty()) {
-        VNInfo *VNI = valnos.back();
-        valnos.pop_back();
-        VNI->~VNInfo();
-      }
-      
+      valnos.clear();
       ranges.clear();
     }
 

Modified: llvm/trunk/include/llvm/Support/Allocator.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/Allocator.h?rev=99883&r1=99882&r2=99883&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Support/Allocator.h (original)
+++ llvm/trunk/include/llvm/Support/Allocator.h Tue Mar 30 06:17:48 2010
@@ -134,6 +134,7 @@
   static MallocSlabAllocator DefaultSlabAllocator;
 
 public:
+  typedef void (*DTorFunction)(void*);
   BumpPtrAllocator(size_t size = 4096, size_t threshold = 4096,
                    SlabAllocator &allocator = DefaultSlabAllocator);
   ~BumpPtrAllocator();
@@ -142,6 +143,11 @@
   /// to the beginning of it, freeing all memory allocated so far.
   void Reset();
 
+  /// Reset - like Reset(), but call DTorFunction for each allocated
+  /// object. This assumes that all objects allocated with this allocator
+  /// had the same size and alignment specified here.
+  void Reset(size_t Size, size_t Alignment, DTorFunction DTor);
+
   /// Allocate - Allocate space at the specified alignment.
   ///
   void *Allocate(size_t Size, size_t Alignment);

Modified: llvm/trunk/lib/CodeGen/LiveInterval.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveInterval.cpp?rev=99883&r1=99882&r2=99883&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/LiveInterval.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveInterval.cpp Tue Mar 30 06:17:48 2010
@@ -305,7 +305,6 @@
             do {
               VNInfo *VNI = valnos.back();
               valnos.pop_back();
-              VNI->~VNInfo();
             } while (!valnos.empty() && valnos.back()->isUnused());
           } else {
             ValNo->setIsUnused(true);
@@ -353,7 +352,6 @@
     do {
       VNInfo *VNI = valnos.back();
       valnos.pop_back();
-      VNI->~VNInfo();
     } while (!valnos.empty() && valnos.back()->isUnused());
   } else {
     ValNo->setIsUnused(true);
@@ -581,7 +579,6 @@
           do {
             VNInfo *VNI = valnos.back();
             valnos.pop_back();
-            VNI->~VNInfo();
           } while (!valnos.empty() && valnos.back()->isUnused());
         } else {
           V1->setIsUnused(true);
@@ -658,7 +655,6 @@
   if (UnusedValNo) {
     // Delete the last unused val#.
     valnos.pop_back();
-    UnusedValNo->~VNInfo();
   }
 }
 
@@ -751,7 +747,6 @@
     do {
       VNInfo *VNI = valnos.back();
       valnos.pop_back();
-      VNI->~VNInfo();
     } while (valnos.back()->isUnused());
   } else {
     V1->setIsUnused(true);

Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp?rev=99883&r1=99882&r2=99883&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original)
+++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Tue Mar 30 06:17:48 2010
@@ -82,6 +82,11 @@
   MachineFunctionPass::getAnalysisUsage(AU);
 }
 
+static void VNInfoDTor(void* Ptr)
+{
+   reinterpret_cast<VNInfo*>(Ptr)->~VNInfo();
+}
+
 void LiveIntervals::releaseMemory() {
   // Free the live intervals themselves.
   for (DenseMap<unsigned, LiveInterval*>::iterator I = r2iMap_.begin(),
@@ -91,7 +96,7 @@
   r2iMap_.clear();
 
   // Release VNInfo memroy regions after all VNInfo objects are dtor'd.
-  VNInfoAllocator.Reset();
+  VNInfoAllocator.Reset((unsigned)sizeof(VNInfo), alignof<VNInfo>(), VNInfoDTor);
   while (!CloneMIs.empty()) {
     MachineInstr *MI = CloneMIs.back();
     CloneMIs.pop_back();

Modified: llvm/trunk/lib/Support/Allocator.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Support/Allocator.cpp?rev=99883&r1=99882&r2=99883&view=diff
==============================================================================
--- llvm/trunk/lib/Support/Allocator.cpp (original)
+++ llvm/trunk/lib/Support/Allocator.cpp Tue Mar 30 06:17:48 2010
@@ -78,6 +78,21 @@
   End = ((char*)CurSlab) + CurSlab->Size;
 }
 
+void BumpPtrAllocator::Reset(size_t Size, size_t Alignment, DTorFunction DTor) {
+  if (Alignment == 0) Alignment = 1;
+  MemSlab *Slab = CurSlab;
+  while (Slab) {
+    char *End = Slab == CurSlab ? CurPtr : (char*)Slab + Slab->Size;
+    for (char *Ptr = (char*)Slab+1; Ptr < End; Ptr += Size) {
+	Ptr = AlignPtr(Ptr, Alignment);
+	if (Ptr + Size <= End)
+	    DTor(Ptr);
+    }
+    Slab = Slab->NextPtr;
+  }
+  Reset();
+}
+
 /// Allocate - Allocate space at the specified alignment.
 ///
 void *BumpPtrAllocator::Allocate(size_t Size, size_t Alignment) {





More information about the llvm-commits mailing list