]> Cypherpunks.ru repositories - gostls13.git/commit
cmd/compile: enable PGO-driven call devirtualization
authorMichael Pratt <mpratt@google.com>
Fri, 12 May 2023 20:39:43 +0000 (16:39 -0400)
committerGopher Robot <gobot@golang.org>
Mon, 22 May 2023 19:37:24 +0000 (19:37 +0000)
commit8c445b7c9fe6738cbef2040a1011bd11489b0806
treeee0df0991f0f0628c6e20936c7c6e862e567b5c4
parent6761bff433d3cc77bf0b220a69ad813f93415354
cmd/compile: enable PGO-driven call devirtualization

This CL is originally based on CL 484838 from rajbarik@uber.com.

Add a new PGO-based devirtualize pass. This pass conditionally
devirtualizes interface calls for the hottest callee. That is, it
performs a transformation like:

type Iface interface {
Foo()
}

type Concrete struct{}

func (Concrete) Foo() {}

func foo(i Iface) {
i.Foo()
}

to:

func foo(i Iface) {
if c, ok := i.(Concrete); ok {
c.Foo()
} else {
i.Foo()
}
}

The primary benefit of this transformation is enabling inlining of the
direct calls.

Today this change has no impact on the escape behavior, as the fallback
interface always forces an escape. But improving escape analysis to take
advantage of this is an area of potential work.

This CL is the bare minimum of a devirtualization implementation. There
are still numerous limitations:

* Callees not directly referenced in the current package can be missed
  (even if they are in the transitive dependences).
* Callees not in the transitive dependencies of the current package are
  missed.
* Only interface method calls are supported, not other indirect function
  calls.
* Multiple calls to compatible interfaces on the same line cannot be
  distinguished and will use the same callee target.
* Callees that only partially implement an interface (they are embedded
  in another type that completes the interface) cannot be devirtualized.
* Others, mentioned in TODOs.

Fixes #59959

Change-Id: I8bedb516139695ee4069650b099d05957b7ce5ee
Reviewed-on: https://go-review.googlesource.com/c/go/+/492436
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Run-TryBot: Michael Pratt <mpratt@google.com>
Auto-Submit: Michael Pratt <mpratt@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
src/cmd/compile/internal/base/debug.go
src/cmd/compile/internal/base/flag.go
src/cmd/compile/internal/devirtualize/devirtualize.go
src/cmd/compile/internal/devirtualize/pgo.go [new file with mode: 0644]
src/cmd/compile/internal/gc/main.go
src/cmd/compile/internal/inline/inl.go
src/cmd/compile/internal/pgo/irgraph.go
src/cmd/compile/internal/test/pgo_devirtualize_test.go [new file with mode: 0644]
src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt.go [new file with mode: 0644]
src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt.pprof [new file with mode: 0644]
src/cmd/compile/internal/test/testdata/pgo/devirtualize/devirt_test.go [new file with mode: 0644]