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