]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: ensure temp register mask isn't empty
authorKeith Randall <khr@golang.org>
Tue, 17 Jan 2023 17:35:21 +0000 (09:35 -0800)
committerKeith Randall <khr@google.com>
Tue, 17 Jan 2023 18:21:06 +0000 (18:21 +0000)
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>

src/cmd/compile/internal/ssa/regalloc.go
test/fixedbugs/issue57846.go [new file with mode: 0644]

index 3cfe7330d1d621a0f0b6ef595a2fadcabb06bbb4..294c522a90a87073100c63c1612367598b133621 100644 (file)
@@ -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 (file)
index 0000000..1aea975
--- /dev/null
@@ -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
+}