mirror of https://github.com/golang/go.git
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: Matthew Dempsky <mdempsky@google.com>
This commit is contained in:
parent
9de7990054
commit
a14a8a3eb9
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Reference in New Issue