// option. This file may not be copied, modified, or distributed
// except according to those terms.
-use rustc_data_structures::bitvec::BitVector;
-use rustc_data_structures::indexed_vec::Idx;
+use rustc_data_structures::bitvec::BitArray;
use super::*;
#[derive(Clone)]
pub struct Preorder<'a, 'tcx: 'a> {
mir: &'a Mir<'tcx>,
- visited: BitVector,
+ visited: BitArray<BasicBlock>,
worklist: Vec<BasicBlock>,
}
Preorder {
mir,
- visited: BitVector::new(mir.basic_blocks().len()),
+ visited: BitArray::new(mir.basic_blocks().len()),
worklist,
}
}
fn next(&mut self) -> Option<(BasicBlock, &'a BasicBlockData<'tcx>)> {
while let Some(idx) = self.worklist.pop() {
- if !self.visited.insert(idx.index()) {
+ if !self.visited.insert(idx) {
continue;
}
let data = &self.mir[idx];
if let Some(ref term) = data.terminator {
- for &succ in term.successors() {
- self.worklist.push(succ);
- }
+ self.worklist.extend(term.successors());
}
return Some((idx, data));
/// A Postorder traversal of this graph is `D B C A` or `D C B A`
pub struct Postorder<'a, 'tcx: 'a> {
mir: &'a Mir<'tcx>,
- visited: BitVector,
+ visited: BitArray<BasicBlock>,
visit_stack: Vec<(BasicBlock, Successors<'a>)>
}
pub fn new(mir: &'a Mir<'tcx>, root: BasicBlock) -> Postorder<'a, 'tcx> {
let mut po = Postorder {
mir,
- visited: BitVector::new(mir.basic_blocks().len()),
+ visited: BitArray::new(mir.basic_blocks().len()),
visit_stack: Vec::new()
};
let data = &po.mir[root];
if let Some(ref term) = data.terminator {
- po.visited.insert(root.index());
+ po.visited.insert(root);
po.visit_stack.push((root, term.successors()));
po.traverse_successor();
}
break;
};
- if self.visited.insert(bb.index()) {
- if let Some(ref term) = self.mir[bb].terminator {
+ if self.visited.insert(bb) {
+ if let Some(term) = &self.mir[bb].terminator {
self.visit_stack.push((bb, term.successors()));
}
}