[Analysis] Introduce isSoleCallToLocalFunction (NFC)

We check to see if a given CallBase is a sole call to a local function
at multiple places in InlineCost.cpp.  This patch factors out the
common code.

Differential Revision: https://reviews.llvm.org/D134114
This commit is contained in:
Kazu Hirata 2022-09-17 20:59:54 -07:00
parent 97b5736975
commit cf355bf36e
1 changed files with 10 additions and 8 deletions

View File

@ -1063,6 +1063,13 @@ public:
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 @@ private:
(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 @@ void InlineCostCallAnalyzer::updateThreshold(CallBase &Call, Function &Callee) {
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 @@ InlineResult CallAnalyzer::analyze() {
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,