InlineAlways.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. //===- InlineAlways.cpp - Code to inline always_inline functions ----------===//
  2. //
  3. // The LLVM Compiler Infrastructure
  4. //
  5. // This file is distributed under the University of Illinois Open Source
  6. // License. See LICENSE.TXT for details.
  7. //
  8. //===----------------------------------------------------------------------===//
  9. //
  10. // This file implements a custom inliner that handles only functions that
  11. // are marked as "always inline".
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "llvm/Transforms/IPO.h"
  15. #include "llvm/ADT/SmallPtrSet.h"
  16. #include "llvm/Analysis/AliasAnalysis.h"
  17. #include "llvm/Analysis/AssumptionCache.h"
  18. #include "llvm/Analysis/CallGraph.h"
  19. #include "llvm/Analysis/InlineCost.h"
  20. #include "llvm/IR/CallSite.h"
  21. #include "llvm/IR/CallingConv.h"
  22. #include "llvm/IR/DataLayout.h"
  23. #include "llvm/IR/Instructions.h"
  24. #include "llvm/IR/IntrinsicInst.h"
  25. #include "llvm/IR/Module.h"
  26. #include "llvm/IR/Type.h"
  27. #include "llvm/Transforms/IPO/InlinerPass.h"
  28. using namespace llvm;
  29. #define DEBUG_TYPE "inline"
  30. namespace {
  31. /// \brief Inliner pass which only handles "always inline" functions.
  32. class AlwaysInliner : public Inliner {
  33. InlineCostAnalysis *ICA;
  34. public:
  35. // Use extremely low threshold.
  36. AlwaysInliner() : Inliner(ID, -2000000000, /*InsertLifetime*/ true),
  37. ICA(nullptr) {
  38. initializeAlwaysInlinerPass(*PassRegistry::getPassRegistry());
  39. }
  40. AlwaysInliner(bool InsertLifetime)
  41. : Inliner(ID, -2000000000, InsertLifetime), ICA(nullptr) {
  42. initializeAlwaysInlinerPass(*PassRegistry::getPassRegistry());
  43. }
  44. static char ID; // Pass identification, replacement for typeid
  45. InlineCost getInlineCost(CallSite CS) override;
  46. void getAnalysisUsage(AnalysisUsage &AU) const override;
  47. bool runOnSCC(CallGraphSCC &SCC) override;
  48. using llvm::Pass::doFinalization;
  49. bool doFinalization(CallGraph &CG) override {
  50. return removeDeadFunctions(CG, /*AlwaysInlineOnly=*/ true);
  51. }
  52. };
  53. }
  54. char AlwaysInliner::ID = 0;
  55. INITIALIZE_PASS_BEGIN(AlwaysInliner, "always-inline",
  56. "Inliner for always_inline functions", false, false)
  57. INITIALIZE_AG_DEPENDENCY(AliasAnalysis)
  58. INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
  59. INITIALIZE_PASS_DEPENDENCY(CallGraphWrapperPass)
  60. INITIALIZE_PASS_DEPENDENCY(InlineCostAnalysis)
  61. INITIALIZE_PASS_END(AlwaysInliner, "always-inline",
  62. "Inliner for always_inline functions", false, false)
  63. Pass *llvm::createAlwaysInlinerPass() { return new AlwaysInliner(); }
  64. Pass *llvm::createAlwaysInlinerPass(bool InsertLifetime) {
  65. return new AlwaysInliner(InsertLifetime);
  66. }
  67. /// \brief Get the inline cost for the always-inliner.
  68. ///
  69. /// The always inliner *only* handles functions which are marked with the
  70. /// attribute to force inlining. As such, it is dramatically simpler and avoids
  71. /// using the powerful (but expensive) inline cost analysis. Instead it uses
  72. /// a very simple and boring direct walk of the instructions looking for
  73. /// impossible-to-inline constructs.
  74. ///
  75. /// Note, it would be possible to go to some lengths to cache the information
  76. /// computed here, but as we only expect to do this for relatively few and
  77. /// small functions which have the explicit attribute to force inlining, it is
  78. /// likely not worth it in practice.
  79. InlineCost AlwaysInliner::getInlineCost(CallSite CS) {
  80. Function *Callee = CS.getCalledFunction();
  81. // Only inline direct calls to functions with always-inline attributes
  82. // that are viable for inlining. FIXME: We shouldn't even get here for
  83. // declarations.
  84. if (Callee && !Callee->isDeclaration() &&
  85. CS.hasFnAttr(Attribute::AlwaysInline) &&
  86. ICA->isInlineViable(*Callee))
  87. return InlineCost::getAlways();
  88. return InlineCost::getNever();
  89. }
  90. bool AlwaysInliner::runOnSCC(CallGraphSCC &SCC) {
  91. ICA = &getAnalysis<InlineCostAnalysis>();
  92. return Inliner::runOnSCC(SCC);
  93. }
  94. void AlwaysInliner::getAnalysisUsage(AnalysisUsage &AU) const {
  95. AU.addRequired<InlineCostAnalysis>();
  96. Inliner::getAnalysisUsage(AU);
  97. }