Skip to main content

luaur_code_gen/functions/
const_prop_in_block.rs

1use crate::enums::ir_block_kind::IrBlockKind;
2use crate::functions::apply_substitutions_ir_utils_alt_b::apply_substitutions_ir_function_ir_inst;
3use crate::functions::const_prop_in_inst::const_prop_in_inst;
4use crate::functions::fold_constants::fold_constants;
5use crate::records::const_prop_state::ConstPropState;
6use crate::records::ir_block::IrBlock;
7use crate::records::ir_builder::IrBuilder;
8
9const K_BLOCK_FLAG_SAFE_ENV_CHECK: u8 = 1 << 0;
10
11pub fn const_prop_in_block(build: &mut IrBuilder, block: &mut IrBlock, state: &mut ConstPropState) {
12    let function: *mut crate::records::ir_function::IrFunction = &mut build.function;
13
14    if (block.flags & K_BLOCK_FLAG_SAFE_ENV_CHECK) != 0 {
15        state.in_safe_env = true;
16    }
17
18    for index in block.start..=block.finish {
19        unsafe {
20            let inst = &mut (&mut (*function).instructions)[index as usize] as *mut _;
21
22            apply_substitutions_ir_function_ir_inst(&mut *function, &mut *inst);
23            fold_constants(build, &mut *function, block, index);
24            const_prop_in_inst(state, build, &mut *function, block, &mut *inst, index);
25        }
26
27        if block.kind == IrBlockKind::Dead {
28            break;
29        }
30    }
31}