1 // Test to ensure instrumentation of logical operator RHS True/False counters
2 // are being instrumented for branch coverage
3 
4 // RUN: %clang_cc1 -triple %itanium_abi_triple -std=c++11 -main-file-name branch-logical-mixed.cpp %s -o - -emit-llvm -fprofile-instrument=clang | FileCheck -allow-deprecated-dag-overlap %s
5 
6 
7 // CHECK: @[[FUNC:__profc__Z4funcv]] = {{.*}} global [61 x i64] zeroinitializer
8 
9 
10 // CHECK-LABEL: @_Z4funcv()
func()11 bool func() {
12   bool bt0 = true;
13   bool bt1 = true;
14   bool bt2 = true;
15   bool bt3 = true;
16   bool bt4 = true;
17   bool bt5 = true;
18   bool bf0 = false;
19   bool bf1 = false;
20   bool bf2 = false;
21   bool bf3 = false;
22   bool bf4 = false;
23   bool bf5 = false;
24 
25   bool a = bt0 &&
26            bf0 &&                   // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 10
27            bt1 &&                   // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 8
28            bf1 &&                   // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 6
29            bt2 &&                   // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 4
30            bf2;                     // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 2
31 
32   bool b = bt0 ||
33            bf0 ||                   // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 20
34            bt1 ||                   // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 18
35            bf1 ||                   // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 16
36            bt2 ||                   // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 14
37            bf2;                     // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 12
38 
39   bool c = (bt0  &&
40             bf0) ||                 // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 27
41            (bt1  &&
42             bf1) ||                 // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 29
43            (bt2  &&
44             bf2) ||                 // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 31
45            (bt3  &&
46             bf3) ||                 // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 33
47            (bt4  &&
48             bf4) ||                 // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 35
49            (bf5  &&
50             bf5);                   // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 37
51 
52   bool d = (bt0  ||
53             bf0) &&                 // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 44
54            (bt1  ||
55             bf1) &&                 // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 46
56            (bt2  ||
57             bf2) &&                 // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 48
58            (bt3  ||
59             bf3) &&                 // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 50
60            (bt4  ||
61             bf4) &&                 // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 52
62            (bt5  ||
63             bf5);                   // CHECK: store {{.*}} @[[FUNC]], i64 0, i64 54
64 
65   return a && b && c && d;
66 }
67