This patch changes the Go frontend escape analysis test for a big type
to only fetch the size if it might matter.  Fetching the size of a
type typically involves a hash table lookup, and is generally
non-trivial.  The escape analysis code calls is_big more than one
might expect.  So only fetch the size if we need it.  Bootstrapped and
ran Go testsuite on x86_64-pc-linux-gnu.  Committed to mainline.

Ian
Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE     (revision 276186)
+++ gcc/go/gofrontend/MERGE     (working copy)
@@ -1,4 +1,4 @@
-d1fa6c34e56eade6fb5b6291f0a727b1a12bf6f1
+27d1f3031197428b5745d09c167f982d638b8776
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
Index: gcc/go/gofrontend/escape.cc
===================================================================
--- gcc/go/gofrontend/escape.cc (revision 275698)
+++ gcc/go/gofrontend/escape.cc (working copy)
@@ -511,16 +511,28 @@ Node::is_big(Escape_context* context) co
       || t->is_abstract())
     return false;
 
-  int64_t size;
-  bool ok = t->backend_type_size(context->gogo(), &size);
-  bool big = ok && (size < 0 || size > 10 * 1024 * 1024);
+  bool big = false;
+  if (t->struct_type() != NULL
+      || (t->array_type() != NULL && !t->is_slice_type()))
+    {
+      int64_t size;
+      bool ok = t->backend_type_size(context->gogo(), &size);
+      big = ok && (size < 0 || size > 10 * 1024 * 1024);
+    }
 
   if (this->expr() != NULL)
     {
       if (this->expr()->allocation_expression() != NULL)
        {
-         ok = t->deref()->backend_type_size(context->gogo(), &size);
-         big = big || size <= 0 || size >= (1 << 16);
+         Type* pt = t->deref();
+         if (pt->struct_type() != NULL
+             || (pt->array_type() != NULL && !pt->is_slice_type()))
+           {
+             int64_t size;
+             bool ok = pt->backend_type_size(context->gogo(), &size);
+             if (ok)
+               big = big || size <= 0 || size >= (1 << 16);
+           }
        }
       else if (this->expr()->call_expression() != NULL)
        {

Reply via email to