LiveInterval: Fix SubRange memory leak.
authorMatthias Braun <matze@braunis.de>
Fri, 6 Feb 2015 17:28:47 +0000 (17:28 +0000)
committerMatthias Braun <matze@braunis.de>
Fri, 6 Feb 2015 17:28:47 +0000 (17:28 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@228405 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/LiveInterval.h
lib/CodeGen/LiveInterval.cpp

index ce9845ee1673af4f7ea84c68e49cc98f032ce8cf..788a649f717eb872d48fe243a7acc36caf961634 100644 (file)
@@ -606,6 +606,10 @@ namespace llvm {
     LiveInterval(unsigned Reg, float Weight)
       : SubRanges(nullptr), reg(Reg), weight(Weight) {}
 
+    ~LiveInterval() {
+      clearSubRanges();
+    }
+
     template<typename T>
     class SingleLinkedListIterator {
       T *P;
@@ -681,9 +685,7 @@ namespace llvm {
     }
 
     /// Removes all subregister liveness information.
-    void clearSubRanges() {
-      SubRanges = nullptr;
-    }
+    void clearSubRanges();
 
     /// Removes all subranges without any segments (subranges without segments
     /// are not considered valid and should only exist temporarily).
@@ -733,6 +735,9 @@ namespace llvm {
       Range->Next = SubRanges;
       SubRanges = Range;
     }
+
+    /// Free memory held by SubRange.
+    void freeSubRange(SubRange *S);
   };
 
   inline raw_ostream &operator<<(raw_ostream &OS, const LiveInterval &LI) {
index 9423edc30910444b844fafa113bb3e870b410d81..5790905ba5c316cef38392201c228600b5576374 100644 (file)
@@ -598,6 +598,11 @@ VNInfo *LiveRange::MergeValueNumberInto(VNInfo *V1, VNInfo *V2) {
   return V2;
 }
 
+void LiveInterval::freeSubRange(SubRange *S) {
+  S->~SubRange();
+  // Memory was allocated with BumpPtr allocator and is not freed here.
+}
+
 void LiveInterval::removeEmptySubRanges() {
   SubRange **NextPtr = &SubRanges;
   SubRange *I = *NextPtr;
@@ -609,12 +614,22 @@ void LiveInterval::removeEmptySubRanges() {
     }
     // Skip empty subranges until we find the first nonempty one.
     do {
-      I = I->Next;
+      SubRange *Next = I->Next;
+      freeSubRange(I);
+      I = Next;
     } while (I != nullptr && I->empty());
     *NextPtr = I;
   }
 }
 
+void LiveInterval::clearSubRanges() {
+  for (SubRange *I = SubRanges, *Next; I != nullptr; I = Next) {
+    Next = I->Next;
+    freeSubRange(I);
+  }
+  SubRanges = nullptr;
+}
+
 /// Helper function for constructMainRangeFromSubranges(): Search the CFG
 /// backwards until we find a place covered by a LiveRange segment that actually
 /// has a valno set.