Commit d480455f by Ian Lance Taylor

compiler: use gcWriteBarrier for pointer-shaped struct/array

    
    If a struct/array is pointer-shaped (i.e. having a single field
    that is pointer-shaped), we can use gcWriteBarrier instead of
    typedmemmove for the write barrier.
    
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/181539

From-SVN: r272130
parent fa237d91
a32739aadf0c7a65fcd5d5b6d0a0d206bff24a4f
3f7dcb98df3ce1d4e02d0072fd21e70dc08351db
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
......@@ -955,14 +955,21 @@ Gogo::assign_with_write_barrier(Function* function, Block* enclosing,
// fallthrough
case Type::TYPE_STRUCT:
{
// TODO: split assignments for small struct/array?
rhs = Expression::make_unary(OPERATOR_AND, rhs, loc);
rhs->unary_expression()->set_does_not_escape();
call = Runtime::make_call(Runtime::TYPEDMEMMOVE, loc, 3,
Expression::make_type_descriptor(type, loc),
lhs, rhs);
}
if (type->is_direct_iface_type())
{
rhs = Expression::unpack_direct_iface(rhs, loc);
rhs = Expression::make_unsafe_cast(uintptr_type, rhs, loc);
call = Runtime::make_call(Runtime::GCWRITEBARRIER, loc, 2, lhs, rhs);
}
else
{
// TODO: split assignments for small struct/array?
rhs = Expression::make_unary(OPERATOR_AND, rhs, loc);
rhs->unary_expression()->set_does_not_escape();
call = Runtime::make_call(Runtime::TYPEDMEMMOVE, loc, 3,
Expression::make_type_descriptor(type, loc),
lhs, rhs);
}
break;
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment