diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp --- a/llvm/lib/Transforms/IPO/SampleProfile.cpp +++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp @@ -2134,7 +2134,7 @@ uint64_t Count = 0; for (auto &FM : I.second) { - Count += FM.second.getTotalSamples(); + Count += FM.second.getHeadSamplesEstimate(); } TotalCallsiteSamples += Count; TotalProfiledCallsite++; @@ -2183,6 +2183,9 @@ MismatchedFuncHashSamples); ProfStatsVec.emplace_back("TotalFuncHashSamples", TotalFuncHashSamples); } + + ProfStatsVec.emplace_back("NumMismatchedCallsite", NumMismatchedCallsite); + ProfStatsVec.emplace_back("TotalProfiledCallsite", TotalProfiledCallsite); ProfStatsVec.emplace_back("MismatchedCallsiteSamples", MismatchedCallsiteSamples); ProfStatsVec.emplace_back("TotalCallsiteSamples", TotalCallsiteSamples); diff --git a/llvm/test/Transforms/SampleProfile/profile-mismatch.ll b/llvm/test/Transforms/SampleProfile/profile-mismatch.ll --- a/llvm/test/Transforms/SampleProfile/profile-mismatch.ll +++ b/llvm/test/Transforms/SampleProfile/profile-mismatch.ll @@ -4,13 +4,32 @@ ; RUN: FileCheck %s --input-file %t.ll -check-prefix=CHECK-MD ; RUN: llc < %t.ll -filetype=obj -o %t.obj ; RUN: llvm-objdump --section-headers %t.obj | FileCheck %s --check-prefix=CHECK-OBJ +; RUN: llc < %t.ll -filetype=asm -o - | FileCheck %s --check-prefix=CHECK-ASM -; CHECK: (2/3) of callsites' profile are invalid and (20/30) of samples are discarded due to callsite location mismatch. +; CHECK: (2/3) of callsites' profile are invalid and (15/25) of samples are discarded due to callsite location mismatch. -; CHECK-MD: ![[#]] = !{!"MismatchedCallsiteSamples", i64 20, !"TotalCallsiteSamples", i64 30} +; CHECK-MD: ![[#]] = !{!"NumMismatchedCallsite", i64 2, !"TotalProfiledCallsite", i64 3, !"MismatchedCallsiteSamples", i64 15, !"TotalCallsiteSamples", i64 25} ; CHECK-OBJ: .llvm_stats +; CHECK-ASM: .section .llvm_stats,"",@progbits +; CHECK-ASM: .byte 21 +; CHECK-ASM: .ascii "NumMismatchedCallsite" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "Mg==" +; CHECK-ASM: .byte 21 +; CHECK-ASM: .ascii "TotalProfiledCallsite" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "Mw==" +; CHECK-ASM: .byte 25 +; CHECK-ASM: .ascii "MismatchedCallsiteSamples" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "MTU=" +; CHECK-ASM: .byte 20 +; CHECK-ASM: .ascii "TotalCallsiteSamples" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "MjU=" + target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" diff --git a/llvm/test/Transforms/SampleProfile/pseudo-probe-profile-mismatch.ll b/llvm/test/Transforms/SampleProfile/pseudo-probe-profile-mismatch.ll --- a/llvm/test/Transforms/SampleProfile/pseudo-probe-profile-mismatch.ll +++ b/llvm/test/Transforms/SampleProfile/pseudo-probe-profile-mismatch.ll @@ -4,14 +4,49 @@ ; RUN: FileCheck %s --input-file %t.ll -check-prefix=CHECK-MD ; RUN: llc < %t.ll -filetype=obj -o %t.obj ; RUN: llvm-objdump --section-headers %t.obj | FileCheck %s --check-prefix=CHECK-OBJ +; RUN: llc < %t.ll -filetype=asm -o - | FileCheck %s --check-prefix=CHECK-ASM ; CHECK: (1/3) of functions' profile are invalid and (10/50) of samples are discarded due to function hash mismatch. ; CHECK: (2/3) of callsites' profile are invalid and (20/30) of samples are discarded due to callsite location mismatch. -; CHECK-MD: ![[#]] = !{!"NumMismatchedFuncHash", i64 1, !"TotalProfiledFunc", i64 3, !"MismatchedFuncHashSamples", i64 10, !"TotalFuncHashSamples", i64 50, !"MismatchedCallsiteSamples", i64 20, !"TotalCallsiteSamples", i64 30} +; CHECK-MD: ![[#]] = !{!"NumMismatchedFuncHash", i64 1, !"TotalProfiledFunc", i64 3, !"MismatchedFuncHashSamples", i64 10, !"TotalFuncHashSamples", i64 50, !"NumMismatchedCallsite", i64 2, !"TotalProfiledCallsite", i64 3, !"MismatchedCallsiteSamples", i64 20, !"TotalCallsiteSamples", i64 30} ; CHECK-OBJ: .llvm_stats +; CHECK-ASM: .section .llvm_stats,"",@progbits +; CHECK-ASM: .byte 21 +; CHECK-ASM: .ascii "NumMismatchedFuncHash" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "MQ==" +; CHECK-ASM: .byte 17 +; CHECK-ASM: .ascii "TotalProfiledFunc" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "Mw==" +; CHECK-ASM: .byte 25 +; CHECK-ASM: .ascii "MismatchedFuncHashSamples" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "MTA=" +; CHECK-ASM: .byte 20 +; CHECK-ASM: .ascii "TotalFuncHashSamples" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "NTA=" +; CHECK-ASM: .byte 21 +; CHECK-ASM: .ascii "NumMismatchedCallsite" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "Mg==" +; CHECK-ASM: .byte 21 +; CHECK-ASM: .ascii "TotalProfiledCallsite" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "Mw==" +; CHECK-ASM: .byte 25 +; CHECK-ASM: .ascii "MismatchedCallsiteSamples" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "MjA=" +; CHECK-ASM: .byte 20 +; CHECK-ASM: .ascii "TotalCallsiteSamples" +; CHECK-ASM: .byte 4 +; CHECK-ASM: .ascii "MzA=" + target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu"