diff --git a/llvm/tools/llvm-profgen/ProfileGenerator.cpp b/llvm/tools/llvm-profgen/ProfileGenerator.cpp --- a/llvm/tools/llvm-profgen/ProfileGenerator.cpp +++ b/llvm/tools/llvm-profgen/ProfileGenerator.cpp @@ -760,12 +760,12 @@ FunctionProfile.addHeadSamples(Count); // Look up for the caller's function profile const auto *InlinerDesc = Binary->getInlinerDescForProbe(Probe); - if (InlinerDesc != nullptr) { + SampleContextFrames CalleeContextId = + FunctionProfile.getContext().getContextFrames(); + if (InlinerDesc != nullptr && CalleeContextId.size() > 1) { // Since the context id will be compressed, we have to use callee's // context id to infer caller's context id to ensure they share the // same context prefix. - SampleContextFrames CalleeContextId = - FunctionProfile.getContext().getContextFrames(); SampleContextFrameVector CallerContextId; SampleContextFrame &&CallerLeafFrameLoc = getCallerContext(CalleeContextId, CallerContextId); @@ -825,6 +825,20 @@ SampleContextFrameVector NewContextStack(ContextStack.begin(), ContextStack.end()); Binary->getInlineContextForProbe(LeafProbe, NewContextStack, true); + + int ZeroProbeIdx = -1; + for (uint32_t I = 0; I < NewContextStack.size() - 1; I++) { + auto &Callsite = NewContextStack[I]; + // Ignore the context if the probe of the callsite is zero. + if (Callsite.Location.LineOffset == 0) + ZeroProbeIdx = I; + } + if (ZeroProbeIdx != -1) { + std::copy(NewContextStack.begin() + ZeroProbeIdx + 1, NewContextStack.end(), + NewContextStack.begin()); + NewContextStack.resize(NewContextStack.size() - ZeroProbeIdx - 1); + } + // For leaf inlined context with the top frame, we should strip off the top // frame's probe id, like: // Inlined stack: [foo:1, bar:2], the ContextId will be "foo:1 @ bar"