@@ -364,10 +364,13 @@ impl<'a> MakeBcbCounters<'a> {
364
364
) ;
365
365
366
366
debug ! ( "{expression_to_bcb:?} gets an expression: {expression:?}" ) ;
367
- if self . basic_coverage_blocks . bcb_has_multiple_in_edges ( expression_to_bcb) {
368
- self . coverage_counters . set_bcb_edge_counter ( from_bcb, expression_to_bcb, expression) ;
369
- } else {
367
+ if let Some ( sole_pred) = self . basic_coverage_blocks . sole_predecessor ( expression_to_bcb) {
368
+ // This edge normally wouldn't get its own counter, so attach the expression
369
+ // to its target node instead, so that `edge_has_no_counter` can see it.
370
+ assert_eq ! ( sole_pred, from_bcb) ;
370
371
self . coverage_counters . set_bcb_counter ( expression_to_bcb, expression) ;
372
+ } else {
373
+ self . coverage_counters . set_bcb_edge_counter ( from_bcb, expression_to_bcb, expression) ;
371
374
}
372
375
}
373
376
@@ -413,10 +416,12 @@ impl<'a> MakeBcbCounters<'a> {
413
416
from_bcb : BasicCoverageBlock ,
414
417
to_bcb : BasicCoverageBlock ,
415
418
) -> BcbCounter {
416
- // If the target BCB has only one in-edge (i.e. this one), then create
417
- // a node counter instead, since it will have the same value.
418
- if !self . basic_coverage_blocks . bcb_has_multiple_in_edges ( to_bcb) {
419
- assert_eq ! ( [ from_bcb] . as_slice( ) , self . basic_coverage_blocks. predecessors[ to_bcb] ) ;
419
+ // If the target node has exactly one in-edge (i.e. this one), then just
420
+ // use the node's counter, since it will have the same value.
421
+ if let Some ( sole_pred) = self . basic_coverage_blocks . sole_predecessor ( to_bcb) {
422
+ assert_eq ! ( sole_pred, from_bcb) ;
423
+ // This call must take care not to invoke `get_or_make_edge` for
424
+ // this edge, since that would result in infinite recursion!
420
425
return self . get_or_make_node_counter ( to_bcb) ;
421
426
}
422
427
@@ -508,18 +513,14 @@ impl<'a> MakeBcbCounters<'a> {
508
513
from_bcb : BasicCoverageBlock ,
509
514
to_bcb : BasicCoverageBlock ,
510
515
) -> bool {
511
- self . edge_counter ( from_bcb, to_bcb) . is_none ( )
512
- }
513
-
514
- fn edge_counter (
515
- & self ,
516
- from_bcb : BasicCoverageBlock ,
517
- to_bcb : BasicCoverageBlock ,
518
- ) -> Option < & BcbCounter > {
519
- if self . basic_coverage_blocks . bcb_has_multiple_in_edges ( to_bcb) {
520
- self . coverage_counters . bcb_edge_counters . get ( & ( from_bcb, to_bcb) )
521
- } else {
522
- self . coverage_counters . bcb_counters [ to_bcb] . as_ref ( )
523
- }
516
+ let edge_counter =
517
+ if let Some ( sole_pred) = self . basic_coverage_blocks . sole_predecessor ( to_bcb) {
518
+ assert_eq ! ( sole_pred, from_bcb) ;
519
+ self . coverage_counters . bcb_counters [ to_bcb]
520
+ } else {
521
+ self . coverage_counters . bcb_edge_counters . get ( & ( from_bcb, to_bcb) ) . copied ( )
522
+ } ;
523
+
524
+ edge_counter. is_none ( )
524
525
}
525
526
}
0 commit comments