Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[InstrProf] Test that entry coverage counts accumulate #81806

Merged
merged 1 commit into from
Feb 15, 2024

Conversation

ellishg
Copy link
Contributor

@ellishg ellishg commented Feb 14, 2024

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.

uint64_t Value =
SaturatingMultiplyAdd(Other.Counts[I], Weight, Counts[I], &Overflowed);

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 #75425 (comment) for discussion.

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 llvm#75425 (comment) for discussion.
@llvmbot llvmbot added compiler-rt PGO Profile Guided Optimizations labels Feb 14, 2024
@llvmbot
Copy link
Collaborator

llvmbot commented Feb 14, 2024

@llvm/pr-subscribers-pgo

Author: Ellis Hoag (ellishg)

Changes

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.

uint64_t Value =
SaturatingMultiplyAdd(Other.Counts[I], Weight, Counts[I], &Overflowed);

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 #75425 (comment) 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 --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

@ellishg ellishg merged commit f872706 into llvm:main Feb 15, 2024
7 checks passed
@ellishg ellishg deleted the coverage-counts branch February 15, 2024 18:06
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
compiler-rt PGO Profile Guided Optimizations
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants