]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: collapse runs of string constants in walkprint
authorJosh Bleecher Snyder <josharian@gmail.com>
Mon, 22 May 2017 13:40:06 +0000 (06:40 -0700)
committerJosh Bleecher Snyder <josharian@gmail.com>
Tue, 15 Aug 2017 21:54:48 +0000 (21:54 +0000)
This reduces the code footprint of code like:

println("foo=", foo, "bar=", bar)

which is fairly common in the runtime.

Prior to this change, this makes function calls to print each of:

"foo=", " ", foo, " ", "bar=", " ", bar, "\n"

After this change, this prints:

"foo= ", foo, " bar= ", bar, "\n"

This shrinks the hello world binary by 0.4%.
More importantly, this improves the instruction
density of important runtime routines.

Change-Id: I8971bdf5382fbaaf4a82bad4442f9da07c28d395
Reviewed-on: https://go-review.googlesource.com/55098
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
src/cmd/compile/internal/gc/walk.go

index 667dd2acb17822c6b708304edf7e61ef24ca4e04..b7fabc1ebf131b7bbee1ab81096acf698fb04d3a 100644 (file)
@@ -2036,6 +2036,25 @@ func walkprint(nn *Node, init *Nodes) *Node {
                nn.List.Set(t)
        }
 
+       // Collapse runs of constant strings.
+       s := nn.List.Slice()
+       t := make([]*Node, 0, len(s))
+       for i := 0; i < len(s); {
+               var strs []string
+               for i < len(s) && Isconst(s[i], CTSTR) {
+                       strs = append(strs, s[i].Val().U.(string))
+                       i++
+               }
+               if len(strs) > 0 {
+                       t = append(t, nodstr(strings.Join(strs, "")))
+               }
+               if i < len(s) {
+                       t = append(t, s[i])
+                       i++
+               }
+       }
+       nn.List.Set(t)
+
        calls := []*Node{mkcall("printlock", nil, init)}
        for i, n := range nn.List.Slice() {
                if n.Op == OLITERAL {