mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-20 09:24:58 +00:00
Added code to PhyRegAlloc to mark unusable suggested regs
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
This commit is contained in:
parent
33eb292e12
commit
0e62aa6d14
@ -2,6 +2,7 @@
|
||||
|
||||
|
||||
IGNode::IGNode(LiveRange *const PLR, unsigned int Ind): Index(Ind),
|
||||
AdjList(),
|
||||
ParentLR(PLR)
|
||||
{
|
||||
OnStack = false;
|
||||
|
@ -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();
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
|
||||
IGNode::IGNode(LiveRange *const PLR, unsigned int Ind): Index(Ind),
|
||||
AdjList(),
|
||||
ParentLR(PLR)
|
||||
{
|
||||
OnStack = false;
|
||||
|
@ -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();
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user