• Russ Cox's avatar
    cmd/gc: shorten more temporary lifetimes · daca06f2
    Russ Cox authored
    1. In functions with heap-allocated result variables or with
    defer statements, the return sequence requires more than
    just a single RET instruction. There is an optimization that
    arranges for all returns to jump to a single copy of the return
    epilogue in this case. Unfortunately, that optimization is
    fundamentally incompatible with PC-based liveness information:
    it takes PCs at many different points in the function and makes
    them all land at one PC, making the combined liveness information
    at that target PC a mess. Disable this optimization, so that each
    return site gets its own copy of the 'call deferreturn' and the
    copying of result variables back from the heap.
    This removes quite a few spurious 'ambiguously live' variables.
    
    2. Let orderexpr allocate temporaries that are passed by address
    to a function call and then die on return, so that we can arrange
    an appropriate VARKILL.
    
    2a. Do this for ... slices.
    
    2b. Do this for closure structs.
    
    2c. Do this for runtime.concatstring, which is the implementation
    of large string additions. Change representation of OADDSTR to
    an explicit list in typecheck to avoid reconstructing list in both
    walk and order.
    
    3. Let orderexpr allocate the temporary variable copies used for
    range loops, so that they can be killed when the loop is over.
    Similarly, let it allocate the temporary holding the map iterator.
    
    CL 81940043 reduced the number of ambiguously live temps
    in the godoc binary from 860 to 711.
    
    This CL reduces the number to 121. Still more to do, but another
    good checkpoint.
    
    Update #7345
    
    LGTM=khr
    R=khr
    CC=golang-codereviews
    https://golang.org/cl/83090046
    daca06f2
closure.c 11.2 KB