Skip to content

Commit a464ffd

Browse files
committed
cmd/compile: tweak inlining to favor PPARAM call sites
If a function f being considered for inlining calls one of its parameters, reduce the normal cost of that call (57) to 17 to increase the chance that f will be inlined and (with luck) that parameter will be revealed as a constant function (which unblocks escape analysis) or perhaps even be inlined. The least-change value for that was still effective for iter_test benchmarks was 32; however tests showed no particular harm even when reduced as low as 7, and there have been reports of other performance problems with rangefunc overheads and so I picked a middling number in hopes of warding off such reports. Updates #69015 Change-Id: I2a525c1beffb9f88daa14caa8a622864b023675c Reviewed-on: https://go-review.googlesource.com/c/go/+/609095 LUCI-TryBot-Result: Go LUCI <[email protected]> Reviewed-by: Keith Randall <[email protected]> Reviewed-by: Tim King <[email protected]> Reviewed-by: Keith Randall <[email protected]>
1 parent 74163c8 commit a464ffd

File tree

3 files changed

+19
-11
lines changed

3 files changed

+19
-11
lines changed

src/cmd/compile/internal/inline/inl.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ const (
4949
inlineExtraAppendCost = 0
5050
// default is to inline if there's at most one call. -l=4 overrides this by using 1 instead.
5151
inlineExtraCallCost = 57 // 57 was benchmarked to provided most benefit with no bad surprises; see https://github.com/golang/go/issues/19348#issuecomment-439370742
52+
inlineParamCallCost = 17 // calling a parameter only costs this much extra (inlining might expose a constant function)
5253
inlineExtraPanicCost = 1 // do not penalize inlining panics.
5354
inlineExtraThrowCost = inlineMaxBudget // with current (2018-05/1.11) code, inlining runtime.throw does not help.
5455

@@ -520,6 +521,10 @@ opSwitch:
520521
}
521522
}
522523

524+
// A call to a parameter is optimistically a cheap call, if it's a constant function
525+
// perhaps it will inline, it also can simplify escape analysis.
526+
extraCost := v.extraCallCost
527+
523528
if n.Fun.Op() == ir.ONAME {
524529
name := n.Fun.(*ir.Name)
525530
if name.Class == ir.PFUNC {
@@ -539,6 +544,9 @@ opSwitch:
539544
}
540545
}
541546
}
547+
if name.Class == ir.PPARAM {
548+
extraCost = min(extraCost, inlineParamCallCost)
549+
}
542550
}
543551

544552
if cheap {
@@ -572,7 +580,7 @@ opSwitch:
572580
}
573581

574582
// Call cost for non-leaf inlining.
575-
v.budget -= v.extraCallCost
583+
v.budget -= extraCost
576584

577585
case ir.OCALLMETH:
578586
base.FatalfAt(n.Pos(), "OCALLMETH missed by typecheck")

