Added code to PhyRegAlloc to mark unusable suggested regs
authorRuchira Sasanka <sasanka@students.uiuc.edu>
Fri, 19 Oct 2001 21:39:31 +0000 (21:39 +0000)
committerRuchira Sasanka <sasanka@students.uiuc.edu>
Fri, 19 Oct 2001 21:39:31 +0000 (21:39 +0000)
Added initialization to AdjList to IGNode constructor - major bug fix

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

lib/CodeGen/RegAlloc/IGNode.cpp
lib/CodeGen/RegAlloc/PhyRegAlloc.cpp
lib/Target/SparcV9/RegAlloc/IGNode.cpp
lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp

index 0e8a124cd3d9249c35077d8b6839d622f283b1db..75007a0898bdddfdda788ef8c724e3b71e2807a5 100644 (file)
@@ -2,6 +2,7 @@
 
 
 IGNode::IGNode(LiveRange *const PLR, unsigned int Ind): Index(Ind),
+                                                       AdjList(),
                                                         ParentLR(PLR)
 {
   OnStack = false;
index 98300499b154892373684c1be50032bcc6bc91e0..b36e8e44437d430476c39dc58717398ecfe8e85d 100644 (file)
@@ -665,11 +665,7 @@ void PhyRegAlloc::printMachineCode()
            // else it must be a register value
            const int RegNum = Op.getAllocatedRegNum();
 
-           //if( RegNum != 1000)
-
-             cout << "\t" << "%" << MRI.getUnifiedRegName( RegNum );
-           // else cout << "\t<*NoReg*>";
-
+           cout << "\t" << "%" << MRI.getUnifiedRegName( RegNum );
          }
 
        } 
@@ -740,6 +736,8 @@ void PhyRegAlloc::colorCallRetArgs()
 
 }
 
+
+
 //----------------------------------------------------------------------------
 
 //----------------------------------------------------------------------------
@@ -771,6 +769,52 @@ void PhyRegAlloc::printLabel(const Value *const Val)
 }
 
 
+//----------------------------------------------------------------------------
+// This method calls setSugColorUsable method of each live range. This
+// will determine whether the suggested color of LR is  really usable.
+// A suggested color is not usable when the suggested color is volatile
+// AND when there are call interferences
+//----------------------------------------------------------------------------
+
+void PhyRegAlloc::markUnusableSugColors()
+{
+  if(DEBUG_RA ) cout << "Creating LR lists ..." << endl;
+
+  // hash map iterator
+  LiveRangeMapType::const_iterator HMI = (LRI.getLiveRangeMap())->begin();   
+  LiveRangeMapType::const_iterator HMIEnd = (LRI.getLiveRangeMap())->end();   
+
+    for(  ; HMI != HMIEnd ; ++HMI ) {
+      
+      if( (*HMI).first ) { 
+
+       LiveRange *L = (*HMI).second;      // get the LiveRange
+
+       if(L) { 
+         if( L->hasSuggestedColor() ) {
+
+           int RCID = (L->getRegClass())->getID();
+           if( MRI.isRegVolatile( RCID,  L->getSuggestedColor()) &&
+               L->isCallInterference() )
+             L->setSuggestedColorUsable( false );
+           else
+             L->setSuggestedColorUsable( true );
+         }
+       } // if L->hasSuggestedColor()
+      }
+    } // for all LR's in hash map
+}
+
+
+
+
+
+
+
+
+
+
+
 //----------------------------------------------------------------------------
 // The entry pont to Register Allocation
 //----------------------------------------------------------------------------
@@ -814,7 +858,13 @@ void PhyRegAlloc::allocateRegisters()
       RegClassList[ rc ]->printIG();       
   }
 
-  // color all register classes
+
+  // mark un-usable suggested color before graph coloring algorithm.
+  // When this is done, the graph coloring algo will not reserve
+  // suggested color unnecessarily - they can be used by another LR
+  markUnusableSugColors(); 
+
+  // color all register classes using the graph coloring algo
   for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)  
     RegClassList[ rc ]->colorAllRegs();    
 
index 0e8a124cd3d9249c35077d8b6839d622f283b1db..75007a0898bdddfdda788ef8c724e3b71e2807a5 100644 (file)
@@ -2,6 +2,7 @@
 
 
 IGNode::IGNode(LiveRange *const PLR, unsigned int Ind): Index(Ind),
+                                                       AdjList(),
                                                         ParentLR(PLR)
 {
   OnStack = false;
index 98300499b154892373684c1be50032bcc6bc91e0..b36e8e44437d430476c39dc58717398ecfe8e85d 100644 (file)
@@ -665,11 +665,7 @@ void PhyRegAlloc::printMachineCode()
            // else it must be a register value
            const int RegNum = Op.getAllocatedRegNum();
 
-           //if( RegNum != 1000)
-
-             cout << "\t" << "%" << MRI.getUnifiedRegName( RegNum );
-           // else cout << "\t<*NoReg*>";
-
+           cout << "\t" << "%" << MRI.getUnifiedRegName( RegNum );
          }
 
        } 
@@ -740,6 +736,8 @@ void PhyRegAlloc::colorCallRetArgs()
 
 }
 
+
+
 //----------------------------------------------------------------------------
 
 //----------------------------------------------------------------------------
@@ -771,6 +769,52 @@ void PhyRegAlloc::printLabel(const Value *const Val)
 }
 
 
+//----------------------------------------------------------------------------
+// This method calls setSugColorUsable method of each live range. This
+// will determine whether the suggested color of LR is  really usable.
+// A suggested color is not usable when the suggested color is volatile
+// AND when there are call interferences
+//----------------------------------------------------------------------------
+
+void PhyRegAlloc::markUnusableSugColors()
+{
+  if(DEBUG_RA ) cout << "Creating LR lists ..." << endl;
+
+  // hash map iterator
+  LiveRangeMapType::const_iterator HMI = (LRI.getLiveRangeMap())->begin();   
+  LiveRangeMapType::const_iterator HMIEnd = (LRI.getLiveRangeMap())->end();   
+
+    for(  ; HMI != HMIEnd ; ++HMI ) {
+      
+      if( (*HMI).first ) { 
+
+       LiveRange *L = (*HMI).second;      // get the LiveRange
+
+       if(L) { 
+         if( L->hasSuggestedColor() ) {
+
+           int RCID = (L->getRegClass())->getID();
+           if( MRI.isRegVolatile( RCID,  L->getSuggestedColor()) &&
+               L->isCallInterference() )
+             L->setSuggestedColorUsable( false );
+           else
+             L->setSuggestedColorUsable( true );
+         }
+       } // if L->hasSuggestedColor()
+      }
+    } // for all LR's in hash map
+}
+
+
+
+
+
+
+
+
+
+
+
 //----------------------------------------------------------------------------
 // The entry pont to Register Allocation
 //----------------------------------------------------------------------------
@@ -814,7 +858,13 @@ void PhyRegAlloc::allocateRegisters()
       RegClassList[ rc ]->printIG();       
   }
 
-  // color all register classes
+
+  // mark un-usable suggested color before graph coloring algorithm.
+  // When this is done, the graph coloring algo will not reserve
+  // suggested color unnecessarily - they can be used by another LR
+  markUnusableSugColors(); 
+
+  // color all register classes using the graph coloring algo
   for( unsigned int rc=0; rc < NumOfRegClasses ; rc++)  
     RegClassList[ rc ]->colorAllRegs();