use crate::enums::ir_block_kind::IrBlockKind;
use crate::functions::add_use::add_use;
use crate::functions::is_block_terminator::is_block_terminator;
use crate::functions::kill_ir_utils_alt_b::kill_ir_function_u32_u32;
use crate::functions::remove_use::remove_use;
use crate::macros::codegen_assert::CODEGEN_ASSERT;
use crate::records::ir_block::IrBlock;
use crate::records::ir_function::IrFunction;
use crate::records::ir_inst::IrInst;
use crate::records::ir_op::IrOp;
pub fn replace_ir_function_ir_block_u32_ir_inst(
function: &mut IrFunction,
block: &mut IrBlock,
inst_idx: u32,
mut replacement: IrInst,
) {
let rn = replacement.ops.size();
for i in 0..rn {
let op: IrOp = replacement.ops.as_slice()[i as usize];
add_use(function, op);
}
let inst_cmd = function.instructions[inst_idx as usize].cmd;
if !is_block_terminator(inst_cmd) && is_block_terminator(replacement.cmd) {
CODEGEN_ASSERT!(block.finish != !0u32);
CODEGEN_ASSERT!(inst_idx + 1 <= block.finish);
kill_ir_function_u32_u32(function, inst_idx + 1, block.finish);
if block.kind == IrBlockKind::Dead {
for i in 0..rn {
let op: IrOp = replacement.ops.as_slice()[i as usize];
remove_use(function, op);
}
return;
}
block.finish = inst_idx;
}
let copy: IrInst = function.instructions[inst_idx as usize].clone();
replacement.use_count = function.instructions[inst_idx as usize].use_count;
function.instructions[inst_idx as usize] = replacement;
let cn = copy.ops.size();
for i in 0..cn {
let op: IrOp = copy.ops.as_slice()[i as usize];
remove_use(function, op);
}
}