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 14ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines#include "llvm/Analysis/AssumptionCache.h" 15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Analysis/CallGraph.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Analysis/InlineCost.h" 17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/ProfileSummaryInfo.h" 18f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar#include "llvm/Analysis/TargetLibraryInfo.h" 19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Analysis/TargetTransformInfo.h" 2036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/IR/CallSite.h" 210b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/CallingConv.h" 220b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 230b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h" 240b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/IntrinsicInst.h" 250b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h" 27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Transforms/IPO.h" 286f7426ec2e46bb19cc9f9e75f1c355b35cf12d7dTanya Lattner#include "llvm/Transforms/IPO/InlinerPass.h" 29682f683669d01f208c647ebce8d41a2580ef7707Tanya Lattner 30869adc283c0c15e46d9b18ca73628600f1c6c54eChris Lattnerusing namespace llvm; 31d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#define DEBUG_TYPE "inline" 33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 34ca398dc3989d35e8516489fd163e012133bd41cbChris Lattnernamespace { 35884d6c4e10501116a8ff45616231564a2738daddChris Lattner 3642864070b016976b87c64830395e96ae0e49279cDavid Majnemer/// \brief Actual inliner pass implementation. 375a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth/// 385a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth/// The common implementation of the inlining logic is shared between this 395a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth/// inliner pass and the always inliner pass. The two passes use different cost 405a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth/// analyses to determine when to inline. 415a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruthclass SimpleInliner : public Inliner { 42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // This field is populated based on one of the following: 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // * optimization or size-optimization levels, 44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // * the --inline-threshold flag, or 45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // * a user specified value. 46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar int DefaultThreshold; 475a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth 485a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruthpublic: 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SimpleInliner() 50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : Inliner(ID), DefaultThreshold(llvm::getDefaultInlineThreshold()) { 515a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth initializeSimpleInlinerPass(*PassRegistry::getPassRegistry()); 525a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth } 535a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar explicit SimpleInliner(int Threshold) 55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : Inliner(ID), DefaultThreshold(Threshold) { 565a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth initializeSimpleInlinerPass(*PassRegistry::getPassRegistry()); 575a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth } 585a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth 595a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth static char ID; // Pass identification, replacement for typeid 605a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines InlineCost getInlineCost(CallSite CS) override { 62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Function *Callee = CS.getCalledFunction(); 63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetTransformInfo &TTI = TTIWP->getTTI(*Callee); 64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return llvm::getInlineCost(CS, DefaultThreshold, TTI, ACT, PSI); 655a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth } 665a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool runOnSCC(CallGraphSCC &SCC) override; 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void getAnalysisUsage(AnalysisUsage &AU) const override; 695a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth 70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate: 71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetTransformInfoWrapperPass *TTIWP; 72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 7336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 745a47127c4c1aeed8a4caac5bcd25301eb69bd461Chandler Carruth} // end anonymous namespace 75ca398dc3989d35e8516489fd163e012133bd41cbChris Lattner 76844731a7f1909f55935e3514c9e713a62d67662eDan Gohmanchar SimpleInliner::ID = 0; 77ae0a7bc68303ce0c8721f0e981ae602601390e68Owen AndersonINITIALIZE_PASS_BEGIN(SimpleInliner, "inline", 78ae0a7bc68303ce0c8721f0e981ae602601390e68Owen Anderson "Function Integration/Inlining", false, false) 79ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesINITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) 8036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesINITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass) 81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass) 82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass) 83f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga NainarINITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) 84ae0a7bc68303ce0c8721f0e981ae602601390e68Owen AndersonINITIALIZE_PASS_END(SimpleInliner, "inline", 85ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson "Function Integration/Inlining", false, false) 86844731a7f1909f55935e3514c9e713a62d67662eDan Gohman 87c71ca3cdd2d7a08b043ebb717cad0beadaf47450Devang PatelPass *llvm::createFunctionInliningPass() { return new SimpleInliner(); } 88869adc283c0c15e46d9b18ca73628600f1c6c54eChris Lattner 895c655413cf9466c29e38204ab3f19b33fffd7996Andrew TrickPass *llvm::createFunctionInliningPass(int Threshold) { 90120d053e3ba810b44047fbcb719824bed5673ca9Chris Lattner return new SimpleInliner(Threshold); 91120d053e3ba810b44047fbcb719824bed5673ca9Chris Lattner} 92120d053e3ba810b44047fbcb719824bed5673ca9Chris Lattner 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesPass *llvm::createFunctionInliningPass(unsigned OptLevel, 9436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned SizeOptLevel) { 9536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return new SimpleInliner( 96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar llvm::computeThresholdFromOptLevels(OptLevel, SizeOptLevel)); 9736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 9986953b5795007eaa98838297360a6987e33e92e7Chandler Carruthbool SimpleInliner::runOnSCC(CallGraphSCC &SCC) { 100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TTIWP = &getAnalysis<TargetTransformInfoWrapperPass>(); 10186953b5795007eaa98838297360a6987e33e92e7Chandler Carruth return Inliner::runOnSCC(SCC); 102682f683669d01f208c647ebce8d41a2580ef7707Tanya Lattner} 1036899b314225dd5fa5ccc2a5692daaa89c1d623d8Devang Patel 10486953b5795007eaa98838297360a6987e33e92e7Chandler Carruthvoid SimpleInliner::getAnalysisUsage(AnalysisUsage &AU) const { 105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar AU.addRequired<TargetTransformInfoWrapperPass>(); 10686953b5795007eaa98838297360a6987e33e92e7Chandler Carruth Inliner::getAnalysisUsage(AU); 10786953b5795007eaa98838297360a6987e33e92e7Chandler Carruth} 108