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>
This commit is contained in:
Keith Randall 2023-01-17 09:35:21 -08:00 committed by Keith Randall
parent c0799f7015
commit 9088c691da
2 changed files with 34 additions and 1 deletions

View 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)

View File

@ -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
}