1
0
mirror of https://github.com/golang/go synced 2024-11-11 23:40:22 -07:00

[dev.typeparams] cmd/compile: do not schedule in-register args late, even for block control

In the scheduler we have the logic that if a Value is used as the
block's control, we schedule it at the end, except for Phis and
Args. Even the comment says so, the code doesn't exclude
in-register Args (OpArgXXXReg).

Change to check for score instead, which includes OpArgXXXRegs.
It also includes GetClosurePtr, which must be scheduled early.
We just happen to never use it as block control.

Found when working on ARM64 register ABI. In theory this could
apply to AMD64 as well. But on AMD64 we never use in-register
Value as block control, as conditional branch is always based on
FLAGS, never based on registers, so it doesn't actually cause any
problem.

Change-Id: I167a550309772639574f7468caf91bd805eb74c6
Reviewed-on: https://go-review.googlesource.com/c/go/+/322849
Trust: Cherry Mui <cherryyz@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: David Chase <drchase@google.com>
This commit is contained in:
Cherry Mui 2021-05-25 19:49:08 -04:00
parent 4ed6317e73
commit cf23daeda3

View File

@ -220,7 +220,7 @@ func schedule(f *Func) {
// unless they are phi values (which must be first). // unless they are phi values (which must be first).
// OpArg also goes first -- if it is stack it register allocates // OpArg also goes first -- if it is stack it register allocates
// to a LoadReg, if it is register it is from the beginning anyway. // to a LoadReg, if it is register it is from the beginning anyway.
if c.Op == OpPhi || c.Op == OpArg { if score[c.ID] == ScorePhi || score[c.ID] == ScoreArg {
continue continue
} }
score[c.ID] = ScoreControl score[c.ID] = ScoreControl