Commit 51c3b7c6 by Ian Lance Taylor

compiler: only check whether struct or array types are big

    
    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.
    
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/197699

From-SVN: r276187
parent df435456
d1fa6c34e56eade6fb5b6291f0a727b1a12bf6f1 27d1f3031197428b5745d09c167f982d638b8776
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.
...@@ -511,16 +511,28 @@ Node::is_big(Escape_context* context) const ...@@ -511,16 +511,28 @@ Node::is_big(Escape_context* context) const
|| t->is_abstract()) || t->is_abstract())
return false; return false;
int64_t size; bool big = false;
bool ok = t->backend_type_size(context->gogo(), &size); if (t->struct_type() != NULL
bool big = ok && (size < 0 || size > 10 * 1024 * 1024); || (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() != NULL)
{ {
if (this->expr()->allocation_expression() != NULL) if (this->expr()->allocation_expression() != NULL)
{ {
ok = t->deref()->backend_type_size(context->gogo(), &size); Type* pt = t->deref();
big = big || size <= 0 || size >= (1 << 16); 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) else if (this->expr()->call_expression() != NULL)
{ {
......
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