squid/frontend/symbolization_passes/
deadcode.rs1use crate::frontend::ao::Function;
2
3pub(crate) struct DeadCodeEliminationPass {}
4
5impl DeadCodeEliminationPass {
6 #[allow(clippy::new_without_default)]
7 pub(crate) fn new() -> Self {
8 Self {}
9 }
10
11 pub(crate) fn run(&mut self, func: &mut Function) -> Result<(), String> {
12 for bb in func.cfg_mut().iter_basic_blocks_mut() {
13 let mut used = vec![0; bb.num_variables()];
14
15 for op in bb.ops() {
16 for var in op.input_variables() {
17 used[var.id()] += 1;
18 }
19 }
20
21 bb.move_cursor_beyond_end();
22 bb.move_cursor_backwards();
23
24 while let Some(op) = bb.cursor_op() {
25 let mut output_used = false;
26 let mut has_output = false;
27
28 for var in op.output_variables() {
29 output_used |= used[var.id()] > 0;
30 has_output = true;
31 }
32
33 if has_output && !output_used {
34 let op = bb.delete_op();
35
36 for var in op.input_variables() {
37 used[var.id()] -= 1;
38 }
39 }
40
41 if !bb.move_cursor_backwards() {
42 break;
43 }
44 }
45 }
46
47 Ok(())
48 }
49}