mirror of
https://github.com/golang/go.git
synced 2026-04-02 01:10:27 +09:00
[release-branch.go1.26] cmd/compile: don't drop same register twice
For instructions that clobber both of their input registers, make
sure we don't clobber the same register twice when both input
registers are the same.
This is rare, but it can happen.
Fixes #77623
Change-Id: I794249cf43a8cc4ab3262055daef9193e2442f73
Reviewed-on: https://go-review.googlesource.com/c/go/+/745621
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Jorropo <jorropo.pgm@gmail.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
(cherry picked from commit f65692ea56)
Reviewed-on: https://go-review.googlesource.com/c/go/+/745820
Reviewed-by: Mark Freeman <markfreeman@google.com>
This commit is contained in:
committed by
David Chase
parent
e8df1a6697
commit
12c0690eeb
@@ -1810,7 +1810,7 @@ func (s *regAllocState) regalloc(f *Func) {
|
||||
if regspec.clobbersArg0 {
|
||||
s.freeReg(register(s.f.getHome(args[0].ID).(*Register).num))
|
||||
}
|
||||
if regspec.clobbersArg1 {
|
||||
if regspec.clobbersArg1 && !(regspec.clobbersArg0 && s.f.getHome(args[0].ID) == s.f.getHome(args[1].ID)) {
|
||||
s.freeReg(register(s.f.getHome(args[1].ID).(*Register).num))
|
||||
}
|
||||
|
||||
|
||||
20
test/fixedbugs/issue77604.go
Normal file
20
test/fixedbugs/issue77604.go
Normal file
@@ -0,0 +1,20 @@
|
||||
// compile
|
||||
|
||||
// Copyright 2026 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.
|
||||
|
||||
// Issue 77604: compiler crash when source and destination
|
||||
// of copy are the same address.
|
||||
|
||||
package p
|
||||
|
||||
type T struct {
|
||||
a [192]byte
|
||||
}
|
||||
|
||||
func f(x *T) {
|
||||
i := any(x)
|
||||
y := i.(*T)
|
||||
*y = *x
|
||||
}
|
||||
Reference in New Issue
Block a user