• 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
inline_big.go 12.7 KB