1
0
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:
Austin Clements 2018-05-22 17:27:54 -04:00
parent cfbf375a81
commit 132900982c

View File

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