squid/frontend/symbolization_passes/
deadcode.rs

1use 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}