Convert RegClass::IsColorUsedArr from a dynamically allocated array to
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
diff --git a/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp b/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp
index bd0db11..6a7031b 100644
--- a/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp
+++ b/lib/CodeGen/RegAlloc/PhyRegAlloc.cpp
@@ -797,7 +797,7 @@
 
   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 @@
 
   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 @@
 // 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 @@
 
   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 @@
 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 @@
 	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 @@
 	    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;
     }
  }
  
diff --git a/lib/CodeGen/RegAlloc/RegClass.cpp b/lib/CodeGen/RegAlloc/RegClass.cpp
index c680bbf..5998f1f 100644
--- a/lib/CodeGen/RegAlloc/RegClass.cpp
+++ b/lib/CodeGen/RegAlloc/RegClass.cpp
@@ -14,7 +14,7 @@
   if( DEBUG_RA)
     cerr << "Created Reg Class: " << RegClassID << "\n";
 
-  IsColorUsedArr = new bool[ Mrc->getNumOfAllRegs() ];
+  IsColorUsedArr.resize(Mrc->getNumOfAllRegs());
 }
 
 
@@ -200,14 +200,13 @@
 
     // 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
diff --git a/lib/CodeGen/RegAlloc/RegClass.h b/lib/CodeGen/RegAlloc/RegClass.h
index c93d696..4584a5f 100644
--- a/lib/CodeGen/RegAlloc/RegClass.h
+++ b/lib/CodeGen/RegAlloc/RegClass.h
@@ -42,16 +42,17 @@
                                         // buildInterferenceGraph
   std::stack<IGNode *> IGNodeStack;     // the stack used for coloring
 
+  // ReservedColorList - for passing registers that are pre-allocated and cannot
+  // be used by the register allocator for this function.
+  //
   const ReservedColorListType *const ReservedColorList;
-  //
-  // for passing registers that are pre-allocated and cannot be used by the
-  // register allocator for this function.
   
-  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 @@
 	   const MachineRegClassInfo *MRC,
 	   const ReservedColorListType *RCL = 0);
 
-  ~RegClass() { delete[] IsColorUsedArr; }
-
   inline void createInterferenceGraph() { IG.createGraph(); }
 
   inline InterferenceGraph &getIG() { return IG; }
@@ -106,7 +105,7 @@
     { IG.mergeIGNodesOfLRs(LR1, LR2); }
 
 
-  inline bool * getIsColorUsedArr() { return IsColorUsedArr; }
+  inline std::vector<bool> &getIsColorUsedArr() { return IsColorUsedArr; }
 
 
   inline void printIGNodeList() const {