Reapply r53540, now with the matching header!
authorChris Lattner <sabre@nondot.org>
Mon, 14 Jul 2008 17:32:59 +0000 (17:32 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 14 Jul 2008 17:32:59 +0000 (17:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53557 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Transforms/Utils/InlineCost.h
lib/Transforms/Utils/InlineCost.cpp

index 24d3fc7523da8dcfdee1302434d52e4e9321cc05..9e044d83f9eb5f4ddd3bacab68ec21fc8590b1f0 100644 (file)
@@ -38,6 +38,10 @@ namespace llvm {
     // FunctionInfo - For each function, calculate the size of it in blocks and
     // instructions.
     struct FunctionInfo {
+      /// NeverInline - True if this callee should never be inlined into a
+      /// caller.
+      bool NeverInline;
+      
       /// NumInsts, NumBlocks - Keep track of how large each function is, which
       /// is used to estimate the code size cost of inlining it.
       unsigned NumInsts, NumBlocks;
@@ -53,7 +57,8 @@ namespace llvm {
       /// entry here.
       std::vector<ArgInfo> ArgumentWeights;
       
-      FunctionInfo() : NumInsts(0), NumBlocks(0), NumVectorInsts(0) {}
+      FunctionInfo() : NeverInline(false), NumInsts(0), NumBlocks(0),
+                       NumVectorInsts(0) {}
       
       /// analyzeFunction - Fill in the current structure with information
       /// gleaned from the specified function.
index c17705bf85090504a74bfe0681d1d839e1791a63..10cb77bbcba61835a17736f3c1368650eaf770ca 100644 (file)
@@ -100,9 +100,27 @@ void InlineCostAnalyzer::FunctionInfo::analyzeFunction(Function *F) {
   for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) {
     for (BasicBlock::const_iterator II = BB->begin(), E = BB->end();
          II != E; ++II) {
-      if (isa<DbgInfoIntrinsic>(II)) continue;  // Debug intrinsics don't count.
       if (isa<PHINode>(II)) continue;           // PHI nodes don't count.
 
+      // Special handling for calls.
+      if (isa<CallInst>(II) || isa<InvokeInst>(II)) {
+        if (isa<DbgInfoIntrinsic>(II))
+          continue;  // Debug intrinsics don't count as size.
+        
+        CallSite CS = CallSite::get(const_cast<Instruction*>(&*II));
+        
+        // If this function contains a call to setjmp or _setjmp, never inline
+        // it.  This is a hack because we depend on the user marking their local
+        // variables as volatile if they are live across a setjmp call, and they
+        // probably won't do this in callers.
+        if (Function *F = CS.getCalledFunction())
+          if (F->isDeclaration() && 
+              (F->isName("setjmp") || F->isName("_setjmp"))) {
+            NeverInline = true;
+            return;
+          }
+      }
+      
       if (isa<ExtractElementInst>(II) || isa<VectorType>(II->getType()))
         ++NumVectorInsts; 
       
@@ -194,6 +212,10 @@ int InlineCostAnalyzer::getInlineCost(CallSite CS,
   // If we haven't calculated this information yet, do so now.
   if (CalleeFI.NumBlocks == 0)
     CalleeFI.analyzeFunction(Callee);
+  
+  // If we should never inline this, return a huge cost.
+  if (CalleeFI.NeverInline)
+    return 2000000000;
     
   // Add to the inline quality for properties that make the call valuable to
   // inline.  This includes factors that indicate that the result of inlining