mirror of
https://github.com/golang/go
synced 2024-11-23 20:00:04 -07:00
cmd/compile: ignore g register in liveness analysis
In rare circumstances that we don't yet fully understand, the g register can be spilled to the stack and then reloaded. If this happens, liveness analysis sees a pointer load into a non-general-purpose register and panics. We should fix the root cause of this, but fix the build for now by ignoring pointer loads into the g register. For #25504. Change-Id: I0dfee1af9750c8e9157c7637280cdf07118ef2ca Reviewed-on: https://go-review.googlesource.com/114081 Run-TryBot: Austin Clements <austin@google.com> Reviewed-by: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org>
This commit is contained in:
parent
cfbf375a81
commit
132900982c
@ -461,6 +461,17 @@ func (lv *Liveness) regEffects(v *ssa.Value) (uevar, kill liveRegMask) {
|
||||
for _, reg := range regs[:nreg] {
|
||||
if reg.GCNum() == -1 {
|
||||
if ptrOnly {
|
||||
if reg.String() == "g" {
|
||||
// Issue #25504: Sometimes we
|
||||
// spill and reload the g
|
||||
// register, which this sees
|
||||
// as a pointer load into the
|
||||
// g register. The g register
|
||||
// isn't a GP register and
|
||||
// can't appear in register
|
||||
// maps. Ignore it.
|
||||
continue
|
||||
}
|
||||
v.Fatalf("pointer in non-pointer register %v", reg)
|
||||
} else {
|
||||
continue
|
||||
|
Loading…
Reference in New Issue
Block a user