cmd/compile: don't export dead code in inlineable fuctions

CL 37499 allows inlining more functions by ignoring dead code.
However, that dead code can contain non-exportable constructs.
Teach the exporter not to export dead code.

Fixes #19679 

Change-Id: Idb1d3794053514544b6f1035d29262aa6683e1e7
Reviewed-on: https://go-review.googlesource.com/38601
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Robert Griesemer <gri@golang.org>
This commit is contained in:
Josh Bleecher Snyder 2017-03-24 09:52:39 -07:00
parent a69754e30c
commit ad8c17b703
2 changed files with 54 additions and 2 deletions

View file

@ -1493,8 +1493,22 @@ func (p *exporter) stmt(n *Node) {
p.pos(n)
p.stmtList(n.Ninit)
p.expr(n.Left)
p.stmtList(n.Nbody)
p.stmtList(n.Rlist)
nbody := n.Nbody
rlist := n.Rlist
if Isconst(n.Left, CTBOOL) {
// if false { ... } or if true { ... }
// Only export the taken branch.
// This is more efficient,
// and avoids trying to export
// un-exportable nodes.
if n.Left.Bool() {
rlist = Nodes{}
} else {
nbody = Nodes{}
}
}
p.stmtList(nbody)
p.stmtList(rlist)
case OFOR:
p.op(OFOR)

View file

@ -0,0 +1,38 @@
// compile
// Copyright 2017 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.
// Used to crash when a type switch was present in dead code
// in an inlineable function.
package p
func Then() {
var i interface{}
if false {
switch i.(type) {
}
}
}
func Else() {
var i interface{}
if true {
_ = i
} else {
switch i.(type) {
}
}
}
func Switch() {
var i interface{}
switch 5 {
case 3:
switch i.(type) {
}
case 5:
}
}