> 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

Reply via email to