diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/CodeGen/ScheduleDAG.h | 25 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp | 10 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp | 1 | 
3 files changed, 29 insertions, 7 deletions
diff --git a/llvm/include/llvm/CodeGen/ScheduleDAG.h b/llvm/include/llvm/CodeGen/ScheduleDAG.h index 746f7b2330f..c3513960ba6 100644 --- a/llvm/include/llvm/CodeGen/ScheduleDAG.h +++ b/llvm/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/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp index aff5d4265dd..58344872a53 100644 --- a/llvm/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp +++ b/llvm/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/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp index e4691b3d9c5..e2049f1cb8c 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp @@ -1998,4 +1998,5 @@ void SelectionDAGISel::ScheduleAndEmitDAG(SelectionDAG &DAG) {      SL = createBURRListDAGScheduler(DAG, BB);    }    BB = SL->Run(); +  delete SL;  }  | 

