Skip to content

cmd/compile: expose what contributes to consuming the inlining budget #65780

@jespino

Description

@jespino

Proposal Details

Expose what contributes to consuming the inlining budget as a debug flag

Sometimes, understanding why a function is inlined or not or what the main contributors to the function budget consumption are is not easy.

This proposal is to add a -d flag to the go tool compile command that enables traces of budget consumption.

Proof of concept

I already have a POC that does more or less the job and a tool that takes advantage of that to give a summary.

This is an example of this execution:

> go build -gcflags "-d=inlcostreason" hello.go
./hello.go:24:6: inline-function-cost: 123
./hello.go:24:6: inline-function-cost: 0,not inlining too expensive
./hello.go:25:13: inline-cost: 57,non-leaf inlining,0
./hello.go:25:13: inline-cost: 1,node,1
./hello.go:25:13: inline-cost: 1,node,2
./hello.go:25:13: inline-cost: 1,node,6
./hello.go:25:16: inline-cost: 1,node,3
./hello.go:25:16: inline-cost: 1,node,4
./hello.go:25:25: inline-cost: 1,node,5
./hello.go:26:20: inline-cost: 59,inlined function body,7
./hello.go:26:20: inline-cost: 1,node,7
...

This file, passing from a tool that I built, gives you this (showing only part of the output):

...
func usage() {  //  123, total inline cost, not inlining too expensive
	fmt.Fprintf(os.Stderr, "usage: helloserver [options]\n")  //  63, non-leaf inlining, node
	flag.PrintDefaults()  //  60, inlined function body, node
	os.Exit(2)
}
...

To understand what I did, I just added in the right places (where the budget changes) blocks like this:

if base.Debug.InlCostReason != 0 {
    base.WarnfAt(v.lastFunctionPos, "inline-cost: %d,%s,%d", inlineExtraThrowCost, "trow", v.counter)
    v.counter++
}

The counter avoids line deduplication, and the lastFunctionPos avoids showing already inlinable code as part of other functions. But those are implementation details that we need to figure out later the best approach here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    NeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.Performance

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions