Add #includes neccesary since they were removed from .h files
[oota-llvm.git] / lib / CodeGen / RegAlloc / LiveRangeInfo.cpp
index 00385d99de20cc03443fc63d343ae6f516905938..b5f9275be4bf543db868cad5c1d7f81fc1ec6bb9 100644 (file)
@@ -1,31 +1,66 @@
 #include "llvm/CodeGen/LiveRangeInfo.h"
-
+#include "llvm/CodeGen/RegClass.h"
+#include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Method.h"
+#include <iostream>
+using std::cerr;
+
+//---------------------------------------------------------------------------
+// Constructor
+//---------------------------------------------------------------------------
 LiveRangeInfo::LiveRangeInfo(const Method *const M, 
                             const TargetMachine& tm,
-                            vector<RegClass *> &RCL) 
-                             : Meth(M), LiveRangeMap(), 
-                              TM(tm), RegClassList(RCL),
-                              MRI( tm.getRegInfo()),
-                              CallRetInstrList()
+                            std::vector<RegClass *> &RCL)
+                             : Meth(M), LiveRangeMap(), TM(tm),
+                               RegClassList(RCL), MRI(tm.getRegInfo())
 { }
 
 
+//---------------------------------------------------------------------------
+// Destructor: Deletes all LiveRanges in the LiveRangeMap
+//---------------------------------------------------------------------------
+LiveRangeInfo::~LiveRangeInfo() {
+  LiveRangeMapType::iterator MI =  LiveRangeMap.begin(); 
+
+  for( ; MI != LiveRangeMap.end() ; ++MI) {  
+    if (MI->first && MI->second) {
+      LiveRange *LR = MI->second;
+
+      // we need to be careful in deleting LiveRanges in LiveRangeMap
+      // since two/more Values in the live range map can point to the same
+      // live range. We have to make the other entries NULL when we delete
+      // a live range.
+
+      LiveRange::iterator LI = LR->begin();
+      
+      for( ; LI != LR->end() ; ++LI)
+        LiveRangeMap[*LI] = 0;
+      
+      delete LR;
+    }
+  }
+}
+
+
+//---------------------------------------------------------------------------
 // union two live ranges into one. The 2nd LR is deleted. Used for coalescing.
 // Note: the caller must make sure that L1 and L2 are distinct and both
 // LRs don't have suggested colors
-
+//---------------------------------------------------------------------------
 void LiveRangeInfo::unionAndUpdateLRs(LiveRange *const L1, LiveRange *L2)
 {
   assert( L1 != L2);
-  L1->setUnion( L2 );             // add elements of L2 to L1
+  L1->setUnion( L2 );                   // add elements of L2 to L1
   ValueSet::iterator L2It;
 
   for( L2It = L2->begin() ; L2It != L2->end(); ++L2It) {
 
     //assert(( L1->getTypeID() == L2->getTypeID()) && "Merge:Different types");
 
-    L1->add( *L2It );            // add the var in L2 to L1
-    LiveRangeMap[ *L2It ] = L1;  // now the elements in L2 should map to L1    
+    L1->add( *L2It );                   // add the var in L2 to L1
+    LiveRangeMap[ *L2It ] = L1;         // now the elements in L2 should map 
+                                        //to L1    
   }
 
 
@@ -40,18 +75,24 @@ void LiveRangeInfo::unionAndUpdateLRs(LiveRange *const L1, LiveRange *L2)
   if( L2->isCallInterference() )
     L1->setCallInterference();
   
+  L1->addSpillCost( L2->getSpillCost() ); // add the spill costs
 
-  delete ( L2 );                 // delete L2 as it is no longer needed
+  delete L2;                        // delete L2 as it is no longer needed
 }
 
 
 
