From: Evan Cheng Date: Sat, 4 Feb 2006 06:49:00 +0000 (+0000) Subject: Get rid of some memory leaks identified by Valgrind X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=cccf1232a69e2d78516c61a97e7bfa26acefb714;p=oota-llvm.git Get rid of some memory leaks identified by Valgrind git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@25960 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/CodeGen/ScheduleDAG.h b/include/llvm/CodeGen/ScheduleDAG.h index 746f7b2330f..c3513960ba6 100644 --- a/include/llvm/CodeGen/ScheduleDAG.h +++ b/include/llvm/CodeGen/ScheduleDAG.h @@ -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 diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp index aff5d4265dd..58344872a53 100644 --- a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp +++ b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp @@ -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; } } diff --git a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index e4691b3d9c5..e2049f1cb8c 100644 --- a/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1998,4 +1998,5 @@ void SelectionDAGISel::ScheduleAndEmitDAG(SelectionDAG &DAG) { SL = createBURRListDAGScheduler(DAG, BB); } BB = SL->Run(); + delete SL; }