Commit 4c6f5562 by Ian Lance Taylor

compiler: handle set-and-use-temp in nilcheck code

    
    Change the code in Unary_expression::do_get_backend that introduces
    explicit nil checks for dereference operations to special case
    set-and-use-temporary expressions. For this case it is better to
    generate an explicit reference of the temp in the final conditional
    (avoids introducing tree sharing).
    
    Reviewed-on: https://go-review.googlesource.com/81915

From-SVN: r255442
parent 40242256
297cf346f2400274946650ab9ecd039427fc986b d16e370c93e2866a961847a15f5001413e66d179
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.
...@@ -4455,10 +4455,23 @@ Unary_expression::do_get_backend(Translate_context* context) ...@@ -4455,10 +4455,23 @@ Unary_expression::do_get_backend(Translate_context* context)
case NIL_CHECK_NEEDED: case NIL_CHECK_NEEDED:
{ {
go_assert(this->expr_->is_variable()); go_assert(this->expr_->is_variable());
// If we're nil-checking the result of a set-and-use-temporary
// expression, then pick out the target temp and use that
// for the final result of the conditional.
Bexpression* tbexpr = bexpr;
Bexpression* ubexpr = bexpr;
Set_and_use_temporary_expression* sut =
this->expr_->set_and_use_temporary_expression();
if (sut != NULL) {
Temporary_statement* temp = sut->temporary();
Bvariable* bvar = temp->get_backend_variable(context);
ubexpr = gogo->backend()->var_expression(bvar, loc);
}
Bexpression* nil = Bexpression* nil =
Expression::make_nil(loc)->get_backend(context); Expression::make_nil(loc)->get_backend(context);
Bexpression* compare = Bexpression* compare =
gogo->backend()->binary_expression(OPERATOR_EQEQ, bexpr, gogo->backend()->binary_expression(OPERATOR_EQEQ, tbexpr,
nil, loc); nil, loc);
Bexpression* crash = Bexpression* crash =
gogo->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, gogo->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE,
...@@ -4466,7 +4479,7 @@ Unary_expression::do_get_backend(Translate_context* context) ...@@ -4466,7 +4479,7 @@ Unary_expression::do_get_backend(Translate_context* context)
Bfunction* bfn = context->function()->func_value()->get_decl(); Bfunction* bfn = context->function()->func_value()->get_decl();
bexpr = gogo->backend()->conditional_expression(bfn, btype, bexpr = gogo->backend()->conditional_expression(bfn, btype,
compare, compare,
crash, bexpr, crash, ubexpr,
loc); loc);
known_valid = true; known_valid = true;
break; break;
......
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