diff options
| author | Bryan Garza <1396101+bryangarza@users.noreply.github.com> | 2023-01-06 22:04:25 +0000 |
|---|---|---|
| committer | Bryan Garza <1396101+bryangarza@users.noreply.github.com> | 2023-01-24 00:01:37 +0000 |
| commit | 1bbd655888ec50220e6cd34e846c816c1cad8f17 (patch) | |
| tree | 0c70e62ed5b06b30be9d93245cb70c51d7a9ffad /compiler/rustc_mir_transform/src | |
| parent | 7618163a1caf0d6dfa5618c8369742720c90ef6b (diff) | |
| download | rust-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.rs | 21 |
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<'_>) { |
