Convert RegClass::IsColorUsedArr from a dynamically allocated array to
authorChris Lattner <sabre@nondot.org>
Thu, 23 May 2002 15:50:03 +0000 (15:50 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 23 May 2002 15:50:03 +0000 (15:50 +0000)
a vector.  This makes asserting on array bounds easier.

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

include/llvm/CodeGen/RegClass.h
include/llvm/Target/TargetRegInfo.h
lib/CodeGen/RegAlloc/PhyRegAlloc.cpp
lib/CodeGen/RegAlloc/RegClass.cpp
lib/CodeGen/RegAlloc/RegClass.h
lib/Target/SparcV9/RegAlloc/PhyRegAlloc.cpp
lib/Target/SparcV9/RegAlloc/RegClass.cpp
lib/Target/SparcV9/RegAlloc/RegClass.h
lib/Target/SparcV9/SparcV9RegClassInfo.cpp
lib/Target/SparcV9/SparcV9RegClassInfo.h

index c93d6961e0bd8251d5a14c4cc784ee65fbd6e926..4584a5f7a1e01c9f00285df8673337e3388fc9c0 100644 (file)
@@ -42,16 +42,17 @@ class RegClass {
                                         // buildInterferenceGraph
   std::stack<IGNode *> IGNodeStack;     // the stack used for coloring
 
-  const ReservedColorListType *const ReservedColorList;
+  // ReservedColorList - for passing registers that are pre-allocated and cannot
+  // be used by the register allocator for this function.
   //
-  // for passing registers that are pre-allocated and cannot be used by the
-  // register allocator for this function.
+  const ReservedColorListType *const ReservedColorList;
   
-  bool *IsColorUsedArr;
+  // IsColorUsedArr - An array used for coloring each node. This array must be
+  // of size MRC->getNumOfAllRegs(). Allocated once in the constructor for
+  // efficiency.
   //
-  // An array used for coloring each node. This array must be of size 
-  // MRC->getNumOfAllRegs(). Allocated once in the constructor
-  // for efficiency.
+  std::vector<bool> IsColorUsedArr;
+
 
 
   //--------------------------- private methods ------------------------------
@@ -71,8 +72,6 @@ class RegClass {
           const MachineRegClassInfo *MRC,
           const ReservedColorListType *RCL = 0);
 
-  ~RegClass() { delete[] IsColorUsedArr; }
-
   inline void createInterferenceGraph() { IG.createGraph(); }
 
   inline InterferenceGraph &getIG() { return IG; }
@@ -106,7 +105,7 @@ class RegClass {
     { IG.mergeIGNodesOfLRs(LR1, LR2); }
 
 
-  inline bool * getIsColorUsedArr() { return IsColorUsedArr; }
+  inline std::vector<bool> &getIsColorUsedArr() { return IsColorUsedArr; }
 
 
   inline void printIGNodeList() const {
index 1067a9a18df2e2fcf4a43dd380788d680cc1ec5f..99a89feb2e8126c8679eea4b672fe6cc4d117eb2 100644 (file)
@@ -51,7 +51,8 @@ public:
 
   // This method should find a color which is not used by neighbors
   // (i.e., a false position in IsColorUsedArr) and 
-  virtual void colorIGNode(IGNode *Node, bool IsColorUsedArr[]) const = 0;
+  virtual void colorIGNode(IGNode *Node,
+                           std::vector<bool> &IsColorUsedArr) const = 0;
   virtual bool isRegVolatile(int Reg) const = 0;
 
   MachineRegClassInfo(unsigned ID, unsigned NVR, unsigned NAR)
index bd0db117f0fed82e7b8324363461e5c02e4c4a63..6a7031bab59211ff92ea71e40e2b5c776965c322 100644 (file)
@@ -797,7 +797,7 @@ int PhyRegAlloc::getUnusedUniRegAtMI(RegClass *RC,
 
   unsigned NumAvailRegs =  RC->getNumOfAvailRegs();
   
-  bool *IsColorUsedArr = RC->getIsColorUsedArr();
+  std::vector<bool> &IsColorUsedArr = RC->getIsColorUsedArr();
   
   for(unsigned i=0; i <  NumAvailRegs; i++)     // Reset array
       IsColorUsedArr[i] = false;
@@ -822,16 +822,11 @@ int PhyRegAlloc::getUnusedUniRegAtMI(RegClass *RC,
 
   setRelRegsUsedByThisInst(RC, MInst);
 
-  unsigned c;                         // find first unused color
-  for( c=0; c < NumAvailRegs; c++)  
-     if( ! IsColorUsedArr[ c ] ) break;
+  for(unsigned c=0; c < NumAvailRegs; c++)   // find first unused color
+     if (!IsColorUsedArr[c])
+       return MRI.getUnifiedRegNum(RC->getID(), c);
    
-  if(c < NumAvailRegs) 
-    return  MRI.getUnifiedRegNum(RC->getID(), c);
-  else 
-    return -1;
-
-
+  return -1;
 }
 
 
@@ -840,9 +835,9 @@ int PhyRegAlloc::getUnusedUniRegAtMI(RegClass *RC,
 // by operands of a machine instruction. Returns the unified reg number.
 //----------------------------------------------------------------------------
 int PhyRegAlloc::getUniRegNotUsedByThisInst(RegClass *RC, 
-                                        const MachineInstr *MInst) {
+                                            const MachineInstr *MInst) {
 
-  bool *IsColorUsedArr = RC->getIsColorUsedArr();
+  vector<bool> &IsColorUsedArr = RC->getIsColorUsedArr();
   unsigned NumAvailRegs =  RC->getNumOfAvailRegs();
 
 
@@ -851,14 +846,11 @@ int PhyRegAlloc::getUniRegNotUsedByThisInst(RegClass *RC,
 
   setRelRegsUsedByThisInst(RC, MInst);
 
-  unsigned c;                         // find first unused color
-  for( c=0; c <  RC->getNumOfAvailRegs(); c++)  
-     if( ! IsColorUsedArr[ c ] ) break;
-   
-  if(c < NumAvailRegs) 
-    return  MRI.getUnifiedRegNum(RC->getID(), c);
-  else 
-    assert( 0 && "FATAL: No free register could be found in reg class!!");
+  for(unsigned c=0; c < RC->getNumOfAvailRegs(); c++)// find first unused color
+    if (!IsColorUsedArr[c])
+      return  MRI.getUnifiedRegNum(RC->getID(), c);
+
+  assert(0 && "FATAL: No free register could be found in reg class!!");
   return 0;
 }
 
@@ -871,7 +863,7 @@ int PhyRegAlloc::getUniRegNotUsedByThisInst(RegClass *RC,
 void PhyRegAlloc::setRelRegsUsedByThisInst(RegClass *RC, 
                                       const MachineInstr *MInst ) {
 
bool *IsColorUsedArr = RC->getIsColorUsedArr();
vector<bool> &IsColorUsedArr = RC->getIsColorUsedArr();
   
  for(unsigned OpNum=0; OpNum < MInst->getNumOperands(); ++OpNum) {
     
@@ -886,7 +878,7 @@ void PhyRegAlloc::setRelRegsUsedByThisInst(RegClass *RC,
        if( MRI.getRegClassIDOfValue(Val) == RC->getID() ) {   
          int Reg;
          if( (Reg=Op.getAllocatedRegNum()) != -1) {
-           IsColorUsedArr[ Reg ] = true;
+           IsColorUsedArr[Reg] = true;
          }
          else {
            // it is possilbe that this operand still is not marked with
@@ -895,13 +887,14 @@ void PhyRegAlloc::setRelRegsUsedByThisInst(RegClass *RC,
            LiveRange *LROfVal =  LRI.getLiveRangeForValue(Val);
            if( LROfVal) 
              if( LROfVal->hasColor() )
-               IsColorUsedArr[ LROfVal->getColor() ] = true;
+               IsColorUsedArr[LROfVal->getColor()] = true;
          }
        
        } // if reg classes are the same
     }
     else if (Op.getOperandType() ==  MachineOperand::MO_MachineRegister) {
-      IsColorUsedArr[ Op.getMachineRegNum() ] = true;
+      assert((unsigned)Op.getMachineRegNum() < IsColorUsedArr.size());
+      IsColorUsedArr[Op.getMachineRegNum()] = true;
     }
  }
  
index c680bbfc31b387b00a9622e42877084f2b919157..5998f1fd6641f75cfc43a5666427d045d18c76e8 100644 (file)
@@ -14,7 +14,7 @@ RegClass::RegClass(const Function *M,
   if( DEBUG_RA)
     cerr << "Created Reg Class: " << RegClassID << "\n";
 
-  IsColorUsedArr = new bool[ Mrc->getNumOfAllRegs() ];
+  IsColorUsedArr.resize(Mrc->getNumOfAllRegs());
 }
 
 
@@ -200,14 +200,13 @@ void RegClass::colorIGNode(IGNode *const Node)
 
     // init all elements of to  IsColorUsedAr  false;
     //
-    for( unsigned  i=0; i < MRC->getNumOfAllRegs(); i++) { 
-      IsColorUsedArr[ i ] = false;
-    }
+    for (unsigned  i=0; i < MRC->getNumOfAllRegs(); i++)
+      IsColorUsedArr[i] = false;
     
     // init all reserved_regs to true - we can't use them
     //
     for( unsigned i=0; i < ReservedColorList->size() ; i++) {  
-      IsColorUsedArr[ (*ReservedColorList)[i] ] = true;
+      IsColorUsedArr[(*ReservedColorList)[i]] = true;
     }
 
     // initialize all colors used by neighbors of this node to true
index c93d6961e0bd8251d5a14c4cc784ee65fbd6e926..4584a5f7a1e01c9f00285df8673337e3388fc9c0 100644 (file)
@@ -42,16 +42,17 @@ class RegClass {
                                         // buildInterferenceGraph
   std::stack<IGNode *> IGNodeStack;     // the stack used for coloring
 
-  const ReservedColorListType *const ReservedColorList;
+  // ReservedColorList - for passing registers that are pre-allocated and cannot
+  // be used by the register allocator for this function.
   //
-  // for passing registers that are pre-allocated and cannot be used by the
-  // register allocator for this function.
+  const ReservedColorListType *const ReservedColorList;
   
-  bool *IsColorUsedArr;
+  // IsColorUsedArr - An array used for coloring each node. This array must be
+  // of size MRC->getNumOfAllRegs(). Allocated once in the constructor for
+  // efficiency.
   //
-  // An array used for coloring each node. This array must be of size 
-  // MRC->getNumOfAllRegs(). Allocated once in the constructor
-  // for efficiency.
+  std::vector<bool> IsColorUsedArr;
+
 
 
   //--------------------------- private methods ------------------------------
@@ -71,8 +72,6 @@ class RegClass {
           const MachineRegClassInfo *MRC,
           const ReservedColorListType *RCL = 0);
 
-  ~RegClass() { delete[] IsColorUsedArr; }
-
   inline void createInterferenceGraph() { IG.createGraph(); }
 
   inline InterferenceGraph &getIG() { return IG; }
@@ -106,7 +105,7 @@ class RegClass {
     { IG.mergeIGNodesOfLRs(LR1, LR2); }
 
 
-  inline bool * getIsColorUsedArr() { return IsColorUsedArr; }
+  inline std::vector<bool> &getIsColorUsedArr() { return IsColorUsedArr; }
 
 
   inline void printIGNodeList() const {
index bd0db117f0fed82e7b8324363461e5c02e4c4a63..6a7031bab59211ff92ea71e40e2b5c776965c322 100644 (file)
@@ -797,7 +797,7 @@ int PhyRegAlloc::getUnusedUniRegAtMI(RegClass *RC,
 
   unsigned NumAvailRegs =  RC->getNumOfAvailRegs();
   
-  bool *IsColorUsedArr = RC->getIsColorUsedArr();
+  std::vector<bool> &IsColorUsedArr = RC->getIsColorUsedArr();
   
   for(unsigned i=0; i <  NumAvailRegs; i++)     // Reset array
       IsColorUsedArr[i] = false;
@@ -822,16 +822,11 @@ int PhyRegAlloc::getUnusedUniRegAtMI(RegClass *RC,
 
   setRelRegsUsedByThisInst(RC, MInst);
 
-  unsigned c;                         // find first unused color
-  for( c=0; c < NumAvailRegs; c++)  
-     if( ! IsColorUsedArr[ c ] ) break;
+  for(unsigned c=0; c < NumAvailRegs; c++)   // find first unused color
+     if (!IsColorUsedArr[c])
+       return MRI.getUnifiedRegNum(RC->getID(), c);
    
-  if(c < NumAvailRegs) 
-    return  MRI.getUnifiedRegNum(RC->getID(), c);
-  else 
-    return -1;
-
-
+  return -1;
 }
 
 
@@ -840,9 +835,9 @@ int PhyRegAlloc::getUnusedUniRegAtMI(RegClass *RC,
 // by operands of a machine instruction. Returns the unified reg number.
 //----------------------------------------------------------------------------
 int PhyRegAlloc::getUniRegNotUsedByThisInst(RegClass *RC, 
-                                        const MachineInstr *MInst) {
+                                            const MachineInstr *MInst) {
 
-  bool *IsColorUsedArr = RC->getIsColorUsedArr();
+  vector<bool> &IsColorUsedArr = RC->getIsColorUsedArr();
   unsigned NumAvailRegs =  RC->getNumOfAvailRegs();
 
 
@@ -851,14 +846,11 @@ int PhyRegAlloc::getUniRegNotUsedByThisInst(RegClass *RC,
 
   setRelRegsUsedByThisInst(RC, MInst);
 
-  unsigned c;                         // find first unused color
-  for( c=0; c <  RC->getNumOfAvailRegs(); c++)  
-     if( ! IsColorUsedArr[ c ] ) break;
-   
-  if(c < NumAvailRegs) 
-    return  MRI.getUnifiedRegNum(RC->getID(), c);
-  else 
-    assert( 0 && "FATAL: No free register could be found in reg class!!");
+  for(unsigned c=0; c < RC->getNumOfAvailRegs(); c++)// find first unused color
+    if (!IsColorUsedArr[c])
+      return  MRI.getUnifiedRegNum(RC->getID(), c);
+
+  assert(0 && "FATAL: No free register could be found in reg class!!");
   return 0;
 }
 
@@ -871,7 +863,7 @@ int PhyRegAlloc::getUniRegNotUsedByThisInst(RegClass *RC,
 void PhyRegAlloc::setRelRegsUsedByThisInst(RegClass *RC, 
                                       const MachineInstr *MInst ) {
 
bool *IsColorUsedArr = RC->getIsColorUsedArr();
vector<bool> &IsColorUsedArr = RC->getIsColorUsedArr();
   
  for(unsigned OpNum=0; OpNum < MInst->getNumOperands(); ++OpNum) {
     
@@ -886,7 +878,7 @@ void PhyRegAlloc::setRelRegsUsedByThisInst(RegClass *RC,
        if( MRI.getRegClassIDOfValue(Val) == RC->getID() ) {   
          int Reg;
          if( (Reg=Op.getAllocatedRegNum()) != -1) {
-           IsColorUsedArr[ Reg ] = true;
+           IsColorUsedArr[Reg] = true;
          }
          else {
            // it is possilbe that this operand still is not marked with
@@ -895,13 +887,14 @@ void PhyRegAlloc::setRelRegsUsedByThisInst(RegClass *RC,
            LiveRange *LROfVal =  LRI.getLiveRangeForValue(Val);
            if( LROfVal) 
              if( LROfVal->hasColor() )
-               IsColorUsedArr[ LROfVal->getColor() ] = true;
+               IsColorUsedArr[LROfVal->getColor()] = true;
          }
        
        } // if reg classes are the same
     }
     else if (Op.getOperandType() ==  MachineOperand::MO_MachineRegister) {
-      IsColorUsedArr[ Op.getMachineRegNum() ] = true;
+      assert((unsigned)Op.getMachineRegNum() < IsColorUsedArr.size());
+      IsColorUsedArr[Op.getMachineRegNum()] = true;
     }
  }
  
index c680bbfc31b387b00a9622e42877084f2b919157..5998f1fd6641f75cfc43a5666427d045d18c76e8 100644 (file)
@@ -14,7 +14,7 @@ RegClass::RegClass(const Function *M,
   if( DEBUG_RA)
     cerr << "Created Reg Class: " << RegClassID << "\n";
 
-  IsColorUsedArr = new bool[ Mrc->getNumOfAllRegs() ];
+  IsColorUsedArr.resize(Mrc->getNumOfAllRegs());
 }
 
 
@@ -200,14 +200,13 @@ void RegClass::colorIGNode(IGNode *const Node)
 
     // init all elements of to  IsColorUsedAr  false;
     //
-    for( unsigned  i=0; i < MRC->getNumOfAllRegs(); i++) { 
-      IsColorUsedArr[ i ] = false;
-    }
+    for (unsigned  i=0; i < MRC->getNumOfAllRegs(); i++)
+      IsColorUsedArr[i] = false;
     
     // init all reserved_regs to true - we can't use them
     //
     for( unsigned i=0; i < ReservedColorList->size() ; i++) {  
-      IsColorUsedArr[ (*ReservedColorList)[i] ] = true;
+      IsColorUsedArr[(*ReservedColorList)[i]] = true;
     }
 
     // initialize all colors used by neighbors of this node to true
index c93d6961e0bd8251d5a14c4cc784ee65fbd6e926..4584a5f7a1e01c9f00285df8673337e3388fc9c0 100644 (file)
@@ -42,16 +42,17 @@ class RegClass {
                                         // buildInterferenceGraph
   std::stack<IGNode *> IGNodeStack;     // the stack used for coloring
 
-  const ReservedColorListType *const ReservedColorList;
+  // ReservedColorList - for passing registers that are pre-allocated and cannot
+  // be used by the register allocator for this function.
   //
-  // for passing registers that are pre-allocated and cannot be used by the
-  // register allocator for this function.
+  const ReservedColorListType *const ReservedColorList;
   
-  bool *IsColorUsedArr;
+  // IsColorUsedArr - An array used for coloring each node. This array must be
+  // of size MRC->getNumOfAllRegs(). Allocated once in the constructor for
+  // efficiency.
   //
-  // An array used for coloring each node. This array must be of size 
-  // MRC->getNumOfAllRegs(). Allocated once in the constructor
-  // for efficiency.
+  std::vector<bool> IsColorUsedArr;
+
 
 
   //--------------------------- private methods ------------------------------
@@ -71,8 +72,6 @@ class RegClass {
           const MachineRegClassInfo *MRC,
           const ReservedColorListType *RCL = 0);
 
-  ~RegClass() { delete[] IsColorUsedArr; }
-
   inline void createInterferenceGraph() { IG.createGraph(); }
 
   inline InterferenceGraph &getIG() { return IG; }
@@ -106,7 +105,7 @@ class RegClass {
     { IG.mergeIGNodesOfLRs(LR1, LR2); }
 
 
-  inline bool * getIsColorUsedArr() { return IsColorUsedArr; }
+  inline std::vector<bool> &getIsColorUsedArr() { return IsColorUsedArr; }
 
 
   inline void printIGNodeList() const {
index 11a82511587b74b2ec34919623755042e822ec36..da40826b3e0ff4f0c70336764e5cec9f2aa0c006 100644 (file)
@@ -18,7 +18,7 @@ using std::cerr;
 //     If both above fail, spill.
 //  
 //-----------------------------------------------------------------------------
-void SparcIntRegClass::colorIGNode(IGNode * Node, bool IsColorUsedArr[]) const {
+void SparcIntRegClass::colorIGNode(IGNode * Node, vector<bool> &IsColorUsedArr) const {
   LiveRange *LR = Node->getParentLR();
 
   if( DEBUG_RA ) {
@@ -30,7 +30,7 @@ void SparcIntRegClass::colorIGNode(IGNode * Node, bool IsColorUsedArr[]) const {
 
     unsigned SugCol = LR->getSuggestedColor();
 
-    if( ! IsColorUsedArr[ SugCol ] ) {
+    if (!IsColorUsedArr[SugCol]) {
 
       if( LR->isSuggestedColorUsable()  ) {
 
@@ -71,7 +71,7 @@ void SparcIntRegClass::colorIGNode(IGNode * Node, bool IsColorUsedArr[]) const {
  
   // find first unused color
   for( c=SearchStart; c < SparcIntRegOrder::NumOfAvailRegs; c++) { 
-    if( ! IsColorUsedArr[ c ] ) { ColorFound = true; break; }
+    if(!IsColorUsedArr[c] ) { ColorFound = true; break; }
   }
 
   if( ColorFound) {
@@ -130,7 +130,8 @@ void SparcIntRegClass::colorIGNode(IGNode * Node, bool IsColorUsedArr[]) const {
 //     If a color is still not fond, mark for spilling
 //
 //----------------------------------------------------------------------------
-void SparcFloatRegClass::colorIGNode(IGNode * Node,bool IsColorUsedArr[]) const{
+void SparcFloatRegClass::colorIGNode(IGNode * Node,
+                                     vector<bool> &IsColorUsedArr) const{
   LiveRange *LR = Node->getParentLR();
 
   // Mark the second color for double-precision registers:
@@ -175,7 +176,7 @@ void SparcFloatRegClass::colorIGNode(IGNode * Node,bool IsColorUsedArr[]) const{
   int ColorFound = -1;               // have we found a color yet?
   bool isCallInterf = LR->isCallInterference();
 
-  // if value is a double - search the double only reigon (f32 - f63)
+  // if value is a double - search the double only region (f32 - f63)
   // i.e. we try to allocate f32 - f63 first for doubles since singles
   // cannot go there. By doing that, we provide more space for singles
   // in f0 - f31
@@ -243,7 +244,7 @@ void SparcFloatRegClass::colorIGNode(IGNode * Node,bool IsColorUsedArr[]) const{
 
 int SparcFloatRegClass::findFloatColor(const LiveRange *LR, 
                                       unsigned Start, unsigned End, 
-                                      bool IsColorUsedArr[]) const {
+                                      vector<bool> &IsColorUsedArr) const {
   bool ColorFound = false;
   unsigned c;
 
index ab5b35c8010e0c92cfbd724621092225834ab897..f07d0aa5f2b1ab897ee2f9c26e5b4218ddf94a3e 100644 (file)
@@ -82,7 +82,7 @@ struct SparcIntRegClass : public MachineRegClassInfo {
                          SparcIntRegOrder::NumOfAvailRegs,
                          SparcIntRegOrder::NumOfAllRegs) {  }
 
-  void colorIGNode(IGNode *Node, bool IsColorUsedArr[]) const;
+  void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const;
 
   inline bool isRegVolatile(int Reg) const {
     return (Reg < (int) SparcIntRegOrder::StartOfNonVolatileRegs); 
@@ -144,14 +144,14 @@ class SparcFloatRegOrder{
 
 class SparcFloatRegClass : public MachineRegClassInfo {
   int findFloatColor(const LiveRange *LR, unsigned Start,
-                    unsigned End, bool IsColorUsedArr[]) const;
+                    unsigned End, std::vector<bool> &IsColorUsedArr) const;
 public:
   SparcFloatRegClass(unsigned ID) 
     : MachineRegClassInfo(ID, 
                          SparcFloatRegOrder::NumOfAvailRegs,
                          SparcFloatRegOrder::NumOfAllRegs) {}
 
-  void colorIGNode(IGNode *Node, bool IsColorUsedArr[]) const;
+  void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const;
 
   // according to  Sparc 64 ABI, all %fp regs are volatile
   inline bool isRegVolatile(int Reg) const { return true; }
@@ -192,7 +192,7 @@ struct SparcIntCCRegClass : public MachineRegClassInfo {
   SparcIntCCRegClass(unsigned ID) 
     : MachineRegClassInfo(ID, 1, 2) {  }
   
-  inline void colorIGNode(IGNode *Node, bool IsColorUsedArr[]) const {
+  void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const {
     if (IsColorUsedArr[0])
       Node->getParentLR()->markForSpill();
     else
@@ -231,13 +231,14 @@ struct SparcFloatCCRegClass : public MachineRegClassInfo {
   SparcFloatCCRegClass(unsigned ID) 
     : MachineRegClassInfo(ID, 4, 4) {  }
 
-  void colorIGNode(IGNode *Node, bool IsColorUsedArr[]) const {
-    int c;
-    for(c=0; c < 4  && IsColorUsedArr[c] ; ++c) ; // find unused color
-    if (c < 4)
-      Node->setColor(c);   
-    else
-      Node->getParentLR()->markForSpill();
+  void colorIGNode(IGNode *Node, std::vector<bool> &IsColorUsedArr) const {
+    for(unsigned c = 0; c != 4; ++c)
+      if (!IsColorUsedArr[c]) { // find unused color
+        Node->setColor(c);   
+        return;
+      }
+
+    Node->getParentLR()->markForSpill();
   }
   
   // according to  Sparc 64 ABI, all %fp CC regs are volatile