[compiler-rt] [InstrProf] Test that entry coverage counts accumulate (PR #81806)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 14 15:56:37 PST 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-pgo
Author: Ellis Hoag (ellishg)
<details>
<summary>Changes</summary>
Entry coverage (`-pgo-function-entry-coverage`) and block covearge (`-pgo-block-coverage`) can be useful to reduce the size overhead of instrumented builds, and the profiles they generate can even be used in PGO builds.
When merging raw profiles with coverage, we accumulate their values as if they were counts and `llvm-profdata` considers a value to be "covered" if it's larger than zero. https://github.com/llvm/llvm-project/blob/acdb4cdc04ed4d9a130f0fa706ed1b0f42cc1aa0/llvm/lib/ProfileData/InstrProf.cpp#L841-L842
This is technically different than accumulating counts, but it can help discriminate cold functions from hot functions when the number of raw profiles is large.
See https://github.com/llvm/llvm-project/pull/75425#discussion_r1427177844 for discussion.
---
Full diff: https://github.com/llvm/llvm-project/pull/81806.diff
2 Files Affected:
- (modified) compiler-rt/test/profile/instrprof-block-coverage.c (+5)
- (modified) compiler-rt/test/profile/instrprof-entry-coverage.c (+11)
``````````diff
diff --git a/compiler-rt/test/profile/instrprof-block-coverage.c b/compiler-rt/test/profile/instrprof-block-coverage.c
index 4f1e77810ab5fd..829d5af8dc3f9e 100644
--- a/compiler-rt/test/profile/instrprof-block-coverage.c
+++ b/compiler-rt/test/profile/instrprof-block-coverage.c
@@ -5,6 +5,9 @@
// RUN: %clang_profuse=%t.profdata -mllvm -pgo-verify-bfi -o - -S -emit-llvm %s 2>%t.errs | FileCheck %s --implicit-check-not="!prof"
// RUN: FileCheck %s < %t.errs --allow-empty --check-prefix=CHECK-ERROR
+// RUN: llvm-profdata merge -o %t2.profdata %t1.profraw %t1.profraw %t2.profraw %t2.profraw
+// RUN: llvm-profdata show %t2.profdata | FileCheck %s --check-prefix=COUNTS
+
#include <stdlib.h>
// CHECK: @foo({{.*}})
@@ -45,3 +48,5 @@ int main(int argc, char *argv[]) {
// CHECK-DAG: ![[PROF2]] = !{!"branch_weights", i32 0, i32 1}
// CHECK-ERROR-NOT: warning: {{.*}}: Found inconsistent block coverage
+
+// COUNTS: Maximum function count: 4
diff --git a/compiler-rt/test/profile/instrprof-entry-coverage.c b/compiler-rt/test/profile/instrprof-entry-coverage.c
index 99ec38b3e2a6c9..1c6816ba01964b 100644
--- a/compiler-rt/test/profile/instrprof-entry-coverage.c
+++ b/compiler-rt/test/profile/instrprof-entry-coverage.c
@@ -3,10 +3,19 @@
// RUN: llvm-profdata merge -o %t.profdata %t.profraw
// RUN: llvm-profdata show --covered %t.profdata | FileCheck %s --implicit-check-not goo
+// We deliberately merge the raw profile twice to test that internal counts can
+// grow larger than one. Technically, accumulating coverage values is different
+// than accumulating counts, but this helps discriminate cold functions from hot
+// functions when the number of raw profiles is large.
+// RUN: llvm-profdata merge -o %t2.profdata %t.profraw %t.profraw
+// RUN: llvm-profdata show %t2.profdata | FileCheck %s --check-prefix=COUNTS
+
// RUN: %clang_cspgogen -O1 -mllvm -pgo-function-entry-coverage %s -o %t.cs.out
// RUN: env LLVM_PROFILE_FILE=%t.csprofraw %run %t.cs.out
// RUN: llvm-profdata merge -o %t.csprofdata %t.csprofraw
// RUN: llvm-profdata show --covered %t.csprofdata --showcs | FileCheck %s --implicit-check-not goo
+// RUN: llvm-profdata merge -o %t2.csprofdata %t.csprofraw %t.csprofraw
+// RUN: llvm-profdata show --showcs %t2.csprofdata | FileCheck %s --check-prefix=COUNTS
void markUsed(int a) {
volatile int g;
@@ -26,3 +35,5 @@ int main(int argc, char *argv[]) {
// CHECK-DAG: main
// CHECK-DAG: foo
// CHECK-DAG: bar
+
+// COUNTS: Maximum function count: 2
``````````
</details>
https://github.com/llvm/llvm-project/pull/81806
More information about the llvm-commits
mailing list