diff mbox series

Go patch committed: Set captured var address to not escape before flood

Message ID CAOyqgcWThF6P28=XHnxtnFNHan+BqjvQNoJ4KJGfriJv_LV+UQ@mail.gmail.com
State New
Headers show
Series Go patch committed: Set captured var address to not escape before flood | expand

Commit Message

Ian Lance Taylor Jan. 9, 2018, 11:43 p.m. UTC
This patch to the Go frontend by Cherry Zhang sets captured variable
addresses to nonescape until the flood phase.  The escape analysis
pass 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.
Bootstrapped on x86_64-pc-linux-gnu.  Committed to mainline.

Ian
diff mbox series

Patch

Index: gcc/go/gofrontend/MERGE
===================================================================
--- gcc/go/gofrontend/MERGE	(revision 256410)
+++ gcc/go/gofrontend/MERGE	(working copy)
@@ -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.
Index: gcc/go/gofrontend/escape.cc
===================================================================
--- gcc/go/gofrontend/escape.cc	(revision 256410)
+++ gcc/go/gofrontend/escape.cc	(working copy)
@@ -1774,9 +1774,7 @@  Escape_analysis_assign::expression(Expre
 	    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);
 	      }
 	  }