diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2018-01-09 23:43:23 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2018-01-09 23:43:23 +0000 |
commit | 4a59d4472b9a0a4c25c4483a03c71def7cb3aa8c (patch) | |
tree | 7caa556f1ebfcdaa15f65cd2e09266a79be3a052 | |
parent | 47e8a22a179a53f681ab4e2478ffd62d01fb5f52 (diff) | |
download | gcc-4a59d4472b9a0a4c25c4483a03c71def7cb3aa8c.zip gcc-4a59d4472b9a0a4c25c4483a03c71def7cb3aa8c.tar.gz gcc-4a59d4472b9a0a4c25c4483a03c71def7cb3aa8c.tar.bz2 |
compiler: set captured variable address to nonescape until further flooded
The escape analysis models closures by flowing captured variable
address to the closure node. However, the escape state for the
address expressions remained unset as ESCAPE_UNKNOWN. This
caused later passes to conclude that the address escapes. Fix this by
setting its escape state to ESCAPE_NONE first. If it escapes
(because the closure escapes), the flood phase will set its
escape state properly.
Reviewed-on: https://go-review.googlesource.com/86240
From-SVN: r256411
-rw-r--r-- | gcc/go/gofrontend/MERGE | 2 | ||||
-rw-r--r-- | gcc/go/gofrontend/escape.cc | 4 |
2 files changed, 2 insertions, 4 deletions
diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE index 80ccaf3..fc2e65d 100644 --- a/gcc/go/gofrontend/MERGE +++ b/gcc/go/gofrontend/MERGE @@ -1,4 +1,4 @@ -7c5e4d67041e3529a055a923b2b9f5ef09aa72a3 +bea521d1d8688bea5b14b1ae2a03aec949f48a44 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/escape.cc b/gcc/go/gofrontend/escape.cc index 65ccf9b..2e9798e 100644 --- a/gcc/go/gofrontend/escape.cc +++ b/gcc/go/gofrontend/escape.cc @@ -1774,9 +1774,7 @@ Escape_analysis_assign::expression(Expression** pexpr) for (; p != sce->vals()->end(); ++p) { Node* enclosed_node = Node::make_node(*p); - Node::Escape_state* state = - enclosed_node->state(this->context_, NULL); - state->loop_depth = this->context_->loop_depth(); + this->context_->track(enclosed_node); this->assign(closure_node, enclosed_node); } } |