about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'compiler')
-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