================ @@ -321,14 +790,114 @@ bool IndirectCallPromoter::processFunction(ProfileSummaryInfo *PSI) { if (!NumCandidates || (PSI && PSI->hasProfileSummary() && !PSI->isHotCount(TotalCount))) continue; + auto PromotionCandidates = getPromotionCandidatesForCallSite( *CB, ICallProfDataRef, TotalCount, NumCandidates); - Changed |= tryToPromoteWithFuncCmp(*CB, PromotionCandidates, TotalCount, - ICallProfDataRef, NumCandidates); + + VTableGUIDCountsMap VTableGUIDCounts; + Instruction *VPtr = + computeVTableInfos(CB, VTableGUIDCounts, PromotionCandidates); + + if (isProfitableToCompareVTables(PromotionCandidates, TotalCount)) + Changed |= tryToPromoteWithVTableCmp(*CB, VPtr, PromotionCandidates, + TotalCount, NumCandidates, + ICallProfDataRef, VTableGUIDCounts); + else + Changed |= tryToPromoteWithFuncCmp(*CB, VPtr, PromotionCandidates, + TotalCount, ICallProfDataRef, + NumCandidates, VTableGUIDCounts); } return Changed; } +// TODO: Returns false if the function addressing and vtable load instructions +// cannot sink to indirect fallback. +bool IndirectCallPromoter::isProfitableToCompareVTables( + const std::vector<PromotionCandidate> &Candidates, uint64_t TotalCount) { + if (!EnableVTableProfileUse || Candidates.empty()) + return false; + uint64_t RemainingVTableCount = TotalCount; + for (size_t I = 0; I < Candidates.size(); I++) { + auto &Candidate = Candidates[I]; + uint64_t VTableSumCount = 0; + for (auto &[GUID, Count] : Candidate.VTableGUIDAndCounts) + VTableSumCount += Count; + + if (VTableSumCount < Candidate.Count * ICPVTablePercentageThreshold) + return false; + + RemainingVTableCount -= Candidate.Count; + + int MaxNumVTable = 1; ---------------- minglotus-6 wrote:
done. https://github.com/llvm/llvm-project/pull/81442 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits