Skip to main content

luaur_code_gen/functions/
const_prop_in_block_chains.rs

1use crate::enums::ir_block_kind::IrBlockKind;
2use crate::functions::const_prop_in_block_chain::const_prop_in_block_chain;
3use crate::records::const_prop_state::ConstPropState;
4use crate::records::ir_builder::IrBuilder;
5
6pub fn const_prop_in_block_chains(build: &mut IrBuilder) {
7    let function: *mut crate::records::ir_function::IrFunction = &mut build.function;
8    let mut state =
9        unsafe { ConstPropState::const_prop_state_const_prop_state(build, &mut *function) };
10    let mut visited = unsafe { vec![0u8; (&(*function).blocks).len()] };
11
12    unsafe {
13        (&mut (*function).block_exit_tags).resize((&(*function).blocks).len(), Vec::new());
14
15        let block_count = (&(*function).blocks).len();
16        for i in 0..block_count {
17            let block: *mut crate::records::ir_block::IrBlock = &mut (&mut (*function).blocks)[i];
18
19            if (*block).kind == IrBlockKind::Fallback || (*block).kind == IrBlockKind::Dead {
20                continue;
21            }
22
23            if visited[i] != 0 {
24                continue;
25            }
26
27            const_prop_in_block_chain(build, &mut visited, block, &mut state);
28        }
29    }
30}