diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2017-12-06 13:32:06 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2017-12-06 13:32:06 +0000 |
commit | 4c6f5562dce997c013340fb5d6891d777efb99be (patch) | |
tree | 7fffcd9e8ba3dcd0a191a595a2135dabded952b4 | |
parent | 40242256f156e91244d770ac422e6e244b99152b (diff) | |
download | gcc-4c6f5562dce997c013340fb5d6891d777efb99be.zip gcc-4c6f5562dce997c013340fb5d6891d777efb99be.tar.gz gcc-4c6f5562dce997c013340fb5d6891d777efb99be.tar.bz2 |
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
-rw-r--r-- | gcc/go/gofrontend/MERGE | 2 | ||||
-rw-r--r-- | gcc/go/gofrontend/expressions.cc | 17 |
2 files changed, 16 insertions, 3 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index e0d606c..b185c9e 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -297cf346f2400274946650ab9ecd039427fc986b +d16e370c93e2866a961847a15f5001413e66d179 The first line of this file holds the git revision number of the last merge done from the gofrontend repository. diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc index e9b8683..219b163 100644 --- a/gcc/go/gofrontend/expressions.cc +++ b/gcc/go/gofrontend/expressions.cc @@ -4455,10 +4455,23 @@ Unary_expression::do_get_backend(Translate_context* context) case NIL_CHECK_NEEDED: { 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 = Expression::make_nil(loc)->get_backend(context); Bexpression* compare = - gogo->backend()->binary_expression(OPERATOR_EQEQ, bexpr, + gogo->backend()->binary_expression(OPERATOR_EQEQ, tbexpr, nil, loc); Bexpression* crash = gogo->runtime_error(RUNTIME_ERROR_NIL_DEREFERENCE, @@ -4466,7 +4479,7 @@ Unary_expression::do_get_backend(Translate_context* context) Bfunction* bfn = context->function()->func_value()->get_decl(); bexpr = gogo->backend()->conditional_expression(bfn, btype, compare, - crash, bexpr, + crash, ubexpr, loc); known_valid = true; break; |