use crate::Pass;
use leo_ast::ProgramReconstructor as _;
use leo_errors::Result;
use leo_span::Symbol;
mod ast;
mod program;
mod visitor;
pub use visitor::SsaConstPropagationVisitor;
pub struct SsaConstPropagation;
impl Pass for SsaConstPropagation {
type Input = ();
type Output = ();
const NAME: &str = "SsaConstPropagation";
fn do_pass(_input: Self::Input, state: &mut crate::CompilerState) -> Result<Self::Output> {
for _ in 0..1024 {
let mut ast = std::mem::take(&mut state.ast);
let mut visitor = SsaConstPropagationVisitor {
state,
program: Symbol::intern(""),
constants: Default::default(),
changed: false,
};
ast.ast = visitor.reconstruct_program(ast.ast);
visitor.state.handler.last_err()?;
visitor.state.ast = ast;
if !visitor.changed {
return Ok(());
}
}
panic!("ran out of loops");
}
}