aboutsummaryrefslogtreecommitdiff
path: root/test/interface
diff options
context:
space:
mode:
authorJosh Bleecher Snyder <josharian@gmail.com>2016-06-06 12:38:19 -0700
committerJosh Bleecher Snyder <josharian@gmail.com>2016-08-17 01:12:01 +0000
commit615a52b95b5eedb94297f8de6e7838b16445bd16 (patch)
treedb90accfdd7915d087c1d6dd81dc0b3659ad37ec /test/interface
parent074d6a649c57a3731e273c8f9dcb36f1663e504a (diff)
downloadgo-615a52b95b5eedb94297f8de6e7838b16445bd16.tar.gz
go-615a52b95b5eedb94297f8de6e7838b16445bd16.zip
cmd/compile: inline x, ok := y.(T) where T is a scalar
When T is a scalar, there are no runtime calls required, which makes this a clear win. encoding/binary: WriteInts-8 958ns ± 3% 864ns ± 2% -9.80% (p=0.000 n=15+15) This also considerably shrinks a core fmt routine: Before: "".(*pp).printArg t=1 size=3952 args=0x20 locals=0xf0 After: "".(*pp).printArg t=1 size=2624 args=0x20 locals=0x98 Unfortunately, I find it very hard to get stable numbers out of the fmt benchmarks due to thermal scaling. Change-Id: I1278006b030253bf8e48dc7631d18985cdaa143d Reviewed-on: https://go-review.googlesource.com/26659 Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com> Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'test/interface')
-rw-r--r--test/interface/assertinline.go16
1 files changed, 15 insertions, 1 deletions
diff --git a/test/interface/assertinline.go b/test/interface/assertinline.go
index 227fe70d87..c3f3624570 100644
--- a/test/interface/assertinline.go
+++ b/test/interface/assertinline.go
@@ -43,7 +43,7 @@ func assertbig(x interface{}) complex128 {
}
func assertbig2(x interface{}) (complex128, bool) {
- z, ok := x.(complex128) // ERROR "type assertion not inlined"
+ z, ok := x.(complex128) // ERROR "type assertion .scalar result. inlined"
return z, ok
}
@@ -51,3 +51,17 @@ func assertbig2ok(x interface{}) (complex128, bool) {
_, ok := x.(complex128) // ERROR "type assertion [(]ok only[)] inlined"
return 0, ok
}
+
+func assertslice(x interface{}) []int {
+ return x.([]int) // ERROR "type assertion not inlined"
+}
+
+func assertslice2(x interface{}) ([]int, bool) {
+ z, ok := x.([]int) // ERROR "type assertion not inlined"
+ return z, ok
+}
+
+func assertslice2ok(x interface{}) ([]int, bool) {
+ _, ok := x.([]int) // ERROR "type assertion [(]ok only[)] inlined"
+ return nil, ok
+}