From cb42e3e979830ccaac72d02512f522a820c6a5e7 Mon Sep 17 00:00:00 2001 From: Cherry Zhang Date: Wed, 31 Mar 2021 10:27:06 -0400 Subject: [PATCH] cmd/compile: schedule in-register OpArg first 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 Run-TryBot: Cherry Zhang TryBot-Result: Go Bot Reviewed-by: Than McIntosh --- src/cmd/compile/internal/ssa/schedule.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/cmd/compile/internal/ssa/schedule.go b/src/cmd/compile/internal/ssa/schedule.go index c987647131..4e3e5e75e3 100644 --- a/src/cmd/compile/internal/ssa/schedule.go +++ b/src/cmd/compile/internal/ssa/schedule.go @@ -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(): -- 2.50.0