> After inlining A into B, inline_small_functions updates the information > for (most) callees and callers of the new B: > > update_callee_keys (&edge_heap, where, updated_nodes); > [...] > /* Our profitability metric can depend on local properties > such as number of inlinable calls and size of the function body. > After inlining these properties might change for the function we > inlined into (since it's body size changed) and for the functions > called by function we inlined (since number of it inlinable callers > might change). */ > update_caller_keys (&edge_heap, where, updated_nodes, NULL); > > These functions in turn call can_inline_edge_p for most of the associated > edges: > > if (can_inline_edge_p (edge, false) > && want_inline_small_function_p (edge, false)) > update_edge_key (heap, edge); > > can_inline_edge_p indirectly calls estimate_calls_size_and_time > on the caller node, which seems to recursively process all callee > edges rooted at the node. It looks from this like algorithm can be > at least quadratic in the worst case.
Yep, I have patch to add overall size into summary that makes it constant time. Will need to clean it up for mainline. > > Maybe there's something we can do to make can_inline_edge_p cheaper, but > since neither of these two calls is responsible for reporting an inline > failure reason, it seems cheaper to test want_inline_small_function_p > first, so that we don't calculate an estimate for something that we > already know isn't a "small function". I think the only change > needed to make that work is to check for CIF_FINAL_ERROR in > want_inline_small_function_p; at the moment we rely on can_inline_edge_p > to make that check. > > This cuts the time to build optabs.ii by over 4% with an > --enable-checking=release compiler on x86_64-linux-gnu. I've seen more > dramatic wins on aarch64-linux-gnu due to the NUM_POLY_INT_COEFFS==2 > thing. The patch doesn't affect the output code. > > Tested on aarch64-linux-gnu, x86_64-linux-gnu and powerpc64le-linux-gnu. > OK to install? Anyway this seems to make sense to do. > > Richard > > > 2018-01-13 Richard Sandiford <richard.sandif...@linaro.org> > > gcc/ > * ipa-inline.c (want_inline_small_function_p): Return false if > inlining has already failed with CIF_FINAL_ERROR. > (update_caller_keys): Call want_inline_small_function_p before > can_inline_edge_p. > (update_callee_keys): Likewise. OK, thanks! Honza