diff options
| author | Camille Gillot <gillot.camille@gmail.com> | 2025-09-26 20:44:06 +0000 |
|---|---|---|
| committer | Camille Gillot <gillot.camille@gmail.com> | 2025-09-26 20:44:06 +0000 |
| commit | d13a5b0a6c12837007c51f229cb8c58b614cfb5b (patch) | |
| tree | f54efec1548a4c91a9fc8908e9fdf67c8c5292fe | |
| parent | 1a37374973f2d57c7c1c18a8371aa99607adfad8 (diff) | |
| download | rust-d13a5b0a6c12837007c51f229cb8c58b614cfb5b.tar.gz rust-d13a5b0a6c12837007c51f229cb8c58b614cfb5b.zip | |
Handle self-loops too.
| -rw-r--r-- | compiler/rustc_mir_transform/src/jump_threading.rs | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/compiler/rustc_mir_transform/src/jump_threading.rs b/compiler/rustc_mir_transform/src/jump_threading.rs index c69660108d9..68298767e7f 100644 --- a/compiler/rustc_mir_transform/src/jump_threading.rs +++ b/compiler/rustc_mir_transform/src/jump_threading.rs @@ -842,9 +842,6 @@ fn maybe_loop_headers(body: &Body<'_>) -> DenseBitSet<BasicBlock> { let mut maybe_loop_headers = DenseBitSet::new_empty(body.basic_blocks.len()); let mut visited = DenseBitSet::new_empty(body.basic_blocks.len()); for (bb, bbdata) in traversal::postorder(body) { - let _new = visited.insert(bb); - debug_assert!(_new); - // Post-order means we visit successors before the block for acyclic CFGs. // If the successor is not visited yet, consider it a loop header. for succ in bbdata.terminator().successors() { @@ -852,6 +849,11 @@ fn maybe_loop_headers(body: &Body<'_>) -> DenseBitSet<BasicBlock> { maybe_loop_headers.insert(succ); } } + + // Only mark `bb` as visited after we checked the successors, in case we have a self-loop. + // bb1: goto -> bb1; + let _new = visited.insert(bb); + debug_assert!(_new); } maybe_loop_headers |
