about summary refs log tree commit diff
path: root/compiler/rustc_mir_transform/src
diff options
context:
space:
mode:
authorBryan Garza <1396101+bryangarza@users.noreply.github.com>2023-01-06 22:04:25 +0000
committerBryan Garza <1396101+bryangarza@users.noreply.github.com>2023-01-24 00:01:37 +0000
commit1bbd655888ec50220e6cd34e846c816c1cad8f17 (patch)
tree0c70e62ed5b06b30be9d93245cb70c51d7a9ffad /compiler/rustc_mir_transform/src
parent7618163a1caf0d6dfa5618c8369742720c90ef6b (diff)
downloadrust-1bbd655888ec50220e6cd34e846c816c1cad8f17.tar.gz
rust-1bbd655888ec50220e6cd34e846c816c1cad8f17.zip
Improve efficiency of has_back_edge(...)
Diffstat (limited to 'compiler/rustc_mir_transform/src')
-rw-r--r--compiler/rustc_mir_transform/src/ctfe_limit.rs21
1 files changed, 11 insertions, 10 deletions
diff --git a/compiler/rustc_mir_transform/src/ctfe_limit.rs b/compiler/rustc_mir_transform/src/ctfe_limit.rs
index 76db4a09d91..7d127032179 100644
--- a/compiler/rustc_mir_transform/src/ctfe_limit.rs
+++ b/compiler/rustc_mir_transform/src/ctfe_limit.rs
@@ -2,8 +2,9 @@
 //! (thus indicating there is a loop in the CFG), or whose terminator is a function call.
 use crate::MirPass;
 
+use rustc_data_structures::graph::dominators::Dominators;
 use rustc_middle::mir::{
-    BasicBlock, BasicBlockData, BasicBlocks, Body, Statement, StatementKind, TerminatorKind,
+    BasicBlock, BasicBlockData, Body, Statement, StatementKind, TerminatorKind,
 };
 use rustc_middle::ty::TyCtxt;
 
@@ -12,13 +13,14 @@ pub struct CtfeLimit;
 impl<'tcx> MirPass<'tcx> for CtfeLimit {
     #[instrument(skip(self, _tcx, body))]
     fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
+        let doms = body.basic_blocks.dominators();
         let indices: Vec<BasicBlock> = body
             .basic_blocks
             .iter_enumerated()
             .filter_map(|(node, node_data)| {
                 if matches!(node_data.terminator().kind, TerminatorKind::Call { .. })
                     // Back edges in a CFG indicate loops
-                    || has_back_edge(&body.basic_blocks, node, &node_data)
+                    || has_back_edge(&doms, node, &node_data)
                 {
                     Some(node)
                 } else {
@@ -37,17 +39,16 @@ impl<'tcx> MirPass<'tcx> for CtfeLimit {
 }
 
 fn has_back_edge(
-    basic_blocks: &BasicBlocks<'_>,
+    doms: &Dominators<BasicBlock>,
     node: BasicBlock,
     node_data: &BasicBlockData<'_>,
 ) -> bool {
-    let doms = basic_blocks.dominators();
-    basic_blocks.indices().any(|potential_dom| {
-        doms.is_reachable(potential_dom)
-            && doms.is_reachable(node)
-            && doms.is_dominated_by(node, potential_dom)
-            && node_data.terminator().successors().into_iter().any(|succ| succ == potential_dom)
-    })
+    if !doms.is_reachable(node) {
+        return false;
+    }
+    // Check if any of the dominators of the node are also the node's successor.
+    doms.dominators(node)
+        .any(|dom| node_data.terminator().successors().into_iter().any(|succ| succ == dom))
 }
 
 fn insert_counter(basic_block_data: &mut BasicBlockData<'_>) {