• Russ Cox's avatar
    cmd/gc: shorten temporary lifetimes when possible · b700cb49
    Russ Cox authored
    The new channel and map runtime routines take pointers
    to values, typically temporaries. Without help, the compiler
    cannot tell when those temporaries stop being needed,
    because it isn't sure what happened to the pointer.
    Arrange to insert explicit VARKILL instructions for these
    temporaries so that the liveness analysis can avoid seeing
    them as "ambiguously live".
    
    The change is made in order.c, which was already in charge of
    introducing temporaries to preserve the order-of-evaluation
    guarantees. Now its job has expanded to include introducing
    temporaries as needed by runtime routines, and then also
    inserting the VARKILL annotations for all these temporaries,
    so that their lifetimes can be shortened.
    
    In order to do its job for the map runtime routines, order.c arranges
    that all map lookups or map assignments have the form:
    
            x = m[k]
            x, y = m[k]
            m[k] = x
    
    where x, y, and k are simple variables (often temporaries).
    Likewise, receiving from a channel is now always:
    
            x = <-c
    
    In order to provide the map guarantee, order.c is responsible for
    rewriting x op= y into x = x op y, so that m[k] += z becomes
    
            t = m[k]
            t2 = t + z
            m[k] = t2
    
    While here, fix a few bugs in order.c's traversal: it was failing to
    walk into select and switch case bodies, so order of evaluation
    guarantees were not preserved in those situations.
    Added tests to test/reorder2.go.
    
    Fixes #7671.
    
    In gc/popt's temporary-merging optimization, allow merging
    of temporaries with their address taken as long as the liveness
    ranges do not intersect. (There is a good chance of that now
    that we have VARKILL annotations to limit the liveness range.)
    
    Explicitly killing temporaries cuts the number of ambiguously
    live temporaries that must be zeroed in the godoc binary from
    860 to 711, or -17%. There is more work to be done, but this
    is a good checkpoint.
    
    Update #7345
    
    LGTM=khr
    R=khr
    CC=golang-codereviews
    https://golang.org/cl/81940043
    b700cb49
peep.c 18.4 KB