luaur_code_gen/functions/
mark_dead_stores_in_block_chains.rs1use crate::enums::ir_block_kind::IrBlockKind;
2use crate::functions::generate_vm_exit_blocks::generate_vm_exit_blocks;
3use crate::functions::mark_dead_stores_in_block_chain::mark_dead_stores_in_block_chain;
4use crate::records::ir_builder::IrBuilder;
5use alloc::vec;
6use alloc::vec::Vec;
7
8pub fn mark_dead_stores_in_block_chains(build: &mut IrBuilder) {
9 let num_blocks = build.function.blocks.len();
10 let num_insts = build.function.instructions.len();
11
12 let mut visited: Vec<u8> = vec![0u8; num_blocks];
13 let mut remaining_uses: Vec<u32> = vec![0u32; num_insts];
14 let mut block_idx_chain: Vec<u32> = Vec::new();
15 let mut recorded_vm_exit_syncs: Vec<u32> = Vec::new();
16
17 for block_idx in 0..num_blocks {
18 let kind = build.function.blocks[block_idx].kind;
19
20 if kind == IrBlockKind::Fallback || kind == IrBlockKind::Dead {
21 continue;
22 }
23
24 if visited[block_idx] != 0 {
25 continue;
26 }
27
28 mark_dead_stores_in_block_chain(
29 build,
30 &mut visited,
31 &mut remaining_uses,
32 &mut block_idx_chain,
33 &mut recorded_vm_exit_syncs,
34 block_idx as u32,
35 );
36 }
37
38 if luaur_common::FFlag::LuauCodegenVmExitSync.get() {
39 generate_vm_exit_blocks(build, &recorded_vm_exit_syncs);
40 }
41}