https://github.com/int-zjt updated https://github.com/llvm/llvm-project/pull/149085
>From 763293b20bb79bb28c0187edc4b282a1536993dc Mon Sep 17 00:00:00 2001 From: int-zjt <zhangjiaton...@bytedance.com> Date: Wed, 16 Jul 2025 19:03:11 +0800 Subject: [PATCH 1/3] [llvm-cov] Add gap region after binary operator && and || --- clang/lib/CodeGen/CoverageMappingGen.cpp | 10 ++++++ .../profile/Linux/coverage_short_circuit.cpp | 36 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 compiler-rt/test/profile/Linux/coverage_short_circuit.cpp diff --git a/clang/lib/CodeGen/CoverageMappingGen.cpp b/clang/lib/CodeGen/CoverageMappingGen.cpp index 4aafac349e3e9..f55290a5feee6 100644 --- a/clang/lib/CodeGen/CoverageMappingGen.cpp +++ b/clang/lib/CodeGen/CoverageMappingGen.cpp @@ -2269,6 +2269,11 @@ struct CounterCoverageMappingBuilder // Track LHS True/False Decision. const auto DecisionLHS = MCDCBuilder.pop(); + if (auto Gap = + findGapAreaBetween(getEnd(E->getLHS()), getStart(E->getRHS()))) { + fillGapAreaWithCount(Gap->getBegin(), Gap->getEnd(), getRegionCounter(E)); + } + // Counter tracks the right hand side of a logical and operator. extendRegion(E->getRHS()); propagateCounts(getRegionCounter(E), E->getRHS()); @@ -2330,6 +2335,11 @@ struct CounterCoverageMappingBuilder // Track LHS True/False Decision. const auto DecisionLHS = MCDCBuilder.pop(); + if (auto Gap = + findGapAreaBetween(getEnd(E->getLHS()), getStart(E->getRHS()))) { + fillGapAreaWithCount(Gap->getBegin(), Gap->getEnd(), getRegionCounter(E)); + } + // Counter tracks the right hand side of a logical or operator. extendRegion(E->getRHS()); propagateCounts(getRegionCounter(E), E->getRHS()); diff --git a/compiler-rt/test/profile/Linux/coverage_short_circuit.cpp b/compiler-rt/test/profile/Linux/coverage_short_circuit.cpp new file mode 100644 index 0000000000000..cc4022bc3c286 --- /dev/null +++ b/compiler-rt/test/profile/Linux/coverage_short_circuit.cpp @@ -0,0 +1,36 @@ +// RUN: %clangxx_profgen -std=c++17 -fuse-ld=lld -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 + +void foo() { // CHECK: [[@LINE]]| 1|void foo() { + bool cond1 = false; // CHECK-NEXT: [[@LINE]]| 1| bool cond1 = false; + bool cond2 = true; // CHECK-NEXT: [[@LINE]]| 1| bool cond2 = true; + if (cond1 && // CHECK-NEXT: [[@LINE]]| 1| if (cond1 && + cond2) { // CHECK-NEXT: [[@LINE]]| 0| cond2) { + } // CHECK-NEXT: [[@LINE]]| 0| } +} // CHECK-NEXT: [[@LINE]]| 1|} + +void bar() { // CHECK: [[@LINE]]| 1|void bar() { + bool cond1 = true; // CHECK-NEXT: [[@LINE]]| 1| bool cond1 = true; + bool cond2 = false; // CHECK-NEXT: [[@LINE]]| 1| bool cond2 = false; + if (cond1 && // CHECK-NEXT: [[@LINE]]| 1| if (cond1 && + cond2) { // CHECK-NEXT: [[@LINE]]| 1| cond2) { + } // CHECK-NEXT: [[@LINE]]| 0| } +} // CHECK-NEXT: [[@LINE]]| 1|} + +void baz() { // CHECK: [[@LINE]]| 1|void baz() { + bool cond1 = false; // CHECK-NEXT: [[@LINE]]| 1| bool cond1 = false; + bool cond2 = true; // CHECK-NEXT: [[@LINE]]| 1| bool cond2 = true; + if (cond1 // CHECK-NEXT: [[@LINE]]| 1| if (cond1 + && // CHECK-NEXT: [[@LINE]]| 0| && + cond2) { // CHECK-NEXT: [[@LINE]]| 0| cond2) { + } // CHECK-NEXT: [[@LINE]]| 0| } +} // CHECK-NEXT: [[@LINE]]| 1|} + +int main() { + foo(); + bar(); + baz(); + return 0; +} >From 54824448fb3cc2bf86219f424e659360923b6851 Mon Sep 17 00:00:00 2001 From: int-zjt <zhangjiaton...@bytedance.com> Date: Thu, 17 Jul 2025 11:00:33 +0800 Subject: [PATCH 2/3] Fix format --- compiler-rt/test/profile/Linux/coverage_short_circuit.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/compiler-rt/test/profile/Linux/coverage_short_circuit.cpp b/compiler-rt/test/profile/Linux/coverage_short_circuit.cpp index cc4022bc3c286..54f0c4cebc44c 100644 --- a/compiler-rt/test/profile/Linux/coverage_short_circuit.cpp +++ b/compiler-rt/test/profile/Linux/coverage_short_circuit.cpp @@ -8,7 +8,7 @@ void foo() { // CHECK: [[@LINE]]| 1|void foo() { bool cond2 = true; // CHECK-NEXT: [[@LINE]]| 1| bool cond2 = true; if (cond1 && // CHECK-NEXT: [[@LINE]]| 1| if (cond1 && cond2) { // CHECK-NEXT: [[@LINE]]| 0| cond2) { - } // CHECK-NEXT: [[@LINE]]| 0| } + } // CHECK-NEXT: [[@LINE]]| 0| } } // CHECK-NEXT: [[@LINE]]| 1|} void bar() { // CHECK: [[@LINE]]| 1|void bar() { @@ -16,7 +16,7 @@ void bar() { // CHECK: [[@LINE]]| 1|void bar() { bool cond2 = false; // CHECK-NEXT: [[@LINE]]| 1| bool cond2 = false; if (cond1 && // CHECK-NEXT: [[@LINE]]| 1| if (cond1 && cond2) { // CHECK-NEXT: [[@LINE]]| 1| cond2) { - } // CHECK-NEXT: [[@LINE]]| 0| } + } // CHECK-NEXT: [[@LINE]]| 0| } } // CHECK-NEXT: [[@LINE]]| 1|} void baz() { // CHECK: [[@LINE]]| 1|void baz() { @@ -25,7 +25,7 @@ void baz() { // CHECK: [[@LINE]]| 1|void baz() { if (cond1 // CHECK-NEXT: [[@LINE]]| 1| if (cond1 && // CHECK-NEXT: [[@LINE]]| 0| && cond2) { // CHECK-NEXT: [[@LINE]]| 0| cond2) { - } // CHECK-NEXT: [[@LINE]]| 0| } + } // CHECK-NEXT: [[@LINE]]| 0| } } // CHECK-NEXT: [[@LINE]]| 1|} int main() { >From f7929d7859748daf9c546360f5df697d84d00b75 Mon Sep 17 00:00:00 2001 From: int-zjt <zhangjiaton...@bytedance.com> Date: Thu, 17 Jul 2025 14:56:00 +0800 Subject: [PATCH 3/3] Fix coverage mapping logical test --- clang/test/CoverageMapping/logical.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/clang/test/CoverageMapping/logical.cpp b/clang/test/CoverageMapping/logical.cpp index 2a22d6cca4518..caa773cfec3a5 100644 --- a/clang/test/CoverageMapping/logical.cpp +++ b/clang/test/CoverageMapping/logical.cpp @@ -1,27 +1,31 @@ // RUN: %clang_cc1 -mllvm -emptyline-comment-coverage=false -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name logical.cpp %s | FileCheck %s // RUN: %clang_cc1 -mllvm -emptyline-comment-coverage=false -fcoverage-mcdc -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name logical.cpp %s | FileCheck %s -check-prefix=MCDC -int main() { // CHECK: File 0, [[@LINE]]:12 -> [[@LINE+23]]:2 = #0 +int main() { // CHECK: File 0, [[@LINE]]:12 -> [[@LINE+27]]:2 = #0 bool bt = true; bool bf = false; // MCDC: Decision,File 0, [[@LINE+1]]:12 -> [[@LINE+1]]:20 = M:3, C:2 bool a = bt && bf; // CHECK-NEXT: File 0, [[@LINE]]:12 -> [[@LINE]]:14 = #0 // CHECK-NEXT: Branch,File 0, [[@LINE-1]]:12 -> [[@LINE-1]]:14 = #1, (#0 - #1) - // CHECK-NEXT: File 0, [[@LINE-2]]:18 -> [[@LINE-2]]:20 = #1 - // CHECK-NEXT: Branch,File 0, [[@LINE-3]]:18 -> [[@LINE-3]]:20 = #2, (#1 - #2) + // CHECK-NEXT: Gap,File 0, [[@LINE-2]]:14 -> [[@LINE-2]]:18 = #1 + // CHECK-NEXT: File 0, [[@LINE-3]]:18 -> [[@LINE-3]]:20 = #1 + // CHECK-NEXT: Branch,File 0, [[@LINE-4]]:18 -> [[@LINE-4]]:20 = #2, (#1 - #2) // MCDC: Decision,File 0, [[@LINE+1]]:7 -> [[@LINE+2]]:9 = M:6, C:2 a = bt && // CHECK-NEXT: File 0, [[@LINE]]:7 -> [[@LINE]]:9 = #0 bf; // CHECK-NEXT: Branch,File 0, [[@LINE-1]]:7 -> [[@LINE-1]]:9 = #3, (#0 - #3) - // CHECK-NEXT: File 0, [[@LINE-1]]:7 -> [[@LINE-1]]:9 = #3 - // CHECK-NEXT: Branch,File 0, [[@LINE-2]]:7 -> [[@LINE-2]]:9 = #4, (#3 - #4) + // CHECK-NEXT: Gap,File 0, [[@LINE-2]]:9 -> [[@LINE-1]]:7 = #3 + // CHECK-NEXT: File 0, [[@LINE-2]]:7 -> [[@LINE-2]]:9 = #3 + // CHECK-NEXT: Branch,File 0, [[@LINE-3]]:7 -> [[@LINE-3]]:9 = #4, (#3 - #4) // MCDC: Decision,File 0, [[@LINE+1]]:7 -> [[@LINE+1]]:15 = M:9, C:2 a = bf || bt; // CHECK-NEXT: File 0, [[@LINE]]:7 -> [[@LINE]]:9 = #0 // CHECK-NEXT: Branch,File 0, [[@LINE-1]]:7 -> [[@LINE-1]]:9 = (#0 - #5), #5 - // CHECK-NEXT: File 0, [[@LINE-2]]:13 -> [[@LINE-2]]:15 = #5 - // CHECK-NEXT: Branch,File 0, [[@LINE-3]]:13 -> [[@LINE-3]]:15 = (#5 - #6), #6 + // CHECK-NEXT: Gap,File 0, [[@LINE-2]]:9 -> [[@LINE-2]]:13 = #5 + // CHECK-NEXT: File 0, [[@LINE-3]]:13 -> [[@LINE-3]]:15 = #5 + // CHECK-NEXT: Branch,File 0, [[@LINE-4]]:13 -> [[@LINE-4]]:15 = (#5 - #6), #6 // MCDC: Decision,File 0, [[@LINE+1]]:7 -> [[@LINE+2]]:9 = M:12, C:2 a = bf || // CHECK-NEXT: File 0, [[@LINE]]:7 -> [[@LINE]]:9 = #0 bt; // CHECK-NEXT: Branch,File 0, [[@LINE-1]]:7 -> [[@LINE-1]]:9 = (#0 - #7), #7 - // CHECK-NEXT: File 0, [[@LINE-1]]:7 -> [[@LINE-1]]:9 = #7 - // CHECK-NEXT: Branch,File 0, [[@LINE-2]]:7 -> [[@LINE-2]]:9 = (#7 - #8), #8 + // CHECK-NEXT: Gap,File 0, [[@LINE-2]]:9 -> [[@LINE-1]]:7 = #7 + // CHECK-NEXT: File 0, [[@LINE-2]]:7 -> [[@LINE-2]]:9 = #7 + // CHECK-NEXT: Branch,File 0, [[@LINE-3]]:7 -> [[@LINE-3]]:9 = (#7 - #8), #8 return 0; } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits