use crate::ir::ir_assign::IrAssign; use crate::ir::ir_call::IrCall; use crate::ir::ir_return::IrReturn; use crate::ir::ir_set_field::IrSetField; use crate::ir::ir_variable::IrVariableId; use crate::ir::register_allocation::VrUser; use std::collections::HashSet; #[derive(Debug)] pub enum IrStatement { Assign(IrAssign), Call(IrCall), Return(IrReturn), SetField(IrSetField), } impl VrUser for IrStatement { fn vr_definitions(&self) -> HashSet { match self { IrStatement::Assign(ir_assign) => ir_assign.vr_definitions(), IrStatement::Call(ir_call) => ir_call.vr_definitions(), IrStatement::Return(ir_return) => ir_return.vr_definitions(), IrStatement::SetField(ir_set_field) => ir_set_field.vr_definitions(), } } fn vr_uses(&self) -> HashSet { match self { IrStatement::Assign(ir_assign) => ir_assign.vr_uses(), IrStatement::Call(ir_call) => ir_call.vr_uses(), IrStatement::Return(ir_return) => ir_return.vr_uses(), IrStatement::SetField(ir_set_field) => ir_set_field.vr_uses(), } } }