From 45e7f9bced899a5469188c7dced50bbcadde7499 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Sun, 14 Jan 2024 16:04:05 +0800 Subject: [PATCH] MIR Cleanup - Implement `read_via_copy` and `write_via_move` --- src/mir/cleanup.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/mir/cleanup.cpp b/src/mir/cleanup.cpp index f8781fa6..0079baa1 100644 --- a/src/mir/cleanup.cpp +++ b/src/mir/cleanup.cpp @@ -1347,6 +1347,21 @@ void MIR_Cleanup(const StaticTraitResolve& resolve, const ::HIR::ItemPath& path, } } } + + // NOTE: Would be nice to do this in `Lower_MIR` - but that confuses the validity checks + if( e.fcn.is_Intrinsic() && e.fcn.as_Intrinsic().name == "read_via_copy" ) + { + // TODO: Replace with `res = *ptr;` + block.statements.push_back(MIR::Statement::make_Assign({ std::move(e.ret_val), MIR::LValue::new_Deref( std::move(e.args.at(0).as_LValue()) ) })); + block.terminator = MIR::Terminator::make_Goto(e.ret_block); + } + if( e.fcn.is_Intrinsic() && e.fcn.as_Intrinsic().name == "write_via_move" ) + { + // TODO: Replace with `*ptr = arg;` + block.statements.push_back(MIR::Statement::make_Assign({ MIR::LValue::new_Deref( std::move(e.args.at(0).as_LValue()) ), std::move(e.args.at(1).as_LValue()) })); + block.statements.push_back(MIR::Statement::make_Assign({ std::move(e.ret_val), MIR::RValue::make_Tuple({}) })); + block.terminator = MIR::Terminator::make_Goto(e.ret_block); + } } mutator.flush_block();