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