Skip to main content

luaur_code_gen/functions/
mark_dead_stores_in_block_chains.rs

1use 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}