aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2023-01-17 09:35:21 -0800
committerKeith Randall <khr@google.com>2023-01-17 18:21:06 +0000
commit9088c691dac424540f562d6271c5ee479e9f9d80 (patch)
tree7b8871ac3e83ddeb62be8a15db00fac4f260c6e6
parentc0799f7015e6cae37c21294bb94f56050fda5f4e (diff)
downloadgo-9088c691dac424540f562d6271c5ee479e9f9d80.tar.gz
go-9088c691dac424540f562d6271c5ee479e9f9d80.zip
cmd/compile: ensure temp register mask isn't empty
We need to avoid nospill registers at this point in regalloc. Make sure that we don't restrict our register set to avoid registers desired by other instructions, if the resulting set includes only nospill registers. Fixes #57846 Change-Id: I05478e4513c484755dc2e8621d73dac868e45a27 Reviewed-on: https://go-review.googlesource.com/c/go/+/461685 Reviewed-by: Keith Randall <khr@google.com> Run-TryBot: Keith Randall <khr@golang.org> Reviewed-by: Cherry Mui <cherryyz@google.com> TryBot-Result: Gopher Robot <gobot@golang.org>
-rw-r--r--src/cmd/compile/internal/ssa/regalloc.go2
-rw-r--r--test/fixedbugs/issue57846.go33
2 files changed, 34 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/ssa/regalloc.go b/src/cmd/compile/internal/ssa/regalloc.go
index 3cfe7330d1..294c522a90 100644
--- a/src/cmd/compile/internal/ssa/regalloc.go
+++ b/src/cmd/compile/internal/ssa/regalloc.go
@@ -1561,7 +1561,7 @@ func (s *regAllocState) regalloc(f *Func) {
// (Not all instructions need that distinct part, but it is conservative.)
if opcodeTable[v.Op].needIntTemp {
m := s.allocatable & s.f.Config.gpRegMask
- if m&^desired.avoid != 0 {
+ if m&^desired.avoid&^s.nospill != 0 {
m &^= desired.avoid
}
tmpReg = s.allocReg(m, &tmpVal)
diff --git a/test/fixedbugs/issue57846.go b/test/fixedbugs/issue57846.go
new file mode 100644
index 0000000000..1aea97564e
--- /dev/null
+++ b/test/fixedbugs/issue57846.go
@@ -0,0 +1,33 @@
+// 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 Float64D3(list [][][]float64, value float64) int {
+ valueCount := 0
+ for _, listValue := range list {
+ valueCount += Float64D2(listValue, value)
+ }
+ return valueCount
+}
+
+func Float64(list []float64, value float64) int {
+ valueCount := 0
+ for _, listValue := range list {
+ if listValue == value {
+ valueCount++
+ }
+ }
+ return valueCount
+}
+
+func Float64D2(list [][]float64, value float64) int {
+ valueCount := 0
+ for _, listValue := range list {
+ valueCount += Float64(listValue, value)
+ }
+ return valueCount
+}