Skip to content

Commit 9fbcba6

Browse files
committed
cmd/compile: in clobberdead mode, don't clobber slots that are live for defers
There are stack slots that are kept live for defers, which are tracked separately. Don't clobber them. Change-Id: Ib558345758b5a4fd89c7ff8a3fe08087059add21 Reviewed-on: https://go-review.googlesource.com/c/go/+/310329 Trust: Cherry Zhang <[email protected]> Run-TryBot: Cherry Zhang <[email protected]> TryBot-Result: Go Bot <[email protected]> Reviewed-by: David Chase <[email protected]> Reviewed-by: Than McIntosh <[email protected]>
1 parent 4fb74e0 commit 9fbcba6

File tree

1 file changed

+3
-1
lines changed
  • src/cmd/compile/internal/liveness

1 file changed

+3
-1
lines changed

src/cmd/compile/internal/liveness/plive.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -995,9 +995,11 @@ func (lv *liveness) clobber(b *ssa.Block) {
995995
// of b.Values.
996996
func clobber(lv *liveness, b *ssa.Block, live bitvec.BitVec) {
997997
for i, n := range lv.vars {
998-
if !live.Get(int32(i)) && !n.Addrtaken() {
998+
if !live.Get(int32(i)) && !n.Addrtaken() && !n.OpenDeferSlot() && !n.IsOutputParamHeapAddr() {
999999
// Don't clobber stack objects (address-taken). They are
10001000
// tracked dynamically.
1001+
// Also don't clobber slots that are live for defers (see
1002+
// the code setting livedefer in epilogue).
10011003
clobberVar(b, n)
10021004
}
10031005
}

0 commit comments

Comments
 (0)