@@ -363,7 +363,8 @@ class SampleProfileLoader final : public SampleProfileLoaderBaseImpl {
363
363
// Attempt to promote indirect call and also inline the promoted call
364
364
bool tryPromoteAndInlineCandidate (
365
365
Function &F, InlineCandidate &Candidate, uint64_t SumOrigin,
366
- uint64_t &Sum, SmallVector<CallBase *, 8 > *InlinedCallSites = nullptr );
366
+ uint64_t &Sum, DenseSet<Instruction *> &PromotedInsns,
367
+ SmallVector<CallBase *, 8 > *InlinedCallSites = nullptr );
367
368
bool inlineHotFunctions (Function &F,
368
369
DenseSet<GlobalValue::GUID> &InlinedGUIDs);
369
370
InlineCost shouldInlineCandidate (InlineCandidate &Candidate);
@@ -766,10 +767,12 @@ updateIDTMetaData(Instruction &Inst,
766
767
// / \param F Caller function.
767
768
// / \param Candidate ICP and inline candidate.
768
769
// / \param Sum Sum of target counts for indirect call.
770
+ // / \param PromotedInsns Map to keep track of indirect call already processed.
769
771
// / \param InlinedCallSite Output vector for new call sites exposed after
770
772
// / inlining.
771
773
bool SampleProfileLoader::tryPromoteAndInlineCandidate (
772
774
Function &F, InlineCandidate &Candidate, uint64_t SumOrigin, uint64_t &Sum,
775
+ DenseSet<Instruction *> &PromotedInsns,
773
776
SmallVector<CallBase *, 8 > *InlinedCallSite) {
774
777
auto CalleeFunctionName = Candidate.CalleeSamples ->getFuncName ();
775
778
auto R = SymbolMap.find (CalleeFunctionName);
@@ -808,6 +811,7 @@ bool SampleProfileLoader::tryPromoteAndInlineCandidate(
808
811
// be prorated so that the it will reflect the real callsite counts.
809
812
setProbeDistributionFactor (CI, Candidate.CallsiteDistribution * Sum /
810
813
SumOrigin);
814
+ PromotedInsns.insert (Candidate.CallInstr );
811
815
Candidate.CallInstr = DI;
812
816
if (isa<CallInst>(DI) || isa<InvokeInst>(DI)) {
813
817
bool Inlined = tryInlineCandidate (Candidate, InlinedCallSite);
@@ -880,6 +884,8 @@ void SampleProfileLoader::emitOptimizationRemarksForInlineCandidates(
880
884
// / \returns True if there is any inline happened.
881
885
bool SampleProfileLoader::inlineHotFunctions (
882
886
Function &F, DenseSet<GlobalValue::GUID> &InlinedGUIDs) {
887
+ DenseSet<Instruction *> PromotedInsns;
888
+
883
889
// ProfAccForSymsInList is used in callsiteIsHot. The assertion makes sure
884
890
// Profile symbol list is ignored when profile-sample-accurate is on.
885
891
assert ((!ProfAccForSymsInList ||
@@ -933,6 +939,8 @@ bool SampleProfileLoader::inlineHotFunctions(
933
939
if (CalledFunction == &F)
934
940
continue ;
935
941
if (I->isIndirectCall ()) {
942
+ if (PromotedInsns.count (I))
943
+ continue ;
936
944
uint64_t Sum;
937
945
for (const auto *FS : findIndirectCallFunctionSamples (*I, Sum)) {
938
946
uint64_t SumOrigin = Sum;
@@ -945,7 +953,8 @@ bool SampleProfileLoader::inlineHotFunctions(
945
953
continue ;
946
954
947
955
Candidate = {I, FS, FS->getEntrySamples (), 1.0 };
948
- if (tryPromoteAndInlineCandidate (F, Candidate, SumOrigin, Sum)) {
956
+ if (tryPromoteAndInlineCandidate (F, Candidate, SumOrigin, Sum,
957
+ PromotedInsns)) {
949
958
LocalNotInlinedCallSites.erase (I);
950
959
LocalChanged = true ;
951
960
}
@@ -1154,6 +1163,7 @@ SampleProfileLoader::shouldInlineCandidate(InlineCandidate &Candidate) {
1154
1163
1155
1164
bool SampleProfileLoader::inlineHotFunctionsWithPriority (
1156
1165
Function &F, DenseSet<GlobalValue::GUID> &InlinedGUIDs) {
1166
+ DenseSet<Instruction *> PromotedInsns;
1157
1167
assert (ProfileIsCS && " Prioritiy based inliner only works with CSSPGO now" );
1158
1168
1159
1169
// ProfAccForSymsInList is used in callsiteIsHot. The assertion makes sure
@@ -1202,6 +1212,8 @@ bool SampleProfileLoader::inlineHotFunctionsWithPriority(
1202
1212
if (CalledFunction == &F)
1203
1213
continue ;
1204
1214
if (I->isIndirectCall ()) {
1215
+ if (PromotedInsns.count (I))
1216
+ continue ;
1205
1217
uint64_t Sum;
1206
1218
auto CalleeSamples = findIndirectCallFunctionSamples (*I, Sum);
1207
1219
uint64_t SumOrigin = Sum;
@@ -1236,7 +1248,7 @@ bool SampleProfileLoader::inlineHotFunctionsWithPriority(
1236
1248
Candidate = {I, FS, EntryCountDistributed,
1237
1249
Candidate.CallsiteDistribution };
1238
1250
if (tryPromoteAndInlineCandidate (F, Candidate, SumOrigin, Sum,
1239
- &InlinedCallSites)) {
1251
+ PromotedInsns, &InlinedCallSites)) {
1240
1252
for (auto *CB : InlinedCallSites) {
1241
1253
if (getInlineCandidate (&NewCandidate, CB))
1242
1254
CQueue.emplace (NewCandidate);
0 commit comments