Skip to content

Commit 59f4f1c

Browse files
committed
coverage: Don't store loop backedges in the traversal context
As long as we store the loop header BCB, we can look up its incoming loop backedges as needed.
1 parent 15360b3 commit 59f4f1c

File tree

1 file changed

+10
-7
lines changed
  • compiler/rustc_mir_transform/src/coverage

1 file changed

+10
-7
lines changed

compiler/rustc_mir_transform/src/coverage/graph.rs

+10-7
Original file line numberDiff line numberDiff line change
@@ -386,8 +386,11 @@ fn bcb_filtered_successors<'a, 'tcx>(
386386
/// ensures a loop is completely traversed before processing Blocks after the end of the loop.
387387
#[derive(Debug)]
388388
pub(super) struct TraversalContext {
389-
/// From one or more backedges returning to a loop header.
390-
loop_backedges: Option<(Vec<BasicCoverageBlock>, BasicCoverageBlock)>,
389+
/// BCB with one or more incoming loop backedges, indicating which loop
390+
/// this context is for.
391+
///
392+
/// If `None`, this is the non-loop context for the function as a whole.
393+
loop_header: Option<BasicCoverageBlock>,
391394

392395
/// Worklist of BCBs to be processed in this context.
393396
worklist: VecDeque<BasicCoverageBlock>,
@@ -406,7 +409,7 @@ impl<'a> TraverseCoverageGraphWithLoops<'a> {
406409
let backedges = find_loop_backedges(basic_coverage_blocks);
407410

408411
let worklist = VecDeque::from([basic_coverage_blocks.start_node()]);
409-
let context_stack = vec![TraversalContext { loop_backedges: None, worklist }];
412+
let context_stack = vec![TraversalContext { loop_header: None, worklist }];
410413

411414
// `context_stack` starts with a `TraversalContext` for the main function context (beginning
412415
// with the `start` BasicCoverageBlock of the function). New worklists are pushed to the top
@@ -422,8 +425,8 @@ impl<'a> TraverseCoverageGraphWithLoops<'a> {
422425
self.context_stack
423426
.iter()
424427
.rev()
425-
.filter_map(|context| context.loop_backedges.as_ref())
426-
.map(|(from_bcbs, _to_bcb)| from_bcbs.as_slice())
428+
.filter_map(|context| context.loop_header)
429+
.map(|header_bcb| self.backedges[header_bcb].as_slice())
427430
}
428431

429432
pub(super) fn next(&mut self) -> Option<BasicCoverageBlock> {
@@ -443,7 +446,7 @@ impl<'a> TraverseCoverageGraphWithLoops<'a> {
443446
if self.backedges[bcb].len() > 0 {
444447
debug!("{bcb:?} is a loop header! Start a new TraversalContext...");
445448
self.context_stack.push(TraversalContext {
446-
loop_backedges: Some((self.backedges[bcb].clone(), bcb)),
449+
loop_header: Some(bcb),
447450
worklist: VecDeque::new(),
448451
});
449452
}
@@ -484,7 +487,7 @@ impl<'a> TraverseCoverageGraphWithLoops<'a> {
484487
// `Expression`s by creating a Counter in a `BasicCoverageBlock` that the
485488
// branching block would have given an `Expression` (or vice versa).
486489
let (some_successor_to_add, _) =
487-
if let Some((_, loop_header)) = context.loop_backedges {
490+
if let Some(loop_header) = context.loop_header {
488491
if basic_coverage_blocks.dominates(loop_header, successor) {
489492
(Some(successor), Some(loop_header))
490493
} else {

0 commit comments

Comments
 (0)