-                                 
+//---------------------------------------------------------------------------
+// Method for constructing all live ranges in a method. It creates live 
+// ranges for all values defined in the instruction stream. Also, it
+// creates live ranges for all incoming arguments of the method.
+//---------------------------------------------------------------------------
 void LiveRangeInfo::constructLiveRanges()
 {  
 
   if( DEBUG_RA) 
-    cout << "Consturcting Live Ranges ..." << endl;
+    cerr << "Consturcting Live Ranges ...\n";
 
   // first find the live ranges for all incoming args of the method since
   // those LRs start from the start of the method
@@ -63,14 +104,13 @@ void LiveRangeInfo::constructLiveRanges()
 
              
   for( ; ArgIt != ArgList.end() ; ++ArgIt) {     // for each argument
-
     LiveRange * ArgRange = new LiveRange();      // creates a new LR and 
     const Value *const Val = (const Value *) *ArgIt;
 
     assert( Val);
 
-    ArgRange->add( Val );     // add the arg (def) to it
-    LiveRangeMap[ Val ] = ArgRange;
+    ArgRange->add(Val);     // add the arg (def) to it
+    LiveRangeMap[Val] = ArgRange;
 
     // create a temp machine op to find the register class of value
     //const MachineOperand Op(MachineOperand::MO_VirtualRegister);
@@ -80,8 +120,8 @@ void LiveRangeInfo::constructLiveRanges()
 
                           
     if( DEBUG_RA > 1) {     
-      cout << " adding LiveRange for argument ";    
-      printValue( (const Value *) *ArgIt); cout  << endl;
+      cerr << " adding LiveRange for argument ";    
+      printValue((const Value *) *ArgIt); cerr << "\n";
     }
   }
 
@@ -95,7 +135,6 @@ void LiveRangeInfo::constructLiveRanges()
 
 
   Method::const_iterator BBI = Meth->begin();    // random iterator for BBs   
-
   for( ; BBI != Meth->end(); ++BBI) {            // go thru BBs in random order
 
     // Now find all LRs for machine the instructions. A new LR will be created 
@@ -105,8 +144,7 @@ void LiveRangeInfo::constructLiveRanges()
 
     // get the iterator for machine instructions
     const MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
-    MachineCodeForBasicBlock::const_iterator 
-      MInstIterator = MIVec.begin();
+    MachineCodeForBasicBlock::const_iterator MInstIterator = MIVec.begin();
 
     // iterate over all the machine instructions in BB
     for( ; MInstIterator != MIVec.end(); MInstIterator++) {  
@@ -116,53 +154,46 @@ void LiveRangeInfo::constructLiveRanges()
       // Now if the machine instruction is a  call/return instruction,
       // add it to CallRetInstrList for processing its implicit operands
 
-      if( (TM.getInstrInfo()).isReturn( MInst->getOpCode()) ||
-         (TM.getInstrInfo()).isCall( MInst->getOpCode()) )
+      if(TM.getInstrInfo().isReturn(MInst->getOpCode()) ||
+        TM.getInstrInfo().isCall(MInst->getOpCode()))
        CallRetInstrList.push_back( MInst ); 
  
              
       // iterate over  MI operands to find defs
-      for( MachineInstr::val_const_op_iterator OpI(MInst);!OpI.done(); ++OpI) {
-       
-       if( DEBUG_RA) {
+      for (MachineInstr::val_const_op_iterator OpI(MInst); !OpI.done(); ++OpI) {
+       if(DEBUG_RA) {
          MachineOperand::MachineOperandType OpTyp = 
            OpI.getMachineOperand().getOperandType();
 
-         if ( OpTyp == MachineOperand::MO_CCRegister) {
-           cout << "\n**CC reg found. Is Def=" << OpI.isDef() << " Val:";
+         if (OpTyp == MachineOperand::MO_CCRegister) {
+           cerr << "\n**CC reg found. Is Def=" << OpI.isDef() << " Val:";
            printValue( OpI.getMachineOperand().getVRegValue() );
-           cout << endl;
+           cerr << "\n";
          }
        }
 
        // create a new LR iff this operand is a def
        if( OpI.isDef() ) {     
-         
          const Value *const Def = *OpI;
 
-
          // Only instruction values are accepted for live ranges here
-
          if( Def->getValueType() != Value::InstructionVal ) {
-           cout << "\n**%%Error: Def is not an instruction val. Def=";
-           printValue( Def ); cout << endl;
+           cerr << "\n**%%Error: Def is not an instruction val. Def=";
+           printValue( Def ); cerr << "\n";
            continue;
          }
 
-
          LiveRange *DefRange = LiveRangeMap[Def]; 
 
          // see LR already there (because of multiple defs)
-         
          if( !DefRange) {                  // if it is not in LiveRangeMap
-           
            DefRange = new LiveRange();     // creates a new live range and 
            DefRange->add( Def );           // add the instruction (def) to it
            LiveRangeMap[ Def ] = DefRange; // update the map
 
            if( DEBUG_RA > 1) {             
-             cout << "  creating a LR for def: ";    
-             printValue(Def); cout  << endl;
+             cerr << "  creating a LR for def: ";    
+             printValue(Def); cerr  << "\n";
            }
 
            // set the register class of the new live range
@@ -176,7 +207,7 @@ void LiveRangeInfo::constructLiveRanges()
 
 
            if(isCC && DEBUG_RA) {
-             cout  << "\a**created a LR for a CC reg:";
+             cerr  << "\a**created a LR for a CC reg:";
              printValue( OpI.getMachineOperand().getVRegValue() );
            }
 
@@ -190,8 +221,8 @@ void LiveRangeInfo::constructLiveRanges()
            LiveRangeMap[ Def ] = DefRange; 
 
            if( DEBUG_RA > 1) { 
-             cout << "   added to an existing LR for def: ";  
-             printValue( Def ); cout  << endl;
+             cerr << "   added to an existing LR for def: ";  
+             printValue( Def ); cerr  << "\n";
            }
          }
 
@@ -211,15 +242,19 @@ void LiveRangeInfo::constructLiveRanges()
   suggestRegs4CallRets();
 
   if( DEBUG_RA) 
-    cout << "Initial Live Ranges constructed!" << endl;
+    cerr << "Initial Live Ranges constructed!\n";
 
 }
 
 
-
-// Suggest colors for call and return args. 
-// Also create new LRs for implicit defs
-
+//---------------------------------------------------------------------------
+// If some live ranges must be colored with specific hardware registers
+// (e.g., for outgoing call args), suggesting of colors for such live
+// ranges is done using target specific method. Those methods are called
+// from this function. The target specific methods must:
+//    1) suggest colors for call and return args. 
+//    2) create new LRs for implicit defs in machine instructions
+//---------------------------------------------------------------------------
 void LiveRangeInfo::suggestRegs4CallRets()
 {
 
@@ -243,11 +278,11 @@ void LiveRangeInfo::suggestRegs4CallRets()
 }
 
 
+//--------------------------------------------------------------------------
+// The following method coalesces live ranges when possible. This method
+// must be called after the interference graph has been constructed.
 
 
-void LiveRangeInfo::coalesceLRs()  
-{
-
 /* Algorithm:
    for each BB in method
      for each machine instruction (inst)
@@ -260,9 +295,11 @@ void LiveRangeInfo::coalesceLRs()
                    merge2IGNodes(def, op) // i.e., merge 2 LRs 
 
 */
-
+//---------------------------------------------------------------------------
+void LiveRangeInfo::coalesceLRs()  
+{
   if( DEBUG_RA) 
-    cout << endl << "Coalscing LRs ..." << endl;
+    cerr << "\nCoalscing LRs ...\n";
 
   Method::const_iterator BBI = Meth->begin();  // random iterator for BBs   
 
@@ -270,8 +307,7 @@ void LiveRangeInfo::coalesceLRs()
 
     // get the iterator for machine instructions
     const MachineCodeForBasicBlock& MIVec = (*BBI)->getMachineInstrVec();
-    MachineCodeForBasicBlock::const_iterator 
-      MInstIterator = MIVec.begin();
+    MachineCodeForBasicBlock::const_iterator MInstIterator = MIVec.begin();
 
     // iterate over all the machine instructions in BB
     for( ; MInstIterator != MIVec.end(); ++MInstIterator) {  
@@ -279,9 +315,9 @@ void LiveRangeInfo::coalesceLRs()
       const MachineInstr * MInst = *MInstIterator; 
 
       if( DEBUG_RA > 1) {
-       cout << " *Iterating over machine instr ";
+       cerr << " *Iterating over machine instr ";
        MInst->dump();
-       cout << endl;
+       cerr << "\n";
       }
 
 
@@ -303,8 +339,8 @@ void LiveRangeInfo::coalesceLRs()
 
              //don't warn about labels
              if (!((*UseI)->getType())->isLabelType() && DEBUG_RA) {
-               cout<<" !! Warning: No LR for use "; printValue(*UseI);
-               cout << endl;
+               cerr<<" !! Warning: No LR for use "; printValue(*UseI);
+               cerr << "\n";
              }
              continue;                 // ignore and continue
            }
@@ -353,7 +389,7 @@ void LiveRangeInfo::coalesceLRs()
   } // for all BBs
 
   if( DEBUG_RA) 
-    cout << endl << "Coalscing Done!" << endl;
+    cerr << "\nCoalscing Done!\n";
 
 }
 
@@ -367,11 +403,11 @@ void LiveRangeInfo::coalesceLRs()
 void LiveRangeInfo::printLiveRanges()
 {
   LiveRangeMapType::iterator HMI = LiveRangeMap.begin();   // hash map iterator
-  cout << endl << "Printing Live Ranges from Hash Map:" << endl;
-  for( ; HMI != LiveRangeMap.end() ; HMI ++ ) {
-    if( (*HMI).first && (*HMI).second ) {
-      cout <<" "; printValue((*HMI).first);  cout  << "\t: "; 
-      ((*HMI).second)->printSet(); cout << endl;
+  cerr << "\nPrinting Live Ranges from Hash Map:\n";
+  for( ; HMI != LiveRangeMap.end() ; ++HMI) {
+    if( HMI->first && HMI->second ) {
+      cerr <<" "; printValue((*HMI).first);  cerr << "\t: "; 
+      HMI->second->printSet(); cerr << "\n";
     }
   }
 }