]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: lazily create true and false Values in shortcircuit
authorJosh Bleecher Snyder <josharian@gmail.com>
Sun, 23 Apr 2017 12:03:11 +0000 (05:03 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Mon, 24 Apr 2017 00:58:27 +0000 (00:58 +0000)
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>
src/cmd/compile/internal/ssa/shortcircuit.go

index 54e186980d23c050b534f21fc19cef6109b107c9..506be4e7a0752c3d142ca1b967033131389c67ea 100644 (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)
                                }
                        }