]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: schedule in-register OpArg first
authorCherry Zhang <cherryyz@google.com>
Wed, 31 Mar 2021 14:27:06 +0000 (10:27 -0400)
committerCherry Zhang <cherryyz@google.com>
Wed, 31 Mar 2021 18:01:39 +0000 (18:01 +0000)
OpArgXXXReg values must be scheduled at the very top, as their
registers need to be live at the beginning before any other use
of the register.

Change-Id: Ic76768bb74da402adbe61db3b2d174ecd3f9fffc
Reviewed-on: https://go-review.googlesource.com/c/go/+/306329
Trust: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/compile/internal/ssa/schedule.go

index c987647131eba49ed0f8ce0d81b0c31258bde39e..4e3e5e75e358d7f1d75a0a5c2888efdfe8fe398a 100644 (file)
@@ -137,7 +137,14 @@ func schedule(f *Func) {
                        case v.Op == OpVarDef:
                                // We want all the vardefs next.
                                score[v.ID] = ScoreVarDef
-                       case v.Op == OpArg || v.Op == OpArgIntReg || v.Op == OpArgFloatReg:
+                       case v.Op == OpArgIntReg || v.Op == OpArgFloatReg:
+                               // In-register args must be scheduled as early as possible to ensure that the
+                               // context register is not stomped. They should only appear in the entry block.
+                               if b != f.Entry {
+                                       f.Fatalf("%s appeared outside of entry block, b=%s", v.Op, b.String())
+                               }
+                               score[v.ID] = ScorePhi
+                       case v.Op == OpArg:
                                // We want all the args as early as possible, for better debugging.
                                score[v.ID] = ScoreArg
                        case v.Type.IsMemory():