From 49fbff45685c21d7f42aca7a104fc841cdbd5d43 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 18 May 2005 04:30:33 +0000 Subject: teach the inliner about coldcc and noreturn functions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22113 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/InlineSimple.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'lib/Transforms/IPO/InlineSimple.cpp') diff --git a/lib/Transforms/IPO/InlineSimple.cpp b/lib/Transforms/IPO/InlineSimple.cpp index 4bbefa3aac..0d579bc1ff 100644 --- a/lib/Transforms/IPO/InlineSimple.cpp +++ b/lib/Transforms/IPO/InlineSimple.cpp @@ -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(TheCall)) { + if (isa(II->getNormalDest()->begin())) + InlineCost += 10000; + } else if (isa(++BasicBlock::iterator(TheCall))) + InlineCost += 10000; + // Get information about the callee... FunctionInfo &CalleeFI = CachedFunctionInfo[Callee]; -- cgit v1.2.3