]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: in clobberdead mode, don't clobber slots that are live for defers
authorCherry Zhang <cherryyz@google.com>
Thu, 15 Apr 2021 03:36:14 +0000 (23:36 -0400)
committerCherry Zhang <cherryyz@google.com>
Fri, 16 Apr 2021 20:56:09 +0000 (20:56 +0000)
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 <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/compile/internal/liveness/plive.go

index 53feb6cc323356a90dfbe8a18d5c8c0f93c5d2bf..9eca05b040afec7e6d29992e7ddaddf82eab63dd 100644 (file)
@@ -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)
                }
        }