You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I'd expect the compiler to detect that hey, there will be a READ-ONLY use of the key thus convert from []byte->slice with zero allocations
but unfortunately this code was showing up hot in our continuous profiler so I took a sample and alas when I experimented with a manual []byte->string zero allocation with
diff --git a/mapstore.go b/mapstore.go
index 5fe381b..ed063fc 100644
--- a/mapstore.go+++ b/mapstore.go@@ -2,6 +2,8 @@ package smt
import (
"fmt"
+ "reflect"+ "unsafe"
)
// MapStore is a key-value store.
@@ -32,9 +34,14 @@ func NewSimpleMap() *SimpleMap {
}
}
+func bytesToStr(b []byte) (str string) {+ hdr := (*reflect.StringHeader)(unsafe.Pointer(&str))+ return *(*string)(unsafe.Pointer(hdr))+}+
// Get gets the value for a key.
func (sm *SimpleMap) Get(key []byte) ([]byte, error) {
- if value, ok := sm.m[string(key)]; ok {+ if value, ok := sm.m[bytesToStr(key)]; ok {
return value, nil
}
return nil, &InvalidKeyError{Key: key}
the results were shocking
$ benchstat before.txt after.txt
name old time/op new time/op delta
SparseMerkleTree_Update-8 22.9µs ± 8% 2.4µs ±12% -89.65% (p=0.000 n=20+20)
name old alloc/op new alloc/op delta
SparseMerkleTree_Update-8 15.8kB ± 0% 12.8kB ± 0% -19.49% (p=0.000 n=19+20)
name old allocs/op new allocs/op delta
SparseMerkleTree_Update-8 59.0 ± 0% 7.0 ± 0% -88.14% (p=0.000 n=16+20)
ROUTINE ======================== github.com/celestiaorg/smt.(*SimpleMap).Get in /Users/emmanuelodeke/go/src/github.com/celestiaorg/smt/mapstore.go
20ms 1.10s (flat, cum) 5.08% of Total
.. 31: m: make(map[string][]byte),
.. 32: }
.. 33:}
.. 34:
.. 35:// Get gets the value for a key.
. 10ms 36:func (sm *SimpleMap) Get(key []byte) ([]byte, error) {
10ms 1.08s 37: if value, ok := sm.m[string(key)]; ok {
10ms 10ms 38: return value, nil
.. 39: }
.. 40: return nil, &InvalidKeyError{Key: key}
.. 41:}
.. 42:
.. 43:// Set updates the value for a key.
and on looking further I noticed
ROUTINE ======================== runtime.slicebytetostring in /Users/emmanuelodeke/go/src/go.googlesource.com/go/src/runtime/string.go
40ms 370ms (flat, cum) 1.71% of Total
.. 75:// It is inserted by the compiler into generated code.
.. 76:// ptr is a pointer to the first element of the slice;.. 77:// n is the length of the slice.
.. 78:// Buf is a fixed-size buffer for the result,
.. 79:// it is not nil if the result does not escape.
20ms 20ms 80:func slicebytetostring(buf *tmpBuf, ptr *byte, n int) (str string) {
.. 81: if n == 0 {
.. 82: // Turns out to be a relatively common case.
.. 83: // Consider that you want to parse out data between parens in"foo()bar",
.. 84: // you find the indices and convert the subslice to string.
.. 85: return"".. 86: }
.. 87: if raceenabled {
.. 88: racereadrangepc(unsafe.Pointer(ptr),
.. 89: uintptr(n),
.. 90: getcallerpc(),
.. 91: funcPC(slicebytetostring))
.. 92: }
.. 93: if msanenabled {
.. 94: msanread(unsafe.Pointer(ptr), uintptr(n))
.. 95: }
.. 96: if n == 1 {
.. 97: p := unsafe.Pointer(&staticuint64s[*ptr])
.. 98: if sys.BigEndian {
.. 99: p = add(p, 7)
.. 100: }
.. 101: stringStructOf(&str).str = p
.. 102: stringStructOf(&str).len = 1
.. 103: return.. 104: }
.. 105:
.. 106: var p unsafe.Pointer
10ms 10ms 107: if buf != nil && n <= len(buf) {
.. 108: p = unsafe.Pointer(buf)
.. 109: } else {
. 290ms 110: p = mallocgc(uintptr(n), nil, false)
.. 111: }
.. 112: stringStructOf(&str).str = p
.. 113: stringStructOf(&str).len = n
. 40ms 114: memmove(p, unsafe.Pointer(ptr), uintptr(n))
10ms 10ms 115: return.. 116:}
.. 117:
.. 118:// stringDataOnStack reports whether the string's data is . . 119:// stored on the current goroutine's stack.
.. 120:func stringDataOnStack(s string) bool {
before walk os.(*File).close
. AS l(1) tc(1)
.. NAME-main..this g(2) l(1) x(0) class(PPARAM) esc(no) tc(1) assigned used PTR-@0
.. CONVNOP l(1) tc(1) PTR-@0
... DOTPTR l(1) x(0) tc(1) implicit(true) os.file PTR-@0
.... NAME-main..this g(2) l(1) x(0) class(PPARAM) esc(no) tc(1) assigned used PTR-@0
. RETJMP l(1) tc(1) os.(*file).close
after walk os.(*File).close
. AS l(1) tc(1) hascall
.. NAME-main..this g(2) l(1) x(0) class(PPARAM) esc(no) tc(1) assigned used PTR-@0
.. CONVNOP l(1) tc(1) hascall PTR-@0
... DOTPTR l(1) x(0) tc(1) implicit(true) hascall os.file PTR-@0
.... NAME-main..this g(2) l(1) x(0) class(PPARAM) esc(no) tc(1) assigned used PTR-@0
. RETJMP l(1) tc(1) os.(*file).close
enter os.(*File).close
. AS l(1)
.. NAME-main.~r0 g(1) l(240) x(8) class(PPARAMOUT) esc(no) error
before walk main
. DCL l(9)
.. NAME-main.f g(1) l(9) x(0) class(PAUTO) esc(no) tc(1) used PTR-@0
. DCL l(9)
.. NAME-main.err g(2) l(9) x(0) class(PAUTO) esc(no) tc(1) used error
. DCL l(9)
.. NAME-os.name l(295) x(0) class(PAUTO) esc(no) tc(1) assigned used string
. DCL l(9)
.. NAME-main.~R0 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
. DCL l(9)
.. NAME-main.~R1 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. AS2 l(9) tc(1)
. AS2-list
.. NAME-os.name l(295) x(0) class(PAUTO) esc(no) tc(1) assigned used string
. AS2-rlist
.. LITERAL-"prof.cpu" l(9) tc(1) string
. AS l(9) tc(1)
.. NAME-main.~R0 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
. AS l(9) tc(1)
.. NAME-main.~R1 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. INLMARK l(+9) x(0)
. DCL l(9) tc(1)
.. NAME-os..autotmp_3 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
. AS l(9) tc(1)
.. NAME-os..autotmp_3 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
. DCL l(9) tc(1)
.. NAME-os..autotmp_4 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. AS l(9) tc(1)
.. NAME-os..autotmp_4 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. AS l(296) tc(1)
.. NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
. AS l(296) tc(1)
.. NAME-main..autotmp_19 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used error
. AS2FUNC l(296) tc(1)
.. CALLFUNC l(296) tc(1) STRUCT-@0
... NAME-os.OpenFile l(305) x(0) class(PFUNC) tc(1) used FUNC-@0
.. CALLFUNC-list
... NAME-os.name l(295) x(0) class(PAUTO) esc(no) tc(1) assigned used string
... LITERAL-1538 l(296) tc(1) int
... LITERAL-438 l(296) tc(1) os.FileMode
. AS2FUNC-list
.. NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.. NAME-main..autotmp_19 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used error
. AS2 l(296) tc(1)
. AS2-list
.. NAME-os..autotmp_3 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
.. NAME-os..autotmp_4 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. AS2-rlist
.. NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.. NAME-main..autotmp_19 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used error
. VARKILL l(296) tc(1)
.. NAME-main..autotmp_19 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used error
. VARKILL l(296) tc(1)
.. NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
. AS2 l(9) tc(1)
. AS2-list
.. NAME-main.~R0 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
.. NAME-main.~R1 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. AS2-rlist
.. NAME-os..autotmp_3 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
.. NAME-os..autotmp_4 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. GOTO l(9) tc(1) main..i0
. LABEL l(9) tc(1) main..i0
. AS2 l(9) colas(true) tc(1)
. AS2-list
.. NAME-main.f g(1) l(9) x(0) class(PAUTO) esc(no) tc(1) used PTR-@0
.. NAME-main.err g(2) l(9) x(0) class(PAUTO) esc(no) tc(1) used error
. AS2-rlist
.. CONVNOP l(9) tc(1) hascall PTR-@0
... NAME-main.~R0 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
.. NAME-main.~R1 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. IF l(10) tc(1)
.. NE l(10) tc(1) bool
... NAME-main.err g(2) l(9) x(0) class(PAUTO) esc(no) tc(1) used error
... LITERAL-nil tc(1) .nil error
. IF-body
.. PANIC l(11) tc(1)
... NAME-main.err g(2) l(9) x(0) class(PAUTO) esc(no) tc(1) used error
. DEFER l(13) esc(N) tc(1)
.. CALLMETH l(13) tc(1) error
... DOTMETH l(13) tc(1) os.(*File).Close FUNC-@0
.... NAME-main.f g(1) l(9) x(0) class(PAUTO) esc(no) tc(1) used PTR-@0
. DCL l(15)
.. NAME-main.err g(3) l(15) x(0) class(PAUTO) esc(no) tc(1) used error
. AS l(15) tc(1)
.. NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.. NAME-main.f g(1) l(9) x(0) class(PAUTO) esc(no) tc(1) used PTR-@0
. AS l(15) colas(true) tc(1)
.. NAME-main.err g(3) l(15) x(0) class(PAUTO) esc(no) tc(1) used error
.. CALLFUNC l(15) tc(1) error
... NAME-pprof.StartCPUProfile l(727) x(0) class(PFUNC) tc(1) used FUNC-@0
.. CALLFUNC-list
... CONVIFACE l(15) tc(1) implicit(true) io.Writer
.... NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
. VARKILL l(15) tc(1)
.. NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
. IF l(15) tc(1)
.. NE l(15) tc(1) bool
... NAME-main.err g(3) l(15) x(0) class(PAUTO) esc(no) tc(1) used error
... LITERAL-nil tc(1) .nil error
. IF-body
.. PANIC l(16) tc(1)
... NAME-main.err g(3) l(15) x(0) class(PAUTO) esc(no) tc(1) used error
. DEFER l(18) esc(N) tc(1)
.. CALLFUNC l(18) tc(1)
... NAME-pprof.StopCPUProfile l(786) x(0) class(PFUNC) tc(1) used FUNC-@0
. DCL l(20)
.. NAME-main.m g(4) l(20) x(0) class(PAUTO) esc(no) tc(1) used MAP-@0
. AS l(20) colas(true) tc(1)
.. NAME-main.m g(4) l(20) x(0) class(PAUTO) esc(no) tc(1) used MAP-@0
.. MAKEMAP l(20) esc(no) tc(1) MAP-@0
... LITERAL-0 l(20) untyped int
. AS l(21) tc(1)
.. NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. STR2BYTES l(21) esc(h) tc(1) SLICE-@0
... LITERAL-"d1" l(21) tc(1) string
. AS l(21) tc(1)
.. INDEXMAP l(21) tc(1) SLICE-@0
... NAME-main.m g(4) l(20) x(0) class(PAUTO) esc(no) tc(1) used MAP-@0
... LITERAL-"a" l(21) tc(1) string
.. NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. VARKILL l(21) tc(1)
.. NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. DCL l(22)
.. NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
. AS l(22) colas(true) tc(1)
.. NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. LITERAL-0 l(22) tc(1) int
. FOR l(22) tc(1)
.. LT l(22) tc(1) bool
... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
... LITERAL-10 l(22) tc(1) int
.. BLOCK l(22)
.. BLOCK-list
... ASOP-ADD l(22) tc(1) implicit(true) int
.... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.... LITERAL-1 l(22) tc(1) int
. FOR-body
.. AS l(23) tc(1)
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
... SLICELIT l(23) esc(h) tc(1) SLICE-@0
.... LITERAL-2 l(23) untyped int
... SLICELIT-list
.... CONV l(23) tc(1) byte
..... AND l(23) tc(1) int
...... LITERAL-255 l(23) tc(1) int
...... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.... CONV l(23) tc(1) byte
..... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. AS l(23) tc(1)
... INDEXMAP l(23) tc(1) SLICE-@0
.... NAME-main.m g(4) l(20) x(0) class(PAUTO) esc(no) tc(1) used MAP-@0
.... RUNESTR l(23) esc(h) tc(1) string
..... ADD l(23) tc(1) int
...... LITERAL-97 l(23) tc(1) int
...... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. VARKILL l(23) tc(1)
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. DCL l(25)
.. NAME-main.i g(6) l(25) x(0) class(PAUTO) esc(no) tc(1) assigned used int
. AS l(25) colas(true) tc(1)
.. NAME-main.i g(6) l(25) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. LITERAL-0 l(25) tc(1) int
. FOR l(25) tc(1)
.. LT l(25) tc(1) bool
... NAME-main.i g(6) l(25) x(0) class(PAUTO) esc(no) tc(1) assigned used int
... LITERAL-1000000000 l(25) tc(1) int
.. BLOCK l(25)
.. BLOCK-list
... ASOP-ADD l(25) tc(1) implicit(true) int
.... NAME-main.i g(6) l(25) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.... LITERAL-1 l(25) tc(1) int
. FOR-body
.. DCL l(26)
... NAME-main.value g(7) l(26) x(0) class(PAUTO) esc(no) tc(1) used SLICE-@0
.. DCL l(26)
... NAME-main.m l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used MAP-@0
.. DCL l(26)
... NAME-main.key l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. DCL l(26)
... NAME-main.~r2 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. DCL l(26)
... NAME-main.~r3 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. AS l(26) tc(1)
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
... STR2BYTES l(26) esc(no) tc(1) SLICE-@0
.... LITERAL-"b" l(26) tc(1) string
.. AS2 l(26) tc(1)
.. AS2-list
... NAME-main.m l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used MAP-@0
... NAME-main.key l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. AS2-rlist
... NAME-main.m g(4) l(20) x(0) class(PAUTO) esc(no) tc(1) used MAP-@0
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. VARKILL l(26) tc(1)
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. AS l(26) tc(1)
... NAME-main.~r2 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. AS l(26) tc(1)
... NAME-main.~r3 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. INLMARK l(+26) x(1)
.. DCL l(34)
... NAME-main.value l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. DCL l(34)
... NAME-main.ok l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
.. AS l(34) tc(1)
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. AS2MAPR l(34) colas(true) tc(1)
... INDEXMAP l(34) tc(1) SLICE-@0
.... NAME-main.m l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used MAP-@0
.... BYTES2STRTMP l(34) esc(no) tc(1) string
..... NAME-main.key l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. AS2MAPR-list
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
... NAME-main..autotmp_21 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
.. AS l(34) tc(1)
... NAME-main.value l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. AS l(34) tc(1)
... NAME-main.ok l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
... NAME-main..autotmp_21 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
.. VARKILL l(34) tc(1)
... NAME-main..autotmp_21 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
.. VARKILL l(34) tc(1)
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. IF l(34) tc(1)
... NAME-main.ok l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
.. IF-body
... AS2 l(26) tc(1)
... AS2-list
.... NAME-main.~r2 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.... NAME-main.~r3 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used int
... AS2-rlist
.... NAME-main.value l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.... LITERAL-0 l(35) tc(1) int
... GOTO l(26) tc(1) main..i1
.. AS2 l(26) tc(1)
.. AS2-list
... NAME-main.~r2 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
... NAME-main.~r3 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. AS2-rlist
... LITERAL-nil tc(1) .nil SLICE-@0
... LITERAL-1 l(37) tc(1) int
.. GOTO l(26) tc(1) main..i1
.. LABEL l(26) tc(1) main..i1
.. AS2 l(26) colas(true) tc(1)
.. AS2-list
... NAME-main.value g(7) l(26) x(0) class(PAUTO) esc(no) tc(1) used SLICE-@0
... NAME-_ x(0) tc(1) assigned blank
.. AS2-rlist
... CONVNOP l(26) tc(1) hascall SLICE-@0
.... NAME-main.~r2 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
... NAME-main.~r3 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. IF l(27) tc(1)
... EQ-init
.... AS l(27) tc(1)
..... NAME-main..autotmp_22 l(27) x(0) class(PAUTO) esc(N) tc(1) assigned used int
..... LEN l(27) tc(1) int
...... NAME-main.value g(7) l(26) x(0) class(PAUTO) esc(no) tc(1) used SLICE-@0
... EQ l(27) tc(1) hascall bool
.... NAME-main..autotmp_22 l(27) x(0) class(PAUTO) esc(N) tc(1) assigned used int
.... LITERAL-100 l(27) tc(1) int
.. IF-rlist
... VARKILL l(27) tc(1)
.... NAME-main..autotmp_22 l(27) x(0) class(PAUTO) esc(N) tc(1) assigned used int
.. IF-body
... VARKILL l(27) tc(1)
.... NAME-main..autotmp_22 l(27) x(0) class(PAUTO) esc(N) tc(1) assigned used int
... AS l(28) tc(1)
.... NAME-main..autotmp_23 l(28) x(0) class(PAUTO) esc(N) tc(1) assigned used string
.... BYTES2STR l(28) esc(h) tc(1) string
..... NAME-main.value g(7) l(26) x(0) class(PAUTO) esc(no) tc(1) used SLICE-@0
... PANIC l(28) tc(1)
.... NAME-main..autotmp_23 l(28) x(0) class(PAUTO) esc(N) tc(1) assigned used string
... VARKILL l(28) tc(1)
.... NAME-main..autotmp_23 l(28) x(0) class(PAUTO) esc(N) tc(1) assigned used string
after walk main
. DCL l(9)
.. NAME-main.f g(1) l(9) x(0) class(PAUTO) esc(no) tc(1) used PTR-@0
. DCL l(9)
.. NAME-main.err g(2) l(9) x(0) class(PAUTO) esc(no) tc(1) used error
. DCL l(9)
.. NAME-os.name l(295) x(0) class(PAUTO) esc(no) tc(1) assigned used string
. DCL l(9)
.. NAME-main.~R0 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
. DCL l(9)
.. NAME-main.~R1 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. BLOCK l(9)
. BLOCK-list
.. AS l(9) tc(1)
... NAME-os.name l(295) x(0) class(PAUTO) esc(no) tc(1) assigned used string
... LITERAL-"prof.cpu" l(9) tc(1) string
. AS l(9) tc(1)
.. NAME-main.~R0 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
. AS l(9) tc(1)
.. NAME-main.~R1 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. INLMARK l(+9) x(0)
. DCL l(9) tc(1)
.. NAME-os..autotmp_3 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
. AS l(9) tc(1)
.. NAME-os..autotmp_3 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
. DCL l(9) tc(1)
.. NAME-os..autotmp_4 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. AS l(9) tc(1)
.. NAME-os..autotmp_4 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. AS l(296) tc(1)
.. NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
. AS l(296) tc(1)
.. NAME-main..autotmp_19 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used error
. BLOCK-init
.. CALLFUNC l(296) tc(1) hascall STRUCT-@0
... NAME-os.OpenFile l(305) x(0) class(PFUNC) tc(1) used FUNC-@0
.. CALLFUNC-rlist
... NAME-os.name l(295) x(0) class(PAUTO) esc(no) tc(1) assigned used string
... LITERAL-1538 l(296) tc(1) int
... LITERAL-438 l(296) tc(1) os.FileMode
. BLOCK l(296) hascall
. BLOCK-list
.. AS l(296) tc(1)
... NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
... RESULT l(296) x(32) tc(1) PTR-@0
.. AS l(296) tc(1)
... NAME-main..autotmp_19 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used error
... RESULT l(296) x(40) tc(1) error
. BLOCK l(296)
. BLOCK-list
.. AS l(296) tc(1)
... NAME-os..autotmp_3 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
... NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.. AS l(296) tc(1)
... NAME-os..autotmp_4 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used error
... NAME-main..autotmp_19 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used error
. VARKILL l(296) tc(1)
.. NAME-main..autotmp_19 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used error
. VARKILL l(296) tc(1)
.. NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
. BLOCK l(9)
. BLOCK-list
.. AS l(9) tc(1)
... NAME-main.~R0 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
... NAME-os..autotmp_3 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
.. AS l(9) tc(1)
... NAME-main.~R1 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used error
... NAME-os..autotmp_4 l(296) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. GOTO l(9) tc(1) main..i0
. LABEL l(9) tc(1) main..i0
. BLOCK-init
.. AS l(9) tc(1)
... NAME-main..autotmp_24 l(9) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
... CONVNOP l(9) tc(1) PTR-@0
.... NAME-main.~R0 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used PTR-@0
. BLOCK l(9) hascall
. BLOCK-list
.. AS l(9) tc(1)
... NAME-main.f g(1) l(9) x(0) class(PAUTO) esc(no) tc(1) used PTR-@0
... NAME-main..autotmp_24 l(9) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.. AS l(9) tc(1)
... NAME-main.err g(2) l(9) x(0) class(PAUTO) esc(no) tc(1) used error
... NAME-main.~R1 l(9) x(0) class(PAUTO) esc(no) tc(1) assigned used error
. IF l(10) tc(1)
.. NE l(10) tc(1) bool
... NAME-main.err g(2) l(9) x(0) class(PAUTO) esc(no) tc(1) used error
... LITERAL-nil tc(1) .nil error
. IF-body
.. CALLFUNC-init
... AS l(11)
.... NAME-main..autotmp_25 l(11) x(0) class(PAUTO) esc(N) tc(1) used error
.... NAME-main.err g(2) l(9) x(0) class(PAUTO) esc(no) tc(1) used error
... AS l(11)
.... NAME-main..autotmp_26 l(11) x(0) class(PAUTO) esc(N) tc(1) used PTR-@0
.... ITAB l(11) tc(1) PTR-@0
..... NAME-main..autotmp_25 l(11) x(0) class(PAUTO) esc(N) tc(1) used error
... IF l(11)
.... NE l(11) tc(1) untyped bool
..... NAME-main..autotmp_26 l(11) x(0) class(PAUTO) esc(N) tc(1) used PTR-@0
..... LITERAL-nil l(11) tc(1) PTR-@0
... IF-body
.... AS l(11)
..... NAME-main..autotmp_26 l(11) x(0) class(PAUTO) esc(N) tc(1) used PTR-@0
..... DOTPTR l(11) x(8) tc(1) bounded PTR-@0
...... NAME-main..autotmp_26 l(11) x(0) class(PAUTO) esc(N) tc(1) used PTR-@0
.. CALLFUNC l(11) tc(1) hascall
... NAME-runtime.gopanic x(0) class(PFUNC) tc(1) used FUNC-@0
.. CALLFUNC-rlist
... EFACE l(11) tc(1) INTER-@0
.... NAME-main..autotmp_26 l(11) x(0) class(PAUTO) esc(N) tc(1) used PTR-@0
.... IDATA l(11) tc(1) PTR-@0
..... NAME-main..autotmp_25 l(11) x(0) class(PAUTO) esc(N) tc(1) used error
. DEFER l(13) esc(N) tc(1)
.. CALLMETH l(13) tc(1) hascall error
... DOTMETH l(13) tc(1) os.(*File).Close FUNC-@0
.. CALLMETH-rlist
... NAME-main.f g(1) l(9) x(0) class(PAUTO) esc(no) tc(1) used PTR-@0
. DCL l(15)
.. NAME-main.err g(3) l(15) x(0) class(PAUTO) esc(no) tc(1) used error
. AS l(15) tc(1)
.. NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.. NAME-main.f g(1) l(9) x(0) class(PAUTO) esc(no) tc(1) used PTR-@0
. AS l(15) colas(true) tc(1) hascall
.. NAME-main.err g(3) l(15) x(0) class(PAUTO) esc(no) tc(1) used error
.. CALLFUNC l(15) tc(1) hascall error
... NAME-pprof.StartCPUProfile l(727) x(0) class(PFUNC) tc(1) used FUNC-@0
.. CALLFUNC-rlist
... EFACE l(15) tc(1) io.Writer
.... ADDR l(15) tc(1) PTR-@0
..... NAME-go.itab.*os.File,io.Writer l(15) x(0) class(PEXTERN) tc(1) uint8
.... NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
. VARKILL l(15) tc(1)
.. NAME-main..autotmp_18 l(296) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
. IF l(15) tc(1)
.. NE l(15) tc(1) bool
... NAME-main.err g(3) l(15) x(0) class(PAUTO) esc(no) tc(1) used error
... LITERAL-nil tc(1) .nil error
. IF-body
.. CALLFUNC-init
... AS l(16)
.... NAME-main..autotmp_27 l(16) x(0) class(PAUTO) esc(N) tc(1) used error
.... NAME-main.err g(3) l(15) x(0) class(PAUTO) esc(no) tc(1) used error
... AS l(16)
.... NAME-main..autotmp_28 l(16) x(0) class(PAUTO) esc(N) tc(1) used PTR-@0
.... ITAB l(16) tc(1) PTR-@0
..... NAME-main..autotmp_27 l(16) x(0) class(PAUTO) esc(N) tc(1) used error
... IF l(16)
.... NE l(16) tc(1) untyped bool
..... NAME-main..autotmp_28 l(16) x(0) class(PAUTO) esc(N) tc(1) used PTR-@0
..... LITERAL-nil l(16) tc(1) PTR-@0
... IF-body
.... AS l(16)
..... NAME-main..autotmp_28 l(16) x(0) class(PAUTO) esc(N) tc(1) used PTR-@0
..... DOTPTR l(16) x(8) tc(1) bounded PTR-@0
...... NAME-main..autotmp_28 l(16) x(0) class(PAUTO) esc(N) tc(1) used PTR-@0
.. CALLFUNC l(16) tc(1) hascall
... NAME-runtime.gopanic x(0) class(PFUNC) tc(1) used FUNC-@0
.. CALLFUNC-rlist
... EFACE l(16) tc(1) INTER-@0
.... NAME-main..autotmp_28 l(16) x(0) class(PAUTO) esc(N) tc(1) used PTR-@0
.... IDATA l(16) tc(1) PTR-@0
..... NAME-main..autotmp_27 l(16) x(0) class(PAUTO) esc(N) tc(1) used error
. DEFER l(18) esc(N) tc(1)
.. CALLFUNC l(18) tc(1) hascall
... NAME-pprof.StopCPUProfile l(786) x(0) class(PFUNC) tc(1) used FUNC-@0
. DCL l(20)
.. NAME-main.m g(4) l(20) x(0) class(PAUTO) esc(no) tc(1) used MAP-@0
. AS-init
.. AS l(20) tc(1)
... NAME-main..autotmp_29 l(20) x(0) class(PAUTO) esc(N) tc(1) addrtaken assigned used STRUCT-@0
.. AS l(20) tc(1)
... NAME-main..autotmp_30 l(20) x(0) class(PAUTO) esc(N) tc(1) addrtaken assigned used STRUCT-@0
.. AS l(20) tc(1)
... DOTPTR l(20) x(16) tc(1) .buckets PTR-@0
.... ADDR l(20) tc(1) PTR-@0
..... NAME-main..autotmp_29 l(20) x(0) class(PAUTO) esc(N) tc(1) addrtaken assigned used STRUCT-@0
... ADDR l(20) tc(1) PTR-@0
.... NAME-main..autotmp_30 l(20) x(0) class(PAUTO) esc(N) tc(1) addrtaken assigned used STRUCT-@0
.. AS l(20) tc(1)
... NAME-main..autotmp_31 l(20) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
... ADDR l(20) tc(1) PTR-@0
.... NAME-main..autotmp_29 l(20) x(0) class(PAUTO) esc(N) tc(1) addrtaken assigned used STRUCT-@0
.. AS l(20) tc(1) hascall
... DOTPTR l(20) x(12) tc(1) hascall .hash0 uint32
.... NAME-main..autotmp_31 l(20) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
... CALLFUNC l(20) tc(1) hascall uint32
.... NAME-runtime.fastrand x(0) class(PFUNC) tc(1) used FUNC-@0
. AS l(20) colas(true) tc(1) hascall
.. NAME-main.m g(4) l(20) x(0) class(PAUTO) esc(no) tc(1) used MAP-@0
.. CONVNOP l(20) tc(1) MAP-@0
... ADDR l(20) tc(1) PTR-@0
.... NAME-main..autotmp_29 l(20) x(0) class(PAUTO) esc(N) tc(1) addrtaken assigned used STRUCT-@0
. AS-init
.. AS l(21) tc(1)
... NAME-main..autotmp_32 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
... NEWOBJ l(21) tc(1) nonnil PTR-@0
.... ADDR l(21) tc(1) PTR-@0
..... NAME-type.[2]uint8 x(0) class(PEXTERN) tc(1) uint8
.. AS l(21) tc(1) hascall
... DEREF l(21) tc(1) hascall ARRAY-@0
.... NAME-main..autotmp_32 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
... DEREF l(21) tc(1) hascall ARRAY-@0
.... CONVNOP l(21) tc(1) PTR-@0
..... SPTR l(21) tc(1) PTR-@0
...... LITERAL-"d1" l(21) tc(1) string
. AS l(21) tc(1) hascall
.. NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. SLICEARR l(21) esc(h) tc(1) hascall SLICE-@0
... NAME-main..autotmp_32 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
. AS-init
.. AS l(21) tc(1) hascall
... NAME-main..autotmp_33 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
... CALLFUNC l(21) tc(1) nonnil hascall PTR-@0
.... NAME-runtime.mapassign_faststr x(0) class(PFUNC) tc(1) used FUNC-@0
... CALLFUNC-rlist
.... ADDR l(21) tc(1) PTR-@0
..... NAME-type.map[string][]uint8 x(0) class(PEXTERN) tc(1) uint8
.... NAME-main.m g(4) l(20) x(0) class(PAUTO) esc(no) tc(1) used MAP-@0
.... LITERAL-"a" l(21) tc(1) string
. AS l(21) tc(1) hascall
.. DEREF l(21) tc(1) hascall SLICE-@0
... NAME-main..autotmp_33 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.. NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. VARKILL l(21) tc(1)
.. NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. DCL l(22)
.. NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
. AS l(22) colas(true) tc(1)
.. NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. LITERAL-0 l(22) tc(1) int
. FOR l(22) tc(1)
.. LT l(22) tc(1) bool
... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
... LITERAL-10 l(22) tc(1) int
.. BLOCK l(22)
.. BLOCK-list
... AS l(22) tc(1) implicit(true) int
.... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.... ADD l(22) tc(1) int
..... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
..... LITERAL-1 l(22) tc(1) int
. FOR-body
.. EMPTY-init
... AS l(23) tc(1)
.... NAME-main..autotmp_34 l(23) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.... NEWOBJ l(23) tc(1) nonnil PTR-@0
..... ADDR l(23) tc(1) PTR-@0
...... NAME-type.[2]uint8 x(0) class(PEXTERN) tc(1) uint8
... BLOCK l(23)
... BLOCK-list
.... AS l(23) tc(1) hascall
..... INDEX l(23) tc(1) bounded hascall byte
...... DEREF l(23) tc(1) implicit(true) hascall ARRAY-@0
....... NAME-main..autotmp_34 l(23) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
...... LITERAL-0 l(23) tc(1) int
..... CONV l(23) tc(1) byte
...... AND l(23) tc(1) int
....... LITERAL-255 l(23) tc(1) int
....... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
... BLOCK l(23)
... BLOCK-list
.... AS l(23) tc(1) hascall
..... INDEX l(23) tc(1) bounded hascall byte
...... DEREF l(23) tc(1) implicit(true) hascall ARRAY-@0
....... NAME-main..autotmp_34 l(23) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
...... LITERAL-1 l(23) tc(1) int
..... CONV l(23) tc(1) byte
...... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
... BLOCK l(23)
... BLOCK-list
.... AS l(23) tc(1) hascall
..... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
..... SLICEARR l(23) tc(1) hascall SLICE-@0
...... NAME-main..autotmp_34 l(23) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.. EMPTY l(23) tc(1) hascall
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. AS-init
... AS l(23) tc(1) hascall
.... NAME-main..autotmp_36 l(23) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.... CALLFUNC l(23) tc(1) nonnil hascall PTR-@0
..... NAME-runtime.mapassign_faststr x(0) class(PFUNC) tc(1) used FUNC-@0
.... CALLFUNC-list
..... AS l(23) tc(1) hascall
...... NAME-main..autotmp_35 l(23) x(0) class(PAUTO) esc(N) used string
...... CALLFUNC l(23) tc(1) hascall string
....... NAME-runtime.intstring x(0) class(PFUNC) tc(1) used FUNC-@0
...... CALLFUNC-rlist
....... LITERAL-nil l(23) tc(1) PTR-@0
....... CONVNOP l(23) tc(1) int64
........ ADD l(23) tc(1) int
......... LITERAL-97 l(23) tc(1) int
......... NAME-main.i g(5) l(22) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.... CALLFUNC-rlist
..... ADDR l(23) tc(1) PTR-@0
...... NAME-type.map[string][]uint8 x(0) class(PEXTERN) tc(1) uint8
..... NAME-main.m g(4) l(20) x(0) class(PAUTO) esc(no) tc(1) used MAP-@0
..... NAME-main..autotmp_35 l(23) x(0) class(PAUTO) esc(N) used string
.. AS l(23) tc(1) hascall
... DEREF l(23) tc(1) hascall SLICE-@0
.... NAME-main..autotmp_36 l(23) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. VARKILL l(23) tc(1)
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. DCL l(25)
.. NAME-main.i g(6) l(25) x(0) class(PAUTO) esc(no) tc(1) assigned used int
. AS l(25) colas(true) tc(1)
.. NAME-main.i g(6) l(25) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. LITERAL-0 l(25) tc(1) int
. FOR l(25) tc(1)
.. LT l(25) tc(1) bool
... NAME-main.i g(6) l(25) x(0) class(PAUTO) esc(no) tc(1) assigned used int
... LITERAL-1000000000 l(25) tc(1) int
.. BLOCK l(25)
.. BLOCK-list
... AS l(25) tc(1) implicit(true) int
.... NAME-main.i g(6) l(25) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.... ADD l(25) tc(1) int
..... NAME-main.i g(6) l(25) x(0) class(PAUTO) esc(no) tc(1) assigned used int
..... LITERAL-1 l(25) tc(1) int
. FOR-body
.. DCL l(26)
... NAME-main.value g(7) l(26) x(0) class(PAUTO) esc(no) tc(1) used SLICE-@0
.. DCL l(26)
... NAME-main.m l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used MAP-@0
.. DCL l(26)
... NAME-main.key l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. DCL l(26)
... NAME-main.~r2 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. DCL l(26)
... NAME-main.~r3 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. AS-init
... AS l(26) tc(1)
.... NAME-main..autotmp_38 l(26) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.... ADDR l(26) tc(1) PTR-@0
..... NAME-main..autotmp_37 l(26) x(0) class(PAUTO) esc(N) tc(1) addrtaken used ARRAY-@0
... AS l(26) tc(1) hascall
.... DEREF l(26) tc(1) hascall ARRAY-@0
..... NAME-main..autotmp_38 l(26) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.... DEREF l(26) tc(1) hascall ARRAY-@0
..... CONVNOP l(26) tc(1) PTR-@0
...... SPTR l(26) tc(1) PTR-@0
....... LITERAL-"b" l(26) tc(1) string
.. AS l(26) tc(1) hascall
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
... SLICEARR l(26) esc(no) tc(1) hascall SLICE-@0
.... NAME-main..autotmp_38 l(26) x(0) class(PAUTO) esc(N) tc(1) assigned used PTR-@0
.. BLOCK l(26)
.. BLOCK-list
... AS l(26) tc(1)
.... NAME-main.m l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used MAP-@0
.... NAME-main.m g(4) l(20) x(0) class(PAUTO) esc(no) tc(1) used MAP-@0
... AS l(26) tc(1)
.... NAME-main.key l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. VARKILL l(26) tc(1)
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. AS l(26) tc(1)
... NAME-main.~r2 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. AS l(26) tc(1)
... NAME-main.~r3 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. INLMARK l(+26) x(1)
.. DCL l(34)
... NAME-main.value l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. DCL l(34)
... NAME-main.ok l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
.. AS l(34) tc(1)
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. AS-init
... CALLFUNC l(34) tc(1) hascall STRUCT-@0
.... NAME-runtime.mapaccess2_faststr x(0) class(PFUNC) tc(1) used FUNC-@0
... CALLFUNC-rlist
.... ADDR l(34) tc(1) PTR-@0
..... NAME-type.map[string][]uint8 x(0) class(PEXTERN) tc(1) uint8
.... NAME-main.m l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used MAP-@0
.... BYTES2STRTMP l(34) esc(no) tc(1) string
..... NAME-main.key l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
... BLOCK l(34)
... BLOCK-list
.... AS l(34) tc(1)
..... NAME-main..autotmp_39 l(34) x(0) class(PAUTO) esc(N) tc(1) nonnil used PTR-@0
..... RESULT l(34) x(32) tc(1) PTR-@0
.... AS l(34) tc(1)
..... NAME-main..autotmp_21 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
..... RESULT l(34) x(40) tc(1) bool
.. AS l(34) tc(1) hascall
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
... DEREF l(34) tc(1) hascall SLICE-@0
.... NAME-main..autotmp_39 l(34) x(0) class(PAUTO) esc(N) tc(1) nonnil used PTR-@0
.. AS l(34) tc(1)
... NAME-main.value l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. AS l(34) tc(1)
... NAME-main.ok l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
... NAME-main..autotmp_21 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
.. VARKILL l(34) tc(1)
... NAME-main..autotmp_21 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
.. VARKILL l(34) tc(1)
... NAME-main..autotmp_20 l(21) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. IF l(34) tc(1)
... NAME-main.ok l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
.. IF-body
... BLOCK l(26)
... BLOCK-list
.... AS l(26) tc(1)
..... NAME-main.~r2 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
..... NAME-main.value l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.... AS l(26) tc(1)
..... NAME-main.~r3 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used int
..... LITERAL-0 l(35) tc(1) int
... GOTO l(26) tc(1) main..i1
.. BLOCK l(26)
.. BLOCK-list
... AS l(26) tc(1)
.... NAME-main.~r2 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.... LITERAL-nil tc(1) .nil SLICE-@0
... AS l(26) tc(1)
.... NAME-main.~r3 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.... LITERAL-1 l(37) tc(1) int
.. GOTO l(26) tc(1) main..i1
.. LABEL l(26) tc(1) main..i1
.. BLOCK-init
... AS l(26) tc(1)
.... NAME-main..autotmp_40 l(26) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.... CONVNOP l(26) tc(1) SLICE-@0
..... NAME-main.~r2 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. BLOCK l(26) hascall
.. BLOCK-list
... AS l(26) tc(1)
.... NAME-main.value g(7) l(26) x(0) class(PAUTO) esc(no) tc(1) used SLICE-@0
.... NAME-main..autotmp_40 l(26) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
... AS l(26) tc(1)
.... NAME-_ x(0) tc(1) assigned blank
.... NAME-main.~r3 l(33) x(0) class(PAUTO) esc(no) tc(1) assigned used int
.. IF-init
... AS l(27) tc(1)
.... NAME-main..autotmp_22 l(27) x(0) class(PAUTO) esc(N) tc(1) assigned used int
.... LEN l(27) tc(1) int
..... NAME-main.value g(7) l(26) x(0) class(PAUTO) esc(no) tc(1) used SLICE-@0
.. IF l(27) tc(1)
... EQ l(27) tc(1) bool
.... NAME-main..autotmp_22 l(27) x(0) class(PAUTO) esc(N) tc(1) assigned used int
.... LITERAL-100 l(27) tc(1) int
.. IF-rlist
... VARKILL l(27) tc(1)
.... NAME-main..autotmp_22 l(27) x(0) class(PAUTO) esc(N) tc(1) assigned used int
.. IF-body
... VARKILL l(27) tc(1)
.... NAME-main..autotmp_22 l(27) x(0) class(PAUTO) esc(N) tc(1) assigned used int
... AS l(28) tc(1) hascall
.... NAME-main..autotmp_23 l(28) x(0) class(PAUTO) esc(N) tc(1) assigned used string
.... CALLFUNC l(28) tc(1) hascall string
..... NAME-runtime.slicebytetostring x(0) class(PFUNC) tc(1) used FUNC-@0
.... CALLFUNC-rlist
..... LITERAL-nil l(28) tc(1) PTR-@0
..... NAME-main.value g(7) l(26) x(0) class(PAUTO) esc(no) tc(1) used SLICE-@0
... CALLFUNC-init
.... AS l(28) tc(1) hascall
..... NAME-main..autotmp_41 l(28) x(0) class(PAUTO) esc(N) tc(1) assigned used UNSAFEPTR-@0
..... CALLFUNC l(28) tc(1) hascall UNSAFEPTR-@0
...... NAME-runtime.convTstring x(0) class(PFUNC) tc(1) used FUNC-@0
..... CALLFUNC-rlist
...... NAME-main..autotmp_23 l(28) x(0) class(PAUTO) esc(N) tc(1) assigned used string
... CALLFUNC l(28) tc(1) hascall
.... NAME-runtime.gopanic x(0) class(PFUNC) tc(1) used FUNC-@0
... CALLFUNC-rlist
.... EFACE l(28) tc(1) INTER-@0
..... ADDR l(28) tc(1) PTR-@0
...... NAME-type.string x(0) class(PEXTERN) tc(1) uint8
..... NAME-main..autotmp_41 l(28) x(0) class(PAUTO) esc(N) tc(1) assigned used UNSAFEPTR-@0
... VARKILL l(28) tc(1)
.... NAME-main..autotmp_23 l(28) x(0) class(PAUTO) esc(N) tc(1) assigned used string
before walk retrieve
. DCL l(34)
.. NAME-main.value g(5) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
. DCL l(34)
.. NAME-main.ok g(6) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
. AS l(34) tc(1)
.. NAME-main..autotmp_6 l(34) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. AS2MAPR l(34) colas(true) tc(1)
.. INDEXMAP l(34) tc(1) SLICE-@0
... NAME-main.m g(3) l(33) x(0) class(PPARAM) esc(no) tc(1) used MAP-@0
... BYTES2STRTMP l(34) esc(no) tc(1) string
.... NAME-main.key g(4) l(33) x(8) class(PPARAM) esc(no) tc(1) used SLICE-@0
. AS2MAPR-list
.. NAME-main..autotmp_6 l(34) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. NAME-main..autotmp_7 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
. AS l(34) tc(1)
.. NAME-main.value g(5) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. NAME-main..autotmp_6 l(34) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. AS l(34) tc(1)
.. NAME-main.ok g(6) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
.. NAME-main..autotmp_7 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
. VARKILL l(34) tc(1)
.. NAME-main..autotmp_7 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
. VARKILL l(34) tc(1)
.. NAME-main..autotmp_6 l(34) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. IF l(34) tc(1)
.. NAME-main.ok g(6) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
. IF-body
.. RETURN l(35) tc(1)
.. RETURN-list
... NAME-main.value g(5) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
... LITERAL-0 l(35) tc(1) int
. RETURN l(37) tc(1)
. RETURN-list
.. LITERAL-nil tc(1) .nil SLICE-@0
.. LITERAL-1 l(37) tc(1) int
after walk retrieve
. DCL l(34)
.. NAME-main.value g(5) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
. DCL l(34)
.. NAME-main.ok g(6) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
. AS l(34) tc(1)
.. NAME-main..autotmp_6 l(34) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. AS-init
.. CALLFUNC l(34) tc(1) hascall STRUCT-@0
... NAME-runtime.mapaccess2_faststr x(0) class(PFUNC) tc(1) used FUNC-@0
.. CALLFUNC-rlist
... ADDR l(34) tc(1) PTR-@0
.... NAME-type.map[string][]uint8 x(0) class(PEXTERN) tc(1) uint8
... NAME-main.m g(3) l(33) x(0) class(PPARAM) esc(no) tc(1) used MAP-@0
... BYTES2STRTMP l(34) esc(no) tc(1) string
.... NAME-main.key g(4) l(33) x(8) class(PPARAM) esc(no) tc(1) used SLICE-@0
.. BLOCK l(34)
.. BLOCK-list
... AS l(34) tc(1)
.... NAME-main..autotmp_8 l(34) x(0) class(PAUTO) esc(N) tc(1) nonnil used PTR-@0
.... RESULT l(34) x(32) tc(1) PTR-@0
... AS l(34) tc(1)
.... NAME-main..autotmp_7 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
.... RESULT l(34) x(40) tc(1) bool
. AS l(34) tc(1) hascall
.. NAME-main..autotmp_6 l(34) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
.. DEREF l(34) tc(1) hascall SLICE-@0
... NAME-main..autotmp_8 l(34) x(0) class(PAUTO) esc(N) tc(1) nonnil used PTR-@0
. AS l(34) tc(1)
.. NAME-main.value g(5) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
.. NAME-main..autotmp_6 l(34) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. AS l(34) tc(1)
.. NAME-main.ok g(6) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
.. NAME-main..autotmp_7 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
. VARKILL l(34) tc(1)
.. NAME-main..autotmp_7 l(34) x(0) class(PAUTO) esc(N) tc(1) used bool
. VARKILL l(34) tc(1)
.. NAME-main..autotmp_6 l(34) x(0) class(PAUTO) esc(N) tc(1) assigned used SLICE-@0
. IF l(34) tc(1)
.. NAME-main.ok g(6) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used bool
. IF-body
.. RETURN l(35) tc(1)
.. RETURN-list
... AS l(35) tc(1)
.... NAME-main.~r2 g(1) l(33) x(32) class(PPARAMOUT) esc(no) SLICE-@0
.... NAME-main.value g(5) l(34) x(0) class(PAUTO) esc(no) tc(1) assigned used SLICE-@0
... AS l(35) tc(1)
.... NAME-main.~r3 g(2) l(33) x(56) class(PPARAMOUT) esc(no) int
.... LITERAL-0 l(35) tc(1) int
. RETURN l(37) tc(1)
. RETURN-list
.. AS l(37) tc(1)
... NAME-main.~r2 g(1) l(33) x(32) class(PPARAMOUT) esc(no) SLICE-@0
... LITERAL-nil tc(1) .nil SLICE-@0
.. AS l(37) tc(1)
... NAME-main.~r3 g(2) l(33) x(56) class(PPARAMOUT) esc(no) int
... LITERAL-1 l(37) tc(1) int
enter retrieve
. AS l(33)
.. NAME-main.~r2 g(1) l(33) x(32) class(PPARAMOUT) esc(no) SLICE-@0
. AS l(33)
.. NAME-main.~r3 g(2) l(33) x(56) class(PPARAMOUT) esc(no) int
Kindly cc-ing @randall77@cuonglm@mdempsky@dr2chase@josharian. I raise this issue because if the explanation is a complex one, perhaps we should examine what we can do, backport or it, or if not tell users upfront instead of them getting surprised. Thank you!
The text was updated successfully, but these errors were encountered:
What version of Go are you using (
go version
)?Does this issue reproduce with the latest release?
Yes!
What operating system and processor architecture are you using (
go env
)?go env
OutputGO111MODULE=""
GOARCH="amd64"
GOBIN="/Users/emmanuelodeke/go/bin"
GOCACHE="/Users/emmanuelodeke/Library/Caches/go-build"
GOENV="/Users/emmanuelodeke/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/emmanuelodeke/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/Users/emmanuelodeke/go/src/go.googlesource.com/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/Users/emmanuelodeke/go/src/go.googlesource.com/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/emmanuelodeke/go/src/go.googlesource.com/go/src/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/v3/7z434qpx5v3bw0wh8h2myfpw0000gn/T/go-build131913713=/tmp/go-build -gno-record-gcc-switches -fno-common"
What did you do?
I continuously profiled a customer's code that my team is auditing and needs to give the OK signal for use this library
If we look at this code https://github.com/celestiaorg/smt/blob/f0f62d60a45dc98ea95933d99505576f1018ae93/mapstore.go#L36-L41
What did you expect to see?
I'd expect the compiler to detect that hey, there will be a READ-ONLY use of the key thus convert from []byte->slice with zero allocations
but unfortunately this code was showing up hot in our continuous profiler so I took a sample and alas when I experimented with a manual []byte->string zero allocation with
the results were shocking
and on looking further I noticed
However if we walk through code
we successfully see runtime.slicebytetostringtmp successfully generated by
which correctly points to line 34

Kindly cc-ing @randall77 @cuonglm @mdempsky @dr2chase @josharian. I raise this issue because if the explanation is a complex one, perhaps we should examine what we can do, backport or it, or if not tell users upfront instead of them getting surprised. Thank you!
The text was updated successfully, but these errors were encountered: