Commit a14a8a3e authored by Josh Bleecher Snyder's avatar Josh Bleecher Snyder

cmd/compile: collapse runs of string constants in walkprint

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: 's avatarMatthew Dempsky <mdempsky@google.com>
parent 9de79900
...@@ -2036,6 +2036,25 @@ func walkprint(nn *Node, init *Nodes) *Node { ...@@ -2036,6 +2036,25 @@ func walkprint(nn *Node, init *Nodes) *Node {
nn.List.Set(t) 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)} calls := []*Node{mkcall("printlock", nil, init)}
for i, n := range nn.List.Slice() { for i, n := range nn.List.Slice() {
if n.Op == OLITERAL { if n.Op == OLITERAL {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment