Revert "cmd/compile: speedup large init function compile time" This reverts CL 737880. Reason to revert: the CL breaks initialization variables that emits local variables in synthetic init function. Fixes #80141 Change-Id: I7d5da53901b47d7000dc7794a157df720c4f8add Reviewed-on: https://go-review.googlesource.com/c/go/+/794180 Reviewed-by: Keith Randall <khr@google.com> Reviewed-by: Junyang Shao <shaojunyang@google.com> Reviewed-by: Jorropo <jorropo.pgm@gmail.com> Reviewed-by: Keith Randall <khr@golang.org> Auto-Submit: Cuong Manh Le <cuong.manhle.vn@gmail.com> Auto-Submit: Junyang Shao <shaojunyang@google.com> LUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
diff --git a/src/cmd/compile/internal/noder/reader.go b/src/cmd/compile/internal/noder/reader.go index 0b6d74b..fab311e 100644 --- a/src/cmd/compile/internal/noder/reader.go +++ b/src/cmd/compile/internal/noder/reader.go
@@ -3573,9 +3573,6 @@ // Outline (if legal/profitable) global map inits. staticinit.OutlineMapInits(fn) - // Split large init function. - staticinit.SplitLargeInit(fn) - target.Inits = append(target.Inits, fn) }
diff --git a/src/cmd/compile/internal/pkginit/init.go b/src/cmd/compile/internal/pkginit/init.go index 9be1586..04f6a5d 100644 --- a/src/cmd/compile/internal/pkginit/init.go +++ b/src/cmd/compile/internal/pkginit/init.go
@@ -87,7 +87,10 @@ // Record user init functions. for _, fn := range typecheck.Target.Inits { - if staticinit.CanOptimize(fn) { + if fn.Sym().Name == "init" { + // Synthetic init function for initialization of package-scope + // variables. We can use staticinit to optimize away static + // assignments. s := staticinit.Schedule{ Plans: make(map[ir.Node]*staticinit.Plan), Temps: make(map[ir.Node]*ir.Name),
diff --git a/src/cmd/compile/internal/staticinit/sched.go b/src/cmd/compile/internal/staticinit/sched.go index 42a2276..c954631 100644 --- a/src/cmd/compile/internal/staticinit/sched.go +++ b/src/cmd/compile/internal/staticinit/sched.go
@@ -9,7 +9,6 @@ "go/constant" "go/token" "os" - "slices" "strings" "cmd/compile/internal/base" @@ -1248,54 +1247,3 @@ fmt.Fprintf(os.Stderr, "=-= outlined %v map initializations\n", outlined) } } - -const maxInitStatements = 1000 - -// SplitLargeInit breaks up a large "init" function into smaller chunks to avoid slow compilation. -func SplitLargeInit(fn *ir.Func) { - if !fn.IsPackageInit() || len(fn.Body) <= maxInitStatements { - return - } - var calls []ir.Node - for chunk := range slices.Chunk(fn.Body, maxInitStatements) { - varInitFn := generateVarInitFunc(chunk) - ir.WithFunc(fn, func() { - calls = append(calls, typecheck.Call(varInitFn.Pos(), varInitFn.Nname, nil, false)) - }) - } - fn.Body = calls -} - -// CanOptimize reports whether the given fn can be optimized for static assignments. -func CanOptimize(fn *ir.Func) bool { - name := fn.Sym().Name - return name == "init" || strings.HasPrefix(name, varInitFuncPrefix) -} - -// varInitGen is a counter used to uniquify compiler-generated functions for initializing variables. -var varInitGen int - -const varInitFuncPrefix = "init.var." - -// Create a new function that will (eventually) have this form: -// -// func init.var.%d() { -// ... -// } -func generateVarInitFunc(body []ir.Node) *ir.Func { - pos := base.AutogeneratedPos - base.Pos = pos - - sym := typecheck.LookupNum(varInitFuncPrefix, varInitGen) - varInitGen++ - - fn := ir.NewFunc(pos, pos, sym, types.NewSignature(nil, nil, nil)) - fn.SetInlinabilityChecked(true) // suppress inlining; otherwise, we end up with giant init eventually. - fn.SetWrapper(true) // less disruptive on backtraces. - typecheck.DeclFunc(fn) - - fn.Body = body - typecheck.FinishFuncBody() - - return fn -}