Change code to use map insead of for-loop
This commit is contained in:
parent
b763f9094f
commit
009beb00bc
@ -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,15 +11,14 @@ 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;
|
||||
}
|
||||
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
|
||||
for (potential_dom, _) in body.basic_blocks.iter_enumerated() {
|
||||
if doms.is_reachable(potential_dom)
|
||||
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
|
||||
@ -25,12 +26,13 @@ impl<'tcx> MirPass<'tcx> for CtfeLimit {
|
||||
.successors()
|
||||
.into_iter()
|
||||
.any(|succ| succ == potential_dom)
|
||||
{
|
||||
indices.push(node);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}) {
|
||||
Some(node)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
})
|
||||
.collect();
|
||||
for index in indices {
|
||||
insert_counter(
|
||||
body.basic_blocks_mut()
|
||||
|
Loading…
x
Reference in New Issue
Block a user