aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile/internal/liveness
diff options
context:
space:
mode:
authorCherry Zhang <cherryyz@google.com>2021-04-14 23:36:14 -0400
committerCherry Zhang <cherryyz@google.com>2021-04-16 20:56:09 +0000
commit9fbcba6664840ada5aaedb7f1a587d0cca1c9035 (patch)
tree8e845c015cbc08b1b1681a1ae42e10a66e729f7e /src/cmd/compile/internal/liveness
parent4fb74e055595a0009f11272432c2a5047a64507b (diff)
downloadgo-9fbcba6664840ada5aaedb7f1a587d0cca1c9035.tar.gz
go-9fbcba6664840ada5aaedb7f1a587d0cca1c9035.zip
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 <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>
Diffstat (limited to 'src/cmd/compile/internal/liveness')
-rw-r--r--src/cmd/compile/internal/liveness/plive.go4
1 files changed, 3 insertions, 1 deletions
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)
}
}