Skip to main content

luaur_code_gen/functions/
apply_substitutions_ir_utils.rs

1use crate::enums::ir_cmd::IrCmd;
2use crate::enums::ir_op_kind::IrOpKind;
3use crate::functions::remove_use::remove_use;
4use crate::macros::codegen_assert::CODEGEN_ASSERT;
5use crate::records::ir_function::IrFunction;
6use crate::records::ir_inst::IrInst;
7use crate::records::ir_op::IrOp;
8
9pub fn apply_substitutions_ir_function_ir_op(function: &mut IrFunction, op: &mut IrOp) {
10    if op.kind() == IrOpKind::Inst {
11        let src: *mut IrInst = &mut function.instructions[op.index() as usize];
12
13        if unsafe { (*src).cmd } == IrCmd::SUBSTITUTE {
14            let src_a: IrOp = unsafe { (*src).ops.as_slice()[0] };
15            *op = src_a;
16
17            // If we substitute with the result of a different instruction, update the use count
18            if op.kind() == IrOpKind::Inst {
19                let dst = &mut function.instructions[op.index() as usize];
20                CODEGEN_ASSERT!(dst.cmd != IrCmd::SUBSTITUTE);
21                dst.use_count += 1;
22            }
23
24            CODEGEN_ASSERT!(unsafe { (*src).use_count } > 0);
25            unsafe {
26                (*src).use_count -= 1;
27            }
28
29            if unsafe { (*src).use_count } == 0 {
30                unsafe {
31                    (*src).cmd = IrCmd::NOP;
32                }
33                let src_a2: IrOp = unsafe { (*src).ops.as_slice()[0] };
34                remove_use(function, src_a2);
35                unsafe {
36                    (*src).ops.clear();
37                }
38            }
39        }
40    }
41}