Skip to content

Commit

Permalink
Auto merge of #137923 - scottmcm:fix-postorder-size-hint, r=<try>
Browse files Browse the repository at this point in the history
Simplify `<Postorder as Iterator>::size_hint`

The current version is sometimes malformed (cc #137919); let's see if we can get away with a loose but trivially-correct one.
  • Loading branch information
bors committed Mar 3, 2025
2 parents 81d8edc + e403654 commit 6b39be3
Showing 1 changed file with 6 additions and 11 deletions.
17 changes: 6 additions & 11 deletions compiler/rustc_middle/src/mir/traversal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,6 @@ pub struct Postorder<'a, 'tcx> {
basic_blocks: &'a IndexSlice<BasicBlock, BasicBlockData<'tcx>>,
visited: DenseBitSet<BasicBlock>,
visit_stack: Vec<(BasicBlock, Successors<'a>)>,
root_is_start_block: bool,
/// A non-empty `extra` allows for a precise calculation of the successors.
extra: Option<(TyCtxt<'tcx>, Instance<'tcx>)>,
}
Expand All @@ -123,7 +122,6 @@ impl<'a, 'tcx> Postorder<'a, 'tcx> {
basic_blocks,
visited: DenseBitSet::new_empty(basic_blocks.len()),
visit_stack: Vec::new(),
root_is_start_block: root == START_BLOCK,
extra,
};

Expand Down Expand Up @@ -211,16 +209,13 @@ impl<'tcx> Iterator for Postorder<'_, 'tcx> {
}

fn size_hint(&self) -> (usize, Option<usize>) {
// All the blocks, minus the number of blocks we've visited.
let upper = self.basic_blocks.len() - self.visited.count();

let lower = if self.root_is_start_block {
// We will visit all remaining blocks exactly once.
upper
} else {
self.visit_stack.len()
};
// These bounds are not at all tight, but that's fine.
// It's not worth a popcnt loop in `DenseBitSet` to improve the upper,
// and in mono-reachable we can't be precise anyway.
// Leaning on amortized growth is fine.

let lower = self.visit_stack.len();
let upper = self.basic_blocks.len();
(lower, Some(upper))
}
}
Expand Down

0 comments on commit 6b39be3

Please sign in to comment.