PGOInlinePrologue(profile)
}
- ir.VisitFuncsBottomUp(funcs, func(list []*ir.Func, recursive bool) {
- CanInlineSCC(list, recursive, profile)
- })
-}
-
-// CanInlineSCC computes the inlinability of functions within an SCC
-// (strongly connected component).
-//
-// CanInlineSCC is designed to be used by ir.VisitFuncsBottomUp
-// callbacks.
-func CanInlineSCC(funcs []*ir.Func, recursive bool, profile *pgo.Profile) {
if base.Flag.LowerL == 0 {
return
}
- numfns := numNonClosures(funcs)
+ ir.VisitFuncsBottomUp(funcs, func(funcs []*ir.Func, recursive bool) {
+ numfns := numNonClosures(funcs)
- for _, fn := range funcs {
- if !recursive || numfns > 1 {
- // We allow inlining if there is no
- // recursion, or the recursion cycle is
- // across more than one function.
- CanInline(fn, profile)
- } else {
- if base.Flag.LowerM > 1 && fn.OClosure == nil {
- fmt.Printf("%v: cannot inline %v: recursive\n", ir.Line(fn), fn.Nname)
+ for _, fn := range funcs {
+ if !recursive || numfns > 1 {
+ // We allow inlining if there is no
+ // recursion, or the recursion cycle is
+ // across more than one function.
+ CanInline(fn, profile)
+ } else {
+ if base.Flag.LowerM > 1 && fn.OClosure == nil {
+ fmt.Printf("%v: cannot inline %v: recursive\n", ir.Line(fn), fn.Nname)
+ }
+ }
+ if inlheur.Enabled() {
+ analyzeFuncProps(fn, profile)
}
}
- if inlheur.Enabled() {
- analyzeFuncProps(fn, profile)
- }
- }
+ })
}
// GarbageCollectUnreferencedHiddenClosures makes a pass over all the
if base.Debug.PGOInline != 0 {
inlProfile = profile
}
- if inlProfile != nil {
- inline.PGOInlinePrologue(inlProfile)
- }
-
- ir.VisitFuncsBottomUp(pkg.Funcs, func(funcs []*ir.Func, recursive bool) {
- // We visit functions within an SCC in fairly arbitrary order,
- // so by computing inlinability for all functions in the SCC
- // before performing any inlining, the results are less
- // sensitive to the order within the SCC (see #58905 for an
- // example).
- // First compute inlinability for all functions in the SCC ...
- inline.CanInlineSCC(funcs, recursive, inlProfile)
+ // First compute inlinability of all functions in the package.
+ inline.CanInlineFuncs(pkg.Funcs, inlProfile)
- // ... then make a second pass to do devirtualization and inlining
- // of calls.
- for _, fn := range funcs {
- DevirtualizeAndInlineFunc(fn, inlProfile)
- }
- })
+ // Now we make a second pass to do devirtualization and inlining of
+ // calls. Order here should not matter.
+ for _, fn := range pkg.Funcs {
+ DevirtualizeAndInlineFunc(fn, inlProfile)
+ }
if base.Flag.LowerL != 0 {
// Perform a garbage collection of hidden closures functions that