From ada45e1a6f3098217bcdafc2ea10cbfe6594353d Mon Sep 17 00:00:00 2001 From: Teresa Johnson Date: Wed, 14 Nov 2018 19:30:13 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@346883 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/ModuleSummaryAnalysis.cpp | 9 ++++++-- test/Bitcode/thinlto-function-summary.ll | 18 ++++++++++++---- .../FunctionImport/Inputs/funcimport.ll | 17 ++++++++++++--- test/Transforms/FunctionImport/funcimport.ll | 21 +++++++++++++------ 4 files changed, 50 insertions(+), 15 deletions(-) diff --git a/lib/Analysis/ModuleSummaryAnalysis.cpp b/lib/Analysis/ModuleSummaryAnalysis.cpp index 29b96ac746b..f0421782b66 100644 --- a/lib/Analysis/ModuleSummaryAnalysis.cpp +++ b/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(I)) continue; + if (const IntrinsicInst *II = dyn_cast(&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( diff --git a/test/Bitcode/thinlto-function-summary.ll b/test/Bitcode/thinlto-function-summary.ll index 7f59eeabd9c..8563d127ff6 100644 --- a/test/Bitcode/thinlto-function-summary.ll +++ b/test/Bitcode/thinlto-function-summary.ll @@ -13,18 +13,23 @@ ; BC-NEXT: