Commit 28b9598b by Ian Lance Taylor

compiler: omit write barrier for assignment to *(convert(&local))

    
    Assignments to local variables don't need a write barrier. But
    currently the compiler inserts a write barrier if the LHS is a
    local variable with type converted, as *(convert(&local)). Let
    the compiler recognize this pattern and omit the write barrier.
    
    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/182541

From-SVN: r272550
parent c9b236e5
62e3a8cc0a862b0abd3d0b1ef6cf4b228992a137 593f94f008c24f5abfe7f917a717cf2b0a2585e2
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.
...@@ -735,6 +735,26 @@ Gogo::assign_needs_write_barrier(Expression* lhs) ...@@ -735,6 +735,26 @@ Gogo::assign_needs_write_barrier(Expression* lhs)
} }
} }
// Nothing to do for an assignment to *(convert(&x)) where
// x is local variable or a temporary variable.
Unary_expression* ue = lhs->unary_expression();
if (ue != NULL && ue->op() == OPERATOR_MULT)
{
Expression* expr = ue->operand();
while (true)
{
if (expr->conversion_expression() != NULL)
expr = expr->conversion_expression()->expr();
else if (expr->unsafe_conversion_expression() != NULL)
expr = expr->unsafe_conversion_expression()->expr();
else
break;
}
ue = expr->unary_expression();
if (ue != NULL && ue->op() == OPERATOR_AND)
return this->assign_needs_write_barrier(ue->operand());
}
// For a struct assignment, we don't need a write barrier if all the // For a struct assignment, we don't need a write barrier if all the
// pointer types can not be in the heap. // pointer types can not be in the heap.
Struct_type* st = lhs->type()->struct_type(); Struct_type* st = lhs->type()->struct_type();
......
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