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