diff options
| author | Anand Shukla <ashukla@cs.uiuc.edu> | 2003-07-20 15:39:30 +0000 |
|---|---|---|
| committer | Anand Shukla <ashukla@cs.uiuc.edu> | 2003-07-20 15:39:30 +0000 |
| commit | bd2d0577fb12288c47fbcde3dad8977948625bff (patch) | |
| tree | 5ea27faaadc1710bcf9d9093b5ea230ffcefedd5 /llvm/lib/Target/Sparc | |
| parent | 63e14b5a4a08359a0632bb54559a1d7326a72a60 (diff) | |
| download | bcm5719-llvm-bd2d0577fb12288c47fbcde3dad8977948625bff.tar.gz bcm5719-llvm-bd2d0577fb12288c47fbcde3dad8977948625bff.zip | |
Added special consideration for instrumentation strategy
llvm-svn: 7208
Diffstat (limited to 'llvm/lib/Target/Sparc')
| -rw-r--r-- | llvm/lib/Target/Sparc/SparcInternals.h | 4 | ||||
| -rw-r--r-- | llvm/lib/Target/Sparc/SparcRegClassInfo.h | 6 | ||||
| -rw-r--r-- | llvm/lib/Target/Sparc/SparcRegInfo.cpp | 14 |
3 files changed, 24 insertions, 0 deletions
diff --git a/llvm/lib/Target/Sparc/SparcInternals.h b/llvm/lib/Target/Sparc/SparcInternals.h index 47885a4f578..2cd54b2c00e 100644 --- a/llvm/lib/Target/Sparc/SparcInternals.h +++ b/llvm/lib/Target/Sparc/SparcInternals.h @@ -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; diff --git a/llvm/lib/Target/Sparc/SparcRegClassInfo.h b/llvm/lib/Target/Sparc/SparcRegClassInfo.h index 50cccb66214..38b81b3798f 100644 --- a/llvm/lib/Target/Sparc/SparcRegClassInfo.h +++ b/llvm/lib/Target/Sparc/SparcRegClassInfo.h @@ -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; diff --git a/llvm/lib/Target/Sparc/SparcRegInfo.cpp b/llvm/lib/Target/Sparc/SparcRegInfo.cpp index e1eb148f025..42b9d10b59f 100644 --- a/llvm/lib/Target/Sparc/SparcRegInfo.cpp +++ b/llvm/lib/Target/Sparc/SparcRegInfo.cpp @@ -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) |

