1
0
mirror of https://github.com/golang/go synced 2024-11-26 05:48:05 -07:00

cmd/compile: put constants before variables in initialization order

Fixes #66575

Change-Id: I03f4d4577b88ad0a92b260b2efd0cb9fe5082b2f
Reviewed-on: https://go-review.googlesource.com/c/go/+/575075
Reviewed-by: Robert Griesemer <gri@google.com>
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Keith Randall 2024-03-28 08:47:52 -07:00
parent 3f90ba7f1f
commit 8f618c1f53
4 changed files with 49 additions and 0 deletions

View File

@ -309,6 +309,14 @@ func (a nodeQueue) Swap(i, j int) {
func (a nodeQueue) Less(i, j int) bool { func (a nodeQueue) Less(i, j int) bool {
x, y := a[i], a[j] x, y := a[i], a[j]
// Prioritize all constants before non-constants. See go.dev/issue/66575/.
_, xConst := x.obj.(*Const)
_, yConst := y.obj.(*Const)
if xConst != yConst {
return xConst
}
// nodes are prioritized by number of incoming dependencies (1st key) // nodes are prioritized by number of incoming dependencies (1st key)
// and source order (2nd key) // and source order (2nd key)
return x.ndeps < y.ndeps || x.ndeps == y.ndeps && x.obj.order() < y.obj.order() return x.ndeps < y.ndeps || x.ndeps == y.ndeps && x.obj.order() < y.obj.order()

View File

@ -311,6 +311,14 @@ func (a nodeQueue) Swap(i, j int) {
func (a nodeQueue) Less(i, j int) bool { func (a nodeQueue) Less(i, j int) bool {
x, y := a[i], a[j] x, y := a[i], a[j]
// Prioritize all constants before non-constants. See go.dev/issue/66575/.
_, xConst := x.obj.(*Const)
_, yConst := y.obj.(*Const)
if xConst != yConst {
return xConst
}
// nodes are prioritized by number of incoming dependencies (1st key) // nodes are prioritized by number of incoming dependencies (1st key)
// and source order (2nd key) // and source order (2nd key)
return x.ndeps < y.ndeps || x.ndeps == y.ndeps && x.obj.order() < y.obj.order() return x.ndeps < y.ndeps || x.ndeps == y.ndeps && x.obj.order() < y.obj.order()

View File

@ -0,0 +1,31 @@
// run
// Copyright 2024 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
var (
v0 = initv0()
v1 = initv1()
)
const c = "c"
func initv0() string {
println("initv0")
if c != "" { // have a dependency on c
return ""
}
return ""
}
func initv1() string {
println("initv1")
return ""
}
func main() {
// do nothing
}

View File

@ -0,0 +1,2 @@
initv0
initv1