diff options
Diffstat (limited to 'llvm/lib/Analysis/InlineCost.cpp')
| -rw-r--r-- | llvm/lib/Analysis/InlineCost.cpp | 23 | 
1 files changed, 14 insertions, 9 deletions
| diff --git a/llvm/lib/Analysis/InlineCost.cpp b/llvm/lib/Analysis/InlineCost.cpp index 48666566dd9..c66b9f38942 100644 --- a/llvm/lib/Analysis/InlineCost.cpp +++ b/llvm/lib/Analysis/InlineCost.cpp @@ -2022,9 +2022,10 @@ InlineCost llvm::getInlineCost(    // Calls to functions with always-inline attributes should be inlined    // whenever possible.    if (CS.hasFnAttr(Attribute::AlwaysInline)) { -    if (isInlineViable(*Callee)) +    auto IsViable = isInlineViable(*Callee); +    if (IsViable)        return llvm::InlineCost::getAlways("always inline attribute"); -    return llvm::InlineCost::getNever("inapplicable always inline attribute"); +    return llvm::InlineCost::getNever(IsViable.message);    }    // Never inline functions with conflicting attributes (unless callee has @@ -2072,14 +2073,16 @@ InlineCost llvm::getInlineCost(    return llvm::InlineCost::get(CA.getCost(), CA.getThreshold());  } -bool llvm::isInlineViable(Function &F) { +InlineResult llvm::isInlineViable(Function &F) {    bool ReturnsTwice = F.hasFnAttribute(Attribute::ReturnsTwice);    for (Function::iterator BI = F.begin(), BE = F.end(); BI != BE; ++BI) {      // Disallow inlining of functions which contain indirect branches or      // blockaddresses. -    if (isa<IndirectBrInst>(BI->getTerminator()) || -        BI->hasAddressTaken()) -      return false; +    if (isa<IndirectBrInst>(BI->getTerminator())) +      return "contains indirect branches"; + +    if (BI->hasAddressTaken()) +      return "uses block address";      for (auto &II : *BI) {        CallSite CS(&II); @@ -2088,13 +2091,13 @@ bool llvm::isInlineViable(Function &F) {        // Disallow recursive calls.        if (&F == CS.getCalledFunction()) -        return false; +        return "recursive call";        // Disallow calls which expose returns-twice to a function not previously        // attributed as such.        if (!ReturnsTwice && CS.isCall() &&            cast<CallInst>(CS.getInstruction())->canReturnTwice()) -        return false; +        return "exposes returns-twice attribute";        if (CS.getCalledFunction())          switch (CS.getCalledFunction()->getIntrinsicID()) { @@ -2103,12 +2106,14 @@ bool llvm::isInlineViable(Function &F) {          // Disallow inlining of @llvm.icall.branch.funnel because current          // backend can't separate call targets from call arguments.          case llvm::Intrinsic::icall_branch_funnel: +          return "disallowed inlining of @llvm.icall.branch.funnel";          // Disallow inlining functions that call @llvm.localescape. Doing this          // correctly would require major changes to the inliner.          case llvm::Intrinsic::localescape: +          return "disallowed inlining of @llvm.localescape";          // Disallow inlining of functions that initialize VarArgs with va_start.          case llvm::Intrinsic::vastart: -          return false; +          return "contains VarArgs initialized with va_start";          }      }    } | 

