xref: /llvm-project/llvm/test/tools/llvm-cov/mcdc-const.test (revision 3f9d8d892e2de2ac2542cb8e88ae5317f3282244)
1// Test visualization of MC/DC constructs for constant-folded condition masking.
2
3// RUN: llvm-profdata merge %S/Inputs/mcdc-const.proftext -o %t.profdata
4// RUN: llvm-cov show --show-branches=count --show-mcdc %S/Inputs/mcdc-const.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s -check-prefix=CHECKGENERALCASE
5
6//      CHECKGENERALCASE:  ------------------
7// CHECKGENERALCASE-NEXT:  |  Branch (12:8): [True: 4, False: 1]
8// CHECKGENERALCASE-NEXT:  |  Branch (12:13): [Folded - Ignored]
9// CHECKGENERALCASE-NEXT:  |  Branch (12:20): [Folded - Ignored]
10// CHECKGENERALCASE-NEXT:  |  Branch (12:25): [True: 0, False: 0]
11// CHECKGENERALCASE-NEXT:  |  Branch (12:31): [Folded - Ignored]
12// CHECKGENERALCASE-NEXT:  ------------------
13// CHECKGENERALCASE-NEXT:  |---> MC/DC Decision Region (12:7) to (12:32)
14// CHECKGENERALCASE-NEXT:  |
15// CHECKGENERALCASE-NEXT:  |  Number of Conditions: 5
16// CHECKGENERALCASE-NEXT:  |     Condition C1 --> (12:8)
17// CHECKGENERALCASE-NEXT:  |     Condition C2 --> (12:13)
18// CHECKGENERALCASE-NEXT:  |     Condition C3 --> (12:20)
19// CHECKGENERALCASE-NEXT:  |     Condition C4 --> (12:25)
20// CHECKGENERALCASE-NEXT:  |     Condition C5 --> (12:31)
21// CHECKGENERALCASE-NEXT:  |
22// CHECKGENERALCASE-NEXT:  |  Executed MC/DC Test Vectors:
23// CHECKGENERALCASE-NEXT:  |
24// CHECKGENERALCASE-NEXT:  |     C1, C2, C3, C4, C5    Result
25// CHECKGENERALCASE-NEXT:  |  1 { F,  C,  C,  -,  C  = F      }
26// CHECKGENERALCASE-NEXT:  |  2 { T,  C,  C,  -,  C  = T      }
27// CHECKGENERALCASE-NEXT:  |
28// CHECKGENERALCASE-NEXT:  |  C1-Pair: covered: (1,2)
29// CHECKGENERALCASE-NEXT:  |  C2-Pair: constant folded
30// CHECKGENERALCASE-NEXT:  |  C3-Pair: constant folded
31// CHECKGENERALCASE-NEXT:  |  C4-Pair: not covered
32// CHECKGENERALCASE-NEXT:  |  C5-Pair: constant folded
33// CHECKGENERALCASE-NEXT:  |  MC/DC Coverage for Decision: 50.00%
34// CHECKGENERALCASE-NEXT:  |
35// CHECKGENERALCASE-NEXT:  ------------------
36
37// RUN: llvm-profdata merge %S/Inputs/mcdc-const-folding.proftext -o %t.profdata
38// RUN: llvm-cov show --show-mcdc %S/Inputs/mcdc-const-folding.o -instr-profile %t.profdata -path-equivalence=.,%S/Inputs | FileCheck %s -check-prefix=CHECKFULLCASE
39// RUN: llvm-cov report --show-mcdc-summary %S/Inputs/mcdc-const-folding.o -instr-profile %t.profdata -show-functions -path-equivalence=.,%S/Inputs %S/Inputs/mcdc-const-folding.cpp | FileCheck %s -check-prefix=REPORT
40
41//      CHECKFULLCASE: |  1 { C,  -  = F      }
42//      CHECKFULLCASE: |  C1-Pair: constant folded
43// CHECKFULLCASE-NEXT: |  C2-Pair: not covered
44//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
45//      CHECKFULLCASE: |  1 { F,  C  = F      }
46// CHECKFULLCASE-NEXT: |  2 { T,  C  = F      }
47//      CHECKFULLCASE: |  C1-Pair: not covered
48// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
49//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
50//      CHECKFULLCASE: |  1 { C,  F  = F      }
51// CHECKFULLCASE-NEXT: |  2 { C,  T  = T      }
52//      CHECKFULLCASE: |  C1-Pair: constant folded
53// CHECKFULLCASE-NEXT: |  C2-Pair: covered: (1,2)
54//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 100.00%
55//      CHECKFULLCASE: |  1 { F,  C  = F      }
56// CHECKFULLCASE-NEXT: |  2 { T,  C  = T      }
57//      CHECKFULLCASE: |  C1-Pair: covered: (1,2)
58// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
59//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 100.00%
60//      CHECKFULLCASE: |  1 { C,  -  = T      }
61//      CHECKFULLCASE: |  C1-Pair: constant folded
62// CHECKFULLCASE-NEXT: |  C2-Pair: not covered
63//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
64//      CHECKFULLCASE: |  1 { F,  C  = T      }
65// CHECKFULLCASE-NEXT: |  2 { T,  C  = T      }
66//      CHECKFULLCASE: |  C1-Pair: not covered
67// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
68//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
69//      CHECKFULLCASE: |  1 { C,  F  = F      }
70// CHECKFULLCASE-NEXT: |  2 { C,  T  = T      }
71//      CHECKFULLCASE: |  C1-Pair: constant folded
72// CHECKFULLCASE-NEXT: |  C2-Pair: covered: (1,2)
73//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 100.00%
74//      CHECKFULLCASE: |  1 { F,  C  = F      }
75// CHECKFULLCASE-NEXT: |  2 { T,  C  = T      }
76//      CHECKFULLCASE: |  C1-Pair: covered: (1,2)
77// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
78//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 100.00%
79//      CHECKFULLCASE: |  1 { C,  -,  -  = F      }
80//      CHECKFULLCASE: |  C1-Pair: constant folded
81// CHECKFULLCASE-NEXT: |  C2-Pair: not covered
82// CHECKFULLCASE-NEXT: |  C3-Pair: not covered
83//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
84//      CHECKFULLCASE: |  1 { F,  C,  -  = F      }
85// CHECKFULLCASE-NEXT: |  2 { T,  C,  -  = F      }
86//      CHECKFULLCASE: |  C1-Pair: not covered
87// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
88// CHECKFULLCASE-NEXT: |  C3-Pair: not covered
89//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
90//      CHECKFULLCASE: |  1 { C,  F,  -  = F      }
91// CHECKFULLCASE-NEXT: |  2 { C,  T,  F  = F      }
92// CHECKFULLCASE-NEXT: |  3 { C,  T,  T  = T      }
93//      CHECKFULLCASE: |  C1-Pair: constant folded
94// CHECKFULLCASE-NEXT: |  C2-Pair: covered: (1,3)
95// CHECKFULLCASE-NEXT: |  C3-Pair: covered: (2,3)
96//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 100.00%
97//      CHECKFULLCASE: |  1 { F,  C,  -  = F      }
98// CHECKFULLCASE-NEXT: |  2 { T,  C,  F  = F      }
99// CHECKFULLCASE-NEXT: |  3 { T,  C,  T  = T      }
100//      CHECKFULLCASE: |  C1-Pair: covered: (1,3)
101// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
102// CHECKFULLCASE-NEXT: |  C3-Pair: covered: (2,3)
103//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 100.00%
104//      CHECKFULLCASE: |  1 { C,  -,  -  = T      }
105//      CHECKFULLCASE: |  C1-Pair: constant folded
106// CHECKFULLCASE-NEXT: |  C2-Pair: not covered
107// CHECKFULLCASE-NEXT: |  C3-Pair: not covered
108//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
109//      CHECKFULLCASE: |  1 { F,  C,  -  = T      }
110// CHECKFULLCASE-NEXT: |  2 { T,  C,  -  = T      }
111//      CHECKFULLCASE: |  C1-Pair: not covered
112// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
113// CHECKFULLCASE-NEXT: |  C3-Pair: not covered
114//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
115//      CHECKFULLCASE: |  1 { C,  F,  T  = T      }
116// CHECKFULLCASE-NEXT: |  2 { C,  T,  -  = T      }
117//      CHECKFULLCASE: |  C1-Pair: constant folded
118// CHECKFULLCASE-NEXT: |  C2-Pair: not covered
119// CHECKFULLCASE-NEXT: |  C3-Pair: not covered
120//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
121//      CHECKFULLCASE: |  1 { F,  C,  T  = T      }
122// CHECKFULLCASE-NEXT: |  2 { T,  C,  -  = T      }
123//      CHECKFULLCASE: |  C1-Pair: not covered
124// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
125// CHECKFULLCASE-NEXT: |  C3-Pair: not covered
126//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
127//      CHECKFULLCASE: |  1 { F,  -,  C  = F      }
128// CHECKFULLCASE-NEXT: |  2 { T,  F,  C  = F      }
129// CHECKFULLCASE-NEXT: |  3 { T,  T,  C  = F      }
130//      CHECKFULLCASE: |  C1-Pair: not covered
131// CHECKFULLCASE-NEXT: |  C2-Pair: not covered
132// CHECKFULLCASE-NEXT: |  C3-Pair: constant folded
133//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
134//      CHECKFULLCASE: |  1 { F,  C,  -  = F      }
135// CHECKFULLCASE-NEXT: |  2 { T,  C,  -  = F      }
136//      CHECKFULLCASE: |  C1-Pair: not covered
137// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
138// CHECKFULLCASE-NEXT: |  C3-Pair: not covered
139//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
140//      CHECKFULLCASE: |  1 { F,  -,  C  = F      }
141// CHECKFULLCASE-NEXT: |  2 { T,  F,  C  = F      }
142// CHECKFULLCASE-NEXT: |  3 { T,  T,  C  = T      }
143//      CHECKFULLCASE: |  C1-Pair: covered: (1,3)
144// CHECKFULLCASE-NEXT: |  C2-Pair: covered: (2,3)
145// CHECKFULLCASE-NEXT: |  C3-Pair: constant folded
146//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 100.00%
147//      CHECKFULLCASE: |  1 { F,  C,  -  = F      }
148// CHECKFULLCASE-NEXT: |  2 { T,  C,  F  = F      }
149// CHECKFULLCASE-NEXT: |  3 { T,  C,  T  = T      }
150//      CHECKFULLCASE: |  C1-Pair: covered: (1,3)
151// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
152// CHECKFULLCASE-NEXT: |  C3-Pair: covered: (2,3)
153//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 100.00%
154//      CHECKFULLCASE: |  1 { F,  T,  C  = T      }
155// CHECKFULLCASE-NEXT: |  2 { T,  -,  C  = T      }
156//      CHECKFULLCASE: |  C1-Pair: not covered
157// CHECKFULLCASE-NEXT: |  C2-Pair: not covered
158// CHECKFULLCASE-NEXT: |  C3-Pair: constant folded
159//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
160//      CHECKFULLCASE: |  1 { F,  C,  -  = T      }
161// CHECKFULLCASE-NEXT: |  2 { T,  C,  -  = T      }
162//      CHECKFULLCASE: |  C1-Pair: not covered
163// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
164// CHECKFULLCASE-NEXT: |  C3-Pair: not covered
165//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
166//      CHECKFULLCASE: |  1 { F,  T,  C  = T      }
167// CHECKFULLCASE-NEXT: |  2 { T,  -,  C  = T      }
168//      CHECKFULLCASE: |  C1-Pair: not covered
169// CHECKFULLCASE-NEXT: |  C2-Pair: not covered
170// CHECKFULLCASE-NEXT: |  C3-Pair: constant folded
171//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
172//      CHECKFULLCASE: |  1 { F,  C,  T  = T      }
173// CHECKFULLCASE-NEXT: |  2 { T,  C,  -  = T      }
174//      CHECKFULLCASE: |  C1-Pair: not covered
175// CHECKFULLCASE-NEXT: |  C2-Pair: constant folded
176// CHECKFULLCASE-NEXT: |  C3-Pair: not covered
177//      CHECKFULLCASE: |  MC/DC Coverage for Decision: 0.00%
178
179//      REPORT: _Z5case0b {{.*}} 1       1   0.00%
180// REPORT-NEXT: _Z5case1b {{.*}} 1       1   0.00%
181// REPORT-NEXT: _Z5case2b {{.*}} 1       0 100.00%
182// REPORT-NEXT: _Z5case3b {{.*}} 1       0 100.00%
183// REPORT-NEXT: _Z5case4b {{.*}} 1       1   0.00%
184// REPORT-NEXT: _Z5case5b {{.*}} 1       1   0.00%
185// REPORT-NEXT: _Z5case6b {{.*}} 1       0 100.00%
186// REPORT-NEXT: _Z5case7b {{.*}} 1       0 100.00%
187// REPORT-NEXT: _Z5case8bb {{.*}} 2       2   0.00%
188// REPORT-NEXT: _Z5case9bb {{.*}} 2       2   0.00%
189// REPORT-NEXT: _Z5caseabb {{.*}} 2       0 100.00%
190// REPORT-NEXT: _Z5casebbb {{.*}} 2       0 100.00%
191// REPORT-NEXT: _Z5casecbb {{.*}} 2       2   0.00%
192// REPORT-NEXT: _Z5casedbb {{.*}} 2       2   0.00%
193// REPORT-NEXT: _Z5caseebb {{.*}} 2       2   0.00%
194// REPORT-NEXT: _Z5casefbb {{.*}} 2       2   0.00%
195// REPORT-NEXT: _Z5casegbb {{.*}} 2       2   0.00%
196// REPORT-NEXT: _Z5casehbb {{.*}} 2       2   0.00%
197// REPORT-NEXT: _Z5caseibb {{.*}} 2       0 100.00%
198// REPORT-NEXT: _Z5casejbb {{.*}} 2       0 100.00%
199// REPORT-NEXT: _Z5casekbb {{.*}} 2       2   0.00%
200// REPORT-NEXT: _Z5caselbb {{.*}} 2       2   0.00%
201// REPORT-NEXT: _Z5casembb {{.*}} 2       2   0.00%
202// REPORT-NEXT: _Z5casenbb {{.*}} 2       2   0.00%
203//      REPORT: TOTAL {{.*}} 40      28  30.00%
204
205Instructions for regenerating the test:
206
207cd %S/Inputs # Or copy files into the working directory
208
209clang++ -c -Os \
210    -fcoverage-compilation-dir=. -mllvm -enable-name-compression=false \
211    -fcoverage-mcdc -fprofile-instr-generate -fcoverage-mapping \
212    mcdc-const.cpp mcdc-const-folding.cpp
213
214# Instructions for regenerating proftext
215
216for x in mcdc-const mcdc-const-folding; do (
217  clang++ -fprofile-instr-generate $x.o -o $x
218  find -name '*.profraw' | xargs rm -f
219  export LLVM_PROFILE_FILE=$x-%p.profraw
220  ./$x 0 1
221  if [ "$x" = "mcdc-const-folding" ]; then
222    ./$x 1 0
223    ./$x 1 1
224    ./$x 1 1 # Redundant
225  fi
226  llvm-profdata merge --sparse -o $x.profdata $(find -name '*.profraw')
227  llvm-profdata merge --text -o $x.proftext $x.profdata
228); done
229