]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
compiler: fix loopdepth tracking in array slicing expression in escape analysis
authorIan Lance Taylor <ian@gcc.gnu.org>
Wed, 8 Jan 2020 00:38:34 +0000 (00:38 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Wed, 8 Jan 2020 00:38:34 +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: r279985

gcc/go/gofrontend/escape.cc

index e1c98094831f3de097424856116c212bf65d34ee..23fa7552f4cba725c0d0e01d8bffc77fba8af06e 100644 (file)
@@ -1879,7 +1879,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;