From: Cherry Zhang Date: Thu, 15 Apr 2021 03:36:14 +0000 (-0400) Subject: cmd/compile: in clobberdead mode, don't clobber slots that are live for defers X-Git-Tag: go1.17beta1~592 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=9fbcba6664;p=gostls13.git 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 Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: David Chase Reviewed-by: Than McIntosh --- diff --git a/src/cmd/compile/internal/liveness/plive.go b/src/cmd/compile/internal/liveness/plive.go index 53feb6cc32..9eca05b040 100644 --- a/src/cmd/compile/internal/liveness/plive.go +++ b/src/cmd/compile/internal/liveness/plive.go @@ -995,9 +995,11 @@ func (lv *liveness) clobber(b *ssa.Block) { // of b.Values. func clobber(lv *liveness, b *ssa.Block, live bitvec.BitVec) { for i, n := range lv.vars { - if !live.Get(int32(i)) && !n.Addrtaken() { + if !live.Get(int32(i)) && !n.Addrtaken() && !n.OpenDeferSlot() && !n.IsOutputParamHeapAddr() { // Don't clobber stack objects (address-taken). They are // tracked dynamically. + // Also don't clobber slots that are live for defers (see + // the code setting livedefer in epilogue). clobberVar(b, n) } }