• Dan Scales's avatar
    cmd/compile: fix liveness for open-coded defer args for infinite loops · 1b3a1db1
    Dan Scales authored
    Once defined, a stack slot holding an open-coded defer arg should always be marked
    live, since it may be used at any time if there is a panic. These stack slots are
    typically kept live naturally by the open-defer code inlined at each return/exit point.
    However, we need to do extra work to make sure that they are kept live if a
    function has an infinite loop or a panic exit.
    
    For this fix, only in the case of a function that is using open-coded defers, we
    compute the set of blocks (most often empty) that cannot reach a return or a
    BlockExit (panic) because of an infinite loop. Then, for each block b which
    cannot reach a return or BlockExit or is a BlockExit block, we mark each defer arg
    slot as live, as long as the definition of the defer arg slot dominates block b.
    
    For this change, had to export (*Func).sdom (-> Sdom) and SparseTree.isAncestorEq
    (-> IsAncestorEq)
    
    Updates #35277
    
    Change-Id: I7b53c9bd38ba384a3794386dd0eb94e4cbde4eb1
    Reviewed-on: https://go-review.googlesource.com/c/go/+/204802
    Run-TryBot: Dan Scales <danscales@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    Reviewed-by: default avatarKeith Randall <khr@golang.org>
    1b3a1db1
func.go 22.2 KB