[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