teach the inliner about coldcc and noreturn functions
authorChris Lattner <sabre@nondot.org>
Wed, 18 May 2005 04:30:33 +0000 (04:30 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 18 May 2005 04:30:33 +0000 (04:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22113 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/InlineSimple.cpp

index 4bbefa3aacbd4328ea26ba8ffd5db36e27e2ec36..0d579bc1ff334c2acdd7def03541a77deb191efd 100644 (file)
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "Inliner.h"
+#include "llvm/CallingConv.h"
 #include "llvm/Instructions.h"
 #include "llvm/IntrinsicInst.h"
 #include "llvm/Function.h"
@@ -196,6 +197,20 @@ int SimpleInliner::getInlineCost(CallSite CS) {
   if (Callee->hasInternalLinkage() && Callee->hasOneUse())
     InlineCost -= 30000;
 
+  // If this function uses the coldcc calling convention, prefer not to inline
+  // it.
+  if (Callee->getCallingConv() == CallingConv::Cold)
+    InlineCost += 2000;
+
+  // If the instruction after the call, or if the normal destination of the
+  // invoke is an unreachable instruction, the function is noreturn.  As such,
+  // there is little point in inlining this.
+  if (InvokeInst *II = dyn_cast<InvokeInst>(TheCall)) {
+    if (isa<UnreachableInst>(II->getNormalDest()->begin()))
+      InlineCost += 10000;
+  } else if (isa<UnreachableInst>(++BasicBlock::iterator(TheCall)))
+    InlineCost += 10000;
+
   // Get information about the callee...
   FunctionInfo &CalleeFI = CachedFunctionInfo[Callee];