diff options
author | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-07-10 21:36:00 +0000 |
---|---|---|
committer | Vikram S. Adve <vadve@cs.uiuc.edu> | 2002-07-10 21:36:00 +0000 |
commit | dcde95fbbca7158fea722dd93fbe2dc6112d23a9 (patch) | |
tree | eab305f70886438753b432e1602b854c76fbf30f /lib/Target | |
parent | 9d22cd45359f0d200e374d75f7a8935235da2ef6 (diff) | |
download | llvm-dcde95fbbca7158fea722dd93fbe2dc6112d23a9.tar.gz llvm-dcde95fbbca7158fea722dd93fbe2dc6112d23a9.tar.bz2 llvm-dcde95fbbca7158fea722dd93fbe2dc6112d23a9.tar.xz |
More important fixes:
-- FP argument to a function with no prototype going on stack
was not being copied to the stack in colorCallArgs().
-- Put caller-saving code *before* argument copying code so that
we don't trash a register before saving it!
-- Two other minor fixes.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2855 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/SparcV9/SparcV9RegInfo.cpp | 93 |
1 files changed, 53 insertions, 40 deletions
diff --git a/lib/Target/SparcV9/SparcV9RegInfo.cpp b/lib/Target/SparcV9/SparcV9RegInfo.cpp index 86ee00c79a..11b65f8cab 100644 --- a/lib/Target/SparcV9/SparcV9RegInfo.cpp +++ b/lib/Target/SparcV9/SparcV9RegInfo.cpp @@ -742,9 +742,10 @@ void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI, } unsigned RegClassID = (RetValLR->getRegClass())->getID(); - bool recvCorrectColor = false; - + bool recvCorrectColor; unsigned CorrectCol; // correct color for ret value + unsigned UniRetReg; // unified number for CorrectCol + if(RegClassID == IntRegClassID) CorrectCol = SparcIntRegOrder::o0; else if(RegClassID == FloatRegClassID) @@ -753,28 +754,26 @@ void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI, assert( 0 && "Unknown RegClass"); return; } + + // convert to unified number + UniRetReg = this->getUnifiedRegNum( RegClassID, CorrectCol); // Mark the register as used by this instruction - CallMI->getRegsUsed().insert(this->getUnifiedRegNum(RegClassID,CorrectCol)); + CallMI->getRegsUsed().insert(UniRetReg); // if the LR received the correct color, NOTHING to do - if( RetValLR->hasColor() ) - if( RetValLR->getColor() == CorrectCol ) - recvCorrectColor = true; - + recvCorrectColor = RetValLR->hasColor()? RetValLR->getColor() == CorrectCol + : false; + // if we didn't receive the correct color for some reason, // put copy instruction if( !recvCorrectColor ) { - + unsigned regType = getRegType( RetValLR ); - // the reg that LR must be colored with - unsigned UniRetReg = getUnifiedRegNum( RegClassID, CorrectCol); - if( RetValLR->hasColor() ) { - unsigned - UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor()); + unsigned UniRetLRReg=getUnifiedRegNum(RegClassID,RetValLR->getColor()); // the return value is coming in UniRetReg but has to go into // the UniRetLRReg @@ -851,6 +850,8 @@ void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI, // Repeat for the second copy of the argument, which would be // an FP argument being passed to a function with no prototype. + // It may either be passed as a copy in an integer register + // (in argCopy), or on the stack (useStackSlot). const Value *argCopy = argDesc->getArgInfo(i).getArgCopy(); if (argCopy != NULL) { @@ -872,11 +873,22 @@ void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI, copyRegClassID, copyRegNum, argNo, AddedInstrnsBefore); } + + if (regNum != InvalidRegNum && + argDesc->getArgInfo(i).usesStackSlot()) + { + // Pass the argument via the stack in addition to regNum + assert(regType != IntRegType && "Passing an integer arg. twice?"); + assert(!argCopy && "Passing FP arg in FP reg, INT reg, and stack?"); + InitializeOutgoingArg(CallMI, CallAI, PRA, LR, regType, RegClassID, + InvalidRegNum, argNo, AddedInstrnsBefore); + } } // for each parameter in call instruction // If we added any instruction before the call instruction, verify // that they are in the proper order and if not, reorder them // + std::vector<MachineInstr *> ReorderedVec; if (!AddedInstrnsBefore.empty()) { if (DEBUG_RA) { @@ -885,23 +897,26 @@ void UltraSparcRegInfo::colorCallArgs(MachineInstr *CallMI, cerr << *(AddedInstrnsBefore[i]); } - std::vector<MachineInstr *> TmpVec; - OrderAddedInstrns(AddedInstrnsBefore, TmpVec, PRA); - + OrderAddedInstrns(AddedInstrnsBefore, ReorderedVec, PRA); + assert(ReorderedVec.size() >= AddedInstrnsBefore.size() + && "Dropped some instructions when reordering!"); + if (DEBUG_RA) { cerr << "\nAfter reordering instrns: \n"; - for(unsigned i = 0; i < TmpVec.size(); i++) - cerr << *TmpVec[i]; + for(unsigned i = 0; i < ReorderedVec.size(); i++) + cerr << *ReorderedVec[i]; } - - // copy the results back from TmpVec to InstrnsBefore - for(unsigned i=0; i < TmpVec.size(); i++) - CallAI->InstrnsBefore.push_back( TmpVec[i] ); } - // now insert caller saving code for this call instruction + // Now insert caller saving code for this call instruction // - insertCallerSavingCode(CallMI, BB, PRA); + insertCallerSavingCode(CallAI->InstrnsBefore, CallAI->InstrnsAfter, + CallMI, BB, PRA); + + // Then insert the final reordered code for the call arguments. + // + for(unsigned i=0; i < ReorderedVec.size(); i++) + CallAI->InstrnsBefore.push_back( ReorderedVec[i] ); } //--------------------------------------------------------------------------- @@ -978,16 +993,17 @@ void UltraSparcRegInfo::colorRetValue(MachineInstr *RetMI, return; } + // convert to unified number + unsigned UniRetReg = this->getUnifiedRegNum(RegClassID, CorrectCol); + // Mark the register as used by this instruction - RetMI->getRegsUsed().insert(this->getUnifiedRegNum(RegClassID, CorrectCol)); + RetMI->getRegsUsed().insert(UniRetReg); // if the LR received the correct color, NOTHING to do - + if (LR->hasColor() && LR->getColor() == CorrectCol) return; - - unsigned UniRetReg = getUnifiedRegNum(RegClassID, CorrectCol); - + if (LR->hasColor()) { // We are here because the LR was allocted a regiter @@ -1290,10 +1306,13 @@ UltraSparcRegInfo::cpValue2Value(Value *Src, //---------------------------------------------------------------------------- -void UltraSparcRegInfo::insertCallerSavingCode(MachineInstr *CallMI, - const BasicBlock *BB, - PhyRegAlloc &PRA) const { - +void +UltraSparcRegInfo::insertCallerSavingCode(vector<MachineInstr*>& instrnsBefore, + vector<MachineInstr*>& instrnsAfter, + MachineInstr *CallMI, + const BasicBlock *BB, + PhyRegAlloc &PRA) const +{ assert ( (UltraSparcInfo->getInstrInfo()).isCall(CallMI->getOpCode()) ); // has set to record which registers were saved/restored @@ -1322,7 +1341,6 @@ void UltraSparcRegInfo::insertCallerSavingCode(MachineInstr *CallMI, RetValLR->getColor() ) ); } - const ValueSet &LVSetAft = PRA.LVI->getLiveVarSetAfterMInst(CallMI, BB); ValueSet::const_iterator LIt = LVSetAft.begin(); @@ -1361,11 +1379,6 @@ void UltraSparcRegInfo::insertCallerSavingCode(MachineInstr *CallMI, int StackOff = PRA.mcInfo.pushTempValue(target, getSpilledRegSize(RegType)); - vector<MachineInstr*>& instrnsBefore = - PRA.AddedInstrMap[CallMI].InstrnsBefore; - vector<MachineInstr*>& instrnsAfter = - PRA.AddedInstrMap[CallMI].InstrnsAfter; - vector<MachineInstr*> AdIBef, AdIAft; //---- Insert code for pushing the reg on stack ---------- @@ -1393,7 +1406,7 @@ void UltraSparcRegInfo::insertCallerSavingCode(MachineInstr *CallMI, cpReg2MemMI(instrnsBefore, Reg,getFramePointer(),StackOff,RegType, scratchReg); - if (AdIBef.size() > 0) + if (AdIAft.size() > 0) instrnsBefore.insert(instrnsBefore.end(), AdIAft.begin(), AdIAft.end()); |