luaur_code_gen/functions/
substitute.rs1use crate::enums::ir_cmd::IrCmd;
2use crate::functions::add_use::add_use;
3use crate::functions::get_op_ir_data::get_op_mut;
4use crate::functions::is_block_terminator::is_block_terminator;
5use crate::functions::remove_use::remove_use;
6use crate::macros::codegen_assert::CODEGEN_ASSERT;
7use crate::records::ir_function::IrFunction;
8use crate::records::ir_inst::IrInst;
9use crate::records::ir_op::IrOp;
10
11pub fn substitute(function: &mut IrFunction, inst: &mut IrInst, replacement: IrOp) {
12 CODEGEN_ASSERT!(!is_block_terminator(inst.cmd));
13
14 inst.cmd = IrCmd::SUBSTITUTE;
15
16 add_use(function, replacement);
17
18 let n = inst.ops.size();
19 for i in 0..n {
20 let op: IrOp = inst.ops.as_slice()[i as usize];
21 remove_use(function, op);
22 }
23
24 inst.ops.resize(1);
25 *get_op_mut(inst, 0) = replacement;
26}