SamplePGO: convert callsite samples map key from callsite_location to callsite_location+callee_name
Summary: For iterative SamplePGO, an indirect call can be speculatively promoted to multiple direct calls and get inlined. All these promoted direct calls will share the same callsite location (offset+discriminator). With the current implementation, we cannot distinguish between different promotion candidates and its inlined instance. This patch adds callee_name to the key of the callsite sample map. And added helper functions to get all inlined callee samples for a given callsite location. This helps the profile annotator promote correct targets and inline it before annotation, and ensures all indirect call targets to be annotated correctly. Reviewers: davidxl, dnovillo Reviewed By: davidxl Subscribers: andreadb, llvm-commits Differential Revision: https://reviews.llvm.org/D31950 llvm-svn: 300240
This commit is contained in:
@@ -211,7 +211,7 @@ std::error_code SampleProfileReaderText::read() {
|
||||
InlineStack.pop_back();
|
||||
}
|
||||
FunctionSamples &FSamples = InlineStack.back()->functionSamplesAt(
|
||||
LineLocation(LineOffset, Discriminator));
|
||||
LineLocation(LineOffset, Discriminator))[FName];
|
||||
FSamples.setName(FName);
|
||||
MergeResult(Result, FSamples.addTotalSamples(NumSamples));
|
||||
InlineStack.push_back(&FSamples);
|
||||
@@ -363,8 +363,8 @@ SampleProfileReaderBinary::readProfile(FunctionSamples &FProfile) {
|
||||
if (std::error_code EC = FName.getError())
|
||||
return EC;
|
||||
|
||||
FunctionSamples &CalleeProfile =
|
||||
FProfile.functionSamplesAt(LineLocation(*LineOffset, *Discriminator));
|
||||
FunctionSamples &CalleeProfile = FProfile.functionSamplesAt(
|
||||
LineLocation(*LineOffset, *Discriminator))[*FName];
|
||||
CalleeProfile.setName(*FName);
|
||||
if (std::error_code EC = readProfile(CalleeProfile))
|
||||
return EC;
|
||||
@@ -636,7 +636,7 @@ std::error_code SampleProfileReaderGCC::readOneFunctionProfile(
|
||||
uint32_t LineOffset = Offset >> 16;
|
||||
uint32_t Discriminator = Offset & 0xffff;
|
||||
FProfile = &CallerProfile->functionSamplesAt(
|
||||
LineLocation(LineOffset, Discriminator));
|
||||
LineLocation(LineOffset, Discriminator))[Name];
|
||||
}
|
||||
FProfile->setName(Name);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user