mirror of
https://github.com/golang/go
synced 2024-11-18 15:54:42 -07: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:
parent
976a5ce1a8
commit
79e5ef2935
@ -17,8 +17,7 @@ func shortcircuit(f *Func) {
|
|||||||
// x = phi(a, ...)
|
// x = phi(a, ...)
|
||||||
//
|
//
|
||||||
// We can replace the "a" in the phi with the constant true.
|
// We can replace the "a" in the phi with the constant true.
|
||||||
ct := f.ConstBool(f.Entry.Pos, f.Config.Types.Bool, true)
|
var ct, cf *Value
|
||||||
cf := f.ConstBool(f.Entry.Pos, f.Config.Types.Bool, false)
|
|
||||||
for _, b := range f.Blocks {
|
for _, b := range f.Blocks {
|
||||||
for _, v := range b.Values {
|
for _, v := range b.Values {
|
||||||
if v.Op != OpPhi {
|
if v.Op != OpPhi {
|
||||||
@ -37,8 +36,14 @@ func shortcircuit(f *Func) {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if e.i == 0 {
|
if e.i == 0 {
|
||||||
|
if ct == nil {
|
||||||
|
ct = f.ConstBool(f.Entry.Pos, f.Config.Types.Bool, true)
|
||||||
|
}
|
||||||
v.SetArg(i, ct)
|
v.SetArg(i, ct)
|
||||||
} else {
|
} else {
|
||||||
|
if cf == nil {
|
||||||
|
cf = f.ConstBool(f.Entry.Pos, f.Config.Types.Bool, false)
|
||||||
|
}
|
||||||
v.SetArg(i, cf)
|
v.SetArg(i, cf)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user