compiler: fix loopdepth tracking in array slicing expression in escape analysis
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 8 Jan 2020 00:38:00 +0000 (00:38 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 8 Jan 2020 00:38:00 +0000 (00:38 +0000)
    In the gc compiler, for slicing an array, its AST has an implicit
    address operation node. There isn't such node in the gofrontend
    AST. During the escape analysis, we create a fake node to mimic
    the gc compiler's behavior. For the fake node, the loopdepth was
    not tracked correctly, causing miscompilation. Since this is an
    address operation, do the same thing as we do for the address
    operator.

    Fixes golang/go#36404.

    Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/213643

From-SVN: r279984

gcc/go/gofrontend/MERGE
gcc/go/gofrontend/escape.cc

index fbba6626cc4b1fd3b53bf2403e40d07e13cd912c..d993dc89d3e2c6dc1615b1c75aade11583280169 100644 (file)
@@ -1,4 +1,4 @@
-6fa9657df508ff4d7760cf1abfad3611ba808561
+e0790a756e9ba77e2d3d6ef5d0abbb11dd71211b
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
index f8e07f73cd2d7d3048167140fe14e59331f643a7..0d38858897d1e9266e512266db57403dcb05175a 100644 (file)
@@ -1906,7 +1906,8 @@ Escape_analysis_assign::expression(Expression** pexpr)
             this->context_->track(addr_node);
 
             Node::Escape_state* addr_state = addr_node->state(this->context_, NULL);
-            addr_state->loop_depth = array_state->loop_depth;
+            if (array_state->loop_depth != 0)
+              addr_state->loop_depth = array_state->loop_depth;
           }
       }
       break;