diff options
author | Keith Randall <khr@golang.org> | 2018-09-14 10:09:08 -0700 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2018-10-14 03:46:51 +0000 |
commit | 0e9f8a21f8b6534931f1ab50909161a289a0da3c (patch) | |
tree | 308690e988344f6d44dbf47561dd91622d40cf27 /test/live.go | |
parent | 653a4bd8d46a8a329f37e8a9fc909c3bb92b02bc (diff) | |
download | go-0e9f8a21f8b6534931f1ab50909161a289a0da3c.tar.gz go-0e9f8a21f8b6534931f1ab50909161a289a0da3c.zip |
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>
Diffstat (limited to 'test/live.go')
-rw-r--r-- | test/live.go | 8 |
1 files changed, 4 insertions, 4 deletions
diff --git a/test/live.go b/test/live.go index 679562d9bf..ba50f5b779 100644 --- a/test/live.go +++ b/test/live.go @@ -141,7 +141,7 @@ var i9 interface{} func f9() bool { g8() x := i9 - y := interface{}(str()) // ERROR "live at call to convT2Estring: x.data$" "live at call to str: x.data$" "stack object .autotmp_[0-9]+ string$" + y := interface{}(g18()) // ERROR "live at call to convT2E: x.data$" "live at call to g18: x.data$" "stack object .autotmp_[0-9]+ \[2\]string$" i9 = y // make y escape so the line above has to call convT2E return x != y } @@ -493,13 +493,13 @@ func f30(b bool) { func f31(b1, b2, b3 bool) { if b1 { - g31(str()) // ERROR "stack object .autotmp_[0-9]+ string$" + g31(g18()) // ERROR "stack object .autotmp_[0-9]+ \[2\]string$" } if b2 { - h31(str()) // ERROR "live at call to convT2Estring: .autotmp_[0-9]+$" "live at call to newobject: .autotmp_[0-9]+$" "stack object .autotmp_[0-9]+ string$" + h31(g18()) // ERROR "live at call to convT2E: .autotmp_[0-9]+$" "live at call to newobject: .autotmp_[0-9]+$" "stack object .autotmp_[0-9]+ \[2\]string$" } if b3 { - panic(str()) // ERROR "stack object .autotmp_[0-9]+ string$" + panic(g18()) // ERROR "stack object .autotmp_[0-9]+ \[2\]string$" } print(b3) } |