diff --git a/llvm/test/tools/llvm-profgen/inline-cs-noprobe.test b/llvm/test/tools/llvm-profgen/inline-cs-noprobe.test --- a/llvm/test/tools/llvm-profgen/inline-cs-noprobe.test +++ b/llvm/test/tools/llvm-profgen/inline-cs-noprobe.test @@ -1,10 +1,10 @@ ; RUN: llvm-profgen --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --output=%t --show-unwinder-output | FileCheck %s --check-prefix=CHECK-UNWINDER ; RUN: FileCheck %s --input-file %t -; CHECK:[main:1 @ foo]:44:0 +; CHECK:[main:1 @ foo]:58:0 ; CHECK: 2.2: 14 ; CHECK: 3: 15 -; CHECK: 3.2: 14 bar:14 +; CHECK: 3.2: 28 bar:14 ; CHECK: 3.4: 1 ; CHECK:[main:1 @ foo:3.2 @ bar]:14:0 ; CHECK: 1: 14 diff --git a/llvm/test/tools/llvm-profgen/noinline-cs-noprobe.test b/llvm/test/tools/llvm-profgen/noinline-cs-noprobe.test --- a/llvm/test/tools/llvm-profgen/noinline-cs-noprobe.test +++ b/llvm/test/tools/llvm-profgen/noinline-cs-noprobe.test @@ -7,7 +7,7 @@ ; CHECK: 2: 2 ; CHECK: 4: 1 ; CHECK: 5: 3 -; CHECK:[main:1 @ foo]:9:0 +; CHECK:[main:1 @ foo]:6:0 ; CHECK: 2: 3 ; CHECK: 3: 3 bar:3 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 @@ -239,11 +239,9 @@ // Record called target sample and its count const FrameLocation &LeafLoc = Binary->getInlineLeafFrameLoc(SourceOffset); - FunctionProfile.addCalledTargetSamples(LeafLoc.second.LineOffset, LeafLoc.second.Discriminator, CalleeName, Count); - FunctionProfile.addTotalSamples(Count); // Record head sample for called target(callee) // TODO: Cleanup ' @ ' @@ -274,6 +272,16 @@ return LeafFrameLoc; } +static void accumulateBodySamples(FunctionSamples &FunctionProfile, + const FrameLocation &LeafLoc, + uint64_t Count) { + if (LeafLoc.second.LineOffset & 0x80000000) + return; + FunctionProfile.addBodySamples(LeafLoc.second.LineOffset, + LeafLoc.second.Discriminator, Count); + FunctionProfile.addTotalSamples(Count); +} + void CSProfileGenerator::populateInferredFunctionSamples() { for (const auto &Item : ProfileMap) { const StringRef CalleeContext = Item.first(); @@ -313,6 +321,8 @@ EstimatedCallCount); updateBodySamplesforFunctionProfile(CallerProfile, CallerLeafFrameLoc, EstimatedCallCount); + accumulateBodySamples(CallerProfile, CallerLeafFrameLoc, + EstimatedCallCount); } }