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
This commit is contained in:
Chris Lattner 2005-05-18 04:30:33 +00:00
parent b6f4afbc56
commit 49fbff4568

View 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];