Reapply r99881 with some fixes: only call destructor in releaseMemory!
authorTorok Edwin <edwintorok@gmail.com>
Tue, 30 Mar 2010 11:17:48 +0000 (11:17 +0000)
committerTorok Edwin <edwintorok@gmail.com>
Tue, 30 Mar 2010 11:17:48 +0000 (11:17 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99883 91177308-0d34-0410-b5e6-96231b3b80d8

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

index eb5901c..1f198e6 100644 (file)
@@ -330,12 +330,7 @@ namespace llvm {
     }
     
     void clear() {
-      while (!valnos.empty()) {
-        VNInfo *VNI = valnos.back();
-        valnos.pop_back();
-        VNI->~VNInfo();
-      }
-      
+      valnos.clear();
       ranges.clear();
     }
 
index b1f59dc..a58b9db 100644 (file)
@@ -134,6 +134,7 @@ class BumpPtrAllocator {
   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 @@ public:
   /// 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);
index e207f60..7af25dd 100644 (file)
@@ -305,7 +305,6 @@ void LiveInterval::removeRange(SlotIndex Start, SlotIndex End,
             do {
               VNInfo *VNI = valnos.back();
               valnos.pop_back();
-              VNI->~VNInfo();
             } while (!valnos.empty() && valnos.back()->isUnused());
           } else {
             ValNo->setIsUnused(true);
@@ -353,7 +352,6 @@ void LiveInterval::removeValNo(VNInfo *ValNo) {
     do {
       VNInfo *VNI = valnos.back();
       valnos.pop_back();
-      VNI->~VNInfo();
     } while (!valnos.empty() && valnos.back()->isUnused());
   } else {
     ValNo->setIsUnused(true);
@@ -581,7 +579,6 @@ void LiveInterval::MergeValueInAsValue(
           do {
             VNInfo *VNI = valnos.back();
             valnos.pop_back();
-            VNI->~VNInfo();
           } while (!valnos.empty() && valnos.back()->isUnused());
         } else {
           V1->setIsUnused(true);
@@ -658,7 +655,6 @@ void LiveInterval::MergeInClobberRanges(LiveIntervals &li_,
   if (UnusedValNo) {
     // Delete the last unused val#.
     valnos.pop_back();
-    UnusedValNo->~VNInfo();
   }
 }
 
@@ -751,7 +747,6 @@ VNInfo* LiveInterval::MergeValueNumberInto(VNInfo *V1, VNInfo *V2) {
     do {
       VNInfo *VNI = valnos.back();
       valnos.pop_back();
-      VNI->~VNInfo();
     } while (valnos.back()->isUnused());
   } else {
     V1->setIsUnused(true);
index e657c46..53366b9 100644 (file)
@@ -82,6 +82,11 @@ void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const {
   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 @@ void LiveIntervals::releaseMemory() {
   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();
index 31b45c8..7433247 100644 (file)
@@ -78,6 +78,21 @@ void BumpPtrAllocator::Reset() {
   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) {