]> Cypherpunks repositories - gostls13.git/commit
runtime,cmd/compile: pass strings and slices to convT2{E,I} by value
authorKeith Randall <khr@golang.org>
Fri, 14 Sep 2018 17:09:08 +0000 (10:09 -0700)
committerKeith Randall <khr@golang.org>
Sun, 14 Oct 2018 03:46:51 +0000 (03:46 +0000)
commit0e9f8a21f8b6534931f1ab50909161a289a0da3c
tree308690e988344f6d44dbf47561dd91622d40cf27
parent653a4bd8d46a8a329f37e8a9fc909c3bb92b02bc
runtime,cmd/compile: pass strings and slices to convT2{E,I} by value

When we pass these types by reference, we usually have to allocate
temporaries on the stack, initialize them, then pass their address
to the conversion functions. It's simpler to pass these types
directly by value.

This particularly applies to conversions needed for fmt.Printf
(to interface{} for constructing a [...]interface{}).

func f(a, b, c string) {
     fmt.Printf("%s %s\n", a, b)
     fmt.Printf("%s %s\n", b, c)
}

This function's stack frame shrinks from 200 to 136 bytes, and
its code shrinks from 535 to 453 bytes.

The go binary shrinks 0.3%.

Update #24286

Aside: for this function f, we don't really need to allocate
temporaries for the convT2E function. We could use the address
of a, b, and c directly. That might get similar (or maybe better?)
improvements. I investigated a bit, but it seemed complicated
to do it safely. This change was much easier.

Change-Id: I78cbe51b501fb41e1e324ce4203f0de56a1db82d
Reviewed-on: https://go-review.googlesource.com/c/135377
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Josh Bleecher Snyder <josharian@gmail.com>
src/cmd/compile/internal/gc/builtin.go
src/cmd/compile/internal/gc/builtin/runtime.go
src/cmd/compile/internal/gc/order.go
src/cmd/compile/internal/gc/walk.go
src/runtime/iface.go
test/fixedbugs/issue20250.go
test/live.go