aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2018-01-09 23:43:23 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2018-01-09 23:43:23 +0000
commit4a59d4472b9a0a4c25c4483a03c71def7cb3aa8c (patch)
tree7caa556f1ebfcdaa15f65cd2e09266a79be3a052
parent47e8a22a179a53f681ab4e2478ffd62d01fb5f52 (diff)
downloadgcc-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/MERGE2
-rw-r--r--gcc/go/gofrontend/escape.cc4
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);
}
}