InlineSimple.cpp revision 86953b5795007eaa98838297360a6987e33e92e7
1237ef567f6764f24a47c63121cc0a599ddc8f56dChris Lattner//===- InlineSimple.cpp - Code to perform simple function inlining --------===//
2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//                     The LLVM Compiler Infrastructure
4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman//
8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===//
9009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//
10ca398dc3989d35e8516489fd163e012133bd41cbChris Lattner// This file implements bottom-up inlining of functions into callees.
110154505ab74e7bd0d4dc85dbddc1ff0df6357606Chris Lattner//
12009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner//===----------------------------------------------------------------------===//
13009505452b713ed2e3a8e99c5545a6e721c65495Chris Lattner
146f7426ec2e46bb19cc9f9e75f1c355b35cf12d7dTanya Lattner#define DEBUG_TYPE "inline"
15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Transforms/IPO.h"
16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Analysis/CallGraph.h"
17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Analysis/InlineCost.h"
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/CallingConv.h"
190b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h"
200b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h"
210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IntrinsicInst.h"
220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h"
230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h"
24e54453387486c1d5e61401e1d4febd3f6ebe86cfChris Lattner#include "llvm/Support/CallSite.h"
256f7426ec2e46bb19cc9f9e75f1c355b35cf12d7dTanya Lattner#include "llvm/Transforms/IPO/InlinerPass.h"
26682f683669d01f208c647ebce8d41a2580ef7707Tanya Lattner
27869adc283c0c15e46d9b18ca73628600f1c6c54eChris Lattnerusing namespace llvm;
28d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke
29ca398dc3989d35e8516489fd163e012133bd41cbChris Lattnernamespace {
30884d6c4e10501116a8ff45616231564a2738daddChris Lattner
315a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth/// \brief Actaul inliner pass implementation.
325a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth///
335a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth/// The common implementation of the inlining logic is shared between this
345a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth/// inliner pass and the always inliner pass. The two passes use different cost
355a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth/// analyses to determine when to inline.
365a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruthclass SimpleInliner : public Inliner {
3786953b5795007eaa98838297360a6987e33e92e7Chandler Carruth  InlineCostAnalysis *ICA;
385a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth
395a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruthpublic:
4086953b5795007eaa98838297360a6987e33e92e7Chandler Carruth  SimpleInliner() : Inliner(ID), ICA(0) {
415a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth    initializeSimpleInlinerPass(*PassRegistry::getPassRegistry());
425a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth  }
435a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth
445a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth  SimpleInliner(int Threshold)
4586953b5795007eaa98838297360a6987e33e92e7Chandler Carruth      : Inliner(ID, Threshold, /*InsertLifetime*/ true), ICA(0) {
465a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth    initializeSimpleInlinerPass(*PassRegistry::getPassRegistry());
475a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth  }
485a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth
495a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth  static char ID; // Pass identification, replacement for typeid
505a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth
515a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth  InlineCost getInlineCost(CallSite CS) {
5286953b5795007eaa98838297360a6987e33e92e7Chandler Carruth    return ICA->getInlineCost(CS, getInlineThreshold(CS));
535a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth  }
545a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth
5586953b5795007eaa98838297360a6987e33e92e7Chandler Carruth  virtual bool runOnSCC(CallGraphSCC &SCC);
5686953b5795007eaa98838297360a6987e33e92e7Chandler Carruth  virtual void getAnalysisUsage(AnalysisUsage &AU) const;
575a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth};
585a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth
595a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth} // end anonymous namespace
60ca398dc3989d35e8516489fd163e012133bd41cbChris Lattner
61844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar SimpleInliner::ID = 0;
62ae0a7bc68303ce0c8721f0e981ae602601390e68Owen AndersonINITIALIZE_PASS_BEGIN(SimpleInliner, "inline",
63ae0a7bc68303ce0c8721f0e981ae602601390e68Owen Anderson                "Function Integration/Inlining", false, false)
64ae0a7bc68303ce0c8721f0e981ae602601390e68Owen AndersonINITIALIZE_AG_DEPENDENCY(CallGraph)
6586953b5795007eaa98838297360a6987e33e92e7Chandler CarruthINITIALIZE_PASS_DEPENDENCY(InlineCostAnalysis)
66ae0a7bc68303ce0c8721f0e981ae602601390e68Owen AndersonINITIALIZE_PASS_END(SimpleInliner, "inline",
67ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson                "Function Integration/Inlining", false, false)
68844731a7f1909f55935e3514c9e713a62d67662eDan Gohman
69c71ca3cdd2d7a08b043ebb717cad0beadaf47450Devang PatelPass *llvm::createFunctionInliningPass() { return new SimpleInliner(); }
70869adc283c0c15e46d9b18ca73628600f1c6c54eChris Lattner
715c655413cf9466c29e38204ab3f19b33fffd7996Andrew TrickPass *llvm::createFunctionInliningPass(int Threshold) {
72120d053e3ba810b44047fbcb719824bed5673ca9Chris Lattner  return new SimpleInliner(Threshold);
73120d053e3ba810b44047fbcb719824bed5673ca9Chris Lattner}
74120d053e3ba810b44047fbcb719824bed5673ca9Chris Lattner
7586953b5795007eaa98838297360a6987e33e92e7Chandler Carruthbool SimpleInliner::runOnSCC(CallGraphSCC &SCC) {
7686953b5795007eaa98838297360a6987e33e92e7Chandler Carruth  ICA = &getAnalysis<InlineCostAnalysis>();
7786953b5795007eaa98838297360a6987e33e92e7Chandler Carruth  return Inliner::runOnSCC(SCC);
78682f683669d01f208c647ebce8d41a2580ef7707Tanya Lattner}
796899b314225dd5fa5ccc2a5692daaa89c1d623d8Devang Patel
8086953b5795007eaa98838297360a6987e33e92e7Chandler Carruthvoid SimpleInliner::getAnalysisUsage(AnalysisUsage &AU) const {
8186953b5795007eaa98838297360a6987e33e92e7Chandler Carruth  AU.addRequired<InlineCostAnalysis>();
8286953b5795007eaa98838297360a6987e33e92e7Chandler Carruth  Inliner::getAnalysisUsage(AU);
8386953b5795007eaa98838297360a6987e33e92e7Chandler Carruth}
84