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