diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Analysis/InlineCost.cpp | 32 | ||||
| -rw-r--r-- | llvm/lib/Transforms/IPO/InlineAlways.cpp | 26 | ||||
| -rw-r--r-- | llvm/lib/Transforms/IPO/InlineSimple.cpp | 25 | 
3 files changed, 57 insertions, 26 deletions
| diff --git a/llvm/lib/Analysis/InlineCost.cpp b/llvm/lib/Analysis/InlineCost.cpp index 6e5c0358225..3292ebe3d7f 100644 --- a/llvm/lib/Analysis/InlineCost.cpp +++ b/llvm/lib/Analysis/InlineCost.cpp @@ -1132,11 +1132,32 @@ void CallAnalyzer::dump() {  }  #endif -InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS, int Threshold) { +INITIALIZE_PASS_BEGIN(InlineCostAnalysis, "inline-cost", "Inline Cost Analysis", +                      true, true) +INITIALIZE_PASS_END(InlineCostAnalysis, "inline-cost", "Inline Cost Analysis", +                    true, true) + +char InlineCostAnalysis::ID = 0; + +InlineCostAnalysis::InlineCostAnalysis() : CallGraphSCCPass(ID), TD(0) {} + +InlineCostAnalysis::~InlineCostAnalysis() {} + +void InlineCostAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { +  AU.setPreservesAll(); +  CallGraphSCCPass::getAnalysisUsage(AU); +} + +bool InlineCostAnalysis::runOnSCC(CallGraphSCC &SCC) { +  TD = getAnalysisIfAvailable<DataLayout>(); +  return false; +} + +InlineCost InlineCostAnalysis::getInlineCost(CallSite CS, int Threshold) {    return getInlineCost(CS, CS.getCalledFunction(), Threshold);  } -InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS, Function *Callee, +InlineCost InlineCostAnalysis::getInlineCost(CallSite CS, Function *Callee,                                               int Threshold) {    // Cannot inline indirect calls.    if (!Callee) @@ -1177,9 +1198,10 @@ InlineCost InlineCostAnalyzer::getInlineCost(CallSite CS, Function *Callee,    return llvm::InlineCost::get(CA.getCost(), CA.getThreshold());  } -bool InlineCostAnalyzer::isInlineViable(Function &F) { -  bool ReturnsTwice =F.getAttributes().hasAttribute(AttributeSet::FunctionIndex, -                                                    Attribute::ReturnsTwice); +bool InlineCostAnalysis::isInlineViable(Function &F) { +  bool ReturnsTwice = +    F.getAttributes().hasAttribute(AttributeSet::FunctionIndex, +                                   Attribute::ReturnsTwice);    for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; ++BI) {      // Disallow inlining of functions which contain an indirect branch.      if (isa<IndirectBrInst>(BI->getTerminator())) diff --git a/llvm/lib/Transforms/IPO/InlineAlways.cpp b/llvm/lib/Transforms/IPO/InlineAlways.cpp index 5937fab472b..a0095dad1af 100644 --- a/llvm/lib/Transforms/IPO/InlineAlways.cpp +++ b/llvm/lib/Transforms/IPO/InlineAlways.cpp @@ -32,16 +32,16 @@ namespace {  /// \brief Inliner pass which only handles "always inline" functions.  class AlwaysInliner : public Inliner { -  InlineCostAnalyzer CA; +  InlineCostAnalysis *ICA;  public:    // Use extremely low threshold. -  AlwaysInliner() : Inliner(ID, -2000000000, /*InsertLifetime*/ true) { +  AlwaysInliner() : Inliner(ID, -2000000000, /*InsertLifetime*/ true), ICA(0) {      initializeAlwaysInlinerPass(*PassRegistry::getPassRegistry());    }    AlwaysInliner(bool InsertLifetime) -      : Inliner(ID, -2000000000, InsertLifetime) { +      : Inliner(ID, -2000000000, InsertLifetime), ICA(0) {      initializeAlwaysInlinerPass(*PassRegistry::getPassRegistry());    } @@ -49,13 +49,13 @@ public:    virtual InlineCost getInlineCost(CallSite CS); +  virtual void getAnalysisUsage(AnalysisUsage &AU) const; +  virtual bool runOnSCC(CallGraphSCC &SCC); +    using llvm::Pass::doFinalization;    virtual bool doFinalization(CallGraph &CG) {      return removeDeadFunctions(CG, /*AlwaysInlineOnly=*/ true);    } - -  using llvm::Pass::doInitialization; -  virtual bool doInitialization(CallGraph &CG);  };  } @@ -64,6 +64,7 @@ char AlwaysInliner::ID = 0;  INITIALIZE_PASS_BEGIN(AlwaysInliner, "always-inline",                  "Inliner for always_inline functions", false, false)  INITIALIZE_AG_DEPENDENCY(CallGraph) +INITIALIZE_PASS_DEPENDENCY(InlineCostAnalysis)  INITIALIZE_PASS_END(AlwaysInliner, "always-inline",                  "Inliner for always_inline functions", false, false) @@ -94,13 +95,18 @@ InlineCost AlwaysInliner::getInlineCost(CallSite CS) {    if (Callee && !Callee->isDeclaration() &&        Callee->getAttributes().hasAttribute(AttributeSet::FunctionIndex,                                             Attribute::AlwaysInline) && -      CA.isInlineViable(*Callee)) +      ICA->isInlineViable(*Callee))      return InlineCost::getAlways();    return InlineCost::getNever();  } -bool AlwaysInliner::doInitialization(CallGraph &CG) { -  CA.setDataLayout(getAnalysisIfAvailable<DataLayout>()); -  return false; +bool AlwaysInliner::runOnSCC(CallGraphSCC &SCC) { +  ICA = &getAnalysis<InlineCostAnalysis>(); +  return Inliner::runOnSCC(SCC); +} + +void AlwaysInliner::getAnalysisUsage(AnalysisUsage &AU) const { +  AU.addRequired<InlineCostAnalysis>(); +  Inliner::getAnalysisUsage(AU);  } diff --git a/llvm/lib/Transforms/IPO/InlineSimple.cpp b/llvm/lib/Transforms/IPO/InlineSimple.cpp index b6a4e3725f6..a4f70260418 100644 --- a/llvm/lib/Transforms/IPO/InlineSimple.cpp +++ b/llvm/lib/Transforms/IPO/InlineSimple.cpp @@ -34,26 +34,26 @@ namespace {  /// inliner pass and the always inliner pass. The two passes use different cost  /// analyses to determine when to inline.  class SimpleInliner : public Inliner { -  InlineCostAnalyzer CA; +  InlineCostAnalysis *ICA;  public: -  SimpleInliner() : Inliner(ID) { +  SimpleInliner() : Inliner(ID), ICA(0) {      initializeSimpleInlinerPass(*PassRegistry::getPassRegistry());    }    SimpleInliner(int Threshold) -      : Inliner(ID, Threshold, /*InsertLifetime*/ true) { +      : Inliner(ID, Threshold, /*InsertLifetime*/ true), ICA(0) {      initializeSimpleInlinerPass(*PassRegistry::getPassRegistry());    }    static char ID; // Pass identification, replacement for typeid    InlineCost getInlineCost(CallSite CS) { -    return CA.getInlineCost(CS, getInlineThreshold(CS)); +    return ICA->getInlineCost(CS, getInlineThreshold(CS));    } -  using llvm::Pass::doInitialization; -  virtual bool doInitialization(CallGraph &CG); +  virtual bool runOnSCC(CallGraphSCC &SCC); +  virtual void getAnalysisUsage(AnalysisUsage &AU) const;  };  } // end anonymous namespace @@ -62,6 +62,7 @@ char SimpleInliner::ID = 0;  INITIALIZE_PASS_BEGIN(SimpleInliner, "inline",                  "Function Integration/Inlining", false, false)  INITIALIZE_AG_DEPENDENCY(CallGraph) +INITIALIZE_PASS_DEPENDENCY(InlineCostAnalysis)  INITIALIZE_PASS_END(SimpleInliner, "inline",                  "Function Integration/Inlining", false, false) @@ -71,10 +72,12 @@ Pass *llvm::createFunctionInliningPass(int Threshold) {    return new SimpleInliner(Threshold);  } -// doInitialization - Initializes the vector of functions that have been -// annotated with the noinline attribute. -bool SimpleInliner::doInitialization(CallGraph &CG) { -  CA.setDataLayout(getAnalysisIfAvailable<DataLayout>()); -  return false; +bool SimpleInliner::runOnSCC(CallGraphSCC &SCC) { +  ICA = &getAnalysis<InlineCostAnalysis>(); +  return Inliner::runOnSCC(SCC);  } +void SimpleInliner::getAnalysisUsage(AnalysisUsage &AU) const { +  AU.addRequired<InlineCostAnalysis>(); +  Inliner::getAnalysisUsage(AU); +} | 

