1
0
mirror of https://github.com/golang/go synced 2024-09-30 19:28:32 -06:00

cmd/compile: lazily create true and false Values in shortcircuit

It is mildly wasteful to always create values
that must sometimes then be dead code eliminated.
Given that it is very easy to avoid, do so.

Noticed when examining a package with thousands
of generated wrappers, each of which uses
only a handful of Values to compile.

Change-Id: If02eb4aa786dfa20f7aa43e8d729dad8b3db2786
Reviewed-on: https://go-review.googlesource.com/41502
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Josh Bleecher Snyder 2017-04-23 05:03:11 -07:00
parent 976a5ce1a8
commit 79e5ef2935

View File

@ -17,8 +17,7 @@ func shortcircuit(f *Func) {
// x = phi(a, ...)
//
// We can replace the "a" in the phi with the constant true.
ct := f.ConstBool(f.Entry.Pos, f.Config.Types.Bool, true)
cf := f.ConstBool(f.Entry.Pos, f.Config.Types.Bool, false)
var ct, cf *Value
for _, b := range f.Blocks {
for _, v := range b.Values {
if v.Op != OpPhi {
@ -37,8 +36,14 @@ func shortcircuit(f *Func) {
continue
}
if e.i == 0 {
if ct == nil {
ct = f.ConstBool(f.Entry.Pos, f.Config.Types.Bool, true)
}
v.SetArg(i, ct)
} else {
if cf == nil {
cf = f.ConstBool(f.Entry.Pos, f.Config.Types.Bool, false)
}
v.SetArg(i, cf)
}
}