duskphantom_middle/transform/
ultimate_pass.rs1use anyhow::Result;
18
19use crate::{config::CONFIG, Program};
20
21use super::{
22 block_fuse, dead_code_elim, func_inline, inst_combine, load_store_elim, loop_optimization,
23 make_parallel, mem2reg, redundance_elim, sink_code,
24};
25
26#[allow(unused)]
27pub fn optimize_program(program: &mut Program, level: usize) -> Result<bool> {
28 mem2reg::optimize_program(program)?;
29 main_loop(program)?;
30 if CONFIG.open_auto_parallel {
31 make_parallel::optimize_program::<5>(program)?;
32 }
33 eval_and_prune(program)?;
34 sink_code::optimize_program(program)?;
35 Ok(true)
36}
37
38pub fn main_loop(program: &mut Program) -> Result<bool> {
39 loop {
40 let mut changed = false;
41
42 changed |= func_inline::optimize_program(program)?;
44
45 changed |= eval_and_prune(program)?;
47
48 changed |= redundance_elim::optimize_program(program)?;
50
51 loop_optimization::optimize_program(program)?;
55
56 changed |= block_fuse::optimize_program(program)?;
58
59 if !changed {
61 break;
62 }
63 }
64 Ok(true)
65}
66
67pub fn eval_and_prune(program: &mut Program) -> Result<bool> {
68 let mut changed = false;
69 loop {
70 let mut c = false;
71 c |= inst_combine::optimize_program(program)?;
72 c |= load_store_elim::optimize_program(program)?;
73 c |= dead_code_elim::optimize_program(program)?;
74 changed |= c;
75 if !c {
76 break;
77 }
78 }
79 Ok(changed)
80}