Fixed bug - added code in pushUnconstrainedIGNodes() to check whether a node
authorRuchira Sasanka <sasanka@students.uiuc.edu>
Tue, 6 Nov 2001 15:25:38 +0000 (15:25 +0000)
committerRuchira Sasanka <sasanka@students.uiuc.edu>
Tue, 6 Nov 2001 15:25:38 +0000 (15:25 +0000)
is already pushed to stack by a previous call to the same method.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1154 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/RegAlloc/RegClass.cpp
lib/Target/SparcV9/RegAlloc/RegClass.cpp

index cb33b9e0fb76c60d941c2d8edeea96a027eb0698..1219147ab2f32d3f81efae91e41098046a711701 100644 (file)
@@ -21,7 +21,7 @@ RegClass::RegClass(const Method *const M,
 
 void RegClass::colorAllRegs()
 {
-  if(DEBUG_RA) cout << "Coloring IGs ..." << endl;
+  if(DEBUG_RA) cout << "Coloring IG of reg class " << RegClassID << " ...\n";
 
   //preColorIGNodes();                    // pre-color IGNodes
   pushAllIGNodes();                     // push all IG Nodes
@@ -47,7 +47,7 @@ void RegClass::colorAllRegs()
 void RegClass::pushAllIGNodes()
 {
   bool NeedMoreSpills;          
-  IGNode *IGNodeSpill;
+
 
   IG.setCurDegreeOfIGNodes();           // calculate degree of IGNodes
 
@@ -71,8 +71,8 @@ void RegClass::pushAllIGNodes()
   do{
 
     //get node with min spill cost
-    IGNodeSpill = getIGNodeWithMinSpillCost(); 
-
+    IGNode *IGNodeSpill =  getIGNodeWithMinSpillCost(); 
+   
     //  push that node on to stack
     IGNodeStack.push( IGNodeSpill ); 
 
@@ -89,7 +89,11 @@ void RegClass::pushAllIGNodes()
 
 
 
-
+//--------------------------------------------------------------------------
+// This method goes thru all IG nodes in the IGNodeList of an IG of a 
+// register class and push any unconstrained IG node left (that is not
+// already pushed)
+//--------------------------------------------------------------------------
 
 bool  RegClass::pushUnconstrainedIGNodes()  
 {
@@ -103,9 +107,14 @@ bool  RegClass::pushUnconstrainedIGNodes()
     // get IGNode i from IGNodeList
     IGNode *IGNode = IG.getIGNodeList()[i]; 
 
-    if( ! IGNode )                      // can be null due to merging
-       continue;
-
+    if( !IGNode )                        // can be null due to merging   
+      continue;
+    
+    // if already pushed on stack, continue. This can happen since this
+    // method can be called repeatedly until all constrained nodes are
+    // pushed
+    if( IGNode->isOnStack() )
+      continue;
                                         // if the degree of IGNode is lower
     if( (unsigned) IGNode->getCurDegree()  < MRC->getNumOfAvailRegs() ) {   
       IGNodeStack.push( IGNode );       // push IGNode on to the stack
index cb33b9e0fb76c60d941c2d8edeea96a027eb0698..1219147ab2f32d3f81efae91e41098046a711701 100644 (file)
@@ -21,7 +21,7 @@ RegClass::RegClass(const Method *const M,
 
 void RegClass::colorAllRegs()
 {
-  if(DEBUG_RA) cout << "Coloring IGs ..." << endl;
+  if(DEBUG_RA) cout << "Coloring IG of reg class " << RegClassID << " ...\n";
 
   //preColorIGNodes();                    // pre-color IGNodes
   pushAllIGNodes();                     // push all IG Nodes
@@ -47,7 +47,7 @@ void RegClass::colorAllRegs()
 void RegClass::pushAllIGNodes()
 {
   bool NeedMoreSpills;          
-  IGNode *IGNodeSpill;
+
 
   IG.setCurDegreeOfIGNodes();           // calculate degree of IGNodes
 
@@ -71,8 +71,8 @@ void RegClass::pushAllIGNodes()
   do{
 
     //get node with min spill cost
-    IGNodeSpill = getIGNodeWithMinSpillCost(); 
-
+    IGNode *IGNodeSpill =  getIGNodeWithMinSpillCost(); 
+   
     //  push that node on to stack
     IGNodeStack.push( IGNodeSpill ); 
 
@@ -89,7 +89,11 @@ void RegClass::pushAllIGNodes()
 
 
 
-
+//--------------------------------------------------------------------------
+// This method goes thru all IG nodes in the IGNodeList of an IG of a 
+// register class and push any unconstrained IG node left (that is not
+// already pushed)
+//--------------------------------------------------------------------------
 
 bool  RegClass::pushUnconstrainedIGNodes()  
 {
@@ -103,9 +107,14 @@ bool  RegClass::pushUnconstrainedIGNodes()
     // get IGNode i from IGNodeList
     IGNode *IGNode = IG.getIGNodeList()[i]; 
 
-    if( ! IGNode )                      // can be null due to merging
-       continue;
-
+    if( !IGNode )                        // can be null due to merging   
+      continue;
+    
+    // if already pushed on stack, continue. This can happen since this
+    // method can be called repeatedly until all constrained nodes are
+    // pushed
+    if( IGNode->isOnStack() )
+      continue;
                                         // if the degree of IGNode is lower
     if( (unsigned) IGNode->getCurDegree()  < MRC->getNumOfAvailRegs() ) {   
       IGNodeStack.push( IGNode );       // push IGNode on to the stack