luaur_code_gen/functions/
const_prop_in_block.rs1use 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}