diff options
Diffstat (limited to 'llvm/lib/ProfileData/SampleProf.cpp')
| -rw-r--r-- | llvm/lib/ProfileData/SampleProf.cpp | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/llvm/lib/ProfileData/SampleProf.cpp b/llvm/lib/ProfileData/SampleProf.cpp index 9b01a386a360..f794e64a13e7 100644 --- a/llvm/lib/ProfileData/SampleProf.cpp +++ b/llvm/lib/ProfileData/SampleProf.cpp @@ -19,9 +19,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Debug.h" -#include "llvm/Support/Error.h" #include "llvm/Support/ErrorHandling.h" -#include "llvm/Support/LEB128.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/raw_ostream.h" #include <string> @@ -31,22 +29,21 @@ using namespace llvm; using namespace sampleprof; static cl::opt<uint64_t> ProfileSymbolListCutOff( - "profile-symbol-list-cutoff", cl::Hidden, cl::init(-1), cl::ZeroOrMore, + "profile-symbol-list-cutoff", cl::Hidden, cl::init(-1), cl::desc("Cutoff value about how many symbols in profile symbol list " "will be used. This is very useful for performance debugging")); cl::opt<bool> GenerateMergedBaseProfiles( - "generate-merged-base-profiles", cl::init(true), cl::ZeroOrMore, + "generate-merged-base-profiles", cl::desc("When generating nested context-sensitive profiles, always " "generate extra base profile for function with all its context " "profiles merged into it.")); namespace llvm { namespace sampleprof { -SampleProfileFormat FunctionSamples::Format; bool FunctionSamples::ProfileIsProbeBased = false; -bool FunctionSamples::ProfileIsCSFlat = false; -bool FunctionSamples::ProfileIsCSNested = false; +bool FunctionSamples::ProfileIsCS = false; +bool FunctionSamples::ProfileIsPreInlined = false; bool FunctionSamples::UseMD5 = false; bool FunctionSamples::HasUniqSuffix = true; bool FunctionSamples::ProfileIsFS = false; @@ -88,8 +85,6 @@ class SampleProfErrorCategoryType : public std::error_category { return "Counter overflow"; case sampleprof_error::ostream_seek_unsupported: return "Ostream does not support seek"; - case sampleprof_error::compress_failed: - return "Compress failure"; case sampleprof_error::uncompress_failed: return "Uncompress failure"; case sampleprof_error::zlib_unavailable: @@ -523,6 +518,12 @@ void CSProfileConverter::convertProfiles(CSProfileConverter::FrameNode &Node) { auto &SamplesMap = NodeProfile->functionSamplesAt(ChildNode.CallSiteLoc); SamplesMap.emplace(OrigChildContext.getName().str(), *ChildProfile); NodeProfile->addTotalSamples(ChildProfile->getTotalSamples()); + // Remove the corresponding body sample for the callsite and update the + // total weight. + auto Count = NodeProfile->removeCalledTargetAndBodySample( + ChildNode.CallSiteLoc.LineOffset, ChildNode.CallSiteLoc.Discriminator, + OrigChildContext.getName()); + NodeProfile->removeTotalSamples(Count); } // Separate child profile to be a standalone profile, if the current parent @@ -531,13 +532,14 @@ void CSProfileConverter::convertProfiles(CSProfileConverter::FrameNode &Node) { // thus done optionally. It is seen that duplicating context profiles into // base profiles improves the code quality for thinlto build by allowing a // profile in the prelink phase for to-be-fully-inlined functions. - if (!NodeProfile || GenerateMergedBaseProfiles) + if (!NodeProfile) { ProfileMap[ChildProfile->getContext()].merge(*ChildProfile); - - // Contexts coming with a `ContextShouldBeInlined` attribute indicate this - // is a preinliner-computed profile. - if (OrigChildContext.hasAttribute(ContextShouldBeInlined)) - FunctionSamples::ProfileIsCSNested = true; + } else if (GenerateMergedBaseProfiles) { + ProfileMap[ChildProfile->getContext()].merge(*ChildProfile); + auto &SamplesMap = NodeProfile->functionSamplesAt(ChildNode.CallSiteLoc); + SamplesMap[ChildProfile->getName().str()].getContext().setAttribute( + ContextDuplicatedIntoBase); + } // Remove the original child profile. ProfileMap.erase(OrigChildContext); |
