diff options
Diffstat (limited to 'llvm/lib/Transforms/IPO')
| -rw-r--r-- | llvm/lib/Transforms/IPO/InlineAlways.cpp | 3 | ||||
| -rw-r--r-- | llvm/lib/Transforms/IPO/Inliner.cpp | 10 | 
2 files changed, 13 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/InlineAlways.cpp b/llvm/lib/Transforms/IPO/InlineAlways.cpp index d809b5aed17..9031432162e 100644 --- a/llvm/lib/Transforms/IPO/InlineAlways.cpp +++ b/llvm/lib/Transforms/IPO/InlineAlways.cpp @@ -45,6 +45,9 @@ namespace {      float getInlineFudgeFactor(CallSite CS) {        return CA.getInlineFudgeFactor(CS);      } +    virtual bool doFinalization(CallGraph &CG) {  +      return removeDeadFunctions(CG, &NeverInline);  +    }      virtual bool doInitialization(CallGraph &CG);    };  } diff --git a/llvm/lib/Transforms/IPO/Inliner.cpp b/llvm/lib/Transforms/IPO/Inliner.cpp index 2321047a375..418b2b70cb6 100644 --- a/llvm/lib/Transforms/IPO/Inliner.cpp +++ b/llvm/lib/Transforms/IPO/Inliner.cpp @@ -204,6 +204,13 @@ bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) {  // doFinalization - Remove now-dead linkonce functions at the end of  // processing to avoid breaking the SCC traversal.  bool Inliner::doFinalization(CallGraph &CG) { +  return removeDeadFunctions(CG); +} + +  /// removeDeadFunctions - Remove dead functions that are not included in +  /// DNR (Do Not Remove) list. +bool Inliner::removeDeadFunctions(CallGraph &CG,  +                                 SmallPtrSet<const Function *, 16> *DNR) {    std::set<CallGraphNode*> FunctionsToRemove;    // Scan for all of the functions, looking for ones that should now be removed @@ -215,6 +222,9 @@ bool Inliner::doFinalization(CallGraph &CG) {        // them.        F->removeDeadConstantUsers(); +      if (DNR && DNR->count(F)) +        continue; +        if ((F->hasLinkOnceLinkage() || F->hasInternalLinkage()) &&            F->use_empty()) {  | 

