forked from OSchip/llvm-project
teach the inliner about coldcc and noreturn functions
llvm-svn: 22113
This commit is contained in:
parent
add85fc7f8
commit
05deb04cb0
|
@ -12,6 +12,7 @@
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
#include "Inliner.h"
|
#include "Inliner.h"
|
||||||
|
#include "llvm/CallingConv.h"
|
||||||
#include "llvm/Instructions.h"
|
#include "llvm/Instructions.h"
|
||||||
#include "llvm/IntrinsicInst.h"
|
#include "llvm/IntrinsicInst.h"
|
||||||
#include "llvm/Function.h"
|
#include "llvm/Function.h"
|
||||||
|
@ -196,6 +197,20 @@ int SimpleInliner::getInlineCost(CallSite CS) {
|
||||||
if (Callee->hasInternalLinkage() && Callee->hasOneUse())
|
if (Callee->hasInternalLinkage() && Callee->hasOneUse())
|
||||||
InlineCost -= 30000;
|
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...
|
// Get information about the callee...
|
||||||
FunctionInfo &CalleeFI = CachedFunctionInfo[Callee];
|
FunctionInfo &CalleeFI = CachedFunctionInfo[Callee];
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue