about summary refs log tree commit diff
diff options
context:
space:
mode:
authorCamille Gillot <gillot.camille@gmail.com>2025-09-26 20:44:06 +0000
committerCamille Gillot <gillot.camille@gmail.com>2025-09-26 20:44:06 +0000
commitd13a5b0a6c12837007c51f229cb8c58b614cfb5b (patch)
treef54efec1548a4c91a9fc8908e9fdf67c8c5292fe
parent1a37374973f2d57c7c1c18a8371aa99607adfad8 (diff)
downloadrust-d13a5b0a6c12837007c51f229cb8c58b614cfb5b.tar.gz
rust-d13a5b0a6c12837007c51f229cb8c58b614cfb5b.zip
Handle self-loops too.
-rw-r--r--compiler/rustc_mir_transform/src/jump_threading.rs8
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