Commit eb80a362 by Ian Lance Taylor

compiler: move some escape check to Mark_address_taken

    
    Move some check of escape state earlier, from get_backend to
    Mark_address_taken. So we can reclaim escape analysis Nodes
    before kicking off the backend (not done in this CL). Also it
    makes it easier to check variables and closures do not escape
    when the escape analysis is run for the runtime package (also
    not done in this CL).
    
    Reviewed-on: https://go-review.googlesource.com/85735

From-SVN: r256406
parent 41a6da2d
cf5a64066fa21b20beae0b895c05d26af53e13e0 584fdecefce831c3471dbd4857ba0ce0be2b5212
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.
...@@ -12383,9 +12383,7 @@ Allocation_expression::do_get_backend(Translate_context* context) ...@@ -12383,9 +12383,7 @@ Allocation_expression::do_get_backend(Translate_context* context)
Gogo* gogo = context->gogo(); Gogo* gogo = context->gogo();
Location loc = this->location(); Location loc = this->location();
Node* n = Node::make_node(this); if (this->allocate_on_stack_)
if (this->allocate_on_stack_
|| (n->encoding() & ESCAPE_MASK) == int(Node::ESCAPE_NONE))
{ {
int64_t size; int64_t size;
bool ok = this->type_->backend_type_size(gogo, &size); bool ok = this->type_->backend_type_size(gogo, &size);
...@@ -13161,13 +13159,8 @@ Slice_construction_expression::do_get_backend(Translate_context* context) ...@@ -13161,13 +13159,8 @@ Slice_construction_expression::do_get_backend(Translate_context* context)
} }
else else
{ {
go_assert(this->storage_escapes_ || this->element_count() == 0);
space = Expression::make_heap_expression(this->array_val_, loc); space = Expression::make_heap_expression(this->array_val_, loc);
Node* n = Node::make_node(this);
if ((n->encoding() & ESCAPE_MASK) == int(Node::ESCAPE_NONE))
{
n = Node::make_node(space);
n->set_encoding(Node::ESCAPE_NONE);
}
} }
// Build a constructor for the slice. // Build a constructor for the slice.
...@@ -14261,8 +14254,7 @@ Heap_expression::do_get_backend(Translate_context* context) ...@@ -14261,8 +14254,7 @@ Heap_expression::do_get_backend(Translate_context* context)
Btype* btype = this->type()->get_backend(gogo); Btype* btype = this->type()->get_backend(gogo);
Expression* alloc = Expression::make_allocation(etype, loc); Expression* alloc = Expression::make_allocation(etype, loc);
Node* n = Node::make_node(this); if (this->allocate_on_stack_)
if ((n->encoding() & ESCAPE_MASK) == int(Node::ESCAPE_NONE))
alloc->allocation_expression()->set_allocate_on_stack(); alloc->allocation_expression()->set_allocate_on_stack();
Bexpression* space = alloc->get_backend(context); Bexpression* space = alloc->get_backend(context);
......
...@@ -3870,13 +3870,17 @@ class Heap_expression : public Expression ...@@ -3870,13 +3870,17 @@ class Heap_expression : public Expression
public: public:
Heap_expression(Expression* expr, Location location) Heap_expression(Expression* expr, Location location)
: Expression(EXPRESSION_HEAP, location), : Expression(EXPRESSION_HEAP, location),
expr_(expr) expr_(expr), allocate_on_stack_(false)
{ } { }
Expression* Expression*
expr() const expr() const
{ return this->expr_; } { return this->expr_; }
void
set_allocate_on_stack()
{ this->allocate_on_stack_ = true; }
protected: protected:
int int
do_traverse(Traverse* traverse) do_traverse(Traverse* traverse)
...@@ -3910,6 +3914,8 @@ class Heap_expression : public Expression ...@@ -3910,6 +3914,8 @@ class Heap_expression : public Expression
private: private:
// The expression which is being put on the heap. // The expression which is being put on the heap.
Expression* expr_; Expression* expr_;
// Whether or not this is a stack allocation.
bool allocate_on_stack_;
}; };
// A receive expression. // A receive expression.
......
...@@ -65,6 +65,25 @@ Mark_address_taken::expression(Expression** pexpr) ...@@ -65,6 +65,25 @@ Mark_address_taken::expression(Expression** pexpr)
aie->array()->address_taken(escapes); aie->array()->address_taken(escapes);
} }
if (expr->allocation_expression() != NULL)
{
Node* n = Node::make_node(expr);
if ((n->encoding() & ESCAPE_MASK) == Node::ESCAPE_NONE)
expr->allocation_expression()->set_allocate_on_stack();
}
if (expr->heap_expression() != NULL)
{
Node* n = Node::make_node(expr);
if ((n->encoding() & ESCAPE_MASK) == Node::ESCAPE_NONE)
expr->heap_expression()->set_allocate_on_stack();
}
if (expr->slice_literal() != NULL)
{
Node* n = Node::make_node(expr);
if ((n->encoding() & ESCAPE_MASK) == Node::ESCAPE_NONE)
expr->slice_literal()->set_storage_does_not_escape();
}
// Rewrite non-escaping makeslice with constant size to stack allocation. // Rewrite non-escaping makeslice with constant size to stack allocation.
Unsafe_type_conversion_expression* uce = Unsafe_type_conversion_expression* uce =
expr->unsafe_conversion_expression(); expr->unsafe_conversion_expression();
......
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