cmd/gc: allocate non-escaping maps on stack
Extend escape analysis to make(map[k]v).
If it does not escape, allocate temp buffer for hmap and one bucket on stack.
There are 75 cases of non-escaping maps in std lib.
benchmark old allocs new allocs delta
BenchmarkConcurrentStmtQuery 16161 15161 -6.19%
BenchmarkConcurrentTxQuery 17658 16658 -5.66%
BenchmarkConcurrentTxStmtQuery 16157 15156 -6.20%
BenchmarkConcurrentRandom 13637 13114 -3.84%
BenchmarkManyConcurrentQueries 22 20 -9.09%
BenchmarkDecodeComplex128Slice 250 188 -24.80%
BenchmarkDecodeFloat64Slice 250 188 -24.80%
BenchmarkDecodeInt32Slice 250 188 -24.80%
BenchmarkDecodeStringSlice 2250 2188 -2.76%
BenchmarkNewEmptyMap 1 0 -100.00%
BenchmarkNewSmallMap 2 0 -100.00%
benchmark old ns/op new ns/op delta
BenchmarkNewEmptyMap 124 55.7 -55.08%
BenchmarkNewSmallMap 317 148 -53.31%
benchmark old allocs new allocs delta
BenchmarkNewEmptyMap 1 0 -100.00%
BenchmarkNewSmallMap 2 0 -100.00%
benchmark old bytes new bytes delta
BenchmarkNewEmptyMap 48 0 -100.00%
BenchmarkNewSmallMap 192 0 -100.00%
Fixes #5449
Change-Id: I24fa66f949d2f138885d9e66a0d160240dc9e8fa
Reviewed-on: https://go-review.googlesource.com/3508
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
diff --git a/test/live2.go b/test/live2.go
index 1bd0af2..7474756 100644
--- a/test/live2.go
+++ b/test/live2.go
@@ -25,15 +25,15 @@
}
func bad40() {
- t := newT40() // ERROR "live at call to makemap: ret"
- printnl() // ERROR "live at call to printnl: ret"
+ t := newT40() // ERROR "live at call to makemap: autotmp_.* ret"
+ printnl() // ERROR "live at call to printnl: autotmp_.* ret"
_ = t
}
func good40() {
ret := T40{}
- ret.m = make(map[int]int) // ERROR "live at call to makemap: ret"
+ ret.m = make(map[int]int) // ERROR "live at call to makemap: autotmp_.* ret"
t := &ret
- printnl() // ERROR "live at call to printnl: ret"
+ printnl() // ERROR "live at call to printnl: autotmp_.* ret"
_ = t
}