diff mbox series

Go patch committed: Use builtin memset for non-pointer memclr

Message ID CAOyqgcUdjAayXkMDAkdsW7GPz6kG49bBwnte8=Dw+wtUv-Aqeg@mail.gmail.com
State New
Headers show
Series Go patch committed: Use builtin memset for non-pointer memclr | expand

Commit Message

Ian Lance Taylor July 2, 2019, 4:47 p.m. UTC
This patch by Cherry Zhang changes the Go frontend to use the builtin
memset function for zeroing a range of memory that doesn't contain any
pointers.  Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu.
Committed to mainline.

Ian

2019-07-02  Cherry Zhang  <cherryyz@google.com>

* go-gcc.cc (Gcc_backend::Gcc_backend): Define __builtin_memset.
diff mbox series

Patch

Index: gcc/go/go-gcc.cc
===================================================================
--- gcc/go/go-gcc.cc	(revision 272608)
+++ gcc/go/go-gcc.cc	(working copy)
@@ -613,6 +613,15 @@  Gcc_backend::Gcc_backend()
 						NULL_TREE),
 		       false, false);
 
+  // We use __builtin_memset for zeroing data.
+  this->define_builtin(BUILT_IN_MEMSET, "__builtin_memset", "memset",
+		       build_function_type_list(void_type_node,
+						ptr_type_node,
+						integer_type_node,
+						size_type_node,
+						NULL_TREE),
+		       false, false);
+
   // Used by runtime/internal/sys and math/bits.
   this->define_builtin(BUILT_IN_CTZ, "__builtin_ctz", "ctz",
 		       build_function_type_list(integer_type_node,
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 272919)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@ 
-1e042a49d6f2e95d371301aa7b911522dc5877f4
+7f753feb8df400d6ed17cdbdfb364f7f3a42fb31
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: gcc/go/gofrontend/expressions.cc
===================================================================
--- gcc/go/gofrontend/expressions.cc	(revision 272624)
+++ gcc/go/gofrontend/expressions.cc	(working copy)
@@ -8910,10 +8910,16 @@  Builtin_call_expression::flatten_append(
           a2 = Expression::make_type_info(element_type, TYPE_INFO_SIZE);
           a2 = Expression::make_binary(OPERATOR_MULT, a2, ref, loc);
 
-          Runtime::Function code = (element_type->has_pointer()
-                                    ? Runtime::MEMCLRHASPTR
-                                    : Runtime::MEMCLRNOPTR);
-          call = Runtime::make_call(code, loc, 2, a1, a2);
+          if (element_type->has_pointer())
+            call = Runtime::make_call(Runtime::MEMCLRHASPTR, loc, 2, a1, a2);
+          else
+            {
+              Type* int32_type = Type::lookup_integer_type("int32");
+              Expression* zero =
+                Expression::make_integer_ul(0, int32_type, loc);
+              call = Runtime::make_call(Runtime::BUILTIN_MEMSET, loc, 3, a1,
+                                        zero, a2);
+            }
 
           if (element_type->has_pointer())
             {
Index: gcc/go/gofrontend/runtime.def
===================================================================
--- gcc/go/gofrontend/runtime.def	(revision 272624)
+++ gcc/go/gofrontend/runtime.def	(working copy)
@@ -351,10 +351,6 @@  DEF_GO_RUNTIME(GCWRITEBARRIER, "runtime.
 DEF_GO_RUNTIME(TYPEDMEMMOVE, "runtime.typedmemmove",
 	       P3(TYPE, POINTER, POINTER), R0())
 
-// Clear memory that contains no pointer.
-DEF_GO_RUNTIME(MEMCLRNOPTR, "runtime.memclrNoHeapPointers",
-               P2(POINTER, UINTPTR), R0())
-
 // Clear memory that contains pointer.
 DEF_GO_RUNTIME(MEMCLRHASPTR, "runtime.memclrHasPointers",
                P2(POINTER, UINTPTR), R0())
@@ -414,6 +410,10 @@  DEF_GO_RUNTIME(UNREACHABLE, "__builtin_u
 DEF_GO_RUNTIME(BUILTIN_MEMMOVE, "__builtin_memmove",
                P3(POINTER, POINTER, UINTPTR), R0())
 
+// Memset, used for zeroing memory.
+DEF_GO_RUNTIME(BUILTIN_MEMSET, "__builtin_memset",
+               P3(POINTER, INT32, UINTPTR), R0())
+
 // Various intrinsics.
 
 // Get the caller's PC, used for runtime.getcallerpc.
Index: gcc/go/gofrontend/statements.cc
===================================================================
--- gcc/go/gofrontend/statements.cc	(revision 272608)
+++ gcc/go/gofrontend/statements.cc	(working copy)
@@ -6882,12 +6882,18 @@  For_range_statement::lower_array_range_c
   Temporary_statement* ts2 = Statement::make_temporary(NULL, e2, loc);
   b->add_statement(ts2);
 
-  Expression* arg1 = Expression::make_temporary_reference(ts1, loc);
-  Expression* arg2 = Expression::make_temporary_reference(ts2, loc);
-  Runtime::Function code = (elem_type->has_pointer()
-                            ? Runtime::MEMCLRHASPTR
-                            : Runtime::MEMCLRNOPTR);
-  Expression* call = Runtime::make_call(code, loc, 2, arg1, arg2);
+  Expression* ptr_arg = Expression::make_temporary_reference(ts1, loc);
+  Expression* sz_arg = Expression::make_temporary_reference(ts2, loc);
+  Expression* call;
+  if (elem_type->has_pointer())
+    call = Runtime::make_call(Runtime::MEMCLRHASPTR, loc, 2, ptr_arg, sz_arg);
+  else
+    {
+      Type* int32_type = Type::lookup_integer_type("int32");
+      Expression* zero = Expression::make_integer_ul(0, int32_type, loc);
+      call = Runtime::make_call(Runtime::BUILTIN_MEMSET, loc, 3, ptr_arg,
+                                zero, sz_arg);
+    }
   Statement* cs3 = Statement::make_statement(call, true);
   b->add_statement(cs3);