-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Description
I'm debugging a performance regression in CL 466099. One cause is that the compiler does not inline the call from newInlineUnwinder
to resolveInternal
, even though resolveInternal
is inlinable according to the -m
output and the call from next
to resolveInternal
a few lines down does get inlined. This appears to be because this call to typecheck.HaveInlineBody
returns false for resolveInternal
when we're visiting newInlineUnwinder
and true when we're visiting next
. Beyond that I get past my depth. The -m output seems to indicate that the inliner visits newInlineUnwinder
, then resolveInternal
, then next
, which is surprising because that's not in bottom-up order (and this is regardless of source order). If visiting a function is what creates the inline body, then this visit order is clearly a problem.
Relevant -m output:
./symtabinl.go:49:6: cannot inline newInlineUnwinder: function too complex: cost 173 exceeds budget 80
./symtabinl.go:50:21: inlining call to funcdata
./symtabinl.go:60:6: can inline (*inlineUnwinder).resolveInternal with cost 73 as: method(*inlineUnwinder) func(uintptr) { u.pc = pc; u.index = pcdatavalue1(u.f, _PCDATA_InlTreeIndex, pc, u.cache, false) }
./symtab.go:1109:6: cannot inline pcdatavalue1: function too complex: cost 100 exceeds budget 80
./symtab.go:1113:32: inlining call to pcdatastart
./symtab.go:1113:32: inlining call to add
./symtabinl.go:72:6: cannot inline (*inlineUnwinder).next: function too complex: cost 170 exceeds budget 80
./symtabinl.go:78:29: inlining call to funcInfo.entry
./symtabinl.go:78:19: inlining call to (*inlineUnwinder).resolveInternal