diff options
author | Wenlei He <aktoon@gmail.com> | 2021-03-07 09:21:09 -0800 |
---|---|---|
committer | Wenlei He <aktoon@gmail.com> | 2021-03-11 10:18:26 -0800 |
commit | 051f2c144e1eee5ed94cc478075a64ee2d0f2745 (patch) | |
tree | e02752c5603885aac8d708eb7b1f11167ca5b5c6 /llvm/lib/Transforms/Utils/InlineFunction.cpp | |
parent | 8d8a9190db19b487198680adab9a6ca173f20bb3 (diff) | |
download | llvm-051f2c144e1eee5ed94cc478075a64ee2d0f2745.zip llvm-051f2c144e1eee5ed94cc478075a64ee2d0f2745.tar.gz llvm-051f2c144e1eee5ed94cc478075a64ee2d0f2745.tar.bz2 |
[SamplePGO] Skip inlinee profile scaling for sample loader inlining
For CGSCC inline, we need to scale down a function's branch weights and entry counts when thee it's inlined at a callsite. This is done through updateCallProfile. Additionally, we also scale the weigths for the inlined clone based on call site count in updateCallerBFI. Neither is needed for inlining during sample profile loader as it's using context profile that is separated from inlinee's own profile. This change skip the inlinee profile scaling for sample loader inlining.
Differential Revision: https://reviews.llvm.org/D98187
Diffstat (limited to 'llvm/lib/Transforms/Utils/InlineFunction.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 5f75ead..e754721 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -1954,13 +1954,19 @@ llvm::InlineResult llvm::InlineFunction(CallBase &CB, InlineFunctionInfo &IFI, if (objcarc::hasAttachedCallOpBundle(&CB)) inlineRetainOrClaimRVCalls(CB, Returns); - if (IFI.CallerBFI != nullptr && IFI.CalleeBFI != nullptr) - // Update the BFI of blocks cloned into the caller. - updateCallerBFI(OrigBB, VMap, IFI.CallerBFI, IFI.CalleeBFI, - CalledFunc->front()); - - updateCallProfile(CalledFunc, VMap, CalledFunc->getEntryCount(), CB, - IFI.PSI, IFI.CallerBFI); + // Updated caller/callee profiles only when requested. For sample loader + // inlining, the context-sensitive inlinee profile doesn't need to be + // subtracted from callee profile, and the inlined clone also doesn't need + // to be scaled based on call site count. + if (IFI.UpdateProfile) { + if (IFI.CallerBFI != nullptr && IFI.CalleeBFI != nullptr) + // Update the BFI of blocks cloned into the caller. + updateCallerBFI(OrigBB, VMap, IFI.CallerBFI, IFI.CalleeBFI, + CalledFunc->front()); + + updateCallProfile(CalledFunc, VMap, CalledFunc->getEntryCount(), CB, + IFI.PSI, IFI.CallerBFI); + } // Inject byval arguments initialization. for (std::pair<Value*, Value*> &Init : ByValInit) |