diff --git a/compiler-rt/test/profile/coverage_wrappedsegments.cpp b/compiler-rt/test/profile/coverage_wrappedsegments.cpp new file mode 100644 --- /dev/null +++ b/compiler-rt/test/profile/coverage_wrappedsegments.cpp @@ -0,0 +1,51 @@ +// RUN: %clangxx_profgen -fcoverage-mapping -o %t %s +// RUN: env LLVM_PROFILE_FILE=%t.profraw %run %t +// RUN: llvm-profdata merge -o %t.profdata %t.profraw +// RUN: llvm-cov show %t -instr-profile %t.profdata 2>&1 | FileCheck %s + +#include + +int f1() { // CHECK: [[# @LINE]]| 1|int f1() { + return getenv( // CHECK-NEXT: [[# @LINE]]| 1| + "TEST") ? 1 // CHECK-NEXT: [[# @LINE]]| 1| + : 0; // CHECK-NEXT: [[# @LINE]]| 1| +} // CHECK-NEXT: [[# @LINE]]| 1|} + +int f2() { // CHECK: [[# @LINE]]| 1|int f2() { + return getenv( // CHECK-NEXT: [[# @LINE]]| 1| + "TEST" // CHECK-NEXT: [[# @LINE]]| 1| + "TEST") ? 1 // CHECK-NEXT: [[# @LINE]]| 1| + : 0; // CHECK-NEXT: [[# @LINE]]| 1| +} // CHECK-NEXT: [[# @LINE]]| 1|} + +int f3() { // CHECK: [[# @LINE]]| 1|int f3() { + return 0; // CHECK-NEXT: [[# @LINE]]| 1| + return 1; // CHECK-NEXT: [[# @LINE]]| 0| +} // CHECK-NEXT: [[# @LINE]]| 1|} + +int f4() { // CHECK: [[# @LINE]]| 1|int f4() { + int a = 0; // CHECK-NEXT: [[# @LINE]]| 1| + for (; a < 9;) // CHECK-NEXT: [[# @LINE]]| 1| + return a; // CHECK-NEXT: [[# @LINE]]| 1| + return a; // CHECK-NEXT: [[# @LINE]]| 0| +} // CHECK-NEXT: [[# @LINE]]| 1|} + +int f5() { // CHECK: [[# @LINE]]| 1|int f5() { + int i=1, j=1; // CHECK-NEXT: [[# @LINE]]| 1| + if (i > 0) { // CHECK-NEXT: [[# @LINE]]| 1| + if (j > 0) // CHECK-NEXT: [[# @LINE]]| 1| + return 0; // CHECK-NEXT: [[# @LINE]]| 1| + else // CHECK-NEXT: [[# @LINE]]| 0| + j++; // CHECK-NEXT: [[# @LINE]]| 0| + } // CHECK-NEXT: [[# @LINE]]| 1| + return 1; // CHECK-NEXT: [[# @LINE]]| 0| +} // CHECK-NEXT: [[# @LINE]]| 1|} + +int main() { + f1(); + f2(); + f3(); + f4(); + f5(); + return 0; +} diff --git a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp --- a/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp +++ b/llvm/lib/ProfileData/Coverage/CoverageMapping.cpp @@ -794,7 +794,10 @@ ExecutionCount = WrappedSegment->Count; if (!MinRegionCount) return; - ExecutionCount = 0; + // If the first line segment is start of region, discard wrapped segment + // count. + if (isStartOfRegion(LineSegments[0])) + ExecutionCount = 0; for (const auto *LS : LineSegments) if (isStartOfRegion(LS)) ExecutionCount = std::max(ExecutionCount, LS->Count);