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 The first line of this file holds the git revision number of the last
merge done from the gofrontend repository. merge done from the gofrontend repository.
...@@ -955,14 +955,21 @@ Gogo::assign_with_write_barrier(Function* function, Block* enclosing, ...@@ -955,14 +955,21 @@ Gogo::assign_with_write_barrier(Function* function, Block* enclosing,
// fallthrough // fallthrough
case Type::TYPE_STRUCT: case Type::TYPE_STRUCT:
{ if (type->is_direct_iface_type())
// TODO: split assignments for small struct/array? {
rhs = Expression::make_unary(OPERATOR_AND, rhs, loc); rhs = Expression::unpack_direct_iface(rhs, loc);
rhs->unary_expression()->set_does_not_escape(); rhs = Expression::make_unsafe_cast(uintptr_type, rhs, loc);
call = Runtime::make_call(Runtime::TYPEDMEMMOVE, loc, 3, call = Runtime::make_call(Runtime::GCWRITEBARRIER, loc, 2, lhs, rhs);
Expression::make_type_descriptor(type, loc), }
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; 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