[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