[llvm-commits] [llvm] r55420 - /llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
Dan Gohman
gohman at apple.com
Wed Aug 27 09:27:26 PDT 2008
Author: djg
Date: Wed Aug 27 11:27:25 2008
New Revision: 55420
URL: http://llvm.org/viewvc/llvm-project?rev=55420&view=rev
Log:
Optimize ScheduleDAG's ComputeDepths and ComputeHeights to not need
a scratch std::vector.
Modified:
llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
Modified: llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp?rev=55420&r1=55419&r2=55420&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp (original)
+++ llvm/trunk/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp Wed Aug 27 11:27:25 2008
@@ -250,17 +250,15 @@
/// paths in the DAG
void ScheduleDAG::CalculateDepths() {
unsigned DAGSize = SUnits.size();
- std::vector<unsigned> InDegree(DAGSize);
std::vector<SUnit*> 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 @@
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 @@
}
}
- // 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 @@
/// paths in the DAG
void ScheduleDAG::CalculateHeights() {
unsigned DAGSize = SUnits.size();
- std::vector<unsigned> InDegree(DAGSize);
std::vector<SUnit*> 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 @@
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 @@
}
}
- // 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);
More information about the llvm-commits
mailing list