src/cmd/compile/internal/inline/inlheur/testdata/props/acrosscall.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ package params
1313
// 0 ParamFeedsIndirectCall
1414
// <endpropsdump>
1515
// {"Flags":0,"ParamFlags":[8],"ResultFlags":null}
16-
// callsite: acrosscall.go:20:12|0 flagstr "" flagval 0 score 60 mask 0 maskstr ""
16+
// callsite: acrosscall.go:20:12|0 flagstr "" flagval 0 score 20 mask 0 maskstr ""
1717
// <endcallsites>
1818
// <endfuncpreamble>
1919
func T_feeds_indirect_call_via_call_toplevel(f func(int)) {
@@ -25,7 +25,7 @@ func T_feeds_indirect_call_via_call_toplevel(f func(int)) {
2525
// 0 ParamMayFeedIndirectCall
2626
// <endpropsdump>
2727
// {"Flags":0,"ParamFlags":[16],"ResultFlags":null}
28-
// callsite: acrosscall.go:33:13|0 flagstr "" flagval 0 score 60 mask 0 maskstr ""
28+
// callsite: acrosscall.go:33:13|0 flagstr "" flagval 0 score 20 mask 0 maskstr ""
2929
// <endcallsites>
3030
// <endfuncpreamble>
3131
func T_feeds_indirect_call_via_call_conditional(f func(int)) {
@@ -39,7 +39,7 @@ func T_feeds_indirect_call_via_call_conditional(f func(int)) {
3939
// 0 ParamMayFeedIndirectCall
4040
// <endpropsdump>
4141
// {"Flags":0,"ParamFlags":[16],"ResultFlags":null}
42-
// callsite: acrosscall.go:46:23|0 flagstr "" flagval 0 score 64 mask 0 maskstr ""
42+
// callsite: acrosscall.go:46:23|0 flagstr "" flagval 0 score 24 mask 0 maskstr ""
4343
// <endcallsites>
4444
// <endfuncpreamble>
4545
func T_feeds_conditional_indirect_call_via_call_toplevel(f func(int)) {
@@ -90,8 +90,8 @@ func T_feeds_conditional_if_via_call(x int) {
9090
// 1 ParamNoInfo
9191
// <endpropsdump>
9292
// {"Flags":0,"ParamFlags":[24,0],"ResultFlags":null}
93-
// callsite: acrosscall.go:98:12|0 flagstr "" flagval 0 score 60 mask 0 maskstr ""
94-
// callsite: acrosscall.go:99:23|1 flagstr "" flagval 0 score 64 mask 0 maskstr ""
93+
// callsite: acrosscall.go:98:12|0 flagstr "" flagval 0 score 20 mask 0 maskstr ""
94+
// callsite: acrosscall.go:99:23|1 flagstr "" flagval 0 score 24 mask 0 maskstr ""
9595
// <endcallsites>
9696
// <endfuncpreamble>
9797
func T_multifeeds1(f1, f2 func(int)) {

src/cmd/compile/internal/inline/inlheur/testdata/props/calls.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ func init() {
133133
// calls.go T_pass_inlinable_func_to_param_feeding_indirect_call 140 0 1
134134
// <endpropsdump>
135135
// {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]}
136-
// callsite: calls.go:141:19|0 flagstr "" flagval 0 score 16 mask 512 maskstr "passInlinableFuncToIndCallAdj"
136+
// callsite: calls.go:141:19|0 flagstr "" flagval 0 score -24 mask 512 maskstr "passInlinableFuncToIndCallAdj"
137137
// callsite: calls.go:141:19|calls.go:232:10|0 flagstr "" flagval 0 score 2 mask 0 maskstr ""
138138
// <endcallsites>
139139
// <endfuncpreamble>
@@ -144,7 +144,7 @@ func T_pass_inlinable_func_to_param_feeding_indirect_call(x int) int {
144144
// calls.go T_pass_noninlinable_func_to_param_feeding_indirect_call 150 0 1
145145
// <endpropsdump>
146146
// {"Flags":0,"ParamFlags":[0],"ResultFlags":[0]}
147-
// callsite: calls.go:153:19|0 flagstr "" flagval 0 score 36 mask 128 maskstr "passFuncToIndCallAdj"
147+
// callsite: calls.go:153:19|0 flagstr "" flagval 0 score -4 mask 128 maskstr "passFuncToIndCallAdj"
148148
// <endcallsites>
149149
// <endfuncpreamble>
150150
func T_pass_noninlinable_func_to_param_feeding_indirect_call(x int) int {
@@ -158,7 +158,7 @@ func T_pass_noninlinable_func_to_param_feeding_indirect_call(x int) int {
158158
// 0 ParamFeedsIfOrSwitch
159159
// <endpropsdump>
160160
// {"Flags":0,"ParamFlags":[32],"ResultFlags":[0]}
161-
// callsite: calls.go:166:25|0 flagstr "" flagval 0 score 27 mask 1024 maskstr "passInlinableFuncToNestedIndCallAdj"
161+
// callsite: calls.go:166:25|0 flagstr "" flagval 0 score -13 mask 1024 maskstr "passInlinableFuncToNestedIndCallAdj"
162162
// callsite: calls.go:166:25|calls.go:237:11|0 flagstr "" flagval 0 score 2 mask 0 maskstr ""
163163
// <endcallsites>
164164
// <endfuncpreamble>
@@ -171,7 +171,7 @@ func T_pass_inlinable_func_to_param_feeding_nested_indirect_call(x int) int {
171171
// 0 ParamFeedsIfOrSwitch
172172
// <endpropsdump>
173173
// {"Flags":0,"ParamFlags":[32],"ResultFlags":[0]}
174-
// callsite: calls.go:178:25|0 flagstr "" flagval 0 score 47 mask 256 maskstr "passFuncToNestedIndCallAdj"
174+
// callsite: calls.go:178:25|0 flagstr "" flagval 0 score 7 mask 256 maskstr "passFuncToNestedIndCallAdj"
175175
// <endcallsites>
176176
// <endfuncpreamble>
177177
func T_pass_noninlinable_func_to_param_feeding_nested_indirect_call(x int) int {
@@ -183,7 +183,7 @@ func T_pass_noninlinable_func_to_param_feeding_nested_indirect_call(x int) int {
183183
// {"Flags":0,"ParamFlags":[0,0],"ResultFlags":[0]}
184184
// callsite: calls.go:209:14|0 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj"
185185
// callsite: calls.go:210:15|1 flagstr "CallSiteOnPanicPath" flagval 2 score 42 mask 1 maskstr "panicPathAdj"
186-
// callsite: calls.go:212:19|2 flagstr "" flagval 0 score 16 mask 512 maskstr "passInlinableFuncToIndCallAdj"
186+
// callsite: calls.go:212:19|2 flagstr "" flagval 0 score -24 mask 512 maskstr "passInlinableFuncToIndCallAdj"
187187
// callsite: calls.go:212:19|calls.go:232:10|0 flagstr "" flagval 0 score 4 mask 0 maskstr ""
188188
// <endcallsites>
189189
// <endfuncpreamble>

0 commit comments

Comments
 (0)