Get rid of some memory leaks identified by Valgrind
authorEvan Cheng <evan.cheng@apple.com>
Sat, 4 Feb 2006 06:49:00 +0000 (06:49 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Sat, 4 Feb 2006 06:49:00 +0000 (06:49 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25960 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/ScheduleDAG.h
lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp

index 746f7b2330ff8fc4345a03b1db88ab7df545754a..c3513960ba61edee849dbc581d9e945163cde820 100644 (file)
@@ -50,6 +50,8 @@ namespace llvm {
   /// Node group -  This struct is used to manage flagged node groups.
   ///
   class NodeGroup {
+  public:
+    NodeGroup     *Next;
   private:
     NIVector      Members;                // Group member nodes
     NodeInfo      *Dominator;             // Node with highest latency
@@ -59,7 +61,7 @@ namespace llvm {
 
   public:
     // Ctor.
-    NodeGroup() : Dominator(NULL), Pending(0) {}
+    NodeGroup() : Next(NULL), Dominator(NULL), Pending(0) {}
   
     // Accessors
     inline void setDominator(NodeInfo *D) { Dominator = D; }
@@ -256,13 +258,24 @@ namespace llvm {
     bool HasGroups;                       // True if there are any groups
     NodeInfo *Info;                       // Info for nodes being scheduled
     NIVector Ordering;                    // Emit ordering of nodes
+    NodeGroup *HeadNG, *TailNG;           // Keep track of allocated NodeGroups
 
     ScheduleDAG(SchedHeuristics hstc, SelectionDAG &dag, MachineBasicBlock *bb,
                 const TargetMachine &tm)
-      : Heuristic(hstc), DAG(dag), BB(bb), TM(tm),
-        NodeCount(0), HasGroups(false), Info(NULL) {}
-
-    virtual ~ScheduleDAG() {};
+      : Heuristic(hstc), DAG(dag), BB(bb), TM(tm), NodeCount(0),
+        HasGroups(false), Info(NULL), HeadNG(NULL), TailNG(NULL) {}
+
+    virtual ~ScheduleDAG() {
+      if (Info)
+        delete[] Info;
+
+      NodeGroup *NG = HeadNG;
+      while (NG) {
+        NodeGroup *NextSU = NG->Next;
+        delete NG;
+        NG = NextSU;
+      }
+    };
 
     /// Run - perform scheduling.
     ///
@@ -329,6 +342,8 @@ namespace llvm {
     /// IdentifyGroups - Put flagged nodes into groups.
     ///
     void IdentifyGroups();
+
+    void AddToGroup(NodeInfo *D, NodeInfo *U);
   };
 
   /// createSimpleDAGScheduler - This creates a simple two pass instruction
index aff5d4265dd3dc581034c29d6d7e3768f2eb7926..58344872a5315e7bb7a3cac9e01e62a2bfbaccfd 100644 (file)
@@ -85,7 +85,7 @@ void ScheduleDAG::IdentifyGroups() {
       // No more flags to walk
       if (Op.getValueType() != MVT::Flag) break;
       // Add to node group
-      NodeGroup::Add(getNI(Op.Val), NI);
+      AddToGroup(getNI(Op.Val), NI);
       // Let everyone else know
       HasGroups = true;
     }
@@ -479,7 +479,7 @@ static unsigned CountInternalUses(NodeInfo *D, NodeInfo *U) {
 //===----------------------------------------------------------------------===//
 /// Add - Adds a definer and user pair to a node group.
 ///
-void NodeGroup::Add(NodeInfo *D, NodeInfo *U) {
+void ScheduleDAG::AddToGroup(NodeInfo *D, NodeInfo *U) {
   // Get current groups
   NodeGroup *DGroup = D->Group;
   NodeGroup *UGroup = U->Group;
@@ -534,5 +534,11 @@ void NodeGroup::Add(NodeInfo *D, NodeInfo *U) {
                        CountInternalUses(D, U));
     DGroup->group_push_back(D);
     DGroup->group_push_back(U);
+
+    if (HeadNG == NULL)
+      HeadNG = DGroup;
+    if (TailNG != NULL)
+      TailNG->Next = DGroup;
+    TailNG = DGroup;
   }
 }
index e4691b3d9c54422acd8eec2cacbc81254bd43b0e..e2049f1cb8c758426ecb3cd9596d7b7e13cfb030 100644 (file)
@@ -1998,4 +1998,5 @@ void SelectionDAGISel::ScheduleAndEmitDAG(SelectionDAG &DAG) {
     SL = createBURRListDAGScheduler(DAG, BB);
   }
   BB = SL->Run();
+  delete SL;
 }