mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: fix runtime.KeepAlive
KeepAlive needs to introduce a use of the spill of the value it is keeping alive. Without that, we don't guarantee that the spill dominates the KeepAlive. This bug was probably introduced with the code to move spills down to the dominator of the restores, instead of always spilling just after the value itself (CL 34822). Fixes #22458. Change-Id: I94955a21960448ffdacc4df775fe1213967b1d4c Reviewed-on: https://go-review.googlesource.com/74210 Reviewed-by: Cherry Zhang <cherryyz@google.com> Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
parent
b09e2de735
commit
0153a4130d
2 changed files with 33 additions and 4 deletions
|
|
@ -1133,12 +1133,15 @@ func (s *regAllocState) regalloc(f *Func) {
|
|||
if v.Op == OpKeepAlive {
|
||||
// Make sure the argument to v is still live here.
|
||||
s.advanceUses(v)
|
||||
vi := &s.values[v.Args[0].ID]
|
||||
if vi.spill != nil {
|
||||
a := v.Args[0]
|
||||
vi := &s.values[a.ID]
|
||||
if vi.regs == 0 && !vi.rematerializeable {
|
||||
// Use the spill location.
|
||||
v.SetArg(0, vi.spill)
|
||||
// This forces later liveness analysis to make the
|
||||
// value live at this point.
|
||||
v.SetArg(0, s.makeSpill(a, b))
|
||||
} else {
|
||||
// No need to keep unspilled values live.
|
||||
// In-register and rematerializeable values are already live.
|
||||
// These are typically rematerializeable constants like nil,
|
||||
// or values of a variable that were modified since the last call.
|
||||
v.Op = OpCopy
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue