public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* Go patch committed: Statically allocate constant interface data
@ 2019-06-05  0:18 Ian Lance Taylor
  0 siblings, 0 replies; only message in thread
From: Ian Lance Taylor @ 2019-06-05  0:18 UTC (permalink / raw)
  To: gcc-patches, gofrontend-dev

[-- Attachment #1: Type: text/plain, Size: 493 bytes --]

This patch to the Go frontend by Cherry Zhang statically allocates
constant interface data.  When converting a constant to interface,
such as interface{}(42) or interface{}("hello"), if the interface
escapes, we currently generate a heap allocation to hold the constant
value.  This patch changes it to generate a static allocation instead,
as the gc compiler does. This reduces allocations in such cases.
Bootstrapped and ran Go testsuite on x86_64-pc-linux-gnu.  Committed
to mainline.

Ian

[-- Attachment #2: patch.txt --]
[-- Type: text/plain, Size: 2309 bytes --]

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 271894)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -1,4 +1,4 @@
-e4d8ccaed06f81683e79774ede6c61949f6df8b8
+949c3b7aa603bc09e650d62e82c600b3463802f0
 
 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 271891)
+++ gcc/go/gofrontend/expressions.cc	(working copy)
@@ -323,9 +323,14 @@ Expression::convert_type_to_interface(Ty
     {
       // We are assigning a non-pointer value to the interface; the
       // interface gets a copy of the value in the heap if it escapes.
-      obj = Expression::make_heap_expression(rhs, location);
-      if (on_stack)
-        obj->heap_expression()->set_allocate_on_stack();
+      if (rhs->is_constant())
+        obj = Expression::make_unary(OPERATOR_AND, rhs, location);
+      else
+        {
+          obj = Expression::make_heap_expression(rhs, location);
+          if (on_stack)
+            obj->heap_expression()->set_allocate_on_stack();
+        }
     }
 
   return Expression::make_interface_value(lhs_type, first_field, obj, location);
@@ -4896,6 +4901,18 @@ Unary_expression::do_get_backend(Transla
 						     false, btype, loc, bexpr);
           bexpr = gogo->backend()->var_expression(decl, loc);
         }
+      else if (this->expr_->is_constant())
+        {
+          std::string var_name(gogo->initializer_name());
+          std::string asm_name(go_selectively_encode_id(var_name));
+          Bvariable* decl =
+              gogo->backend()->implicit_variable(var_name, asm_name, btype,
+                                                 true, true, false, 0);
+          gogo->backend()->implicit_variable_set_init(decl, var_name, btype,
+                                                      true, true, false,
+                                                      bexpr);
+          bexpr = gogo->backend()->var_expression(decl, loc);
+        }
 
       go_assert(!this->create_temp_ || this->expr_->is_variable());
       ret = gogo->backend()->address_expression(bexpr, loc);

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2019-06-05  0:18 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-05  0:18 Go patch committed: Statically allocate constant interface data Ian Lance Taylor

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).