-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[TypeProf][PGO]Support skipping vtable comparisons for a class and its derived ones #110575
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
bc43354
2695641
f14c6d5
255edce
28e2363
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -132,6 +132,15 @@ static cl::opt<int> ICPMaxNumVTableLastCandidate( | |
| "icp-max-num-vtable-last-candidate", cl::init(1), cl::Hidden, | ||
| cl::desc("The maximum number of vtable for the last candidate.")); | ||
|
|
||
| static cl::list<std::string> ICPIgnoredBaseTypes( | ||
| "icp-ignored-base-types", cl::Hidden, | ||
| cl::desc( | ||
| "A list of mangled vtable names. Classes specified by the vtables " | ||
| "and their derived ones will not be vtable-ICP'ed. Useful when the " | ||
| "profiled types and actual types in the optimized binary could be " | ||
| "different due to profiling " | ||
| "limitations.")); | ||
|
|
||
| namespace { | ||
|
|
||
| // The key is a vtable global variable, and the value is a map. | ||
|
|
@@ -316,6 +325,8 @@ class IndirectCallPromoter { | |
|
|
||
| OptimizationRemarkEmitter &ORE; | ||
|
|
||
| const DenseSet<StringRef> &IgnoredBaseTypes; | ||
|
|
||
| // A struct that records the direct target and it's call count. | ||
| struct PromotionCandidate { | ||
| Function *const TargetFunction; | ||
|
|
@@ -391,10 +402,12 @@ class IndirectCallPromoter { | |
| Function &Func, Module &M, InstrProfSymtab *Symtab, bool SamplePGO, | ||
| const VirtualCallSiteTypeInfoMap &VirtualCSInfo, | ||
| VTableAddressPointOffsetValMap &VTableAddressPointOffsetVal, | ||
| const DenseSet<StringRef> &IgnoredBaseTypes, | ||
| OptimizationRemarkEmitter &ORE) | ||
| : F(Func), M(M), Symtab(Symtab), SamplePGO(SamplePGO), | ||
| VirtualCSInfo(VirtualCSInfo), | ||
| VTableAddressPointOffsetVal(VTableAddressPointOffsetVal), ORE(ORE) {} | ||
| VTableAddressPointOffsetVal(VTableAddressPointOffsetVal), ORE(ORE), | ||
| IgnoredBaseTypes(IgnoredBaseTypes) {} | ||
| IndirectCallPromoter(const IndirectCallPromoter &) = delete; | ||
| IndirectCallPromoter &operator=(const IndirectCallPromoter &) = delete; | ||
|
|
||
|
|
@@ -851,8 +864,25 @@ bool IndirectCallPromoter::isProfitableToCompareVTables( | |
| LLVM_DEBUG(dbgs() << "\n"); | ||
|
|
||
| uint64_t CandidateVTableCount = 0; | ||
| for (auto &[GUID, Count] : VTableGUIDAndCounts) | ||
|
|
||
| for (auto &[GUID, Count] : VTableGUIDAndCounts) { | ||
| CandidateVTableCount += Count; | ||
| auto *VTableVar = Symtab->getGlobalVariable(GUID); | ||
|
||
|
|
||
| assert(VTableVar && | ||
| "VTableVar must exist for GUID in VTableGUIDAndCounts"); | ||
|
|
||
| SmallVector<MDNode *, 2> Types; | ||
| VTableVar->getMetadata(LLVMContext::MD_type, Types); | ||
|
|
||
| for (auto *Type : Types) | ||
| if (auto *TypeId = dyn_cast<MDString>(Type->getOperand(1).get())) | ||
| if (IgnoredBaseTypes.contains(TypeId->getString())) { | ||
| LLVM_DEBUG(dbgs() << " vtable profiles should be ignored. Bail " | ||
| "out vtable comparison."); | ||
|
||
| return false; | ||
| } | ||
| } | ||
|
|
||
| if (CandidateVTableCount < Candidate.Count * ICPVTablePercentageThreshold) { | ||
| LLVM_DEBUG( | ||
|
|
@@ -956,9 +986,15 @@ static bool promoteIndirectCalls(Module &M, ProfileSummaryInfo *PSI, bool InLTO, | |
| bool Changed = false; | ||
| VirtualCallSiteTypeInfoMap VirtualCSInfo; | ||
|
|
||
| if (EnableVTableProfileUse) | ||
| DenseSet<StringRef> IgnoredBaseTypes; | ||
|
|
||
| if (EnableVTableProfileUse) { | ||
| computeVirtualCallSiteTypeInfoMap(M, MAM, VirtualCSInfo); | ||
|
|
||
| for (StringRef Str : ICPIgnoredBaseTypes) | ||
| IgnoredBaseTypes.insert(Str); | ||
| } | ||
|
|
||
| // VTableAddressPointOffsetVal stores the vtable address points. The vtable | ||
| // address point of a given <vtable, address point offset> is static (doesn't | ||
| // change after being computed once). | ||
|
|
@@ -977,7 +1013,8 @@ static bool promoteIndirectCalls(Module &M, ProfileSummaryInfo *PSI, bool InLTO, | |
| auto &ORE = FAM.getResult<OptimizationRemarkEmitterAnalysis>(F); | ||
|
|
||
| IndirectCallPromoter CallPromoter(F, M, &Symtab, SamplePGO, VirtualCSInfo, | ||
| VTableAddressPointOffsetVal, ORE); | ||
| VTableAddressPointOffsetVal, | ||
| IgnoredBaseTypes, ORE); | ||
| bool FuncChanged = CallPromoter.processFunction(PSI); | ||
| if (ICPDUMPAFTER && FuncChanged) { | ||
| LLVM_DEBUG(dbgs() << "\n== IR Dump After =="; F.print(dbgs())); | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,6 +2,7 @@ | |
|
|
||
| ; RUN: opt < %s -passes='pgo-icall-prom' -pass-remarks=pgo-icall-prom -enable-vtable-profile-use -icp-max-num-vtable-last-candidate=2 -S 2>&1 | FileCheck %s --check-prefixes=VTABLE-COMMON,VTABLE-CMP | ||
| ; RUN: opt < %s -passes='pgo-icall-prom' -pass-remarks=pgo-icall-prom -enable-vtable-profile-use -icp-max-num-vtable-last-candidate=1 -S 2>&1 | FileCheck %s --check-prefixes=VTABLE-COMMON,FUNC-CMP | ||
| ; RUN: opt < %s -passes='pgo-icall-prom' -pass-remarks=pgo-icall-prom -enable-vtable-profile-use -icp-max-num-vtable-last-candidate=1 -icp-ignored-base-types='Base1' -S 2>&1 | FileCheck %s --check-prefixes=VTABLE-COMMON,FUNC-CMP | ||
|
||
|
|
||
| target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" | ||
| target triple = "x86_64-unknown-linux-gnu" | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: could be on previous line
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
done.