diff --git a/llvm/lib/Analysis/InlineCost.cpp b/llvm/lib/Analysis/InlineCost.cpp --- a/llvm/lib/Analysis/InlineCost.cpp +++ b/llvm/lib/Analysis/InlineCost.cpp @@ -1063,6 +1063,13 @@ bool wasDecidedByCostThreshold() const { return DecidedByCostThreshold; } }; +// Return true if CB is the sole call to local function Callee. +static bool isSoleCallToLocalFunction(const CallBase &CB, + const Function &Callee) { + return Callee.hasLocalLinkage() && Callee.hasOneLiveUse() && + &Callee == CB.getCalledFunction(); +} + class InlineCostFeaturesAnalyzer final : public CallAnalyzer { private: InlineCostFeatures Cost = {}; @@ -1236,8 +1243,7 @@ (F.getCallingConv() == CallingConv::Cold)); set(InlineCostFeatureIndex::LastCallToStaticBonus, - (F.hasLocalLinkage() && F.hasOneLiveUse() && - &F == CandidateCall.getCalledFunction())); + isSoleCallToLocalFunction(CandidateCall, F)); // FIXME: we shouldn't repeat this logic in both the Features and Cost // analyzer - instead, we should abstract it to a common method in the @@ -1913,12 +1919,10 @@ SingleBBBonus = Threshold * SingleBBBonusPercent / 100; VectorBonus = Threshold * VectorBonusPercent / 100; - bool OnlyOneCallAndLocalLinkage = F.hasLocalLinkage() && F.hasOneLiveUse() && - &F == Call.getCalledFunction(); // If there is only one call of the function, and it has internal linkage, // the cost of inlining it drops dramatically. It may seem odd to update // Cost in updateThreshold, but the bonus depends on the logic in this method. - if (OnlyOneCallAndLocalLinkage) + if (isSoleCallToLocalFunction(Call, F)) Cost -= LastCallToStaticBonus; } @@ -2712,12 +2716,10 @@ onBlockAnalyzed(BB); } - bool OnlyOneCallAndLocalLinkage = F.hasLocalLinkage() && F.hasOneLiveUse() && - &F == CandidateCall.getCalledFunction(); // If this is a noduplicate call, we can still inline as long as // inlining this would cause the removal of the caller (so the instruction // is not actually duplicated, just moved). - if (!OnlyOneCallAndLocalLinkage && ContainsNoDuplicateCall) + if (!isSoleCallToLocalFunction(CandidateCall, F) && ContainsNoDuplicateCall) return InlineResult::failure("noduplicate"); // If the callee's stack size exceeds the user-specified threshold,