Added special consideration for instrumentation strategy
authorAnand Shukla <ashukla@cs.uiuc.edu>
Sun, 20 Jul 2003 15:39:30 +0000 (15:39 +0000)
committerAnand Shukla <ashukla@cs.uiuc.edu>
Sun, 20 Jul 2003 15:39:30 +0000 (15:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7208 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Target/TargetRegInfo.h
lib/Target/SparcV9/SparcV9Internals.h
lib/Target/SparcV9/SparcV9RegClassInfo.h
lib/Target/SparcV9/SparcV9RegInfo.cpp

index fc3b52b59bc8a97bce042fe0185e05198ebae887..e5b1355ac4da5b0a5293f825e76801fa1eaa5301 100644 (file)
@@ -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)
index 47885a4f578b13331c35e078cb66bc27a5633266..2cd54b2c00e8773d7d27fd1c0489ca2514af2a6e 100644 (file)
@@ -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;
index 50cccb662146d1aaeeaadfd71496bf3dcbbd6b57..38b81b3798f885e3d24fe35102b6090e33de5e9c 100644 (file)
@@ -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;
index e1eb148f02587285eb98ffc5733b1ffcad0054cb..42b9d10b59fb68baed2d266d0fb4621721f7e803 100644 (file)
@@ -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)