mir: &'a Mir<'tcx>,
visited: BitSet<BasicBlock>,
worklist: Vec<BasicBlock>,
+ root_is_start_block: bool,
}
impl<'a, 'tcx> Preorder<'a, 'tcx> {
mir,
visited: BitSet::new_empty(mir.basic_blocks().len()),
worklist,
+ root_is_start_block: root == START_BLOCK,
}
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
// All the blocks, minus the number of blocks we've visited.
- let remaining = self.mir.basic_blocks().len() - self.visited.count();
+ let upper = self.mir.basic_blocks().len() - self.visited.count();
- // We will visit all remaining blocks exactly once.
- (remaining, Some(remaining))
+ let lower = if self.root_is_start_block {
+ // We will visit all remaining blocks exactly once.
+ upper
+ } else {
+ self.worklist.len()
+ };
+
+ (lower, Some(upper))
}
}
-impl<'a, 'tcx> ExactSizeIterator for Preorder<'a, 'tcx> {}
-
/// Postorder traversal of a graph.
///
/// Postorder traversal is when each node is visited after all of it's
pub struct Postorder<'a, 'tcx: 'a> {
mir: &'a Mir<'tcx>,
visited: BitSet<BasicBlock>,
- visit_stack: Vec<(BasicBlock, Successors<'a>)>
+ visit_stack: Vec<(BasicBlock, Successors<'a>)>,
+ root_is_start_block: bool,
}
impl<'a, 'tcx> Postorder<'a, 'tcx> {
let mut po = Postorder {
mir,
visited: BitSet::new_empty(mir.basic_blocks().len()),
- visit_stack: Vec::new()
+ visit_stack: Vec::new(),
+ root_is_start_block: root == START_BLOCK,
};
fn size_hint(&self) -> (usize, Option<usize>) {
// All the blocks, minus the number of blocks we've visited.
- let remaining = self.mir.basic_blocks().len() - self.visited.count();
+ let upper = self.mir.basic_blocks().len() - self.visited.count();
- // We will visit all remaining blocks exactly once.
- (remaining, Some(remaining))
+ let lower = if self.root_is_start_block {
+ // We will visit all remaining blocks exactly once.
+ upper
+ } else {
+ self.visit_stack.len()
+ };
+
+ (lower, Some(upper))
}
}
-impl<'a, 'tcx> ExactSizeIterator for Postorder<'a, 'tcx> {}
-
/// Reverse postorder traversal of a graph
///
/// Reverse postorder is the reverse order of a postorder traversal.