Skip to content

Commit 6733502

Browse files
committed
coverage: Simplify counter expressions (a + b) - b to just a
There are other simplifications we could potentially be performing, but this one is directly motivated by branch coverage of match arms, because it naturally handles the common case where a match arm has no guard.
1 parent 381f8be commit 6733502

File tree

8 files changed

+54
-66
lines changed

8 files changed

+54
-66
lines changed

compiler/rustc_mir_transform/src/coverage/counters.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::coverage::graph::{BasicCoverageBlock, CoverageGraph, TraverseCoverage
1010

1111
/// The coverage counter or counter expression associated with a particular
1212
/// BCB node or BCB edge.
13-
#[derive(Clone, Copy)]
13+
#[derive(Clone, Copy, PartialEq, Eq)]
1414
pub(super) enum BcbCounter {
1515
Counter { id: CounterId },
1616
Expression { id: ExpressionId },
@@ -96,6 +96,16 @@ impl CoverageCounters {
9696
}
9797

9898
fn make_expression(&mut self, lhs: BcbCounter, op: Op, rhs: BcbCounter) -> BcbCounter {
99+
// Replace `(a + b) - b` with `a`, since this happens often.
100+
if op == Op::Subtract
101+
&& let BcbCounter::Expression { id } = lhs
102+
&& let lhs_expr = &self.expressions[id]
103+
&& lhs_expr.op == Op::Add
104+
&& lhs_expr.rhs == rhs
105+
{
106+
return lhs_expr.lhs;
107+
}
108+
99109
let id = self.expressions.push(BcbExpression { lhs, op, rhs });
100110
BcbCounter::Expression { id }
101111
}

tests/coverage/async_block.cov-map

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
Function name: async_block::main
2-
Raw bytes (38): 0x[01, 01, 02, 01, 05, 03, 05, 06, 01, 05, 01, 00, 0b, 05, 01, 09, 00, 0a, 03, 00, 0e, 00, 13, 05, 00, 14, 01, 16, 05, 07, 0a, 02, 06, 06, 03, 01, 00, 02]
2+
Raw bytes (36): 0x[01, 01, 01, 01, 05, 06, 01, 05, 01, 00, 0b, 05, 01, 09, 00, 0a, 03, 00, 0e, 00, 13, 05, 00, 14, 01, 16, 05, 07, 0a, 02, 06, 01, 03, 01, 00, 02]
33
Number of files: 1
44
- file 0 => global file 1
5-
Number of expressions: 2
5+
Number of expressions: 1
66
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
7-
- expression 1 operands: lhs = Expression(0, Add), rhs = Counter(1)
87
Number of file 0 mappings: 6
98
- Code(Counter(0)) at (prev + 5, 1) to (start + 0, 11)
109
- Code(Counter(1)) at (prev + 1, 9) to (start + 0, 10)
1110
- Code(Expression(0, Add)) at (prev + 0, 14) to (start + 0, 19)
1211
= (c0 + c1)
1312
- Code(Counter(1)) at (prev + 0, 20) to (start + 1, 22)
1413
- Code(Counter(1)) at (prev + 7, 10) to (start + 2, 6)
15-
- Code(Expression(1, Sub)) at (prev + 3, 1) to (start + 0, 2)
16-
= ((c0 + c1) - c1)
14+
- Code(Counter(0)) at (prev + 3, 1) to (start + 0, 2)
1715

1816
Function name: async_block::main::{closure#0}
1917
Raw bytes (28): 0x[01, 01, 02, 01, 05, 05, 02, 04, 01, 07, 1c, 01, 17, 05, 01, 18, 02, 0e, 02, 02, 14, 02, 0e, 07, 03, 09, 00, 0a]

tests/coverage/branch/while.cov-map

+10-16
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,36 @@
11
Function name: while::while_cond
2-
Raw bytes (42): 0x[01, 01, 03, 05, 09, 03, 09, 03, 09, 06, 01, 0c, 01, 01, 10, 05, 03, 09, 00, 12, 03, 01, 0b, 00, 10, 20, 09, 0a, 00, 0b, 00, 10, 09, 00, 11, 02, 06, 0a, 03, 01, 00, 02]
2+
Raw bytes (38): 0x[01, 01, 01, 05, 09, 06, 01, 0c, 01, 01, 10, 05, 03, 09, 00, 12, 03, 01, 0b, 00, 10, 20, 09, 05, 00, 0b, 00, 10, 09, 00, 11, 02, 06, 05, 03, 01, 00, 02]
33
Number of files: 1
44
- file 0 => global file 1
5-
Number of expressions: 3
5+
Number of expressions: 1
66
- expression 0 operands: lhs = Counter(1), rhs = Counter(2)
7-
- expression 1 operands: lhs = Expression(0, Add), rhs = Counter(2)
8-
- expression 2 operands: lhs = Expression(0, Add), rhs = Counter(2)
97
Number of file 0 mappings: 6
108
- Code(Counter(0)) at (prev + 12, 1) to (start + 1, 16)
119
- Code(Counter(1)) at (prev + 3, 9) to (start + 0, 18)
1210
- Code(Expression(0, Add)) at (prev + 1, 11) to (start + 0, 16)
1311
= (c1 + c2)
14-
- Branch { true: Counter(2), false: Expression(2, Sub) } at (prev + 0, 11) to (start + 0, 16)
12+
- Branch { true: Counter(2), false: Counter(1) } at (prev + 0, 11) to (start + 0, 16)
1513
true = c2
16-
false = ((c1 + c2) - c2)
14+
false = c1
1715
- Code(Counter(2)) at (prev + 0, 17) to (start + 2, 6)
18-
- Code(Expression(2, Sub)) at (prev + 3, 1) to (start + 0, 2)
19-
= ((c1 + c2) - c2)
16+
- Code(Counter(1)) at (prev + 3, 1) to (start + 0, 2)
2017

2118
Function name: while::while_cond_not
22-
Raw bytes (42): 0x[01, 01, 03, 05, 09, 03, 09, 03, 09, 06, 01, 15, 01, 01, 10, 05, 03, 09, 00, 12, 03, 01, 0b, 00, 14, 20, 09, 0a, 00, 0b, 00, 14, 09, 00, 15, 02, 06, 0a, 03, 01, 00, 02]
19+
Raw bytes (38): 0x[01, 01, 01, 05, 09, 06, 01, 15, 01, 01, 10, 05, 03, 09, 00, 12, 03, 01, 0b, 00, 14, 20, 09, 05, 00, 0b, 00, 14, 09, 00, 15, 02, 06, 05, 03, 01, 00, 02]
2320
Number of files: 1
2421
- file 0 => global file 1
25-
Number of expressions: 3
22+
Number of expressions: 1
2623
- expression 0 operands: lhs = Counter(1), rhs = Counter(2)
27-
- expression 1 operands: lhs = Expression(0, Add), rhs = Counter(2)
28-
- expression 2 operands: lhs = Expression(0, Add), rhs = Counter(2)
2924
Number of file 0 mappings: 6
3025
- Code(Counter(0)) at (prev + 21, 1) to (start + 1, 16)
3126
- Code(Counter(1)) at (prev + 3, 9) to (start + 0, 18)
3227
- Code(Expression(0, Add)) at (prev + 1, 11) to (start + 0, 20)
3328
= (c1 + c2)
34-
- Branch { true: Counter(2), false: Expression(2, Sub) } at (prev + 0, 11) to (start + 0, 20)
29+
- Branch { true: Counter(2), false: Counter(1) } at (prev + 0, 11) to (start + 0, 20)
3530
true = c2
36-
false = ((c1 + c2) - c2)
31+
false = c1
3732
- Code(Counter(2)) at (prev + 0, 21) to (start + 2, 6)
38-
- Code(Expression(2, Sub)) at (prev + 3, 1) to (start + 0, 2)
39-
= ((c1 + c2) - c2)
33+
- Code(Counter(1)) at (prev + 3, 1) to (start + 0, 2)
4034

4135
Function name: while::while_op_and
4236
Raw bytes (56): 0x[01, 01, 04, 05, 09, 03, 0d, 03, 0d, 11, 0d, 08, 01, 1e, 01, 01, 10, 05, 03, 09, 01, 12, 03, 02, 0b, 00, 10, 20, 0a, 0d, 00, 0b, 00, 10, 0a, 00, 14, 00, 19, 20, 09, 11, 00, 14, 00, 19, 09, 00, 1a, 03, 06, 0f, 04, 01, 00, 02]

tests/coverage/inline.cov-map

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
Function name: inline::display::<char>
2-
Raw bytes (33): 0x[01, 01, 02, 01, 05, 03, 05, 05, 01, 29, 01, 00, 22, 05, 01, 09, 00, 0a, 03, 00, 0e, 00, 10, 05, 00, 11, 02, 06, 06, 03, 05, 01, 02]
2+
Raw bytes (31): 0x[01, 01, 01, 01, 05, 05, 01, 29, 01, 00, 22, 05, 01, 09, 00, 0a, 03, 00, 0e, 00, 10, 05, 00, 11, 02, 06, 01, 03, 05, 01, 02]
33
Number of files: 1
44
- file 0 => global file 1
5-
Number of expressions: 2
5+
Number of expressions: 1
66
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
7-
- expression 1 operands: lhs = Expression(0, Add), rhs = Counter(1)
87
Number of file 0 mappings: 5
98
- Code(Counter(0)) at (prev + 41, 1) to (start + 0, 34)
109
- Code(Counter(1)) at (prev + 1, 9) to (start + 0, 10)
1110
- Code(Expression(0, Add)) at (prev + 0, 14) to (start + 0, 16)
1211
= (c0 + c1)
1312
- Code(Counter(1)) at (prev + 0, 17) to (start + 2, 6)
14-
- Code(Expression(1, Sub)) at (prev + 3, 5) to (start + 1, 2)
15-
= ((c0 + c1) - c1)
13+
- Code(Counter(0)) at (prev + 3, 5) to (start + 1, 2)
1614

1715
Function name: inline::error
1816
Raw bytes (9): 0x[01, 01, 00, 01, 01, 31, 01, 01, 14]

tests/coverage/simple_loop.cov-map

+10-14
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,23 @@
11
Function name: simple_loop::main
2-
Raw bytes (57): 0x[01, 01, 09, 01, 05, 23, 09, 05, 02, 1f, 09, 23, 09, 05, 02, 1f, 09, 23, 09, 05, 02, 07, 01, 04, 01, 09, 10, 05, 0a, 05, 05, 06, 02, 05, 06, 00, 07, 1f, 05, 0d, 02, 0e, 1a, 04, 0d, 00, 12, 09, 02, 0a, 03, 0a, 1a, 06, 01, 00, 02]
2+
Raw bytes (49): 0x[01, 01, 05, 01, 05, 13, 09, 05, 02, 05, 02, 05, 02, 07, 01, 04, 01, 09, 10, 05, 0a, 05, 05, 06, 02, 05, 06, 00, 07, 07, 05, 0d, 02, 0e, 13, 04, 0d, 00, 12, 09, 02, 0a, 03, 0a, 13, 06, 01, 00, 02]
33
Number of files: 1
44
- file 0 => global file 1
5-
Number of expressions: 9
5+
Number of expressions: 5
66
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
7-
- expression 1 operands: lhs = Expression(8, Add), rhs = Counter(2)
7+
- expression 1 operands: lhs = Expression(4, Add), rhs = Counter(2)
88
- expression 2 operands: lhs = Counter(1), rhs = Expression(0, Sub)
9-
- expression 3 operands: lhs = Expression(7, Add), rhs = Counter(2)
10-
- expression 4 operands: lhs = Expression(8, Add), rhs = Counter(2)
11-
- expression 5 operands: lhs = Counter(1), rhs = Expression(0, Sub)
12-
- expression 6 operands: lhs = Expression(7, Add), rhs = Counter(2)
13-
- expression 7 operands: lhs = Expression(8, Add), rhs = Counter(2)
14-
- expression 8 operands: lhs = Counter(1), rhs = Expression(0, Sub)
9+
- expression 3 operands: lhs = Counter(1), rhs = Expression(0, Sub)
10+
- expression 4 operands: lhs = Counter(1), rhs = Expression(0, Sub)
1511
Number of file 0 mappings: 7
1612
- Code(Counter(0)) at (prev + 4, 1) to (start + 9, 16)
1713
- Code(Counter(1)) at (prev + 10, 5) to (start + 5, 6)
1814
- Code(Expression(0, Sub)) at (prev + 5, 6) to (start + 0, 7)
1915
= (c0 - c1)
20-
- Code(Expression(7, Add)) at (prev + 5, 13) to (start + 2, 14)
16+
- Code(Expression(1, Add)) at (prev + 5, 13) to (start + 2, 14)
2117
= ((c1 + (c0 - c1)) + c2)
22-
- Code(Expression(6, Sub)) at (prev + 4, 13) to (start + 0, 18)
23-
= (((c1 + (c0 - c1)) + c2) - c2)
18+
- Code(Expression(4, Add)) at (prev + 4, 13) to (start + 0, 18)
19+
= (c1 + (c0 - c1))
2420
- Code(Counter(2)) at (prev + 2, 10) to (start + 3, 10)
25-
- Code(Expression(6, Sub)) at (prev + 6, 1) to (start + 0, 2)
26-
= (((c1 + (c0 - c1)) + c2) - c2)
21+
- Code(Expression(4, Add)) at (prev + 6, 1) to (start + 0, 2)
22+
= (c1 + (c0 - c1))
2723

tests/coverage/unicode.cov-map

+12-16
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,27 @@
11
Function name: unicode::main
2-
Raw bytes (67): 0x[01, 01, 09, 01, 05, 03, 05, 1e, 0d, 22, 09, 03, 05, 11, 1b, 1e, 0d, 22, 09, 03, 05, 09, 01, 0e, 01, 00, 0b, 05, 01, 09, 00, 0c, 03, 00, 10, 00, 1b, 05, 00, 1c, 00, 28, 22, 02, 08, 00, 25, 09, 00, 29, 00, 46, 11, 00, 47, 02, 06, 1b, 02, 06, 00, 07, 17, 02, 05, 01, 02]
2+
Raw bytes (61): 0x[01, 01, 06, 01, 05, 16, 0d, 01, 09, 11, 13, 16, 0d, 01, 09, 09, 01, 0e, 01, 00, 0b, 05, 01, 09, 00, 0c, 03, 00, 10, 00, 1b, 05, 00, 1c, 00, 28, 01, 02, 08, 00, 25, 09, 00, 29, 00, 46, 11, 00, 47, 02, 06, 13, 02, 06, 00, 07, 0f, 02, 05, 01, 02]
33
Number of files: 1
44
- file 0 => global file 1
5-
Number of expressions: 9
5+
Number of expressions: 6
66
- expression 0 operands: lhs = Counter(0), rhs = Counter(1)
7-
- expression 1 operands: lhs = Expression(0, Add), rhs = Counter(1)
8-
- expression 2 operands: lhs = Expression(7, Sub), rhs = Counter(3)
9-
- expression 3 operands: lhs = Expression(8, Sub), rhs = Counter(2)
10-
- expression 4 operands: lhs = Expression(0, Add), rhs = Counter(1)
11-
- expression 5 operands: lhs = Counter(4), rhs = Expression(6, Add)
12-
- expression 6 operands: lhs = Expression(7, Sub), rhs = Counter(3)
13-
- expression 7 operands: lhs = Expression(8, Sub), rhs = Counter(2)
14-
- expression 8 operands: lhs = Expression(0, Add), rhs = Counter(1)
7+
- expression 1 operands: lhs = Expression(5, Sub), rhs = Counter(3)
8+
- expression 2 operands: lhs = Counter(0), rhs = Counter(2)
9+
- expression 3 operands: lhs = Counter(4), rhs = Expression(4, Add)
10+
- expression 4 operands: lhs = Expression(5, Sub), rhs = Counter(3)
11+
- expression 5 operands: lhs = Counter(0), rhs = Counter(2)
1512
Number of file 0 mappings: 9
1613
- Code(Counter(0)) at (prev + 14, 1) to (start + 0, 11)
1714
- Code(Counter(1)) at (prev + 1, 9) to (start + 0, 12)
1815
- Code(Expression(0, Add)) at (prev + 0, 16) to (start + 0, 27)
1916
= (c0 + c1)
2017
- Code(Counter(1)) at (prev + 0, 28) to (start + 0, 40)
21-
- Code(Expression(8, Sub)) at (prev + 2, 8) to (start + 0, 37)
22-
= ((c0 + c1) - c1)
18+
- Code(Counter(0)) at (prev + 2, 8) to (start + 0, 37)
2319
- Code(Counter(2)) at (prev + 0, 41) to (start + 0, 70)
2420
- Code(Counter(4)) at (prev + 0, 71) to (start + 2, 6)
25-
- Code(Expression(6, Add)) at (prev + 2, 6) to (start + 0, 7)
26-
= ((((c0 + c1) - c1) - c2) + c3)
27-
- Code(Expression(5, Add)) at (prev + 2, 5) to (start + 1, 2)
28-
= (c4 + ((((c0 + c1) - c1) - c2) + c3))
21+
- Code(Expression(4, Add)) at (prev + 2, 6) to (start + 0, 7)
22+
= ((c0 - c2) + c3)
23+
- Code(Expression(3, Add)) at (prev + 2, 5) to (start + 1, 2)
24+
= (c4 + ((c0 - c2) + c3))
2925

3026
Function name: unicode::他 (unused)
3127
Raw bytes (9): 0x[01, 01, 00, 01, 00, 1e, 19, 00, 25]

tests/coverage/while.cov-map

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
Function name: while::main
2-
Raw bytes (28): 0x[01, 01, 02, 01, 00, 03, 00, 04, 01, 01, 01, 01, 10, 03, 02, 0b, 00, 14, 00, 00, 15, 02, 06, 06, 03, 01, 00, 02]
2+
Raw bytes (26): 0x[01, 01, 01, 01, 00, 04, 01, 01, 01, 01, 10, 03, 02, 0b, 00, 14, 00, 00, 15, 02, 06, 01, 03, 01, 00, 02]
33
Number of files: 1
44
- file 0 => global file 1
5-
Number of expressions: 2
5+
Number of expressions: 1
66
- expression 0 operands: lhs = Counter(0), rhs = Zero
7-
- expression 1 operands: lhs = Expression(0, Add), rhs = Zero
87
Number of file 0 mappings: 4
98
- Code(Counter(0)) at (prev + 1, 1) to (start + 1, 16)
109
- Code(Expression(0, Add)) at (prev + 2, 11) to (start + 0, 20)
1110
= (c0 + Zero)
1211
- Code(Zero) at (prev + 0, 21) to (start + 2, 6)
13-
- Code(Expression(1, Sub)) at (prev + 3, 1) to (start + 0, 2)
14-
= ((c0 + Zero) - Zero)
12+
- Code(Counter(0)) at (prev + 3, 1) to (start + 0, 2)
1513

tests/mir-opt/coverage/instrument_coverage.main.InstrumentCoverage.diff

+2-4
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@
88
let mut _3: !;
99

1010
+ coverage ExpressionId(0) => Expression { lhs: Counter(0), op: Add, rhs: Counter(1) };
11-
+ coverage ExpressionId(1) => Expression { lhs: Expression(0), op: Subtract, rhs: Counter(1) };
1211
+ coverage Code(Counter(0)) => $DIR/instrument_coverage.rs:10:1 - 10:11;
1312
+ coverage Code(Expression(0)) => $DIR/instrument_coverage.rs:11:5 - 12:17;
14-
+ coverage Code(Expression(1)) => $DIR/instrument_coverage.rs:13:13 - 13:18;
13+
+ coverage Code(Counter(0)) => $DIR/instrument_coverage.rs:13:13 - 13:18;
1514
+ coverage Code(Counter(1)) => $DIR/instrument_coverage.rs:14:10 - 14:11;
16-
+ coverage Code(Expression(1)) => $DIR/instrument_coverage.rs:16:1 - 16:2;
15+
+ coverage Code(Counter(0)) => $DIR/instrument_coverage.rs:16:1 - 16:2;
1716
+
1817
bb0: {
1918
+ Coverage::CounterIncrement(0);
@@ -35,7 +34,6 @@
3534
}
3635

3736
bb4: {
38-
+ Coverage::ExpressionUsed(1);
3937
_0 = const ();
4038
StorageDead(_2);
4139
return;

0 commit comments

Comments
 (0)