Added special consideration for instrumentation strategy

llvm-svn: 7208
diff --git a/llvm/lib/Target/Sparc/SparcInternals.h b/llvm/lib/Target/Sparc/SparcInternals.h
index 47885a4..2cd54b2 100644
--- a/llvm/lib/Target/Sparc/SparcInternals.h
+++ b/llvm/lib/Target/Sparc/SparcInternals.h
@@ -447,6 +447,10 @@
     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 50cccb6..38b81b3 100644
--- a/llvm/lib/Target/Sparc/SparcRegClassInfo.h
+++ b/llvm/lib/Target/Sparc/SparcRegClassInfo.h
@@ -25,6 +25,10 @@
     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 @@
 
      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 e1eb148..42b9d10 100644
--- a/llvm/lib/Target/Sparc/SparcRegInfo.cpp
+++ b/llvm/lib/Target/Sparc/SparcRegInfo.cpp
@@ -1182,6 +1182,15 @@
 
   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 @@
 
 	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)