[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

Chris Lattner clattner at apple.com
Tue Mar 30 11:33:22 PDT 2010


On Mar 30, 2010, at 4:17 AM, Torok Edwin wrote:

> 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!

Edwin, this patch isn't safe at all.  What if you allocate different types in one bump pointer?  Please revert it.

-Chris

> 
> 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) {
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits





More information about the llvm-commits mailing list