aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/CodeGen/ScheduleDAG.h25
-rw-r--r--lib/CodeGen/SelectionDAG/ScheduleDAG.cpp10
-rw-r--r--lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp1
3 files changed, 29 insertions, 7 deletions
diff --git a/include/llvm/CodeGen/ScheduleDAG.h b/include/llvm/CodeGen/ScheduleDAG.h
index 746f7b2330..c3513960ba 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 aff5d4265d..58344872a5 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 e4691b3d9c..e2049f1cb8 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;
}