compiler: use gcWriteBarrier for pointer-shaped struct/array
authorIan Lance Taylor <ian@gcc.gnu.org>
Mon, 10 Jun 2019 20:35:14 +0000 (20:35 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Mon, 10 Jun 2019 20:35:14 +0000 (20:35 +0000)
    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

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/wb.cc

index eae27560ffcbf389ca8311e1b4c0ebec9800db99..05959f2c55a2a0645529a756a2ed4a59c3e289bd 100644 (file)
@@ -1,4 +1,4 @@
-a32739aadf0c7a65fcd5d5b6d0a0d206bff24a4f
+3f7dcb98df3ce1d4e02d0072fd21e70dc08351db
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index 47cffee8db84ef4421802bf25273ad1f4fd33323..c1d54e6cb4c0a46cc248ff42b771d72545809585 100644 (file)
@@ -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;
     }