Skip to content

Commit d13a5b0

Browse files
committed
Handle self-loops too.
1 parent 1a37374 commit d13a5b0

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

compiler/rustc_mir_transform/src/jump_threading.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -842,16 +842,18 @@ fn maybe_loop_headers(body: &Body<'_>) -> DenseBitSet<BasicBlock> {
842842
let mut maybe_loop_headers = DenseBitSet::new_empty(body.basic_blocks.len());
843843
let mut visited = DenseBitSet::new_empty(body.basic_blocks.len());
844844
for (bb, bbdata) in traversal::postorder(body) {
845-
let _new = visited.insert(bb);
846-
debug_assert!(_new);
847-
848845
// Post-order means we visit successors before the block for acyclic CFGs.
849846
// If the successor is not visited yet, consider it a loop header.
850847
for succ in bbdata.terminator().successors() {
851848
if !visited.contains(succ) {
852849
maybe_loop_headers.insert(succ);
853850
}
854851
}
852+
853+
// Only mark `bb` as visited after we checked the successors, in case we have a self-loop.
854+
// bb1: goto -> bb1;
855+
let _new = visited.insert(bb);
856+
debug_assert!(_new);
855857
}
856858

857859
maybe_loop_headers

0 commit comments

Comments
 (0)