Skip to main content

luaur_code_gen/functions/
substitute.rs

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