diff options
author | Keith Randall <keithr@alum.mit.edu> | 2018-11-04 19:23:08 -0800 |
---|---|---|
committer | Keith Randall <khr@golang.org> | 2018-11-08 17:29:23 +0000 |
commit | 13baf4b2cd34dfb41c570e35b48ec287713f4d7f (patch) | |
tree | 4dd2059a36ca8d95f82e89ebc89dbdc8c61249a5 /test/inline.go | |
parent | be5f646dabf5de85e128f46f102e8c9acdd8fe90 (diff) | |
download | go-13baf4b2cd34dfb41c570e35b48ec287713f4d7f.tar.gz go-13baf4b2cd34dfb41c570e35b48ec287713f4d7f.zip |
cmd/compile: encourage inlining of functions with single-call bodies
This is a simple tweak to allow a bit more mid-stack inlining.
In cases like this:
func f() {
g()
}
We'd really like to inline f into its callers. It can't hurt.
We implement this optimization by making calls a bit cheaper, enough
to afford a single call in the function body, but not 2.
The remaining budget allows for some argument modification, or perhaps
a wrapping conditional:
func f(x int) {
g(x, 0)
}
func f(x int) {
if x > 0 {
g()
}
}
Update #19348
Change-Id: Ifb1ea0dd1db216c3fd5c453c31c3355561fe406f
Reviewed-on: https://go-review.googlesource.com/c/147361
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'test/inline.go')
-rw-r--r-- | test/inline.go | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/test/inline.go b/test/inline.go index 2553230462..9428c1487b 100644 --- a/test/inline.go +++ b/test/inline.go @@ -11,6 +11,7 @@ package foo import ( "errors" + "runtime" "unsafe" ) @@ -162,3 +163,20 @@ func k() (T, int, int) { return T{}, 0, 0 } // ERROR "can inline k" func _() { // ERROR "can inline _" T.meth(k()) // ERROR "inlining call to k" "inlining call to T.meth" } + +func small1() { // ERROR "can inline small1" + runtime.GC() +} +func small2() int { // ERROR "can inline small2" + return runtime.GOMAXPROCS(0) +} +func small3(t T) { // ERROR "can inline small3" + t.meth2(3, 5) +} +func small4(t T) { // not inlineable - has 2 calls. + t.meth2(runtime.GOMAXPROCS(0), 5) +} +func (T) meth2(int, int) { // not inlineable - has 2 calls. + runtime.GC() + runtime.GC() +} |