Skip to content

Commit ec0110b

Browse files
committed
coverage: Merge refined spans in a separate final pass
This makes `push_refined_span` trivial, which will let us inline it and benefit from partial borrows of `refined_spans`.
1 parent c9d85d6 commit ec0110b

File tree

1 file changed

+16
-13
lines changed
  • compiler/rustc_mir_transform/src/coverage

1 file changed

+16
-13
lines changed

compiler/rustc_mir_transform/src/coverage/spans.rs

+16-13
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,10 @@ impl CoverageSpan {
8989
}
9090
}
9191

92-
pub fn merge_from(&mut self, mut other: CoverageSpan) {
93-
debug_assert!(self.is_mergeable(&other));
92+
pub fn merge_from(&mut self, other: &Self) {
93+
debug_assert!(self.is_mergeable(other));
9494
self.span = self.span.to(other.span);
95-
self.merged_spans.append(&mut other.merged_spans);
95+
self.merged_spans.extend_from_slice(&other.merged_spans);
9696
}
9797

9898
pub fn cutoff_statements_at(&mut self, cutoff_pos: BytePos) {
@@ -267,7 +267,7 @@ impl<'a> CoverageSpansGenerator<'a> {
267267
if curr.is_mergeable(prev) {
268268
debug!(" same bcb (and neither is a closure), merge with prev={prev:?}");
269269
let prev = self.take_prev();
270-
self.curr_mut().merge_from(prev);
270+
self.curr_mut().merge_from(&prev);
271271
self.maybe_push_macro_name_span();
272272
// Note that curr.span may now differ from curr_original_span
273273
} else if prev.span.hi() <= curr.span.lo() {
@@ -346,6 +346,17 @@ impl<'a> CoverageSpansGenerator<'a> {
346346
self.push_refined_span(prev);
347347
}
348348

349+
// Do one last merge pass, to simplify the output.
350+
self.refined_spans.dedup_by(|b, a| {
351+
if a.is_mergeable(b) {
352+
debug!(?a, ?b, "merging list-adjacent refined spans");
353+
a.merge_from(b);
354+
true
355+
} else {
356+
false
357+
}
358+
});
359+
349360
// Remove `CoverageSpan`s derived from closures, originally added to ensure the coverage
350361
// regions for the current function leave room for the closure's own coverage regions
351362
// (injected separately, from the closure's own MIR).
@@ -354,15 +365,7 @@ impl<'a> CoverageSpansGenerator<'a> {
354365
}
355366

356367
fn push_refined_span(&mut self, covspan: CoverageSpan) {
357-
if let Some(last) = self.refined_spans.last_mut()
358-
&& last.is_mergeable(&covspan)
359-
{
360-
// Instead of pushing the new span, merge it with the last refined span.
361-
debug!(?last, ?covspan, "merging new refined span with last refined span");
362-
last.merge_from(covspan);
363-
} else {
364-
self.refined_spans.push(covspan);
365-
}
368+
self.refined_spans.push(covspan);
366369
}
367370

368371
/// If `curr` is part of a new macro expansion, carve out and push a separate

0 commit comments

Comments
 (0)