diff --git a/src/librustc_mir/dataflow/framework/cursor.rs b/src/librustc_mir/dataflow/framework/cursor.rs index 2ae353adfc7f..4f5930dc3f5a 100644 --- a/src/librustc_mir/dataflow/framework/cursor.rs +++ b/src/librustc_mir/dataflow/framework/cursor.rs @@ -34,6 +34,9 @@ where /// /// When this flag is set, we need to reset to an entry set before doing a seek. state_needs_reset: bool, + + #[cfg(debug_assertions)] + reachable_blocks: BitSet, } impl<'mir, 'tcx, A, R> ResultsCursor<'mir, 'tcx, A, R> @@ -55,6 +58,9 @@ where state_needs_reset: true, state: BitSet::new_empty(bits_per_block), pos: CursorPosition::block_entry(mir::START_BLOCK), + + #[cfg(debug_assertions)] + reachable_blocks: mir::traversal::reachable_as_bitset(body), } } @@ -85,6 +91,9 @@ where /// /// For backward dataflow analyses, this is the dataflow state after the terminator. pub(super) fn seek_to_block_entry(&mut self, block: BasicBlock) { + #[cfg(debug_assertions)] + assert!(self.reachable_blocks.contains(block)); + self.state.overwrite(&self.results.borrow().entry_set_for_block(block)); self.pos = CursorPosition::block_entry(block); self.state_needs_reset = false; diff --git a/src/librustc_mir/dataflow/framework/engine.rs b/src/librustc_mir/dataflow/framework/engine.rs index eb3881179116..003c40f290b8 100644 --- a/src/librustc_mir/dataflow/framework/engine.rs +++ b/src/librustc_mir/dataflow/framework/engine.rs @@ -213,15 +213,6 @@ where } } - // Add blocks that are not reachable from START_BLOCK to the work queue. These blocks will - // be processed after the ones added above. - // - // FIXME(ecstaticmorse): Is this actually necessary? In principle, we shouldn't need to - // know the dataflow state in unreachable basic blocks. - for bb in body.basic_blocks().indices() { - dirty_queue.insert(bb); - } - let mut state = BitSet::new_empty(bits_per_block); while let Some(bb) = dirty_queue.pop() { let bb_data = &body[bb]; diff --git a/src/librustc_mir/dataflow/framework/visitor.rs b/src/librustc_mir/dataflow/framework/visitor.rs index 0df9322e7fe0..257f3cb9a6dd 100644 --- a/src/librustc_mir/dataflow/framework/visitor.rs +++ b/src/librustc_mir/dataflow/framework/visitor.rs @@ -16,7 +16,13 @@ pub fn visit_results( { let mut state = results.new_flow_state(body); + #[cfg(debug_assertions)] + let reachable_blocks = mir::traversal::reachable_as_bitset(body); + for block in blocks { + #[cfg(debug_assertions)] + assert!(reachable_blocks.contains(block)); + let block_data = &body[block]; V::Direction::visit_results_in_block(&mut state, block, block_data, results, vis); }