From 3a09d891a47c3f887bb1d9fec0355dffdc205b38 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Wed, 27 Aug 2008 16:27:25 +0000 Subject: [PATCH] Optimize ScheduleDAG's ComputeDepths and ComputeHeights to not need a scratch std::vector. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@55420 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/SelectionDAG/ScheduleDAG.cpp | 28 ++++++++++++------------ 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp index d0a94d154ea..faffce5a8f3 100644 --- a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp +++ b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp @@ -250,17 +250,15 @@ void ScheduleDAG::ComputeLatency(SUnit *SU) { /// paths in the DAG void ScheduleDAG::CalculateDepths() { unsigned DAGSize = SUnits.size(); - std::vector InDegree(DAGSize); std::vector WorkList; WorkList.reserve(DAGSize); // Initialize the data structures for (unsigned i = 0, e = DAGSize; i != e; ++i) { SUnit *SU = &SUnits[i]; - int NodeNum = SU->NodeNum; unsigned Degree = SU->Preds.size(); - InDegree[NodeNum] = Degree; - SU->Depth = 0; + // Temporarily use the Depth field as scratch space for the degree count. + SU->Depth = Degree; // Is it a node without dependencies? if (Degree == 0) { @@ -274,7 +272,7 @@ void ScheduleDAG::CalculateDepths() { while (!WorkList.empty()) { SUnit *SU = WorkList.back(); WorkList.pop_back(); - unsigned &SUDepth = SU->Depth; + unsigned SUDepth = 0; // Use dynamic programming: // When current node is being processed, all of its dependencies @@ -288,11 +286,13 @@ void ScheduleDAG::CalculateDepths() { } } - // Update InDegrees of all nodes depending on current SUnit + SU->Depth = SUDepth; + + // Update degrees of all nodes depending on current SUnit for (SUnit::const_succ_iterator I = SU->Succs.begin(), E = SU->Succs.end(); I != E; ++I) { SUnit *SU = I->Dep; - if (!--InDegree[SU->NodeNum]) + if (!--SU->Depth) // If all dependencies of the node are processed already, // then the longest path for the node can be computed now WorkList.push_back(SU); @@ -304,17 +304,15 @@ void ScheduleDAG::CalculateDepths() { /// paths in the DAG void ScheduleDAG::CalculateHeights() { unsigned DAGSize = SUnits.size(); - std::vector InDegree(DAGSize); std::vector WorkList; WorkList.reserve(DAGSize); // Initialize the data structures for (unsigned i = 0, e = DAGSize; i != e; ++i) { SUnit *SU = &SUnits[i]; - int NodeNum = SU->NodeNum; unsigned Degree = SU->Succs.size(); - InDegree[NodeNum] = Degree; - SU->Height = 0; + // Temporarily use the Height field as scratch space for the degree count. + SU->Height = Degree; // Is it a node without dependencies? if (Degree == 0) { @@ -329,7 +327,7 @@ void ScheduleDAG::CalculateHeights() { while (!WorkList.empty()) { SUnit *SU = WorkList.back(); WorkList.pop_back(); - unsigned &SUHeight = SU->Height; + unsigned SUHeight = 0; // Use dynamic programming: // When current node is being processed, all of its dependencies @@ -343,11 +341,13 @@ void ScheduleDAG::CalculateHeights() { } } - // Update InDegrees of all nodes depending on current SUnit + SU->Height = SUHeight; + + // Update degrees of all nodes depending on current SUnit for (SUnit::const_pred_iterator I = SU->Preds.begin(), E = SU->Preds.end(); I != E; ++I) { SUnit *SU = I->Dep; - if (!--InDegree[SU->NodeNum]) + if (!--SU->Height) // If all dependencies of the node are processed already, // then the longest path for the node can be computed now WorkList.push_back(SU);