Skip to content

Commit

Permalink
cmd/compile: keep all open-coded defer slots as used
Browse files Browse the repository at this point in the history
Open-coded defer slots are assigned indices upfront, so they're
logically like elements in an array. Without reassigning the indices,
we need to keep all of the elements alive so their relative offsets
are correct.

Fixes #61895.

Change-Id: Ie0191fdb33276f4e8ed0becb69086524fff022b2
Reviewed-on: https://go-review.googlesource.com/c/go/+/517856
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
  • Loading branch information
mdempsky committed Aug 9, 2023
1 parent d32b479 commit 8c5a54f
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/cmd/compile/internal/ssagen/pgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,14 @@ func (s *ssafn) AllocFrame(f *ssa.Func) {

// Mark the PAUTO's unused.
for _, ln := range fn.Dcl {
if ln.OpenDeferSlot() {
// Open-coded defer slots have indices that were assigned
// upfront during SSA construction, but the defer statement can
// later get removed during deadcode elimination (#61895). To
// keep their relative offsets correct, treat them all as used.
continue
}

if needAlloc(ln) {
ln.SetUsed(false)
}
Expand Down
15 changes: 15 additions & 0 deletions test/fixedbugs/issue61895.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// compile

// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

func main() {
for {
}

defer func() {}()
defer func() {}()
}

0 comments on commit 8c5a54f

Please sign in to comment.