1193323Sed//===- InlineSimple.cpp - Code to perform simple function inlining --------===// 2193323Sed// 3193323Sed// The LLVM Compiler Infrastructure 4193323Sed// 5193323Sed// This file is distributed under the University of Illinois Open Source 6193323Sed// License. See LICENSE.TXT for details. 7193323Sed// 8193323Sed//===----------------------------------------------------------------------===// 9193323Sed// 10193323Sed// This file implements bottom-up inlining of functions into callees. 11193323Sed// 12193323Sed//===----------------------------------------------------------------------===// 13193323Sed 14193323Sed#define DEBUG_TYPE "inline" 15249423Sdim#include "llvm/Transforms/IPO.h" 16193323Sed#include "llvm/Analysis/CallGraph.h" 17198090Srdivacky#include "llvm/Analysis/InlineCost.h" 18249423Sdim#include "llvm/IR/CallingConv.h" 19249423Sdim#include "llvm/IR/DataLayout.h" 20249423Sdim#include "llvm/IR/Instructions.h" 21249423Sdim#include "llvm/IR/IntrinsicInst.h" 22249423Sdim#include "llvm/IR/Module.h" 23249423Sdim#include "llvm/IR/Type.h" 24193323Sed#include "llvm/Support/CallSite.h" 25193323Sed#include "llvm/Transforms/IPO/InlinerPass.h" 26193323Sed 27193323Sedusing namespace llvm; 28193323Sed 29193323Sednamespace { 30193323Sed 31263508Sdim/// \brief Actual inliner pass implementation. 32249423Sdim/// 33249423Sdim/// The common implementation of the inlining logic is shared between this 34249423Sdim/// inliner pass and the always inliner pass. The two passes use different cost 35249423Sdim/// analyses to determine when to inline. 36249423Sdimclass SimpleInliner : public Inliner { 37249423Sdim InlineCostAnalysis *ICA; 38193323Sed 39249423Sdimpublic: 40249423Sdim SimpleInliner() : Inliner(ID), ICA(0) { 41249423Sdim initializeSimpleInlinerPass(*PassRegistry::getPassRegistry()); 42249423Sdim } 43249423Sdim 44249423Sdim SimpleInliner(int Threshold) 45249423Sdim : Inliner(ID, Threshold, /*InsertLifetime*/ true), ICA(0) { 46249423Sdim initializeSimpleInlinerPass(*PassRegistry::getPassRegistry()); 47249423Sdim } 48249423Sdim 49249423Sdim static char ID; // Pass identification, replacement for typeid 50249423Sdim 51249423Sdim InlineCost getInlineCost(CallSite CS) { 52249423Sdim return ICA->getInlineCost(CS, getInlineThreshold(CS)); 53249423Sdim } 54249423Sdim 55249423Sdim virtual bool runOnSCC(CallGraphSCC &SCC); 56249423Sdim virtual void getAnalysisUsage(AnalysisUsage &AU) const; 57249423Sdim}; 58249423Sdim 59249423Sdim} // end anonymous namespace 60249423Sdim 61193323Sedchar SimpleInliner::ID = 0; 62218893SdimINITIALIZE_PASS_BEGIN(SimpleInliner, "inline", 63218893Sdim "Function Integration/Inlining", false, false) 64263508SdimINITIALIZE_PASS_DEPENDENCY(CallGraph) 65249423SdimINITIALIZE_PASS_DEPENDENCY(InlineCostAnalysis) 66218893SdimINITIALIZE_PASS_END(SimpleInliner, "inline", 67218893Sdim "Function Integration/Inlining", false, false) 68193323Sed 69193323SedPass *llvm::createFunctionInliningPass() { return new SimpleInliner(); } 70193323Sed 71226633SdimPass *llvm::createFunctionInliningPass(int Threshold) { 72193323Sed return new SimpleInliner(Threshold); 73193323Sed} 74193323Sed 75249423Sdimbool SimpleInliner::runOnSCC(CallGraphSCC &SCC) { 76249423Sdim ICA = &getAnalysis<InlineCostAnalysis>(); 77249423Sdim return Inliner::runOnSCC(SCC); 78193323Sed} 79193323Sed 80249423Sdimvoid SimpleInliner::getAnalysisUsage(AnalysisUsage &AU) const { 81249423Sdim AU.addRequired<InlineCostAnalysis>(); 82249423Sdim Inliner::getAnalysisUsage(AU); 83249423Sdim} 84