leo_passes/dead_code_elimination/
statement.rs1use super::DeadCodeEliminatingVisitor;
18
19use leo_ast::{
20 AssignStatement,
21 Block,
22 DefinitionPlace,
23 DefinitionStatement,
24 ExpressionReconstructor,
25 ExpressionStatement,
26 IterationStatement,
27 Statement,
28 StatementReconstructor,
29};
30
31impl StatementReconstructor for DeadCodeEliminatingVisitor<'_> {
32 fn reconstruct_assign(&mut self, _input: AssignStatement) -> (Statement, Self::AdditionalOutput) {
34 panic!("`AssignStatement`s should not exist in the AST at this phase of compilation.")
35 }
36
37 fn reconstruct_block(&mut self, block: Block) -> (Block, Self::AdditionalOutput) {
39 self.statements_before += block.statements.iter().filter(|stmt| !stmt.is_empty()).count() as u32;
42
43 let mut statements: Vec<Statement> =
45 block.statements.into_iter().rev().map(|statement| self.reconstruct_statement(statement).0).collect();
46
47 statements.retain(|stmt| !stmt.is_empty());
48
49 statements.reverse();
51
52 self.statements_after += statements.len() as u32;
53
54 (Block { statements, span: block.span, id: block.id }, Default::default())
55 }
56
57 fn reconstruct_definition(&mut self, mut input: DefinitionStatement) -> (Statement, Self::AdditionalOutput) {
59 let lhs_is_used = match &input.place {
61 DefinitionPlace::Single(identifier) => self.used_variables.contains(&identifier.name),
62 DefinitionPlace::Multiple(identifiers) => {
63 identifiers.iter().any(|identifier| self.used_variables.contains(&identifier.name))
64 }
65 };
66
67 if !lhs_is_used && self.side_effect_free(&input.value) {
68 (Statement::dummy(), Default::default())
70 } else {
71 input.value = self.reconstruct_expression(input.value).0;
73 (input.into(), Default::default())
74 }
75 }
76
77 fn reconstruct_iteration(&mut self, _: IterationStatement) -> (Statement, Self::AdditionalOutput) {
79 panic!("`IterationStatement`s should not be in the AST at this phase of compilation.");
80 }
81
82 fn reconstruct_expression_statement(&mut self, input: ExpressionStatement) -> (Statement, Self::AdditionalOutput) {
83 if self.side_effect_free(&input.expression) {
84 (Statement::dummy(), Default::default())
85 } else {
86 (
87 ExpressionStatement { expression: self.reconstruct_expression(input.expression).0, ..input }.into(),
88 Default::default(),
89 )
90 }
91 }
92}