@@ -62,6 +62,7 @@ pub(super) struct CoverageCounters {
62
62
/// corresponding operator (+ or -) and its LHS/RHS operands.
63
63
expressions : IndexVec < ExpressionId , Expression > ,
64
64
65
+ expression_reference : FxHashMap < Expression , BcbCounter > ,
65
66
/// Some terms referencing to composite expressions count sum execution times
66
67
/// of several basic coverage blocks. Mostly such coverage terms are used by patterns including or pattern.
67
68
/// Expressions for these terms should generate statements to some blocks in case
@@ -84,6 +85,7 @@ impl CoverageCounters {
84
85
bcb_counters : IndexVec :: from_elem_n ( None , num_bcbs) ,
85
86
bcb_edge_counters : FxHashMap :: default ( ) ,
86
87
expressions : IndexVec :: new ( ) ,
88
+ expression_reference : FxHashMap :: default ( ) ,
87
89
combined_bcb_expressions : BTreeMap :: new ( ) ,
88
90
} ;
89
91
@@ -105,8 +107,37 @@ impl CoverageCounters {
105
107
rhs : BcbCounter ,
106
108
) -> BcbCounter {
107
109
let expression = Expression { lhs : lhs. as_term ( ) , op, rhs : rhs. as_term ( ) } ;
108
- let id = self . expressions . push ( expression) ;
109
- BcbCounter :: Expression { id }
110
+ if let Some ( counter) = self . expression_reference . get ( & expression) {
111
+ * counter
112
+ } else {
113
+ let counter = BcbCounter :: Expression { id : self . expressions . push ( expression. clone ( ) ) } ;
114
+ self . expression_reference . insert ( expression, counter) ;
115
+ // Later branches of pattern matching might try to make expression with C2 - (C2 - C1), (C2 - C1) + C1
116
+ match ( lhs, op, rhs) {
117
+ ( BcbCounter :: Counter { .. } , Op :: Add , BcbCounter :: Counter { .. } ) => {
118
+ self . expression_reference . insert (
119
+ Expression { lhs : counter. as_term ( ) , op : Op :: Subtract , rhs : lhs. as_term ( ) } ,
120
+ rhs,
121
+ ) ;
122
+ self . expression_reference . insert (
123
+ Expression { lhs : counter. as_term ( ) , op : Op :: Subtract , rhs : rhs. as_term ( ) } ,
124
+ lhs,
125
+ ) ;
126
+ }
127
+ ( BcbCounter :: Counter { .. } , Op :: Subtract , BcbCounter :: Counter { .. } ) => {
128
+ self . expression_reference . insert (
129
+ Expression { lhs : counter. as_term ( ) , op : Op :: Add , rhs : rhs. as_term ( ) } ,
130
+ lhs,
131
+ ) ;
132
+ self . expression_reference . insert (
133
+ Expression { lhs : lhs. as_term ( ) , op : Op :: Subtract , rhs : counter. as_term ( ) } ,
134
+ rhs,
135
+ ) ;
136
+ }
137
+ _ => { }
138
+ }
139
+ counter
140
+ }
110
141
}
111
142
112
143
/// Variant of `make_expression` that makes `lhs` optional and assumes [`Op::Add`].
0 commit comments