Skip to content

Commit 026a673

Browse files
committed
Clean up CtfeLimit MirPass
1 parent 360db51 commit 026a673

File tree

3 files changed

+68
-74
lines changed

3 files changed

+68
-74
lines changed
Lines changed: 31 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,92 +1,49 @@
11
use crate::MirPass;
22

3-
use rustc_middle::mir::{BasicBlock, Body, Statement, StatementKind, TerminatorKind};
3+
use rustc_middle::mir::{BasicBlockData, Body, Statement, StatementKind, TerminatorKind};
44
use rustc_middle::ty::TyCtxt;
55

6-
use tracing::{info, instrument};
7-
86
pub struct CtfeLimit;
97

108
impl<'tcx> MirPass<'tcx> for CtfeLimit {
119
#[instrument(skip(self, _tcx, body))]
1210
fn run_pass(&self, _tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
1311
let doms = body.basic_blocks.dominators();
14-
//info!("Got body with {} basic blocks: {:#?}", body.basic_blocks.len(), body.basic_blocks);
15-
//info!("With doms: {doms:?}");
16-
17-
/*
18-
for (index, basic_block) in body.basic_blocks.iter().enumerate() {
19-
info!("bb{index}: {basic_block:#?}")
20-
}*/
21-
for (index, basic_block) in body.basic_blocks.iter().enumerate() {
22-
info!(
23-
"bb{index} -> successors = {:?}",
24-
basic_block.terminator().successors().collect::<Vec<BasicBlock>>()
25-
);
26-
}
27-
for (index, basic_block) in body.basic_blocks.iter().enumerate() {
28-
info!("bb{index} -> unwind = {:?}", basic_block.terminator().unwind())
29-
}
30-
31-
let mut dominators = Vec::new();
32-
for idom in 0..body.basic_blocks.len() {
33-
let mut nodes = Vec::new();
34-
for inode in 0..body.basic_blocks.len() {
35-
let dom = BasicBlock::from_usize(idom);
36-
let node = BasicBlock::from_usize(inode);
37-
if doms.is_reachable(dom)
12+
let mut indices = Vec::new();
13+
for (node, node_data) in body.basic_blocks.iter_enumerated() {
14+
if let TerminatorKind::Call { .. } = node_data.terminator().kind {
15+
indices.push(node);
16+
continue;
17+
}
18+
// Back edges in a CFG indicate loops
19+
for (potential_dom, _) in body.basic_blocks.iter_enumerated() {
20+
if doms.is_reachable(potential_dom)
3821
&& doms.is_reachable(node)
39-
&& doms.is_dominated_by(node, dom)
22+
&& doms.is_dominated_by(node, potential_dom)
23+
&& node_data
24+
.terminator()
25+
.successors()
26+
.into_iter()
27+
.any(|succ| succ == potential_dom)
4028
{
41-
//info!("{idom} dominates {inode}");
42-
nodes.push(true);
43-
} else {
44-
nodes.push(false);
29+
indices.push(node);
30+
continue;
4531
}
4632
}
47-
dominators.push(nodes);
4833
}
49-
/*
50-
for idom in 0..body.basic_blocks.len() {
51-
print!("{idom} | dom | ");
52-
for inode in 0..body.basic_blocks.len() {
53-
if dominators[idom][inode] {
54-
print!("{inode} | ");
55-
} else {
56-
print!(" | ");
57-
}
58-
}
59-
print!("\n");
60-
}
61-
*/
62-
63-
for (index, basic_block) in body.basic_blocks_mut().iter_mut().enumerate() {
64-
// info!("bb{index}: {basic_block:#?}");
65-
//info!("bb{index} -> successors = {:?}", basic_block.terminator().successors().collect::<Vec<BasicBlock>>());
66-
let is_back_edge_or_fn_call = 'label: {
67-
match basic_block.terminator().kind {
68-
TerminatorKind::Call { .. } => {
69-
break 'label true;
70-
}
71-
_ => (),
72-
}
73-
for successor in basic_block.terminator().successors() {
74-
let s_index = successor.as_usize();
75-
if dominators[s_index][index] {
76-
info!("{s_index} to {index} is a loop");
77-
break 'label true;
78-
}
79-
}
80-
false
81-
};
82-
if is_back_edge_or_fn_call {
83-
basic_block.statements.push(Statement {
84-
source_info: basic_block.terminator().source_info,
85-
kind: StatementKind::ConstEvalCounter,
86-
});
87-
info!("New basic block statements vector: {:?}", basic_block.statements);
88-
}
34+
for index in indices {
35+
insert_counter(
36+
body.basic_blocks_mut()
37+
.get_mut(index)
38+
.expect("basic_blocks index {index} should exist"),
39+
);
8940
}
90-
info!("With doms: {doms:?}");
9141
}
9242
}
43+
44+
fn insert_counter(basic_block_data: &mut BasicBlockData<'_>) {
45+
basic_block_data.statements.push(Statement {
46+
source_info: basic_block_data.terminator().source_info,
47+
kind: StatementKind::ConstEvalCounter,
48+
});
49+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
// check-pass
2+
3+
const fn foo() {}
4+
5+
const fn call_foo() -> u32 {
6+
foo();
7+
foo();
8+
foo();
9+
foo();
10+
foo();
11+
foo();
12+
foo();
13+
foo();
14+
foo();
15+
foo();
16+
foo();
17+
foo();
18+
foo();
19+
foo();
20+
foo();
21+
foo();
22+
foo();
23+
foo();
24+
foo();
25+
foo();
26+
0
27+
}
28+
29+
const X: u32 = call_foo();
30+
31+
fn main() {
32+
println!("{X}");
33+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
warning: Const eval counter limit (20) has been crossed
2+
3+
warning: 1 warning emitted
4+

0 commit comments

Comments
 (0)