From: Josh Bleecher Snyder Date: Sun, 1 Apr 2018 19:21:57 +0000 (-0700) Subject: runtime: allow inlining of stackmapdata X-Git-Tag: go1.11beta1~577 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=31cfa7f2f2ec40715376aebfdddb8183f5a260dc;p=gostls13.git runtime: allow inlining of stackmapdata Also do very minor code cleanup. name old time/op new time/op delta StackCopyPtr-8 84.8ms ± 6% 82.9ms ± 5% -2.19% (p=0.000 n=95+94) StackCopy-8 68.4ms ± 5% 65.3ms ± 4% -4.54% (p=0.000 n=99+99) StackCopyNoCache-8 107ms ± 2% 105ms ± 2% -2.13% (p=0.000 n=91+95) Change-Id: I2d85ede48bffada9584d437a08a82212c0da6d00 Reviewed-on: https://go-review.googlesource.com/109001 Run-TryBot: Josh Bleecher Snyder TryBot-Result: Gobot Gobot Reviewed-by: Austin Clements --- diff --git a/src/cmd/compile/internal/gc/inl_test.go b/src/cmd/compile/internal/gc/inl_test.go index 0225287866..a452f2ad29 100644 --- a/src/cmd/compile/internal/gc/inl_test.go +++ b/src/cmd/compile/internal/gc/inl_test.go @@ -60,6 +60,7 @@ func TestIntendedInlining(t *testing.T) { "releasem", "round", "roundupsize", + "stackmapdata", "stringStructOf", "subtract1", "subtractb", diff --git a/src/runtime/symtab.go b/src/runtime/symtab.go index 91a8f8eb05..8d54369d88 100644 --- a/src/runtime/symtab.go +++ b/src/runtime/symtab.go @@ -916,10 +916,13 @@ type stackmap struct { //go:nowritebarrier func stackmapdata(stkmap *stackmap, n int32) bitvector { - if n < 0 || n >= stkmap.n { + // Check this invariant only when stackDebug is on at all. + // The invariant is already checked by many of stackmapdata's callers, + // and disabling it by default allows stackmapdata to be inlined. + if stackDebug > 0 && (n < 0 || n >= stkmap.n) { throw("stackmapdata: index out of range") } - return bitvector{stkmap.nbit, (*byte)(add(unsafe.Pointer(&stkmap.bytedata), uintptr(n*((stkmap.nbit+7)>>3))))} + return bitvector{stkmap.nbit, addb(&stkmap.bytedata[0], uintptr(n*((stkmap.nbit+7)>>3)))} } // inlinedCall is the encoding of entries in the FUNCDATA_InlTree table.