1 // Test to ensure right number of counters are allocated and used for nested
2 // logical operators on branch conditions for branch coverage.
4 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++11 -fprofile-instrument=clang -fcoverage-mapping -dump-coverage-mapping -emit-llvm-only -main-file-name branch-logical-mixed.cpp %s | FileCheck %s
7 // CHECK-LABEL: _Z5func1ii:
8 bool func1(int a
, int b
) {
13 // This should allocate a RHS branch counter on b2 (counter #3).
14 bool c
= b0
&& (b1
|| b2
);
15 // CHECK: Branch,File 0, [[@LINE-1]]:12 -> [[@LINE-1]]:14 = #1, (#0 - #1)
16 // CHECK: Branch,File 0, [[@LINE-2]]:19 -> [[@LINE-2]]:21 = (#1 - #2), #2
17 // CHECK: Branch,File 0, [[@LINE-3]]:25 -> [[@LINE-3]]:27 = (#2 - #3), #3
22 // CHECK-LABEL: _Z5func2ii:
23 bool func2(int a
, int b
) {
28 // This should allocate a RHS branch counter on b1 and b2 (counters #2, #4)
29 // This could possibly be further optimized through counter reuse (future).
30 bool c
= (b0
&& b1
) || b2
;
31 // CHECK: Branch,File 0, [[@LINE-1]]:13 -> [[@LINE-1]]:15 = #3, (#0 - #3)
32 // CHECK: Branch,File 0, [[@LINE-2]]:19 -> [[@LINE-2]]:21 = #4, (#3 - #4)
33 // CHECK: Branch,File 0, [[@LINE-3]]:26 -> [[@LINE-3]]:28 = (#1 - #2), #2
38 // CHECK-LABEL: _Z5func3ii:
39 bool func3(int a
, int b
) {
45 // This should allocate a RHS branch counter on b1 and b3 (counters #3, #5)
46 // This could possibly be further optimized through counter reuse (future).
47 bool c
= (b0
|| b1
) && (b2
|| b3
);
48 // CHECK: Branch,File 0, [[@LINE-1]]:13 -> [[@LINE-1]]:15 = (#0 - #2), #2
49 // CHECK: Branch,File 0, [[@LINE-2]]:19 -> [[@LINE-2]]:21 = (#2 - #3), #3
50 // CHECK: Branch,File 0, [[@LINE-3]]:27 -> [[@LINE-3]]:29 = (#1 - #4), #4
51 // CHECK: Branch,File 0, [[@LINE-4]]:33 -> [[@LINE-4]]:35 = (#4 - #5), #5