diff --git a/compiler/rustc_mir_transform/src/ctfe_limit.rs b/compiler/rustc_mir_transform/src/ctfe_limit.rs index f2c99b19433..462be8afaaf 100644 --- a/compiler/rustc_mir_transform/src/ctfe_limit.rs +++ b/compiler/rustc_mir_transform/src/ctfe_limit.rs @@ -1,6 +1,8 @@ use crate::MirPass; -use rustc_middle::mir::{BasicBlockData, Body, Statement, StatementKind, TerminatorKind}; +use rustc_middle::mir::{ + BasicBlock, BasicBlockData, Body, Statement, StatementKind, TerminatorKind, +}; use rustc_middle::ty::TyCtxt; pub struct CtfeLimit; @@ -9,28 +11,28 @@ 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 mut indices = Vec::new(); - for (node, node_data) in body.basic_blocks.iter_enumerated() { - if let TerminatorKind::Call { .. } = node_data.terminator().kind { - indices.push(node); - continue; - } - // Back edges in a CFG indicate loops - for (potential_dom, _) in body.basic_blocks.iter_enumerated() { - if 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) - { - indices.push(node); - continue; - } - } - } + let indices: Vec = + 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 + body.basic_blocks.iter_enumerated().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) + }) { + Some(node) + } else { + None + } + }) + .collect(); for index in indices { insert_counter( body.basic_blocks_mut()