• Matthew Dempsky's avatar
    cmd/compile: don't export unreachable inline method bodies · 86845343
    Matthew Dempsky authored
    Previously, anytime we exported a function or method declaration
    (which includes methods for every type transitively exported), we
    included the inline function bodies, if any. However, in many cases,
    it's impossible (or at least very unlikely) for the importing package
    to call the method.
    
    For example:
    
        package p
        type T int
        func (t T) M() { t.u() }
        func (t T) u() {}
        func (t T) v() {}
    
    T.M and T.u are inlineable, and they're both reachable through calls
    to T.M, which is exported. However, t.v is also inlineable, but cannot
    be reached.
    
    Exception: if p.T is embedded in another type q.U, p.T.v will be
    promoted to q.U.v, and the generated wrapper function could have
    inlined the call to p.T.v. However, in practice, this doesn't happen,
    and a missed inlining opportunity doesn't affect correctness.
    
    To implement this, this CL introduces an extra flood fill pass before
    exporting to mark inline bodies that are actually reachable, so the
    exporter can skip over methods like t.v.
    
    This reduces Kubernetes build time (as measured by "time go build -a
    k8s.io/kubernetes/cmd/...") on an HP Z620 measurably:
    
        == before ==
        real    0m44.658s
        user    11m19.136s
        sys     0m53.844s
    
        == after ==
        real    0m41.702s
        user    10m29.732s
        sys     0m50.908s
    
    It also significantly cuts down the cost of enabling mid-stack
    inlining (-l=4):
    
        == before (-l=4) ==
        real    1m19.236s
        user    20m6.528s
        sys     1m17.328s
    
        == after (-l=4) ==
        real    0m59.100s
        user    13m12.808s
        sys     0m58.776s
    
    Updates #19348.
    
    Change-Id: Iade58233ca42af823a1630517a53848b5d3c7a7e
    Reviewed-on: https://go-review.googlesource.com/74110
    Run-TryBot: Matthew Dempsky <mdempsky@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: 's avatarRobert Griesemer <gri@golang.org>
    86845343
dcl.go 30 KB