Index: test/profile/Linux/counter_promo_for.c =================================================================== --- test/profile/Linux/counter_promo_for.c +++ test/profile/Linux/counter_promo_for.c @@ -19,18 +19,18 @@ __attribute__((noinline)) void foo(int n, int N) { // PROMO-LABEL: @foo +// PROMO: load{{.*}}@__profc_foo{{.*}} 3){{.*}} +// PROMO-NEXT: add +// PROMO-NEXT: store{{.*}}@__profc_foo{{.*}} 3){{.*}} // PROMO: load{{.*}}@__profc_foo{{.*}} 0){{.*}} // PROMO-NEXT: add // PROMO-NEXT: store{{.*}}@__profc_foo{{.*}} 0){{.*}} // PROMO-NEXT: load{{.*}}@__profc_foo{{.*}} 1){{.*}} // PROMO-NEXT: add // PROMO-NEXT: store{{.*}}@__profc_foo{{.*}} 1){{.*}} -// PROMO-NEXT: load{{.*}}@__profc_foo{{.*}} 2){{.*}} +// PROMO: load{{.*}}@__profc_foo{{.*}} 2){{.*}} // PROMO-NEXT: add // PROMO-NEXT: store{{.*}}@__profc_foo{{.*}} 2){{.*}} -// PROMO: load{{.*}}@__profc_foo{{.*}} 3){{.*}} -// PROMO-NEXT: add -// PROMO-NEXT: store{{.*}}@__profc_foo{{.*}} 3){{.*}} // // NOPROMO-LABEL: @foo // NOPROMO: load{{.*}}@__profc_foo{{.*}} 0){{.*}} Index: test/profile/infinite_loop.c =================================================================== --- test/profile/infinite_loop.c +++ test/profile/infinite_loop.c @@ -23,8 +23,8 @@ // CHECK: Counters: // CHECK-NEXT: main: // CHECK-NEXT: Hash: {{.*}} -// CHECK-NEXT: Counters: 1 -// CHECK-NEXT: Block counts: [1000] +// CHECK-NEXT: Counters: 2 +// CHECK-NEXT: Block counts: [1000, 1] Index: test/profile/runtime_infinite.c =================================================================== --- test/profile/runtime_infinite.c +++ test/profile/runtime_infinite.c @@ -0,0 +1,36 @@ +// The waiting loop never exits via the normal +// path before the profile is dumped and the +// program is terminated. This tests checks +// that the entry of main is properly instrumented +// and has non-zero count. + +// RUN: %clang_pgogen -mllvm -do-counter-promotion=false -O2 -o %t %s +// RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t +// RUN: llvm-profdata show -function main -counts %t.profraw| FileCheck %s +void exit(int); + +int __llvm_profile_dump(void); +void __llvm_profile_reset_counters(void); + +int g = 0; +__attribute__((noinline)) void doSth() { + g++; + + if (g > 10000) { + // dump profile and exit; + __llvm_profile_dump(); + exit(0); + } +} +int errorcode = 0; +int noerror() { return (errorcode == 0); } + +int main(int argc, const char *argv[]) { + // waiting_loop + while (noerror()) { + doSth(); + } +} + +// CHECK-LABEL: main +// CHECK: [10001, 1]