forked from OSchip/llvm-project
Added special consideration for instrumentation strategy
llvm-svn: 7208
This commit is contained in:
parent
63e14b5a4a
commit
bd2d0577fb
|
@ -44,6 +44,9 @@ public:
|
|||
std::vector<bool> &IsColorUsedArr) const = 0;
|
||||
virtual bool isRegVolatile(int Reg) const = 0;
|
||||
|
||||
//If any specific register needs extra information
|
||||
virtual bool modifiedByCall(int Reg) const {return false; }
|
||||
|
||||
virtual const char* const getRegName(unsigned reg) const = 0;
|
||||
|
||||
TargetRegClassInfo(unsigned ID, unsigned NVR, unsigned NAR)
|
||||
|
|
|
@ -447,6 +447,10 @@ public:
|
|||
return MachineRegClassArr[RegClassID]->isRegVolatile(Reg);
|
||||
}
|
||||
|
||||
inline bool modifiedByCall(int RegClassID, int Reg) const {
|
||||
return MachineRegClassArr[RegClassID]->modifiedByCall(Reg);
|
||||
}
|
||||
|
||||
// Get the register type for a register identified different ways.
|
||||
int getRegType(const Type* type) const;
|
||||
int getRegType(const LiveRange *LR) const;
|
||||
|
|
|
@ -25,6 +25,10 @@ struct SparcIntRegClass : public TargetRegClassInfo {
|
|||
return (Reg < (int)StartOfNonVolatileRegs);
|
||||
}
|
||||
|
||||
inline bool modifiedByCall(int Reg) const {
|
||||
return Reg==(int)ModifiedByCall;
|
||||
}
|
||||
|
||||
enum { // colors possible for a LR (in preferred order)
|
||||
// --- following colors are volatile across function calls
|
||||
// %g0 can't be used for coloring - always 0
|
||||
|
@ -61,6 +65,8 @@ struct SparcIntRegClass : public TargetRegClassInfo {
|
|||
|
||||
StartOfNonVolatileRegs = l0,
|
||||
StartOfAllRegs = o0,
|
||||
|
||||
ModifiedByCall = o7,
|
||||
};
|
||||
|
||||
const char * const getRegName(unsigned reg) const;
|
||||
|
|
|
@ -1182,6 +1182,15 @@ UltraSparcRegInfo::insertCallerSavingCode
|
|||
|
||||
CallArgsDescriptor* argDesc = CallArgsDescriptor::get(CallMI);
|
||||
|
||||
//if the call is to a instrumentation function, do not
|
||||
//insert save and restore instructions
|
||||
//the instrumentation function takes care of
|
||||
//save restore for volatile regs
|
||||
bool isLLVMFirstTrigger = false;
|
||||
const Function *calledFunction = argDesc->getCallInst()->getCalledFunction();
|
||||
if(calledFunction && calledFunction->getName() == "llvm_first_trigger")
|
||||
isLLVMFirstTrigger = true;
|
||||
|
||||
// Now check if the call has a return value (using argDesc) and if so,
|
||||
// find the LR of the TmpInstruction representing the return value register.
|
||||
// (using the last or second-last *implicit operand* of the call MI).
|
||||
|
@ -1228,6 +1237,11 @@ UltraSparcRegInfo::insertCallerSavingCode
|
|||
|
||||
if ( isRegVolatile(RCID, Color) ) {
|
||||
|
||||
//if the function is special LLVM function,
|
||||
//And the register is not modified by call, don't save and restore
|
||||
if(isLLVMFirstTrigger && !modifiedByCall(RCID, Color))
|
||||
continue;
|
||||
|
||||
// if the value is in both LV sets (i.e., live before and after
|
||||
// the call machine instruction)
|
||||
|
||||
|
|
Loading…
Reference in New Issue