]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: ignore g register in liveness analysis
authorAustin Clements <austin@google.com>
Tue, 22 May 2018 21:27:54 +0000 (17:27 -0400)
committerAustin Clements <austin@google.com>
Tue, 22 May 2018 21:49:36 +0000 (21:49 +0000)
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>

src/cmd/compile/internal/gc/plive.go

index 4d5e6ff5603a2706a1f12bb1768d0b7dcf8a119a..28541870a2a565feef61063f6ea176a8704f9aa9 100644 (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