@@ -364,10 +364,13 @@ impl<'a> MakeBcbCounters<'a> {
364364 ) ;
365365
366366 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) ;
370371 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) ;
371374 }
372375 }
373376
@@ -413,10 +416,12 @@ impl<'a> MakeBcbCounters<'a> {
413416 from_bcb : BasicCoverageBlock ,
414417 to_bcb : BasicCoverageBlock ,
415418 ) -> 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!
420425 return self . get_or_make_node_counter ( to_bcb) ;
421426 }
422427
@@ -508,18 +513,14 @@ impl<'a> MakeBcbCounters<'a> {
508513 from_bcb : BasicCoverageBlock ,
509514 to_bcb : BasicCoverageBlock ,
510515 ) -> 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 ( )
524525 }
525526}
0 commit comments