Skip to content

Commit 0eec39b

Browse files
committed
make traversal::reverse_postorder use RPO cache
1 parent 8f6e651 commit 0eec39b

File tree

1 file changed

+6
-29
lines changed

1 file changed

+6
-29
lines changed

compiler/rustc_middle/src/mir/traversal.rs

Lines changed: 6 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -295,34 +295,11 @@ pub fn reachable_as_bitset(body: &Body<'_>) -> BitSet<BasicBlock> {
295295
iter.visited
296296
}
297297

298-
#[derive(Clone)]
299-
pub struct ReversePostorderIter<'a, 'tcx> {
298+
/// Creates an iterator over the `Body`'s basic blocks, that:
299+
/// - returns basic blocks in a reverse postorder,
300+
/// - makes use of the `BasicBlocks` CFG cache's reverse postorder.
301+
pub fn reverse_postorder<'a, 'tcx>(
300302
body: &'a Body<'tcx>,
301-
blocks: &'a [BasicBlock],
302-
idx: usize,
303-
}
304-
305-
impl<'a, 'tcx> Iterator for ReversePostorderIter<'a, 'tcx> {
306-
type Item = (BasicBlock, &'a BasicBlockData<'tcx>);
307-
308-
fn next(&mut self) -> Option<(BasicBlock, &'a BasicBlockData<'tcx>)> {
309-
if self.idx == 0 {
310-
return None;
311-
}
312-
self.idx -= 1;
313-
314-
self.blocks.get(self.idx).map(|&bb| (bb, &self.body[bb]))
315-
}
316-
317-
fn size_hint(&self) -> (usize, Option<usize>) {
318-
(self.idx, Some(self.idx))
319-
}
320-
}
321-
322-
impl<'a, 'tcx> ExactSizeIterator for ReversePostorderIter<'a, 'tcx> {}
323-
324-
pub fn reverse_postorder<'a, 'tcx>(body: &'a Body<'tcx>) -> ReversePostorderIter<'a, 'tcx> {
325-
let blocks = body.basic_blocks.postorder();
326-
let len = blocks.len();
327-
ReversePostorderIter { body, blocks, idx: len }
303+
) -> impl Iterator<Item = (BasicBlock, &'a BasicBlockData<'tcx>)> + ExactSizeIterator {
304+
body.basic_blocks.reverse_postorder().iter().map(|&bb| (bb, &body.basic_blocks[bb]))
328305
}

0 commit comments

Comments
 (0)