diff options
author | Ruchira Sasanka <sasanka@students.uiuc.edu> | 2001-09-14 21:18:34 +0000 |
---|---|---|
committer | Ruchira Sasanka <sasanka@students.uiuc.edu> | 2001-09-14 21:18:34 +0000 |
commit | 8e6047920dbf22a1edcbd98e65a8bc57a56c0e17 (patch) | |
tree | 9d89ad66ac0f1071f081416269c2c58f7af13ba9 /lib/CodeGen/RegAlloc/RegClass.cpp | |
parent | 94d86e9677c863a10741b888177085fe2d48d50c (diff) |
*** empty log message ***
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@580 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/RegAlloc/RegClass.cpp')
-rw-r--r-- | lib/CodeGen/RegAlloc/RegClass.cpp | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/lib/CodeGen/RegAlloc/RegClass.cpp b/lib/CodeGen/RegAlloc/RegClass.cpp new file mode 100644 index 0000000000..90ad960ba5 --- /dev/null +++ b/lib/CodeGen/RegAlloc/RegClass.cpp @@ -0,0 +1,202 @@ +#include "llvm/CodeGen/RegClass.h" + + + +RegClass::RegClass(const Method *const M, + const MachineRegClassInfo *const Mrc, + const ReservedColorListType *const RCL) + : Meth(M), MRC(Mrc), RegClassID( Mrc->getRegClassID() ), + IG(this), IGNodeStack(), ReservedColorList(RCL) +{ + if( DEBUG_RA) + cout << "Created Reg Class: " << RegClassID << endl; + + // This constructor inits IG. The actual matrix is created by a call to + // createInterferenceGraph() above. + + IsColorUsedArr = new bool[ Mrc->getNumOfAllRegs() ]; +} + + + +void RegClass::colorAllRegs() +{ + if(DEBUG_RA) cout << "Coloring IGs ..." << endl; + + //preColorIGNodes(); // pre-color IGNodes + pushAllIGNodes(); // push all IG Nodes + + unsigned int StackSize = IGNodeStack.size(); + IGNode *CurIGNode; + + // for all LRs on stack + for( unsigned int IGN=0; IGN < StackSize; IGN++) { + + CurIGNode = IGNodeStack.top(); // pop the IGNode on top of stack + IGNodeStack.pop(); + colorIGNode (CurIGNode); // color it + } + + + // InsertSpillCode; ********* TODO ******** + +} + + + +void RegClass::pushAllIGNodes() +{ + bool NeedMoreSpills; + IGNode *IGNodeSpill, *IGNode; + + IG.setCurDegreeOfIGNodes(); // calculate degree of IGNodes + + // push non-constrained IGNodes + bool PushedAll = pushUnconstrainedIGNodes(); + + if( DEBUG_RA) { + cout << " Puhsed all-unconstrained IGNodes. "; + if( PushedAll ) cout << " No constrained nodes left."; + cout << endl; + } + + if( PushedAll ) // if NO constrained nodes left + return; + + + // now, we have constrained nodes. So, push one of them (the one with min + // spill cost) and try to push the others as unConstrained nodes. + // Repeat this. + + do{ + + //get IGNode with min spill cost + IGNodeSpill = getIGNodeWithMinSpillCost(); + + // push IGNode on to stack + IGNodeStack.push( IGNodeSpill ); + + // set OnStack flag and decrement degree of neighs + IGNode->pushOnStack(); + + // now push NON-constrined ones, if any + NeedMoreSpills = ! pushUnconstrainedIGNodes(); + + } while( NeedMoreSpills ); // repeat until we have pushed all + +} + + + + + + +bool RegClass::pushUnconstrainedIGNodes() +{ + // # of LRs for this reg class + unsigned int IGNodeListSize = IG.getIGNodeList().size(); + bool pushedall = true; + + // a pass over IGNodeList + for( unsigned i =0; i < IGNodeListSize; i++) { + + // get IGNode i from IGNodeList + IGNode *IGNode = IG.getIGNodeList()[i]; + + if( ! IGNode ) // can be null due to merging + continue; + + // if the degree of IGNode is lower + if( (unsigned) IGNode->getCurDegree() < MRC->getNumOfAvailRegs() ) { + IGNodeStack.push( IGNode ); // push IGNode on to the stack + IGNode->pushOnStack(); // set OnStack and dec deg of neighs + + if (DEBUG_RA > 1) { + cout << " pushed un-constrained IGNode " << IGNode->getIndex() ; + cout << " on to stack" << endl; + } + } + else pushedall = false; // we didn't push all live ranges + + } // for + + // returns true if we pushed all live ranges - else false + return pushedall; +} + + + + +IGNode * RegClass::getIGNodeWithMinSpillCost() +{ + IGNode *IGNode=NULL; + unsigned int IGNodeListSize = IG.getIGNodeList().size(); + + // pass over IGNodeList + for( unsigned int i =0; i < IGNodeListSize; i++) { + IGNode = IG.getIGNodeList()[i]; + + if( ! IGNode ) // can be null due to merging + continue; + + // return the first IGNode ########## Change this ####### + if( ! IGNode->isOnStack() ) return IGNode; + } + + assert(0); + return NULL; +} + + + + +void RegClass::colorIGNode(IGNode *const Node) +{ + + if( ! Node->hasColor() ) { // not colored as an arg etc. + + + // init all elements to 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; + } + + MRC->colorIGNode(Node, IsColorUsedArr); + } + else { + cout << " Node " << Node->getIndex(); + cout << " already colored with color " << Node->getColor() << endl; + } + + + if( !Node->hasColor() ) { + cout << " Node " << Node->getIndex(); + cout << " - could not find a color (needs spilling)" << endl; + } + +} + + +#if 0 + + if( DEBUG_RA) { // printing code + /* cout << " Node " << Node->getIndex(); + if( Node->hasColor() ) { + cout << " colored with color " << Node->getColor() << " [" ; + cout << SparcFloatRegOrder::getRegName(Node->getColor()); + if( Node->getTypeID() == Type::DoubleTyID ) + cout << "+" << SparcFloatRegOrder::getRegName(Node->getColor()+1); + cout << "]" << endl; + } + */ + // MRC->printReg( Node->getParentLR()); + cout << " Node " << Node->getIndex(); + if( Node->hasColor() ) + cout << " colored with color " << Node->getColor() << endl; + +#endif |