Introduce another Reset() method in BumpPtrAllocator that calls a destructor

on all objects it has allocated, if they are all of the same size and alignment.
Use this to destruct all VNInfos allocated in LiveIntervalAnalysis (PR6653).

valnos is not reliable for this purpose, as seen in r99400
(which still leaked, and sometimes caused double frees).


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99881 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Torok Edwin 2010-03-30 10:08:26 +00:00
parent 28a1e48690
commit 2a22004f68
3 changed files with 27 additions and 1 deletions

View 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);

View 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();

View 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) {