mirror of https://github.com/golang/go.git
cmd/compile: don't deadcode eliminate labels
Dead-code eliminating labels is tricky because there might be gotos that can still reach them. Bug probably introduced with CL 91056 Fixes #28616 Change-Id: I6680465134e3486dcb658896f5172606cc51b104 Reviewed-on: https://go-review.googlesource.com/c/147817 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org> Reviewed-by: Iskander Sharipov <iskander.sharipov@intel.com>
This commit is contained in:
parent
8b4692096b
commit
95a4f793c0
|
|
@ -4084,6 +4084,12 @@ func deadcode(fn *Node) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func deadcodeslice(nn Nodes) {
|
func deadcodeslice(nn Nodes) {
|
||||||
|
var lastLabel = -1
|
||||||
|
for i, n := range nn.Slice() {
|
||||||
|
if n != nil && n.Op == OLABEL {
|
||||||
|
lastLabel = i
|
||||||
|
}
|
||||||
|
}
|
||||||
for i, n := range nn.Slice() {
|
for i, n := range nn.Slice() {
|
||||||
// Cut is set to true when all nodes after i'th position
|
// Cut is set to true when all nodes after i'th position
|
||||||
// should be removed.
|
// should be removed.
|
||||||
|
|
@ -4106,10 +4112,14 @@ func deadcodeslice(nn Nodes) {
|
||||||
// If "then" or "else" branch ends with panic or return statement,
|
// If "then" or "else" branch ends with panic or return statement,
|
||||||
// it is safe to remove all statements after this node.
|
// it is safe to remove all statements after this node.
|
||||||
// isterminating is not used to avoid goto-related complications.
|
// isterminating is not used to avoid goto-related complications.
|
||||||
|
// We must be careful not to deadcode-remove labels, as they
|
||||||
|
// might be the target of a goto. See issue 28616.
|
||||||
if body := body.Slice(); len(body) != 0 {
|
if body := body.Slice(); len(body) != 0 {
|
||||||
switch body[(len(body) - 1)].Op {
|
switch body[(len(body) - 1)].Op {
|
||||||
case ORETURN, ORETJMP, OPANIC:
|
case ORETURN, ORETJMP, OPANIC:
|
||||||
cut = true
|
if i > lastLabel {
|
||||||
|
cut = true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,25 @@
|
||||||
|
// compile
|
||||||
|
|
||||||
|
// Copyright 2018 The Go Authors. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
// Make sure we don't dead code eliminate a label.
|
||||||
|
|
||||||
|
package p
|
||||||
|
|
||||||
|
var i int
|
||||||
|
|
||||||
|
func f() {
|
||||||
|
|
||||||
|
if true {
|
||||||
|
|
||||||
|
if i == 1 {
|
||||||
|
goto label
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
label:
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue