[llvm] 4ffad1f - [SampleFDO] Add PromotedInsns to prevent repeated ICP.
Wei Mi via llvm-commits
llvm-commits at lists.llvm.org
Fri Feb 19 10:02:25 PST 2021
Author: Wei Mi
Date: 2021-02-19T10:01:49-08:00
New Revision: 4ffad1fb489f691825d6c7d78e1626de142f26cf
URL: https://github.com/llvm/llvm-project/commit/4ffad1fb489f691825d6c7d78e1626de142f26cf
DIFF: https://github.com/llvm/llvm-project/commit/4ffad1fb489f691825d6c7d78e1626de142f26cf.diff
LOG: [SampleFDO] Add PromotedInsns to prevent repeated ICP.
In https://reviews.llvm.org/rG5fb65c02ca5e91e7e1a00e0efdb8edc899f3e4b9,
We use 0 count value profile to memorize which target has been promoted
and prevent repeated ICP for the same target, so we delete PromotedInsns.
However, I found the implementation in the patch has some shortcomings
to be fixed otherwise there will still be repeated ICP. So I add
PromotedInsns back temorarily. Will remove it after I get a thorough fix.
Added:
Modified:
llvm/lib/Transforms/IPO/SampleProfile.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp
index 5706fb63792e..06b7fdab975e 100644
--- a/llvm/lib/Transforms/IPO/SampleProfile.cpp
+++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp
@@ -363,7 +363,8 @@ class SampleProfileLoader final : public SampleProfileLoaderBaseImpl {
// Attempt to promote indirect call and also inline the promoted call
bool tryPromoteAndInlineCandidate(
Function &F, InlineCandidate &Candidate, uint64_t SumOrigin,
- uint64_t &Sum, SmallVector<CallBase *, 8> *InlinedCallSites = nullptr);
+ uint64_t &Sum, DenseSet<Instruction *> &PromotedInsns,
+ SmallVector<CallBase *, 8> *InlinedCallSites = nullptr);
bool inlineHotFunctions(Function &F,
DenseSet<GlobalValue::GUID> &InlinedGUIDs);
InlineCost shouldInlineCandidate(InlineCandidate &Candidate);
@@ -766,10 +767,12 @@ updateIDTMetaData(Instruction &Inst,
/// \param F Caller function.
/// \param Candidate ICP and inline candidate.
/// \param Sum Sum of target counts for indirect call.
+/// \param PromotedInsns Map to keep track of indirect call already processed.
/// \param InlinedCallSite Output vector for new call sites exposed after
/// inlining.
bool SampleProfileLoader::tryPromoteAndInlineCandidate(
Function &F, InlineCandidate &Candidate, uint64_t SumOrigin, uint64_t &Sum,
+ DenseSet<Instruction *> &PromotedInsns,
SmallVector<CallBase *, 8> *InlinedCallSite) {
auto CalleeFunctionName = Candidate.CalleeSamples->getFuncName();
auto R = SymbolMap.find(CalleeFunctionName);
@@ -808,6 +811,7 @@ bool SampleProfileLoader::tryPromoteAndInlineCandidate(
// be prorated so that the it will reflect the real callsite counts.
setProbeDistributionFactor(CI, Candidate.CallsiteDistribution * Sum /
SumOrigin);
+ PromotedInsns.insert(Candidate.CallInstr);
Candidate.CallInstr = DI;
if (isa<CallInst>(DI) || isa<InvokeInst>(DI)) {
bool Inlined = tryInlineCandidate(Candidate, InlinedCallSite);
@@ -880,6 +884,8 @@ void SampleProfileLoader::emitOptimizationRemarksForInlineCandidates(
/// \returns True if there is any inline happened.
bool SampleProfileLoader::inlineHotFunctions(
Function &F, DenseSet<GlobalValue::GUID> &InlinedGUIDs) {
+ DenseSet<Instruction *> PromotedInsns;
+
// ProfAccForSymsInList is used in callsiteIsHot. The assertion makes sure
// Profile symbol list is ignored when profile-sample-accurate is on.
assert((!ProfAccForSymsInList ||
@@ -933,6 +939,8 @@ bool SampleProfileLoader::inlineHotFunctions(
if (CalledFunction == &F)
continue;
if (I->isIndirectCall()) {
+ if (PromotedInsns.count(I))
+ continue;
uint64_t Sum;
for (const auto *FS : findIndirectCallFunctionSamples(*I, Sum)) {
uint64_t SumOrigin = Sum;
@@ -945,7 +953,8 @@ bool SampleProfileLoader::inlineHotFunctions(
continue;
Candidate = {I, FS, FS->getEntrySamples(), 1.0};
- if (tryPromoteAndInlineCandidate(F, Candidate, SumOrigin, Sum)) {
+ if (tryPromoteAndInlineCandidate(F, Candidate, SumOrigin, Sum,
+ PromotedInsns)) {
LocalNotInlinedCallSites.erase(I);
LocalChanged = true;
}
@@ -1154,6 +1163,7 @@ SampleProfileLoader::shouldInlineCandidate(InlineCandidate &Candidate) {
bool SampleProfileLoader::inlineHotFunctionsWithPriority(
Function &F, DenseSet<GlobalValue::GUID> &InlinedGUIDs) {
+ DenseSet<Instruction *> PromotedInsns;
assert(ProfileIsCS && "Prioritiy based inliner only works with CSSPGO now");
// ProfAccForSymsInList is used in callsiteIsHot. The assertion makes sure
@@ -1202,6 +1212,8 @@ bool SampleProfileLoader::inlineHotFunctionsWithPriority(
if (CalledFunction == &F)
continue;
if (I->isIndirectCall()) {
+ if (PromotedInsns.count(I))
+ continue;
uint64_t Sum;
auto CalleeSamples = findIndirectCallFunctionSamples(*I, Sum);
uint64_t SumOrigin = Sum;
@@ -1236,7 +1248,7 @@ bool SampleProfileLoader::inlineHotFunctionsWithPriority(
Candidate = {I, FS, EntryCountDistributed,
Candidate.CallsiteDistribution};
if (tryPromoteAndInlineCandidate(F, Candidate, SumOrigin, Sum,
- &InlinedCallSites)) {
+ PromotedInsns, &InlinedCallSites)) {
for (auto *CB : InlinedCallSites) {
if (getInlineCandidate(&NewCandidate, CB))
CQueue.emplace(NewCandidate);
More information about the llvm-commits
mailing list