• Keith Randall's avatar
    cmd/compile: set stricter inlining threshold in large functions · 5fc70b6f
    Keith Randall authored
    If we're compiling a large function, be more picky about how big
    the function we're inlining is.  If the function is >5000 nodes,
    we lower the inlining threshold from a cost of 80 to 20.
    
    Turns out reflect.Value's cost is exactly 80.  That's the function
    at issue in #26546.
    
    20 was chosen as a proxy for "inlined body is smaller than the call would be".
    Simple functions still get inlined, like this one at cost 7:
    
    func ifaceIndir(t *rtype) bool {
    	return t.kind&kindDirectIface == 0
    }
    
    5000 nodes was chosen as the big function size.  Here are all the
    5000+ node (~~1000+ lines) functions in the stdlib:
    
    5187 cmd/internal/obj/arm (*ctxt5).asmout
    6879 cmd/internal/obj/s390x (*ctxtz).asmout
    6567 cmd/internal/obj/ppc64 (*ctxt9).asmout
    9643 cmd/internal/obj/arm64 (*ctxt7).asmout
    5042 cmd/internal/obj/x86 (*AsmBuf).doasm
    8768 cmd/compile/internal/ssa rewriteBlockAMD64
    8878 cmd/compile/internal/ssa rewriteBlockARM
    8344 cmd/compile/internal/ssa rewriteValueARM64_OpARM64OR_20
    7916 cmd/compile/internal/ssa rewriteValueARM64_OpARM64OR_30
    5427 cmd/compile/internal/ssa rewriteBlockARM64
    5126 cmd/compile/internal/ssa rewriteValuePPC64_OpPPC64OR_50
    6152 cmd/compile/internal/ssa rewriteValuePPC64_OpPPC64OR_60
    6412 cmd/compile/internal/ssa rewriteValuePPC64_OpPPC64OR_70
    6486 cmd/compile/internal/ssa rewriteValuePPC64_OpPPC64OR_80
    6534 cmd/compile/internal/ssa rewriteValuePPC64_OpPPC64OR_90
    6534 cmd/compile/internal/ssa rewriteValuePPC64_OpPPC64OR_100
    6534 cmd/compile/internal/ssa rewriteValuePPC64_OpPPC64OR_110
    6675 cmd/compile/internal/gc typecheck1
    5433 cmd/compile/internal/gc walkexpr
    14070 cmd/vendor/golang.org/x/arch/arm64/arm64asm decodeArg
    
    There are a lot more smaller (~1000 node) functions in the stdlib.
    The function in #26546 has 12477 nodes.
    
    At some point it might be nice to have a better heuristic for "inlined
    body is smaller than the call", a non-cliff way to scale down the cost
    as the function gets bigger, doing cheaper inlined calls first, etc.
    All that can wait for another release. I'd like to do this CL for
    1.11.
    
    Fixes #26546
    Update #17566
    
    Change-Id: Idda13020e46ec2b28d79a17217f44b189f8139ac
    Reviewed-on: https://go-review.googlesource.com/125516
    Run-TryBot: Keith Randall <khr@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarDavid Chase <drchase@google.com>
    5fc70b6f
Name
Last commit
Last update
..
archive Loading commit data...
bufio Loading commit data...
builtin Loading commit data...
bytes Loading commit data...
cmd Loading commit data...
compress Loading commit data...
container Loading commit data...
context Loading commit data...
crypto Loading commit data...
database/sql Loading commit data...
debug Loading commit data...
encoding Loading commit data...
errors Loading commit data...
expvar Loading commit data...
flag Loading commit data...
fmt Loading commit data...
go Loading commit data...
hash Loading commit data...
html Loading commit data...
image Loading commit data...
index/suffixarray Loading commit data...
internal Loading commit data...
io Loading commit data...
log Loading commit data...
math Loading commit data...
mime Loading commit data...
net Loading commit data...
os Loading commit data...
path Loading commit data...
plugin Loading commit data...
reflect Loading commit data...
regexp Loading commit data...
runtime Loading commit data...
sort Loading commit data...
strconv Loading commit data...
strings Loading commit data...
sync Loading commit data...
syscall Loading commit data...
testing Loading commit data...
text Loading commit data...
time Loading commit data...
unicode Loading commit data...
unsafe Loading commit data...
vendor/golang_org/x Loading commit data...
Make.dist Loading commit data...
all.bash Loading commit data...
all.bat Loading commit data...
all.rc Loading commit data...
androidtest.bash Loading commit data...
bootstrap.bash Loading commit data...
buildall.bash Loading commit data...
clean.bash Loading commit data...
clean.bat Loading commit data...
clean.rc Loading commit data...
cmp.bash Loading commit data...
iostest.bash Loading commit data...
make.bash Loading commit data...
make.bat Loading commit data...
make.rc Loading commit data...
naclmake.bash Loading commit data...
nacltest.bash Loading commit data...
race.bash Loading commit data...
race.bat Loading commit data...
run.bash Loading commit data...
run.bat Loading commit data...
run.rc Loading commit data...