aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkhr@golang.org <khr@golang.org>2026-02-14 10:04:13 -0800
committerDavid Chase <drchase@google.com>2026-02-25 11:15:27 -0800
commit12c0690eebcccf3f1aeaf7599c044edbd7ae7798 (patch)
tree4084304f6a45cf3d489907a53429c583e463083a
parente8df1a6697c1bf9e5fd027c3b2c4cb2ce0429dd9 (diff)
downloadgo-12c0690eebcccf3f1aeaf7599c044edbd7ae7798.tar.xz
[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 f65692ea562bf24c21ae46854e98584dd4bcc201) Reviewed-on: https://go-review.googlesource.com/c/go/+/745820 Reviewed-by: Mark Freeman <markfreeman@google.com>
-rw-r--r--src/cmd/compile/internal/ssa/regalloc.go2
-rw-r--r--test/fixedbugs/issue77604.go20
2 files changed, 21 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/ssa/regalloc.go b/src/cmd/compile/internal/ssa/regalloc.go
index a0257f3064..861cf7e011 100644
--- a/src/cmd/compile/internal/ssa/regalloc.go
+++ b/src/cmd/compile/internal/ssa/regalloc.go
@@ -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))
}
diff --git a/test/fixedbugs/issue77604.go b/test/fixedbugs/issue77604.go
new file mode 100644
index 0000000000..62857f57f0
--- /dev/null
+++ b/test/fixedbugs/issue77604.go
@@ -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
+}