diff options
author | Teresa Johnson <tejohnson@google.com> | 2018-11-14 19:30:13 +0000 |
---|---|---|
committer | Teresa Johnson <tejohnson@google.com> | 2018-11-14 19:30:13 +0000 |
commit | 32dc5b9bf134b5a98c1a22395a5cd0ca5c409fe7 (patch) | |
tree | 7aea2af71ce5484a6aee0e6ae7a2649cce6c4426 /llvm/lib/Analysis/ModuleSummaryAnalysis.cpp | |
parent | d84cf1369060349506fa27779e4403174b5f4c9a (diff) | |
download | llvm-32dc5b9bf134b5a98c1a22395a5cd0ca5c409fe7.zip llvm-32dc5b9bf134b5a98c1a22395a5cd0ca5c409fe7.tar.gz llvm-32dc5b9bf134b5a98c1a22395a5cd0ca5c409fe7.tar.bz2 |
[ThinLTO] Update handling of vararg functions to match inliner
Summary:
Previously we marked all vararg functions as non-inlinable in the
function summary, which prevented their importing. However, the
corresponding inliner restriction was loosened in r321940/r342675
to only apply to functions calling va_start. Adjust the summary
flag computation to match.
Reviewers: davidxl
Subscribers: mehdi_amini, inglorion, eraman, steven_wu, dexonsmith, llvm-commits
Differential Revision: https://reviews.llvm.org/D54270
llvm-svn: 346883
Diffstat (limited to 'llvm/lib/Analysis/ModuleSummaryAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/ModuleSummaryAnalysis.cpp | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp index 29b96ac..f042178 100644 --- a/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp +++ b/llvm/lib/Analysis/ModuleSummaryAnalysis.cpp @@ -246,10 +246,15 @@ static void computeFunctionSummary( findRefEdges(Index, &F, RefEdges, Visited); bool HasInlineAsmMaybeReferencingInternal = false; + bool InitsVarArgs = false; for (const BasicBlock &BB : F) for (const Instruction &I : BB) { if (isa<DbgInfoIntrinsic>(I)) continue; + if (const IntrinsicInst *II = dyn_cast<IntrinsicInst>(&I)) { + if (II->getIntrinsicID() == Intrinsic::vastart) + InitsVarArgs = true; + } ++NumInsts; findRefEdges(Index, &I, RefEdges, Visited); auto CS = ImmutableCallSite(&I); @@ -357,9 +362,9 @@ static void computeFunctionSummary( F.hasFnAttribute(Attribute::ReadNone), F.hasFnAttribute(Attribute::ReadOnly), F.hasFnAttribute(Attribute::NoRecurse), F.returnDoesNotAlias(), - // Inliner doesn't handle variadic functions. + // Inliner doesn't handle variadic functions with va_start calls. // FIXME: refactor this to use the same code that inliner is using. - F.isVarArg() || + InitsVarArgs || // Don't try to import functions with noinline attribute. F.getAttributes().hasFnAttribute(Attribute::NoInline)}; auto FuncSummary = llvm::make_unique<FunctionSummary>( |