diff options
author | Than McIntosh <thanm@google.com> | 2023-03-09 09:59:26 -0500 |
---|---|---|
committer | Than McIntosh <thanm@google.com> | 2023-03-09 22:13:26 +0000 |
commit | f5c7416511de979433a500735c1617cf03dc46c2 (patch) | |
tree | 5723402513474397c8a27257a54bab9c9f1ac4a1 /test/inline.go | |
parent | c9389a5849d65b74287cd2746a94748d6d64cb44 (diff) | |
download | go-f5c7416511de979433a500735c1617cf03dc46c2.tar.gz go-f5c7416511de979433a500735c1617cf03dc46c2.zip |
cmd/compile: reorder operations in SCCs to enable more inlining
This patch changes the relative order of "CanInline" and "InlineCalls"
operations within the inliner for clumps of functions corresponding to
strongly connected components in the call graph. This helps increase
the amount of inlining within SCCs, particularly in Go's runtime
package, which has a couple of very large SCCs.
For a given SCC of the form { fn1, fn2, ... fnk }, the inliner would
(prior to this point) walk through the list of functions and for each
function first compute inlinability ("CanInline") and then perform
inlining ("InlineCalls"). This meant that if there was an inlinable
call from fn3 to fn4 (for example), this call would never be inlined,
since at the point fn3 was visited, we would not have computed
inlinability for fn4.
We now do inlinability analysis for all functions in an SCC first,
then do actual inlining for everything. This results in 47 additional
inlines in the Go runtime package (a fairly modest increase
percentage-wise of 0.6%).
Updates #58905.
Change-Id: I48dbb1ca16f0b12f256d9eeba8cf7f3e6dd853cd
Reviewed-on: https://go-review.googlesource.com/c/go/+/474955
Run-TryBot: Than McIntosh <thanm@google.com>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'test/inline.go')
-rw-r--r-- | test/inline.go | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/test/inline.go b/test/inline.go index 1aa8fccbbd..3bc102f769 100644 --- a/test/inline.go +++ b/test/inline.go @@ -246,13 +246,13 @@ func ff(x int) { // ERROR "can inline ff" if x < 0 { return } - gg(x - 1) + gg(x - 1) // ERROR "inlining call to gg" "inlining call to hh" } func gg(x int) { // ERROR "can inline gg" - hh(x - 1) + hh(x - 1) // ERROR "inlining call to hh" "inlining call to ff" } func hh(x int) { // ERROR "can inline hh" - ff(x - 1) // ERROR "inlining call to ff" // ERROR "inlining call to gg" + ff(x - 1) // ERROR "inlining call to ff" "inlining call to gg" } // Issue #14768 - make sure we can inline for loops. |