mirror of
https://github.com/golang/go
synced 2024-09-04 23:44:16 +00: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:
parent
4ed6317e73
commit
cf23daeda3
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue