* ipa-inline-analysis.c (cgraph_2edge_hook_list, cgraph_edge_hook_list,
[official-gcc.git] / gcc / ipa-inline.c
blob0238de2dac8e205ea508ae389b490e3a4320dfc1
1 /* Inlining decision heuristics.
2 Copyright (C) 2003-2017 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 for more details.
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* Inlining decision heuristics
23 The implementation of inliner is organized as follows:
25 inlining heuristics limits
27 can_inline_edge_p allow to check that particular inlining is allowed
28 by the limits specified by user (allowed function growth, growth and so
29 on).
31 Functions are inlined when it is obvious the result is profitable (such
32 as functions called once or when inlining reduce code size).
33 In addition to that we perform inlining of small functions and recursive
34 inlining.
36 inlining heuristics
38 The inliner itself is split into two passes:
40 pass_early_inlining
42 Simple local inlining pass inlining callees into current function.
43 This pass makes no use of whole unit analysis and thus it can do only
44 very simple decisions based on local properties.
46 The strength of the pass is that it is run in topological order
47 (reverse postorder) on the callgraph. Functions are converted into SSA
48 form just before this pass and optimized subsequently. As a result, the
49 callees of the function seen by the early inliner was already optimized
50 and results of early inlining adds a lot of optimization opportunities
51 for the local optimization.
53 The pass handle the obvious inlining decisions within the compilation
54 unit - inlining auto inline functions, inlining for size and
55 flattening.
57 main strength of the pass is the ability to eliminate abstraction
58 penalty in C++ code (via combination of inlining and early
59 optimization) and thus improve quality of analysis done by real IPA
60 optimizers.
62 Because of lack of whole unit knowledge, the pass can not really make
63 good code size/performance tradeoffs. It however does very simple
64 speculative inlining allowing code size to grow by
65 EARLY_INLINING_INSNS when callee is leaf function. In this case the
66 optimizations performed later are very likely to eliminate the cost.
68 pass_ipa_inline
70 This is the real inliner able to handle inlining with whole program
71 knowledge. It performs following steps:
73 1) inlining of small functions. This is implemented by greedy
74 algorithm ordering all inlinable cgraph edges by their badness and
75 inlining them in this order as long as inline limits allows doing so.
77 This heuristics is not very good on inlining recursive calls. Recursive
78 calls can be inlined with results similar to loop unrolling. To do so,
79 special purpose recursive inliner is executed on function when
80 recursive edge is met as viable candidate.
82 2) Unreachable functions are removed from callgraph. Inlining leads
83 to devirtualization and other modification of callgraph so functions
84 may become unreachable during the process. Also functions declared as
85 extern inline or virtual functions are removed, since after inlining
86 we no longer need the offline bodies.
88 3) Functions called once and not exported from the unit are inlined.
89 This should almost always lead to reduction of code size by eliminating
90 the need for offline copy of the function. */
92 #include "config.h"
93 #include "system.h"
94 #include "coretypes.h"
95 #include "backend.h"
96 #include "target.h"
97 #include "rtl.h"
98 #include "tree.h"
99 #include "gimple.h"
100 #include "alloc-pool.h"
101 #include "tree-pass.h"
102 #include "gimple-ssa.h"
103 #include "cgraph.h"
104 #include "lto-streamer.h"
105 #include "trans-mem.h"
106 #include "calls.h"
107 #include "tree-inline.h"
108 #include "params.h"
109 #include "profile.h"
110 #include "symbol-summary.h"
111 #include "tree-vrp.h"
112 #include "ipa-prop.h"
113 #include "ipa-inline.h"
114 #include "ipa-utils.h"
115 #include "sreal.h"
116 #include "auto-profile.h"
117 #include "builtins.h"
118 #include "fibonacci_heap.h"
120 typedef fibonacci_heap <sreal, cgraph_edge> edge_heap_t;
121 typedef fibonacci_node <sreal, cgraph_edge> edge_heap_node_t;
123 /* Statistics we collect about inlining algorithm. */
124 static int overall_size;
125 static gcov_type max_count;
126 static gcov_type spec_rem;
128 /* Pre-computed constants 1/CGRAPH_FREQ_BASE and 1/100. */
129 static sreal cgraph_freq_base_rec, percent_rec;
131 /* Return false when inlining edge E would lead to violating
132 limits on function unit growth or stack usage growth.
134 The relative function body growth limit is present generally
135 to avoid problems with non-linear behavior of the compiler.
136 To allow inlining huge functions into tiny wrapper, the limit
137 is always based on the bigger of the two functions considered.
139 For stack growth limits we always base the growth in stack usage
140 of the callers. We want to prevent applications from segfaulting
141 on stack overflow when functions with huge stack frames gets
142 inlined. */
144 static bool
145 caller_growth_limits (struct cgraph_edge *e)
147 struct cgraph_node *to = e->caller;
148 struct cgraph_node *what = e->callee->ultimate_alias_target ();
149 int newsize;
150 int limit = 0;
151 HOST_WIDE_INT stack_size_limit = 0, inlined_stack;
152 inline_summary *info, *what_info, *outer_info = inline_summaries->get (to);
154 /* Look for function e->caller is inlined to. While doing
155 so work out the largest function body on the way. As
156 described above, we want to base our function growth
157 limits based on that. Not on the self size of the
158 outer function, not on the self size of inline code
159 we immediately inline to. This is the most relaxed
160 interpretation of the rule "do not grow large functions
161 too much in order to prevent compiler from exploding". */
162 while (true)
164 info = inline_summaries->get (to);
165 if (limit < info->self_size)
166 limit = info->self_size;
167 if (stack_size_limit < info->estimated_self_stack_size)
168 stack_size_limit = info->estimated_self_stack_size;
169 if (to->global.inlined_to)
170 to = to->callers->caller;
171 else
172 break;
175 what_info = inline_summaries->get (what);
177 if (limit < what_info->self_size)
178 limit = what_info->self_size;
180 limit += limit * PARAM_VALUE (PARAM_LARGE_FUNCTION_GROWTH) / 100;
182 /* Check the size after inlining against the function limits. But allow
183 the function to shrink if it went over the limits by forced inlining. */
184 newsize = estimate_size_after_inlining (to, e);
185 if (newsize >= info->size
186 && newsize > PARAM_VALUE (PARAM_LARGE_FUNCTION_INSNS)
187 && newsize > limit)
189 e->inline_failed = CIF_LARGE_FUNCTION_GROWTH_LIMIT;
190 return false;
193 if (!what_info->estimated_stack_size)
194 return true;
196 /* FIXME: Stack size limit often prevents inlining in Fortran programs
197 due to large i/o datastructures used by the Fortran front-end.
198 We ought to ignore this limit when we know that the edge is executed
199 on every invocation of the caller (i.e. its call statement dominates
200 exit block). We do not track this information, yet. */
201 stack_size_limit += ((gcov_type)stack_size_limit
202 * PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) / 100);
204 inlined_stack = (outer_info->stack_frame_offset
205 + outer_info->estimated_self_stack_size
206 + what_info->estimated_stack_size);
207 /* Check new stack consumption with stack consumption at the place
208 stack is used. */
209 if (inlined_stack > stack_size_limit
210 /* If function already has large stack usage from sibling
211 inline call, we can inline, too.
212 This bit overoptimistically assume that we are good at stack
213 packing. */
214 && inlined_stack > info->estimated_stack_size
215 && inlined_stack > PARAM_VALUE (PARAM_LARGE_STACK_FRAME))
217 e->inline_failed = CIF_LARGE_STACK_FRAME_GROWTH_LIMIT;
218 return false;
220 return true;
223 /* Dump info about why inlining has failed. */
225 static void
226 report_inline_failed_reason (struct cgraph_edge *e)
228 if (dump_file)
230 fprintf (dump_file, " not inlinable: %s/%i -> %s/%i, %s\n",
231 xstrdup_for_dump (e->caller->name ()), e->caller->order,
232 xstrdup_for_dump (e->callee->name ()), e->callee->order,
233 cgraph_inline_failed_string (e->inline_failed));
234 if ((e->inline_failed == CIF_TARGET_OPTION_MISMATCH
235 || e->inline_failed == CIF_OPTIMIZATION_MISMATCH)
236 && e->caller->lto_file_data
237 && e->callee->ultimate_alias_target ()->lto_file_data)
239 fprintf (dump_file, " LTO objects: %s, %s\n",
240 e->caller->lto_file_data->file_name,
241 e->callee->ultimate_alias_target ()->lto_file_data->file_name);
243 if (e->inline_failed == CIF_TARGET_OPTION_MISMATCH)
244 cl_target_option_print_diff
245 (dump_file, 2, target_opts_for_fn (e->caller->decl),
246 target_opts_for_fn (e->callee->ultimate_alias_target ()->decl));
247 if (e->inline_failed == CIF_OPTIMIZATION_MISMATCH)
248 cl_optimization_print_diff
249 (dump_file, 2, opts_for_fn (e->caller->decl),
250 opts_for_fn (e->callee->ultimate_alias_target ()->decl));
254 /* Decide whether sanitizer-related attributes allow inlining. */
256 static bool
257 sanitize_attrs_match_for_inline_p (const_tree caller, const_tree callee)
259 /* Don't care if sanitizer is disabled */
260 if (!(flag_sanitize & SANITIZE_ADDRESS))
261 return true;
263 if (!caller || !callee)
264 return true;
266 return !!lookup_attribute ("no_sanitize_address",
267 DECL_ATTRIBUTES (caller)) ==
268 !!lookup_attribute ("no_sanitize_address",
269 DECL_ATTRIBUTES (callee));
272 /* Used for flags where it is safe to inline when caller's value is
273 grater than callee's. */
274 #define check_maybe_up(flag) \
275 (opts_for_fn (caller->decl)->x_##flag \
276 != opts_for_fn (callee->decl)->x_##flag \
277 && (!always_inline \
278 || opts_for_fn (caller->decl)->x_##flag \
279 < opts_for_fn (callee->decl)->x_##flag))
280 /* Used for flags where it is safe to inline when caller's value is
281 smaller than callee's. */
282 #define check_maybe_down(flag) \
283 (opts_for_fn (caller->decl)->x_##flag \
284 != opts_for_fn (callee->decl)->x_##flag \
285 && (!always_inline \
286 || opts_for_fn (caller->decl)->x_##flag \
287 > opts_for_fn (callee->decl)->x_##flag))
288 /* Used for flags where exact match is needed for correctness. */
289 #define check_match(flag) \
290 (opts_for_fn (caller->decl)->x_##flag \
291 != opts_for_fn (callee->decl)->x_##flag)
293 /* Decide if we can inline the edge and possibly update
294 inline_failed reason.
295 We check whether inlining is possible at all and whether
296 caller growth limits allow doing so.
298 if REPORT is true, output reason to the dump file.
300 if DISREGARD_LIMITS is true, ignore size limits.*/
302 static bool
303 can_inline_edge_p (struct cgraph_edge *e, bool report,
304 bool disregard_limits = false, bool early = false)
306 gcc_checking_assert (e->inline_failed);
308 if (cgraph_inline_failed_type (e->inline_failed) == CIF_FINAL_ERROR)
310 if (report)
311 report_inline_failed_reason (e);
312 return false;
315 bool inlinable = true;
316 enum availability avail;
317 cgraph_node *caller = e->caller->global.inlined_to
318 ? e->caller->global.inlined_to : e->caller;
319 cgraph_node *callee = e->callee->ultimate_alias_target (&avail, caller);
320 tree caller_tree = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (caller->decl);
321 tree callee_tree
322 = callee ? DECL_FUNCTION_SPECIFIC_OPTIMIZATION (callee->decl) : NULL;
324 if (!callee->definition)
326 e->inline_failed = CIF_BODY_NOT_AVAILABLE;
327 inlinable = false;
329 else if (callee->calls_comdat_local)
331 e->inline_failed = CIF_USES_COMDAT_LOCAL;
332 inlinable = false;
334 else if (avail <= AVAIL_INTERPOSABLE)
336 e->inline_failed = CIF_OVERWRITABLE;
337 inlinable = false;
339 /* All edges with call_stmt_cannot_inline_p should have inline_failed
340 initialized to one of FINAL_ERROR reasons. */
341 else if (e->call_stmt_cannot_inline_p)
342 gcc_unreachable ();
343 /* Don't inline if the functions have different EH personalities. */
344 else if (DECL_FUNCTION_PERSONALITY (caller->decl)
345 && DECL_FUNCTION_PERSONALITY (callee->decl)
346 && (DECL_FUNCTION_PERSONALITY (caller->decl)
347 != DECL_FUNCTION_PERSONALITY (callee->decl)))
349 e->inline_failed = CIF_EH_PERSONALITY;
350 inlinable = false;
352 /* TM pure functions should not be inlined into non-TM_pure
353 functions. */
354 else if (is_tm_pure (callee->decl) && !is_tm_pure (caller->decl))
356 e->inline_failed = CIF_UNSPECIFIED;
357 inlinable = false;
359 /* Check compatibility of target optimization options. */
360 else if (!targetm.target_option.can_inline_p (caller->decl,
361 callee->decl))
363 e->inline_failed = CIF_TARGET_OPTION_MISMATCH;
364 inlinable = false;
366 else if (!inline_summaries->get (callee)->inlinable)
368 e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
369 inlinable = false;
371 /* Don't inline a function with mismatched sanitization attributes. */
372 else if (!sanitize_attrs_match_for_inline_p (caller->decl, callee->decl))
374 e->inline_failed = CIF_ATTRIBUTE_MISMATCH;
375 inlinable = false;
377 /* Check if caller growth allows the inlining. */
378 else if (!DECL_DISREGARD_INLINE_LIMITS (callee->decl)
379 && !disregard_limits
380 && !lookup_attribute ("flatten",
381 DECL_ATTRIBUTES (caller->decl))
382 && !caller_growth_limits (e))
383 inlinable = false;
384 /* Don't inline a function with a higher optimization level than the
385 caller. FIXME: this is really just tip of iceberg of handling
386 optimization attribute. */
387 else if (caller_tree != callee_tree)
389 bool always_inline =
390 (DECL_DISREGARD_INLINE_LIMITS (callee->decl)
391 && lookup_attribute ("always_inline",
392 DECL_ATTRIBUTES (callee->decl)));
393 inline_summary *caller_info = inline_summaries->get (caller);
394 inline_summary *callee_info = inline_summaries->get (callee);
396 /* Until GCC 4.9 we did not check the semantics alterning flags
397 bellow and inline across optimization boundry.
398 Enabling checks bellow breaks several packages by refusing
399 to inline library always_inline functions. See PR65873.
400 Disable the check for early inlining for now until better solution
401 is found. */
402 if (always_inline && early)
404 /* There are some options that change IL semantics which means
405 we cannot inline in these cases for correctness reason.
406 Not even for always_inline declared functions. */
407 else if (check_match (flag_wrapv)
408 || check_match (flag_trapv)
409 /* When caller or callee does FP math, be sure FP codegen flags
410 compatible. */
411 || ((caller_info->fp_expressions && callee_info->fp_expressions)
412 && (check_maybe_up (flag_rounding_math)
413 || check_maybe_up (flag_trapping_math)
414 || check_maybe_down (flag_unsafe_math_optimizations)
415 || check_maybe_down (flag_finite_math_only)
416 || check_maybe_up (flag_signaling_nans)
417 || check_maybe_down (flag_cx_limited_range)
418 || check_maybe_up (flag_signed_zeros)
419 || check_maybe_down (flag_associative_math)
420 || check_maybe_down (flag_reciprocal_math)
421 || check_maybe_down (flag_fp_int_builtin_inexact)
422 /* Strictly speaking only when the callee contains function
423 calls that may end up setting errno. */
424 || check_maybe_up (flag_errno_math)))
425 /* We do not want to make code compiled with exceptions to be
426 brought into a non-EH function unless we know that the callee
427 does not throw.
428 This is tracked by DECL_FUNCTION_PERSONALITY. */
429 || (check_maybe_up (flag_non_call_exceptions)
430 && DECL_FUNCTION_PERSONALITY (callee->decl))
431 || (check_maybe_up (flag_exceptions)
432 && DECL_FUNCTION_PERSONALITY (callee->decl))
433 /* When devirtualization is diabled for callee, it is not safe
434 to inline it as we possibly mangled the type info.
435 Allow early inlining of always inlines. */
436 || (!early && check_maybe_down (flag_devirtualize)))
438 e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
439 inlinable = false;
441 /* gcc.dg/pr43564.c. Apply user-forced inline even at -O0. */
442 else if (always_inline)
444 /* When user added an attribute to the callee honor it. */
445 else if (lookup_attribute ("optimize", DECL_ATTRIBUTES (callee->decl))
446 && opts_for_fn (caller->decl) != opts_for_fn (callee->decl))
448 e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
449 inlinable = false;
451 /* If explicit optimize attribute are not used, the mismatch is caused
452 by different command line options used to build different units.
453 Do not care about COMDAT functions - those are intended to be
454 optimized with the optimization flags of module they are used in.
455 Also do not care about mixing up size/speed optimization when
456 DECL_DISREGARD_INLINE_LIMITS is set. */
457 else if ((callee->merged_comdat
458 && !lookup_attribute ("optimize",
459 DECL_ATTRIBUTES (caller->decl)))
460 || DECL_DISREGARD_INLINE_LIMITS (callee->decl))
462 /* If mismatch is caused by merging two LTO units with different
463 optimizationflags we want to be bit nicer. However never inline
464 if one of functions is not optimized at all. */
465 else if (!opt_for_fn (callee->decl, optimize)
466 || !opt_for_fn (caller->decl, optimize))
468 e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
469 inlinable = false;
471 /* If callee is optimized for size and caller is not, allow inlining if
472 code shrinks or we are in MAX_INLINE_INSNS_SINGLE limit and callee
473 is inline (and thus likely an unified comdat). This will allow caller
474 to run faster. */
475 else if (opt_for_fn (callee->decl, optimize_size)
476 > opt_for_fn (caller->decl, optimize_size))
478 int growth = estimate_edge_growth (e);
479 if (growth > 0
480 && (!DECL_DECLARED_INLINE_P (callee->decl)
481 && growth >= MAX (MAX_INLINE_INSNS_SINGLE,
482 MAX_INLINE_INSNS_AUTO)))
484 e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
485 inlinable = false;
488 /* If callee is more aggressively optimized for performance than caller,
489 we generally want to inline only cheap (runtime wise) functions. */
490 else if (opt_for_fn (callee->decl, optimize_size)
491 < opt_for_fn (caller->decl, optimize_size)
492 || (opt_for_fn (callee->decl, optimize)
493 > opt_for_fn (caller->decl, optimize)))
495 if (estimate_edge_time (e)
496 >= 20 + ipa_call_summaries->get (e)->call_stmt_time)
498 e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
499 inlinable = false;
505 if (!inlinable && report)
506 report_inline_failed_reason (e);
507 return inlinable;
511 /* Return true if the edge E is inlinable during early inlining. */
513 static bool
514 can_early_inline_edge_p (struct cgraph_edge *e)
516 struct cgraph_node *callee = e->callee->ultimate_alias_target ();
517 /* Early inliner might get called at WPA stage when IPA pass adds new
518 function. In this case we can not really do any of early inlining
519 because function bodies are missing. */
520 if (cgraph_inline_failed_type (e->inline_failed) == CIF_FINAL_ERROR)
521 return false;
522 if (!gimple_has_body_p (callee->decl))
524 e->inline_failed = CIF_BODY_NOT_AVAILABLE;
525 return false;
527 /* In early inliner some of callees may not be in SSA form yet
528 (i.e. the callgraph is cyclic and we did not process
529 the callee by early inliner, yet). We don't have CIF code for this
530 case; later we will re-do the decision in the real inliner. */
531 if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->caller->decl))
532 || !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
534 if (dump_file)
535 fprintf (dump_file, " edge not inlinable: not in SSA form\n");
536 return false;
538 if (!can_inline_edge_p (e, true, false, true))
539 return false;
540 return true;
544 /* Return number of calls in N. Ignore cheap builtins. */
546 static int
547 num_calls (struct cgraph_node *n)
549 struct cgraph_edge *e;
550 int num = 0;
552 for (e = n->callees; e; e = e->next_callee)
553 if (!is_inexpensive_builtin (e->callee->decl))
554 num++;
555 return num;
559 /* Return true if we are interested in inlining small function. */
561 static bool
562 want_early_inline_function_p (struct cgraph_edge *e)
564 bool want_inline = true;
565 struct cgraph_node *callee = e->callee->ultimate_alias_target ();
567 if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
569 /* For AutoFDO, we need to make sure that before profile summary, all
570 hot paths' IR look exactly the same as profiled binary. As a result,
571 in einliner, we will disregard size limit and inline those callsites
572 that are:
573 * inlined in the profiled binary, and
574 * the cloned callee has enough samples to be considered "hot". */
575 else if (flag_auto_profile && afdo_callsite_hot_enough_for_early_inline (e))
577 else if (!DECL_DECLARED_INLINE_P (callee->decl)
578 && !opt_for_fn (e->caller->decl, flag_inline_small_functions))
580 e->inline_failed = CIF_FUNCTION_NOT_INLINE_CANDIDATE;
581 report_inline_failed_reason (e);
582 want_inline = false;
584 else
586 int growth = estimate_edge_growth (e);
587 int n;
589 if (growth <= 0)
591 else if (!e->maybe_hot_p ()
592 && growth > 0)
594 if (dump_file)
595 fprintf (dump_file, " will not early inline: %s/%i->%s/%i, "
596 "call is cold and code would grow by %i\n",
597 xstrdup_for_dump (e->caller->name ()),
598 e->caller->order,
599 xstrdup_for_dump (callee->name ()), callee->order,
600 growth);
601 want_inline = false;
603 else if (growth > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
605 if (dump_file)
606 fprintf (dump_file, " will not early inline: %s/%i->%s/%i, "
607 "growth %i exceeds --param early-inlining-insns\n",
608 xstrdup_for_dump (e->caller->name ()),
609 e->caller->order,
610 xstrdup_for_dump (callee->name ()), callee->order,
611 growth);
612 want_inline = false;
614 else if ((n = num_calls (callee)) != 0
615 && growth * (n + 1) > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
617 if (dump_file)
618 fprintf (dump_file, " will not early inline: %s/%i->%s/%i, "
619 "growth %i exceeds --param early-inlining-insns "
620 "divided by number of calls\n",
621 xstrdup_for_dump (e->caller->name ()),
622 e->caller->order,
623 xstrdup_for_dump (callee->name ()), callee->order,
624 growth);
625 want_inline = false;
628 return want_inline;
631 /* Compute time of the edge->caller + edge->callee execution when inlining
632 does not happen. */
634 inline sreal
635 compute_uninlined_call_time (struct cgraph_edge *edge,
636 sreal uninlined_call_time)
638 cgraph_node *caller = (edge->caller->global.inlined_to
639 ? edge->caller->global.inlined_to
640 : edge->caller);
642 if (edge->count && caller->count)
643 uninlined_call_time *= (sreal)edge->count / caller->count;
644 if (edge->frequency)
645 uninlined_call_time *= cgraph_freq_base_rec * edge->frequency;
646 else
647 uninlined_call_time = uninlined_call_time >> 11;
649 sreal caller_time = inline_summaries->get (caller)->time;
650 return uninlined_call_time + caller_time;
653 /* Same as compute_uinlined_call_time but compute time when inlining
654 does happen. */
656 inline sreal
657 compute_inlined_call_time (struct cgraph_edge *edge,
658 sreal time)
660 cgraph_node *caller = (edge->caller->global.inlined_to
661 ? edge->caller->global.inlined_to
662 : edge->caller);
663 sreal caller_time = inline_summaries->get (caller)->time;
665 if (edge->count && caller->count)
666 time *= (sreal)edge->count / caller->count;
667 if (edge->frequency)
668 time *= cgraph_freq_base_rec * edge->frequency;
669 else
670 time = time >> 11;
672 /* This calculation should match one in ipa-inline-analysis.c
673 (estimate_edge_size_and_time). */
674 time -= (sreal) edge->frequency
675 * ipa_call_summaries->get (edge)->call_stmt_time / CGRAPH_FREQ_BASE;
676 time += caller_time;
677 if (time <= 0)
678 time = ((sreal) 1) >> 8;
679 gcc_checking_assert (time >= 0);
680 return time;
683 /* Return true if the speedup for inlining E is bigger than
684 PARAM_MAX_INLINE_MIN_SPEEDUP. */
686 static bool
687 big_speedup_p (struct cgraph_edge *e)
689 sreal unspec_time;
690 sreal spec_time = estimate_edge_time (e, &unspec_time);
691 sreal time = compute_uninlined_call_time (e, unspec_time);
692 sreal inlined_time = compute_inlined_call_time (e, spec_time);
694 if (time - inlined_time
695 > (sreal) (time * PARAM_VALUE (PARAM_INLINE_MIN_SPEEDUP))
696 * percent_rec)
697 return true;
698 return false;
701 /* Return true if we are interested in inlining small function.
702 When REPORT is true, report reason to dump file. */
704 static bool
705 want_inline_small_function_p (struct cgraph_edge *e, bool report)
707 bool want_inline = true;
708 struct cgraph_node *callee = e->callee->ultimate_alias_target ();
710 if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
712 else if (!DECL_DECLARED_INLINE_P (callee->decl)
713 && !opt_for_fn (e->caller->decl, flag_inline_small_functions))
715 e->inline_failed = CIF_FUNCTION_NOT_INLINE_CANDIDATE;
716 want_inline = false;
718 /* Do fast and conservative check if the function can be good
719 inline candidate. At the moment we allow inline hints to
720 promote non-inline functions to inline and we increase
721 MAX_INLINE_INSNS_SINGLE 16-fold for inline functions. */
722 else if ((!DECL_DECLARED_INLINE_P (callee->decl)
723 && (!e->count || !e->maybe_hot_p ()))
724 && inline_summaries->get (callee)->min_size
725 - ipa_call_summaries->get (e)->call_stmt_size
726 > (unsigned)MAX (MAX_INLINE_INSNS_SINGLE, MAX_INLINE_INSNS_AUTO))
728 e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
729 want_inline = false;
731 else if ((DECL_DECLARED_INLINE_P (callee->decl) || e->count)
732 && inline_summaries->get (callee)->min_size
733 - ipa_call_summaries->get (e)->call_stmt_size
734 > (unsigned)16 * MAX_INLINE_INSNS_SINGLE)
736 e->inline_failed = (DECL_DECLARED_INLINE_P (callee->decl)
737 ? CIF_MAX_INLINE_INSNS_SINGLE_LIMIT
738 : CIF_MAX_INLINE_INSNS_AUTO_LIMIT);
739 want_inline = false;
741 else
743 int growth = estimate_edge_growth (e);
744 inline_hints hints = estimate_edge_hints (e);
745 bool big_speedup = big_speedup_p (e);
747 if (growth <= 0)
749 /* Apply MAX_INLINE_INSNS_SINGLE limit. Do not do so when
750 hints suggests that inlining given function is very profitable. */
751 else if (DECL_DECLARED_INLINE_P (callee->decl)
752 && growth >= MAX_INLINE_INSNS_SINGLE
753 && ((!big_speedup
754 && !(hints & (INLINE_HINT_indirect_call
755 | INLINE_HINT_known_hot
756 | INLINE_HINT_loop_iterations
757 | INLINE_HINT_array_index
758 | INLINE_HINT_loop_stride)))
759 || growth >= MAX_INLINE_INSNS_SINGLE * 16))
761 e->inline_failed = CIF_MAX_INLINE_INSNS_SINGLE_LIMIT;
762 want_inline = false;
764 else if (!DECL_DECLARED_INLINE_P (callee->decl)
765 && !opt_for_fn (e->caller->decl, flag_inline_functions))
767 /* growth_likely_positive is expensive, always test it last. */
768 if (growth >= MAX_INLINE_INSNS_SINGLE
769 || growth_likely_positive (callee, growth))
771 e->inline_failed = CIF_NOT_DECLARED_INLINED;
772 want_inline = false;
775 /* Apply MAX_INLINE_INSNS_AUTO limit for functions not declared inline
776 Upgrade it to MAX_INLINE_INSNS_SINGLE when hints suggests that
777 inlining given function is very profitable. */
778 else if (!DECL_DECLARED_INLINE_P (callee->decl)
779 && !big_speedup
780 && !(hints & INLINE_HINT_known_hot)
781 && growth >= ((hints & (INLINE_HINT_indirect_call
782 | INLINE_HINT_loop_iterations
783 | INLINE_HINT_array_index
784 | INLINE_HINT_loop_stride))
785 ? MAX (MAX_INLINE_INSNS_AUTO,
786 MAX_INLINE_INSNS_SINGLE)
787 : MAX_INLINE_INSNS_AUTO))
789 /* growth_likely_positive is expensive, always test it last. */
790 if (growth >= MAX_INLINE_INSNS_SINGLE
791 || growth_likely_positive (callee, growth))
793 e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
794 want_inline = false;
797 /* If call is cold, do not inline when function body would grow. */
798 else if (!e->maybe_hot_p ()
799 && (growth >= MAX_INLINE_INSNS_SINGLE
800 || growth_likely_positive (callee, growth)))
802 e->inline_failed = CIF_UNLIKELY_CALL;
803 want_inline = false;
806 if (!want_inline && report)
807 report_inline_failed_reason (e);
808 return want_inline;
811 /* EDGE is self recursive edge.
812 We hand two cases - when function A is inlining into itself
813 or when function A is being inlined into another inliner copy of function
814 A within function B.
816 In first case OUTER_NODE points to the toplevel copy of A, while
817 in the second case OUTER_NODE points to the outermost copy of A in B.
819 In both cases we want to be extra selective since
820 inlining the call will just introduce new recursive calls to appear. */
822 static bool
823 want_inline_self_recursive_call_p (struct cgraph_edge *edge,
824 struct cgraph_node *outer_node,
825 bool peeling,
826 int depth)
828 char const *reason = NULL;
829 bool want_inline = true;
830 int caller_freq = CGRAPH_FREQ_BASE;
831 int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO);
833 if (DECL_DECLARED_INLINE_P (edge->caller->decl))
834 max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH);
836 if (!edge->maybe_hot_p ())
838 reason = "recursive call is cold";
839 want_inline = false;
841 else if (max_count && !outer_node->count)
843 reason = "not executed in profile";
844 want_inline = false;
846 else if (depth > max_depth)
848 reason = "--param max-inline-recursive-depth exceeded.";
849 want_inline = false;
852 if (outer_node->global.inlined_to)
853 caller_freq = outer_node->callers->frequency;
855 if (!caller_freq)
857 reason = "function is inlined and unlikely";
858 want_inline = false;
861 if (!want_inline)
863 /* Inlining of self recursive function into copy of itself within other function
864 is transformation similar to loop peeling.
866 Peeling is profitable if we can inline enough copies to make probability
867 of actual call to the self recursive function very small. Be sure that
868 the probability of recursion is small.
870 We ensure that the frequency of recursing is at most 1 - (1/max_depth).
871 This way the expected number of recision is at most max_depth. */
872 else if (peeling)
874 int max_prob = CGRAPH_FREQ_BASE - ((CGRAPH_FREQ_BASE + max_depth - 1)
875 / max_depth);
876 int i;
877 for (i = 1; i < depth; i++)
878 max_prob = max_prob * max_prob / CGRAPH_FREQ_BASE;
879 if (max_count
880 && (edge->count * CGRAPH_FREQ_BASE / outer_node->count
881 >= max_prob))
883 reason = "profile of recursive call is too large";
884 want_inline = false;
886 if (!max_count
887 && (edge->frequency * CGRAPH_FREQ_BASE / caller_freq
888 >= max_prob))
890 reason = "frequency of recursive call is too large";
891 want_inline = false;
894 /* Recursive inlining, i.e. equivalent of unrolling, is profitable if recursion
895 depth is large. We reduce function call overhead and increase chances that
896 things fit in hardware return predictor.
898 Recursive inlining might however increase cost of stack frame setup
899 actually slowing down functions whose recursion tree is wide rather than
900 deep.
902 Deciding reliably on when to do recursive inlining without profile feedback
903 is tricky. For now we disable recursive inlining when probability of self
904 recursion is low.
906 Recursive inlining of self recursive call within loop also results in large loop
907 depths that generally optimize badly. We may want to throttle down inlining
908 in those cases. In particular this seems to happen in one of libstdc++ rb tree
909 methods. */
910 else
912 if (max_count
913 && (edge->count * 100 / outer_node->count
914 <= PARAM_VALUE (PARAM_MIN_INLINE_RECURSIVE_PROBABILITY)))
916 reason = "profile of recursive call is too small";
917 want_inline = false;
919 else if (!max_count
920 && (edge->frequency * 100 / caller_freq
921 <= PARAM_VALUE (PARAM_MIN_INLINE_RECURSIVE_PROBABILITY)))
923 reason = "frequency of recursive call is too small";
924 want_inline = false;
927 if (!want_inline && dump_file)
928 fprintf (dump_file, " not inlining recursively: %s\n", reason);
929 return want_inline;
932 /* Return true when NODE has uninlinable caller;
933 set HAS_HOT_CALL if it has hot call.
934 Worker for cgraph_for_node_and_aliases. */
936 static bool
937 check_callers (struct cgraph_node *node, void *has_hot_call)
939 struct cgraph_edge *e;
940 for (e = node->callers; e; e = e->next_caller)
942 if (!opt_for_fn (e->caller->decl, flag_inline_functions_called_once))
943 return true;
944 if (!can_inline_edge_p (e, true))
945 return true;
946 if (e->recursive_p ())
947 return true;
948 if (!(*(bool *)has_hot_call) && e->maybe_hot_p ())
949 *(bool *)has_hot_call = true;
951 return false;
954 /* If NODE has a caller, return true. */
956 static bool
957 has_caller_p (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
959 if (node->callers)
960 return true;
961 return false;
964 /* Decide if inlining NODE would reduce unit size by eliminating
965 the offline copy of function.
966 When COLD is true the cold calls are considered, too. */
968 static bool
969 want_inline_function_to_all_callers_p (struct cgraph_node *node, bool cold)
971 bool has_hot_call = false;
973 /* Aliases gets inlined along with the function they alias. */
974 if (node->alias)
975 return false;
976 /* Already inlined? */
977 if (node->global.inlined_to)
978 return false;
979 /* Does it have callers? */
980 if (!node->call_for_symbol_and_aliases (has_caller_p, NULL, true))
981 return false;
982 /* Inlining into all callers would increase size? */
983 if (estimate_growth (node) > 0)
984 return false;
985 /* All inlines must be possible. */
986 if (node->call_for_symbol_and_aliases (check_callers, &has_hot_call,
987 true))
988 return false;
989 if (!cold && !has_hot_call)
990 return false;
991 return true;
994 /* A cost model driving the inlining heuristics in a way so the edges with
995 smallest badness are inlined first. After each inlining is performed
996 the costs of all caller edges of nodes affected are recomputed so the
997 metrics may accurately depend on values such as number of inlinable callers
998 of the function or function body size. */
1000 static sreal
1001 edge_badness (struct cgraph_edge *edge, bool dump)
1003 sreal badness;
1004 int growth;
1005 sreal edge_time, unspec_edge_time;
1006 struct cgraph_node *callee = edge->callee->ultimate_alias_target ();
1007 struct inline_summary *callee_info = inline_summaries->get (callee);
1008 inline_hints hints;
1009 cgraph_node *caller = (edge->caller->global.inlined_to
1010 ? edge->caller->global.inlined_to
1011 : edge->caller);
1013 growth = estimate_edge_growth (edge);
1014 edge_time = estimate_edge_time (edge, &unspec_edge_time);
1015 hints = estimate_edge_hints (edge);
1016 gcc_checking_assert (edge_time >= 0);
1017 /* Check that inlined time is better, but tolerate some roundoff issues. */
1018 gcc_checking_assert ((edge_time - callee_info->time).to_int () <= 0);
1019 gcc_checking_assert (growth <= callee_info->size);
1021 if (dump)
1023 fprintf (dump_file, " Badness calculation for %s/%i -> %s/%i\n",
1024 xstrdup_for_dump (edge->caller->name ()),
1025 edge->caller->order,
1026 xstrdup_for_dump (callee->name ()),
1027 edge->callee->order);
1028 fprintf (dump_file, " size growth %i, time %f unspec %f ",
1029 growth,
1030 edge_time.to_double (),
1031 unspec_edge_time.to_double ());
1032 dump_inline_hints (dump_file, hints);
1033 if (big_speedup_p (edge))
1034 fprintf (dump_file, " big_speedup");
1035 fprintf (dump_file, "\n");
1038 /* Always prefer inlining saving code size. */
1039 if (growth <= 0)
1041 badness = (sreal) (-SREAL_MIN_SIG + growth) << (SREAL_MAX_EXP / 256);
1042 if (dump)
1043 fprintf (dump_file, " %f: Growth %d <= 0\n", badness.to_double (),
1044 growth);
1046 /* Inlining into EXTERNAL functions is not going to change anything unless
1047 they are themselves inlined. */
1048 else if (DECL_EXTERNAL (caller->decl))
1050 if (dump)
1051 fprintf (dump_file, " max: function is external\n");
1052 return sreal::max ();
1054 /* When profile is available. Compute badness as:
1056 time_saved * caller_count
1057 goodness = -------------------------------------------------
1058 growth_of_caller * overall_growth * combined_size
1060 badness = - goodness
1062 Again use negative value to make calls with profile appear hotter
1063 then calls without.
1065 else if (opt_for_fn (caller->decl, flag_guess_branch_prob) || caller->count)
1067 sreal numerator, denominator;
1068 int overall_growth;
1070 numerator = (compute_uninlined_call_time (edge, unspec_edge_time)
1071 - compute_inlined_call_time (edge, edge_time));
1072 if (numerator == 0)
1073 numerator = ((sreal) 1 >> 8);
1074 if (caller->count)
1075 numerator *= caller->count;
1076 else if (opt_for_fn (caller->decl, flag_branch_probabilities))
1077 numerator = numerator >> 11;
1078 denominator = growth;
1080 overall_growth = callee_info->growth;
1082 /* Look for inliner wrappers of the form:
1084 inline_caller ()
1086 do_fast_job...
1087 if (need_more_work)
1088 noninline_callee ();
1090 Withhout panilizing this case, we usually inline noninline_callee
1091 into the inline_caller because overall_growth is small preventing
1092 further inlining of inline_caller.
1094 Penalize only callgraph edges to functions with small overall
1095 growth ...
1097 if (growth > overall_growth
1098 /* ... and having only one caller which is not inlined ... */
1099 && callee_info->single_caller
1100 && !edge->caller->global.inlined_to
1101 /* ... and edges executed only conditionally ... */
1102 && edge->frequency < CGRAPH_FREQ_BASE
1103 /* ... consider case where callee is not inline but caller is ... */
1104 && ((!DECL_DECLARED_INLINE_P (edge->callee->decl)
1105 && DECL_DECLARED_INLINE_P (caller->decl))
1106 /* ... or when early optimizers decided to split and edge
1107 frequency still indicates splitting is a win ... */
1108 || (callee->split_part && !caller->split_part
1109 && edge->frequency
1110 < CGRAPH_FREQ_BASE
1111 * PARAM_VALUE
1112 (PARAM_PARTIAL_INLINING_ENTRY_PROBABILITY) / 100
1113 /* ... and do not overwrite user specified hints. */
1114 && (!DECL_DECLARED_INLINE_P (edge->callee->decl)
1115 || DECL_DECLARED_INLINE_P (caller->decl)))))
1117 struct inline_summary *caller_info = inline_summaries->get (caller);
1118 int caller_growth = caller_info->growth;
1120 /* Only apply the penalty when caller looks like inline candidate,
1121 and it is not called once and. */
1122 if (!caller_info->single_caller && overall_growth < caller_growth
1123 && caller_info->inlinable
1124 && caller_info->size
1125 < (DECL_DECLARED_INLINE_P (caller->decl)
1126 ? MAX_INLINE_INSNS_SINGLE : MAX_INLINE_INSNS_AUTO))
1128 if (dump)
1129 fprintf (dump_file,
1130 " Wrapper penalty. Increasing growth %i to %i\n",
1131 overall_growth, caller_growth);
1132 overall_growth = caller_growth;
1135 if (overall_growth > 0)
1137 /* Strongly preffer functions with few callers that can be inlined
1138 fully. The square root here leads to smaller binaries at average.
1139 Watch however for extreme cases and return to linear function
1140 when growth is large. */
1141 if (overall_growth < 256)
1142 overall_growth *= overall_growth;
1143 else
1144 overall_growth += 256 * 256 - 256;
1145 denominator *= overall_growth;
1147 denominator *= inline_summaries->get (caller)->self_size + growth;
1149 badness = - numerator / denominator;
1151 if (dump)
1153 fprintf (dump_file,
1154 " %f: guessed profile. frequency %f, count %" PRId64
1155 " caller count %" PRId64
1156 " time w/o inlining %f, time with inlining %f"
1157 " overall growth %i (current) %i (original)"
1158 " %i (compensated)\n",
1159 badness.to_double (),
1160 (double)edge->frequency / CGRAPH_FREQ_BASE,
1161 edge->count, caller->count,
1162 compute_uninlined_call_time (edge,
1163 unspec_edge_time).to_double (),
1164 compute_inlined_call_time (edge, edge_time).to_double (),
1165 estimate_growth (callee),
1166 callee_info->growth, overall_growth);
1169 /* When function local profile is not available or it does not give
1170 useful information (ie frequency is zero), base the cost on
1171 loop nest and overall size growth, so we optimize for overall number
1172 of functions fully inlined in program. */
1173 else
1175 int nest = MIN (ipa_call_summaries->get (edge)->loop_depth, 8);
1176 badness = growth;
1178 /* Decrease badness if call is nested. */
1179 if (badness > 0)
1180 badness = badness >> nest;
1181 else
1182 badness = badness << nest;
1183 if (dump)
1184 fprintf (dump_file, " %f: no profile. nest %i\n",
1185 badness.to_double (), nest);
1187 gcc_checking_assert (badness != 0);
1189 if (edge->recursive_p ())
1190 badness = badness.shift (badness > 0 ? 4 : -4);
1191 if ((hints & (INLINE_HINT_indirect_call
1192 | INLINE_HINT_loop_iterations
1193 | INLINE_HINT_array_index
1194 | INLINE_HINT_loop_stride))
1195 || callee_info->growth <= 0)
1196 badness = badness.shift (badness > 0 ? -2 : 2);
1197 if (hints & (INLINE_HINT_same_scc))
1198 badness = badness.shift (badness > 0 ? 3 : -3);
1199 else if (hints & (INLINE_HINT_in_scc))
1200 badness = badness.shift (badness > 0 ? 2 : -2);
1201 else if (hints & (INLINE_HINT_cross_module))
1202 badness = badness.shift (badness > 0 ? 1 : -1);
1203 if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
1204 badness = badness.shift (badness > 0 ? -4 : 4);
1205 else if ((hints & INLINE_HINT_declared_inline))
1206 badness = badness.shift (badness > 0 ? -3 : 3);
1207 if (dump)
1208 fprintf (dump_file, " Adjusted by hints %f\n", badness.to_double ());
1209 return badness;
1212 /* Recompute badness of EDGE and update its key in HEAP if needed. */
1213 static inline void
1214 update_edge_key (edge_heap_t *heap, struct cgraph_edge *edge)
1216 sreal badness = edge_badness (edge, false);
1217 if (edge->aux)
1219 edge_heap_node_t *n = (edge_heap_node_t *) edge->aux;
1220 gcc_checking_assert (n->get_data () == edge);
1222 /* fibonacci_heap::replace_key does busy updating of the
1223 heap that is unnecesarily expensive.
1224 We do lazy increases: after extracting minimum if the key
1225 turns out to be out of date, it is re-inserted into heap
1226 with correct value. */
1227 if (badness < n->get_key ())
1229 if (dump_file && (dump_flags & TDF_DETAILS))
1231 fprintf (dump_file,
1232 " decreasing badness %s/%i -> %s/%i, %f"
1233 " to %f\n",
1234 xstrdup_for_dump (edge->caller->name ()),
1235 edge->caller->order,
1236 xstrdup_for_dump (edge->callee->name ()),
1237 edge->callee->order,
1238 n->get_key ().to_double (),
1239 badness.to_double ());
1241 heap->decrease_key (n, badness);
1244 else
1246 if (dump_file && (dump_flags & TDF_DETAILS))
1248 fprintf (dump_file,
1249 " enqueuing call %s/%i -> %s/%i, badness %f\n",
1250 xstrdup_for_dump (edge->caller->name ()),
1251 edge->caller->order,
1252 xstrdup_for_dump (edge->callee->name ()),
1253 edge->callee->order,
1254 badness.to_double ());
1256 edge->aux = heap->insert (badness, edge);
1261 /* NODE was inlined.
1262 All caller edges needs to be resetted because
1263 size estimates change. Similarly callees needs reset
1264 because better context may be known. */
1266 static void
1267 reset_edge_caches (struct cgraph_node *node)
1269 struct cgraph_edge *edge;
1270 struct cgraph_edge *e = node->callees;
1271 struct cgraph_node *where = node;
1272 struct ipa_ref *ref;
1274 if (where->global.inlined_to)
1275 where = where->global.inlined_to;
1277 for (edge = where->callers; edge; edge = edge->next_caller)
1278 if (edge->inline_failed)
1279 reset_edge_growth_cache (edge);
1281 FOR_EACH_ALIAS (where, ref)
1282 reset_edge_caches (dyn_cast <cgraph_node *> (ref->referring));
1284 if (!e)
1285 return;
1287 while (true)
1288 if (!e->inline_failed && e->callee->callees)
1289 e = e->callee->callees;
1290 else
1292 if (e->inline_failed)
1293 reset_edge_growth_cache (e);
1294 if (e->next_callee)
1295 e = e->next_callee;
1296 else
1300 if (e->caller == node)
1301 return;
1302 e = e->caller->callers;
1304 while (!e->next_callee);
1305 e = e->next_callee;
1310 /* Recompute HEAP nodes for each of caller of NODE.
1311 UPDATED_NODES track nodes we already visited, to avoid redundant work.
1312 When CHECK_INLINABLITY_FOR is set, re-check for specified edge that
1313 it is inlinable. Otherwise check all edges. */
1315 static void
1316 update_caller_keys (edge_heap_t *heap, struct cgraph_node *node,
1317 bitmap updated_nodes,
1318 struct cgraph_edge *check_inlinablity_for)
1320 struct cgraph_edge *edge;
1321 struct ipa_ref *ref;
1323 if ((!node->alias && !inline_summaries->get (node)->inlinable)
1324 || node->global.inlined_to)
1325 return;
1326 if (!bitmap_set_bit (updated_nodes, node->uid))
1327 return;
1329 FOR_EACH_ALIAS (node, ref)
1331 struct cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
1332 update_caller_keys (heap, alias, updated_nodes, check_inlinablity_for);
1335 for (edge = node->callers; edge; edge = edge->next_caller)
1336 if (edge->inline_failed)
1338 if (!check_inlinablity_for
1339 || check_inlinablity_for == edge)
1341 if (can_inline_edge_p (edge, false)
1342 && want_inline_small_function_p (edge, false))
1343 update_edge_key (heap, edge);
1344 else if (edge->aux)
1346 report_inline_failed_reason (edge);
1347 heap->delete_node ((edge_heap_node_t *) edge->aux);
1348 edge->aux = NULL;
1351 else if (edge->aux)
1352 update_edge_key (heap, edge);
1356 /* Recompute HEAP nodes for each uninlined call in NODE.
1357 This is used when we know that edge badnesses are going only to increase
1358 (we introduced new call site) and thus all we need is to insert newly
1359 created edges into heap. */
1361 static void
1362 update_callee_keys (edge_heap_t *heap, struct cgraph_node *node,
1363 bitmap updated_nodes)
1365 struct cgraph_edge *e = node->callees;
1367 if (!e)
1368 return;
1369 while (true)
1370 if (!e->inline_failed && e->callee->callees)
1371 e = e->callee->callees;
1372 else
1374 enum availability avail;
1375 struct cgraph_node *callee;
1376 /* We do not reset callee growth cache here. Since we added a new call,
1377 growth chould have just increased and consequentely badness metric
1378 don't need updating. */
1379 if (e->inline_failed
1380 && (callee = e->callee->ultimate_alias_target (&avail, e->caller))
1381 && inline_summaries->get (callee)->inlinable
1382 && avail >= AVAIL_AVAILABLE
1383 && !bitmap_bit_p (updated_nodes, callee->uid))
1385 if (can_inline_edge_p (e, false)
1386 && want_inline_small_function_p (e, false))
1387 update_edge_key (heap, e);
1388 else if (e->aux)
1390 report_inline_failed_reason (e);
1391 heap->delete_node ((edge_heap_node_t *) e->aux);
1392 e->aux = NULL;
1395 if (e->next_callee)
1396 e = e->next_callee;
1397 else
1401 if (e->caller == node)
1402 return;
1403 e = e->caller->callers;
1405 while (!e->next_callee);
1406 e = e->next_callee;
1411 /* Enqueue all recursive calls from NODE into priority queue depending on
1412 how likely we want to recursively inline the call. */
1414 static void
1415 lookup_recursive_calls (struct cgraph_node *node, struct cgraph_node *where,
1416 edge_heap_t *heap)
1418 struct cgraph_edge *e;
1419 enum availability avail;
1421 for (e = where->callees; e; e = e->next_callee)
1422 if (e->callee == node
1423 || (e->callee->ultimate_alias_target (&avail, e->caller) == node
1424 && avail > AVAIL_INTERPOSABLE))
1426 /* When profile feedback is available, prioritize by expected number
1427 of calls. */
1428 heap->insert (!max_count ? -e->frequency
1429 : -(e->count / ((max_count + (1<<24) - 1) / (1<<24))),
1432 for (e = where->callees; e; e = e->next_callee)
1433 if (!e->inline_failed)
1434 lookup_recursive_calls (node, e->callee, heap);
1437 /* Decide on recursive inlining: in the case function has recursive calls,
1438 inline until body size reaches given argument. If any new indirect edges
1439 are discovered in the process, add them to *NEW_EDGES, unless NEW_EDGES
1440 is NULL. */
1442 static bool
1443 recursive_inlining (struct cgraph_edge *edge,
1444 vec<cgraph_edge *> *new_edges)
1446 int limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO);
1447 edge_heap_t heap (sreal::min ());
1448 struct cgraph_node *node;
1449 struct cgraph_edge *e;
1450 struct cgraph_node *master_clone = NULL, *next;
1451 int depth = 0;
1452 int n = 0;
1454 node = edge->caller;
1455 if (node->global.inlined_to)
1456 node = node->global.inlined_to;
1458 if (DECL_DECLARED_INLINE_P (node->decl))
1459 limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE);
1461 /* Make sure that function is small enough to be considered for inlining. */
1462 if (estimate_size_after_inlining (node, edge) >= limit)
1463 return false;
1464 lookup_recursive_calls (node, node, &heap);
1465 if (heap.empty ())
1466 return false;
1468 if (dump_file)
1469 fprintf (dump_file,
1470 " Performing recursive inlining on %s\n",
1471 node->name ());
1473 /* Do the inlining and update list of recursive call during process. */
1474 while (!heap.empty ())
1476 struct cgraph_edge *curr = heap.extract_min ();
1477 struct cgraph_node *cnode, *dest = curr->callee;
1479 if (!can_inline_edge_p (curr, true))
1480 continue;
1482 /* MASTER_CLONE is produced in the case we already started modified
1483 the function. Be sure to redirect edge to the original body before
1484 estimating growths otherwise we will be seeing growths after inlining
1485 the already modified body. */
1486 if (master_clone)
1488 curr->redirect_callee (master_clone);
1489 reset_edge_growth_cache (curr);
1492 if (estimate_size_after_inlining (node, curr) > limit)
1494 curr->redirect_callee (dest);
1495 reset_edge_growth_cache (curr);
1496 break;
1499 depth = 1;
1500 for (cnode = curr->caller;
1501 cnode->global.inlined_to; cnode = cnode->callers->caller)
1502 if (node->decl
1503 == curr->callee->ultimate_alias_target ()->decl)
1504 depth++;
1506 if (!want_inline_self_recursive_call_p (curr, node, false, depth))
1508 curr->redirect_callee (dest);
1509 reset_edge_growth_cache (curr);
1510 continue;
1513 if (dump_file)
1515 fprintf (dump_file,
1516 " Inlining call of depth %i", depth);
1517 if (node->count)
1519 fprintf (dump_file, " called approx. %.2f times per call",
1520 (double)curr->count / node->count);
1522 fprintf (dump_file, "\n");
1524 if (!master_clone)
1526 /* We need original clone to copy around. */
1527 master_clone = node->create_clone (node->decl, node->count,
1528 CGRAPH_FREQ_BASE, false, vNULL,
1529 true, NULL, NULL);
1530 for (e = master_clone->callees; e; e = e->next_callee)
1531 if (!e->inline_failed)
1532 clone_inlined_nodes (e, true, false, NULL, CGRAPH_FREQ_BASE);
1533 curr->redirect_callee (master_clone);
1534 reset_edge_growth_cache (curr);
1537 inline_call (curr, false, new_edges, &overall_size, true);
1538 lookup_recursive_calls (node, curr->callee, &heap);
1539 n++;
1542 if (!heap.empty () && dump_file)
1543 fprintf (dump_file, " Recursive inlining growth limit met.\n");
1545 if (!master_clone)
1546 return false;
1548 if (dump_file)
1549 fprintf (dump_file,
1550 "\n Inlined %i times, "
1551 "body grown from size %i to %i, time %f to %f\n", n,
1552 inline_summaries->get (master_clone)->size,
1553 inline_summaries->get (node)->size,
1554 inline_summaries->get (master_clone)->time.to_double (),
1555 inline_summaries->get (node)->time.to_double ());
1557 /* Remove master clone we used for inlining. We rely that clones inlined
1558 into master clone gets queued just before master clone so we don't
1559 need recursion. */
1560 for (node = symtab->first_function (); node != master_clone;
1561 node = next)
1563 next = symtab->next_function (node);
1564 if (node->global.inlined_to == master_clone)
1565 node->remove ();
1567 master_clone->remove ();
1568 return true;
1572 /* Given whole compilation unit estimate of INSNS, compute how large we can
1573 allow the unit to grow. */
1575 static int
1576 compute_max_insns (int insns)
1578 int max_insns = insns;
1579 if (max_insns < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS))
1580 max_insns = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS);
1582 return ((int64_t) max_insns
1583 * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100);
1587 /* Compute badness of all edges in NEW_EDGES and add them to the HEAP. */
1589 static void
1590 add_new_edges_to_heap (edge_heap_t *heap, vec<cgraph_edge *> new_edges)
1592 while (new_edges.length () > 0)
1594 struct cgraph_edge *edge = new_edges.pop ();
1596 gcc_assert (!edge->aux);
1597 if (edge->inline_failed
1598 && can_inline_edge_p (edge, true)
1599 && want_inline_small_function_p (edge, true))
1600 edge->aux = heap->insert (edge_badness (edge, false), edge);
1604 /* Remove EDGE from the fibheap. */
1606 static void
1607 heap_edge_removal_hook (struct cgraph_edge *e, void *data)
1609 if (e->aux)
1611 ((edge_heap_t *)data)->delete_node ((edge_heap_node_t *)e->aux);
1612 e->aux = NULL;
1616 /* Return true if speculation of edge E seems useful.
1617 If ANTICIPATE_INLINING is true, be conservative and hope that E
1618 may get inlined. */
1620 bool
1621 speculation_useful_p (struct cgraph_edge *e, bool anticipate_inlining)
1623 enum availability avail;
1624 struct cgraph_node *target = e->callee->ultimate_alias_target (&avail,
1625 e->caller);
1626 struct cgraph_edge *direct, *indirect;
1627 struct ipa_ref *ref;
1629 gcc_assert (e->speculative && !e->indirect_unknown_callee);
1631 if (!e->maybe_hot_p ())
1632 return false;
1634 /* See if IP optimizations found something potentially useful about the
1635 function. For now we look only for CONST/PURE flags. Almost everything
1636 else we propagate is useless. */
1637 if (avail >= AVAIL_AVAILABLE)
1639 int ecf_flags = flags_from_decl_or_type (target->decl);
1640 if (ecf_flags & ECF_CONST)
1642 e->speculative_call_info (direct, indirect, ref);
1643 if (!(indirect->indirect_info->ecf_flags & ECF_CONST))
1644 return true;
1646 else if (ecf_flags & ECF_PURE)
1648 e->speculative_call_info (direct, indirect, ref);
1649 if (!(indirect->indirect_info->ecf_flags & ECF_PURE))
1650 return true;
1653 /* If we did not managed to inline the function nor redirect
1654 to an ipa-cp clone (that are seen by having local flag set),
1655 it is probably pointless to inline it unless hardware is missing
1656 indirect call predictor. */
1657 if (!anticipate_inlining && e->inline_failed && !target->local.local)
1658 return false;
1659 /* For overwritable targets there is not much to do. */
1660 if (e->inline_failed && !can_inline_edge_p (e, false, true))
1661 return false;
1662 /* OK, speculation seems interesting. */
1663 return true;
1666 /* We know that EDGE is not going to be inlined.
1667 See if we can remove speculation. */
1669 static void
1670 resolve_noninline_speculation (edge_heap_t *edge_heap, struct cgraph_edge *edge)
1672 if (edge->speculative && !speculation_useful_p (edge, false))
1674 struct cgraph_node *node = edge->caller;
1675 struct cgraph_node *where = node->global.inlined_to
1676 ? node->global.inlined_to : node;
1677 auto_bitmap updated_nodes;
1679 spec_rem += edge->count;
1680 edge->resolve_speculation ();
1681 reset_edge_caches (where);
1682 inline_update_overall_summary (where);
1683 update_caller_keys (edge_heap, where,
1684 updated_nodes, NULL);
1685 update_callee_keys (edge_heap, where,
1686 updated_nodes);
1690 /* Return true if NODE should be accounted for overall size estimate.
1691 Skip all nodes optimized for size so we can measure the growth of hot
1692 part of program no matter of the padding. */
1694 bool
1695 inline_account_function_p (struct cgraph_node *node)
1697 return (!DECL_EXTERNAL (node->decl)
1698 && !opt_for_fn (node->decl, optimize_size)
1699 && node->frequency != NODE_FREQUENCY_UNLIKELY_EXECUTED);
1702 /* Count number of callers of NODE and store it into DATA (that
1703 points to int. Worker for cgraph_for_node_and_aliases. */
1705 static bool
1706 sum_callers (struct cgraph_node *node, void *data)
1708 struct cgraph_edge *e;
1709 int *num_calls = (int *)data;
1711 for (e = node->callers; e; e = e->next_caller)
1712 (*num_calls)++;
1713 return false;
1716 /* We use greedy algorithm for inlining of small functions:
1717 All inline candidates are put into prioritized heap ordered in
1718 increasing badness.
1720 The inlining of small functions is bounded by unit growth parameters. */
1722 static void
1723 inline_small_functions (void)
1725 struct cgraph_node *node;
1726 struct cgraph_edge *edge;
1727 edge_heap_t edge_heap (sreal::min ());
1728 auto_bitmap updated_nodes;
1729 int min_size, max_size;
1730 auto_vec<cgraph_edge *> new_indirect_edges;
1731 int initial_size = 0;
1732 struct cgraph_node **order = XCNEWVEC (cgraph_node *, symtab->cgraph_count);
1733 struct cgraph_edge_hook_list *edge_removal_hook_holder;
1734 new_indirect_edges.create (8);
1736 edge_removal_hook_holder
1737 = symtab->add_edge_removal_hook (&heap_edge_removal_hook, &edge_heap);
1739 /* Compute overall unit size and other global parameters used by badness
1740 metrics. */
1742 max_count = 0;
1743 ipa_reduced_postorder (order, true, true, NULL);
1744 free (order);
1746 FOR_EACH_DEFINED_FUNCTION (node)
1747 if (!node->global.inlined_to)
1749 if (!node->alias && node->analyzed
1750 && (node->has_gimple_body_p () || node->thunk.thunk_p))
1752 struct inline_summary *info = inline_summaries->get (node);
1753 struct ipa_dfs_info *dfs = (struct ipa_dfs_info *) node->aux;
1755 /* Do not account external functions, they will be optimized out
1756 if not inlined. Also only count the non-cold portion of program. */
1757 if (inline_account_function_p (node))
1758 initial_size += info->size;
1759 info->growth = estimate_growth (node);
1761 int num_calls = 0;
1762 node->call_for_symbol_and_aliases (sum_callers, &num_calls,
1763 true);
1764 if (num_calls == 1)
1765 info->single_caller = true;
1766 if (dfs && dfs->next_cycle)
1768 struct cgraph_node *n2;
1769 int id = dfs->scc_no + 1;
1770 for (n2 = node; n2;
1771 n2 = ((struct ipa_dfs_info *) node->aux)->next_cycle)
1773 struct inline_summary *info2 = inline_summaries->get (n2);
1774 if (info2->scc_no)
1775 break;
1776 info2->scc_no = id;
1781 for (edge = node->callers; edge; edge = edge->next_caller)
1782 if (max_count < edge->count)
1783 max_count = edge->count;
1785 ipa_free_postorder_info ();
1786 initialize_growth_caches ();
1788 if (dump_file)
1789 fprintf (dump_file,
1790 "\nDeciding on inlining of small functions. Starting with size %i.\n",
1791 initial_size);
1793 overall_size = initial_size;
1794 max_size = compute_max_insns (overall_size);
1795 min_size = overall_size;
1797 /* Populate the heap with all edges we might inline. */
1799 FOR_EACH_DEFINED_FUNCTION (node)
1801 bool update = false;
1802 struct cgraph_edge *next = NULL;
1803 bool has_speculative = false;
1805 if (dump_file)
1806 fprintf (dump_file, "Enqueueing calls in %s/%i.\n",
1807 node->name (), node->order);
1809 for (edge = node->callees; edge; edge = next)
1811 next = edge->next_callee;
1812 if (edge->inline_failed
1813 && !edge->aux
1814 && can_inline_edge_p (edge, true)
1815 && want_inline_small_function_p (edge, true)
1816 && edge->inline_failed)
1818 gcc_assert (!edge->aux);
1819 update_edge_key (&edge_heap, edge);
1821 if (edge->speculative)
1822 has_speculative = true;
1824 if (has_speculative)
1825 for (edge = node->callees; edge; edge = next)
1826 if (edge->speculative && !speculation_useful_p (edge,
1827 edge->aux != NULL))
1829 edge->resolve_speculation ();
1830 update = true;
1832 if (update)
1834 struct cgraph_node *where = node->global.inlined_to
1835 ? node->global.inlined_to : node;
1836 inline_update_overall_summary (where);
1837 reset_edge_caches (where);
1838 update_caller_keys (&edge_heap, where,
1839 updated_nodes, NULL);
1840 update_callee_keys (&edge_heap, where,
1841 updated_nodes);
1842 bitmap_clear (updated_nodes);
1846 gcc_assert (in_lto_p
1847 || !max_count
1848 || (profile_info && flag_branch_probabilities));
1850 while (!edge_heap.empty ())
1852 int old_size = overall_size;
1853 struct cgraph_node *where, *callee;
1854 sreal badness = edge_heap.min_key ();
1855 sreal current_badness;
1856 int growth;
1858 edge = edge_heap.extract_min ();
1859 gcc_assert (edge->aux);
1860 edge->aux = NULL;
1861 if (!edge->inline_failed || !edge->callee->analyzed)
1862 continue;
1864 #if CHECKING_P
1865 /* Be sure that caches are maintained consistent. */
1866 sreal cached_badness = edge_badness (edge, false);
1868 int old_size_est = estimate_edge_size (edge);
1869 sreal old_time_est = estimate_edge_time (edge);
1870 int old_hints_est = estimate_edge_hints (edge);
1872 reset_edge_growth_cache (edge);
1873 gcc_assert (old_size_est == estimate_edge_size (edge));
1874 gcc_assert (old_time_est == estimate_edge_time (edge));
1875 /* FIXME:
1877 gcc_assert (old_hints_est == estimate_edge_hints (edge));
1879 fails with profile feedback because some hints depends on
1880 maybe_hot_edge_p predicate and because callee gets inlined to other
1881 calls, the edge may become cold.
1882 This ought to be fixed by computing relative probabilities
1883 for given invocation but that will be better done once whole
1884 code is converted to sreals. Disable for now and revert to "wrong"
1885 value so enable/disable checking paths agree. */
1886 edge_growth_cache[edge->uid].hints = old_hints_est + 1;
1888 /* When updating the edge costs, we only decrease badness in the keys.
1889 Increases of badness are handled lazilly; when we see key with out
1890 of date value on it, we re-insert it now. */
1891 current_badness = edge_badness (edge, false);
1892 /* Disable checking for profile because roundoff errors may cause slight
1893 deviations in the order. */
1894 gcc_assert (max_count || cached_badness == current_badness);
1895 gcc_assert (current_badness >= badness);
1896 #else
1897 current_badness = edge_badness (edge, false);
1898 #endif
1899 if (current_badness != badness)
1901 if (edge_heap.min () && current_badness > edge_heap.min_key ())
1903 edge->aux = edge_heap.insert (current_badness, edge);
1904 continue;
1906 else
1907 badness = current_badness;
1910 if (!can_inline_edge_p (edge, true))
1912 resolve_noninline_speculation (&edge_heap, edge);
1913 continue;
1916 callee = edge->callee->ultimate_alias_target ();
1917 growth = estimate_edge_growth (edge);
1918 if (dump_file)
1920 fprintf (dump_file,
1921 "\nConsidering %s/%i with %i size\n",
1922 callee->name (), callee->order,
1923 inline_summaries->get (callee)->size);
1924 fprintf (dump_file,
1925 " to be inlined into %s/%i in %s:%i\n"
1926 " Estimated badness is %f, frequency %.2f.\n",
1927 edge->caller->name (), edge->caller->order,
1928 edge->call_stmt
1929 && (LOCATION_LOCUS (gimple_location ((const gimple *)
1930 edge->call_stmt))
1931 > BUILTINS_LOCATION)
1932 ? gimple_filename ((const gimple *) edge->call_stmt)
1933 : "unknown",
1934 edge->call_stmt
1935 ? gimple_lineno ((const gimple *) edge->call_stmt)
1936 : -1,
1937 badness.to_double (),
1938 edge->frequency / (double)CGRAPH_FREQ_BASE);
1939 if (edge->count)
1940 fprintf (dump_file," Called %" PRId64"x\n",
1941 edge->count);
1942 if (dump_flags & TDF_DETAILS)
1943 edge_badness (edge, true);
1946 if (overall_size + growth > max_size
1947 && !DECL_DISREGARD_INLINE_LIMITS (callee->decl))
1949 edge->inline_failed = CIF_INLINE_UNIT_GROWTH_LIMIT;
1950 report_inline_failed_reason (edge);
1951 resolve_noninline_speculation (&edge_heap, edge);
1952 continue;
1955 if (!want_inline_small_function_p (edge, true))
1957 resolve_noninline_speculation (&edge_heap, edge);
1958 continue;
1961 /* Heuristics for inlining small functions work poorly for
1962 recursive calls where we do effects similar to loop unrolling.
1963 When inlining such edge seems profitable, leave decision on
1964 specific inliner. */
1965 if (edge->recursive_p ())
1967 where = edge->caller;
1968 if (where->global.inlined_to)
1969 where = where->global.inlined_to;
1970 if (!recursive_inlining (edge,
1971 opt_for_fn (edge->caller->decl,
1972 flag_indirect_inlining)
1973 ? &new_indirect_edges : NULL))
1975 edge->inline_failed = CIF_RECURSIVE_INLINING;
1976 resolve_noninline_speculation (&edge_heap, edge);
1977 continue;
1979 reset_edge_caches (where);
1980 /* Recursive inliner inlines all recursive calls of the function
1981 at once. Consequently we need to update all callee keys. */
1982 if (opt_for_fn (edge->caller->decl, flag_indirect_inlining))
1983 add_new_edges_to_heap (&edge_heap, new_indirect_edges);
1984 update_callee_keys (&edge_heap, where, updated_nodes);
1985 bitmap_clear (updated_nodes);
1987 else
1989 struct cgraph_node *outer_node = NULL;
1990 int depth = 0;
1992 /* Consider the case where self recursive function A is inlined
1993 into B. This is desired optimization in some cases, since it
1994 leads to effect similar of loop peeling and we might completely
1995 optimize out the recursive call. However we must be extra
1996 selective. */
1998 where = edge->caller;
1999 while (where->global.inlined_to)
2001 if (where->decl == callee->decl)
2002 outer_node = where, depth++;
2003 where = where->callers->caller;
2005 if (outer_node
2006 && !want_inline_self_recursive_call_p (edge, outer_node,
2007 true, depth))
2009 edge->inline_failed
2010 = (DECL_DISREGARD_INLINE_LIMITS (edge->callee->decl)
2011 ? CIF_RECURSIVE_INLINING : CIF_UNSPECIFIED);
2012 resolve_noninline_speculation (&edge_heap, edge);
2013 continue;
2015 else if (depth && dump_file)
2016 fprintf (dump_file, " Peeling recursion with depth %i\n", depth);
2018 gcc_checking_assert (!callee->global.inlined_to);
2019 inline_call (edge, true, &new_indirect_edges, &overall_size, true);
2020 add_new_edges_to_heap (&edge_heap, new_indirect_edges);
2022 reset_edge_caches (edge->callee);
2024 update_callee_keys (&edge_heap, where, updated_nodes);
2026 where = edge->caller;
2027 if (where->global.inlined_to)
2028 where = where->global.inlined_to;
2030 /* Our profitability metric can depend on local properties
2031 such as number of inlinable calls and size of the function body.
2032 After inlining these properties might change for the function we
2033 inlined into (since it's body size changed) and for the functions
2034 called by function we inlined (since number of it inlinable callers
2035 might change). */
2036 update_caller_keys (&edge_heap, where, updated_nodes, NULL);
2037 /* Offline copy count has possibly changed, recompute if profile is
2038 available. */
2039 if (max_count)
2041 struct cgraph_node *n = cgraph_node::get (edge->callee->decl);
2042 if (n != edge->callee && n->analyzed)
2043 update_callee_keys (&edge_heap, n, updated_nodes);
2045 bitmap_clear (updated_nodes);
2047 if (dump_file)
2049 fprintf (dump_file,
2050 " Inlined %s into %s which now has time %f and size %i, "
2051 "net change of %+i.\n",
2052 edge->callee->name (),
2053 edge->caller->name (),
2054 inline_summaries->get (edge->caller)->time.to_double (),
2055 inline_summaries->get (edge->caller)->size,
2056 overall_size - old_size);
2058 if (min_size > overall_size)
2060 min_size = overall_size;
2061 max_size = compute_max_insns (min_size);
2063 if (dump_file)
2064 fprintf (dump_file, "New minimal size reached: %i\n", min_size);
2068 free_growth_caches ();
2069 if (dump_file)
2070 fprintf (dump_file,
2071 "Unit growth for small function inlining: %i->%i (%i%%)\n",
2072 initial_size, overall_size,
2073 initial_size ? overall_size * 100 / (initial_size) - 100: 0);
2074 symtab->remove_edge_removal_hook (edge_removal_hook_holder);
2077 /* Flatten NODE. Performed both during early inlining and
2078 at IPA inlining time. */
2080 static void
2081 flatten_function (struct cgraph_node *node, bool early)
2083 struct cgraph_edge *e;
2085 /* We shouldn't be called recursively when we are being processed. */
2086 gcc_assert (node->aux == NULL);
2088 node->aux = (void *) node;
2090 for (e = node->callees; e; e = e->next_callee)
2092 struct cgraph_node *orig_callee;
2093 struct cgraph_node *callee = e->callee->ultimate_alias_target ();
2095 /* We've hit cycle? It is time to give up. */
2096 if (callee->aux)
2098 if (dump_file)
2099 fprintf (dump_file,
2100 "Not inlining %s into %s to avoid cycle.\n",
2101 xstrdup_for_dump (callee->name ()),
2102 xstrdup_for_dump (e->caller->name ()));
2103 e->inline_failed = CIF_RECURSIVE_INLINING;
2104 continue;
2107 /* When the edge is already inlined, we just need to recurse into
2108 it in order to fully flatten the leaves. */
2109 if (!e->inline_failed)
2111 flatten_function (callee, early);
2112 continue;
2115 /* Flatten attribute needs to be processed during late inlining. For
2116 extra code quality we however do flattening during early optimization,
2117 too. */
2118 if (!early
2119 ? !can_inline_edge_p (e, true)
2120 : !can_early_inline_edge_p (e))
2121 continue;
2123 if (e->recursive_p ())
2125 if (dump_file)
2126 fprintf (dump_file, "Not inlining: recursive call.\n");
2127 continue;
2130 if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
2131 != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
2133 if (dump_file)
2134 fprintf (dump_file, "Not inlining: SSA form does not match.\n");
2135 continue;
2138 /* Inline the edge and flatten the inline clone. Avoid
2139 recursing through the original node if the node was cloned. */
2140 if (dump_file)
2141 fprintf (dump_file, " Inlining %s into %s.\n",
2142 xstrdup_for_dump (callee->name ()),
2143 xstrdup_for_dump (e->caller->name ()));
2144 orig_callee = callee;
2145 inline_call (e, true, NULL, NULL, false);
2146 if (e->callee != orig_callee)
2147 orig_callee->aux = (void *) node;
2148 flatten_function (e->callee, early);
2149 if (e->callee != orig_callee)
2150 orig_callee->aux = NULL;
2153 node->aux = NULL;
2154 if (!node->global.inlined_to)
2155 inline_update_overall_summary (node);
2158 /* Inline NODE to all callers. Worker for cgraph_for_node_and_aliases.
2159 DATA points to number of calls originally found so we avoid infinite
2160 recursion. */
2162 static bool
2163 inline_to_all_callers_1 (struct cgraph_node *node, void *data,
2164 hash_set<cgraph_node *> *callers)
2166 int *num_calls = (int *)data;
2167 bool callee_removed = false;
2169 while (node->callers && !node->global.inlined_to)
2171 struct cgraph_node *caller = node->callers->caller;
2173 if (!can_inline_edge_p (node->callers, true)
2174 || node->callers->recursive_p ())
2176 if (dump_file)
2177 fprintf (dump_file, "Uninlinable call found; giving up.\n");
2178 *num_calls = 0;
2179 return false;
2182 if (dump_file)
2184 fprintf (dump_file,
2185 "\nInlining %s size %i.\n",
2186 node->name (),
2187 inline_summaries->get (node)->size);
2188 fprintf (dump_file,
2189 " Called once from %s %i insns.\n",
2190 node->callers->caller->name (),
2191 inline_summaries->get (node->callers->caller)->size);
2194 /* Remember which callers we inlined to, delaying updating the
2195 overall summary. */
2196 callers->add (node->callers->caller);
2197 inline_call (node->callers, true, NULL, NULL, false, &callee_removed);
2198 if (dump_file)
2199 fprintf (dump_file,
2200 " Inlined into %s which now has %i size\n",
2201 caller->name (),
2202 inline_summaries->get (caller)->size);
2203 if (!(*num_calls)--)
2205 if (dump_file)
2206 fprintf (dump_file, "New calls found; giving up.\n");
2207 return callee_removed;
2209 if (callee_removed)
2210 return true;
2212 return false;
2215 /* Wrapper around inline_to_all_callers_1 doing delayed overall summary
2216 update. */
2218 static bool
2219 inline_to_all_callers (struct cgraph_node *node, void *data)
2221 hash_set<cgraph_node *> callers;
2222 bool res = inline_to_all_callers_1 (node, data, &callers);
2223 /* Perform the delayed update of the overall summary of all callers
2224 processed. This avoids quadratic behavior in the cases where
2225 we have a lot of calls to the same function. */
2226 for (hash_set<cgraph_node *>::iterator i = callers.begin ();
2227 i != callers.end (); ++i)
2228 inline_update_overall_summary (*i);
2229 return res;
2232 /* Output overall time estimate. */
2233 static void
2234 dump_overall_stats (void)
2236 sreal sum_weighted = 0, sum = 0;
2237 struct cgraph_node *node;
2239 FOR_EACH_DEFINED_FUNCTION (node)
2240 if (!node->global.inlined_to
2241 && !node->alias)
2243 sreal time = inline_summaries->get (node)->time;
2244 sum += time;
2245 sum_weighted += time * node->count;
2247 fprintf (dump_file, "Overall time estimate: "
2248 "%f weighted by profile: "
2249 "%f\n", sum.to_double (), sum_weighted.to_double ());
2252 /* Output some useful stats about inlining. */
2254 static void
2255 dump_inline_stats (void)
2257 int64_t inlined_cnt = 0, inlined_indir_cnt = 0;
2258 int64_t inlined_virt_cnt = 0, inlined_virt_indir_cnt = 0;
2259 int64_t noninlined_cnt = 0, noninlined_indir_cnt = 0;
2260 int64_t noninlined_virt_cnt = 0, noninlined_virt_indir_cnt = 0;
2261 int64_t inlined_speculative = 0, inlined_speculative_ply = 0;
2262 int64_t indirect_poly_cnt = 0, indirect_cnt = 0;
2263 int64_t reason[CIF_N_REASONS][3];
2264 int i;
2265 struct cgraph_node *node;
2267 memset (reason, 0, sizeof (reason));
2268 FOR_EACH_DEFINED_FUNCTION (node)
2270 struct cgraph_edge *e;
2271 for (e = node->callees; e; e = e->next_callee)
2273 if (e->inline_failed)
2275 reason[(int) e->inline_failed][0] += e->count;
2276 reason[(int) e->inline_failed][1] += e->frequency;
2277 reason[(int) e->inline_failed][2] ++;
2278 if (DECL_VIRTUAL_P (e->callee->decl))
2280 if (e->indirect_inlining_edge)
2281 noninlined_virt_indir_cnt += e->count;
2282 else
2283 noninlined_virt_cnt += e->count;
2285 else
2287 if (e->indirect_inlining_edge)
2288 noninlined_indir_cnt += e->count;
2289 else
2290 noninlined_cnt += e->count;
2293 else
2295 if (e->speculative)
2297 if (DECL_VIRTUAL_P (e->callee->decl))
2298 inlined_speculative_ply += e->count;
2299 else
2300 inlined_speculative += e->count;
2302 else if (DECL_VIRTUAL_P (e->callee->decl))
2304 if (e->indirect_inlining_edge)
2305 inlined_virt_indir_cnt += e->count;
2306 else
2307 inlined_virt_cnt += e->count;
2309 else
2311 if (e->indirect_inlining_edge)
2312 inlined_indir_cnt += e->count;
2313 else
2314 inlined_cnt += e->count;
2318 for (e = node->indirect_calls; e; e = e->next_callee)
2319 if (e->indirect_info->polymorphic)
2320 indirect_poly_cnt += e->count;
2321 else
2322 indirect_cnt += e->count;
2324 if (max_count)
2326 fprintf (dump_file,
2327 "Inlined %" PRId64 " + speculative "
2328 "%" PRId64 " + speculative polymorphic "
2329 "%" PRId64 " + previously indirect "
2330 "%" PRId64 " + virtual "
2331 "%" PRId64 " + virtual and previously indirect "
2332 "%" PRId64 "\n" "Not inlined "
2333 "%" PRId64 " + previously indirect "
2334 "%" PRId64 " + virtual "
2335 "%" PRId64 " + virtual and previously indirect "
2336 "%" PRId64 " + stil indirect "
2337 "%" PRId64 " + still indirect polymorphic "
2338 "%" PRId64 "\n", inlined_cnt,
2339 inlined_speculative, inlined_speculative_ply,
2340 inlined_indir_cnt, inlined_virt_cnt, inlined_virt_indir_cnt,
2341 noninlined_cnt, noninlined_indir_cnt, noninlined_virt_cnt,
2342 noninlined_virt_indir_cnt, indirect_cnt, indirect_poly_cnt);
2343 fprintf (dump_file,
2344 "Removed speculations %" PRId64 "\n",
2345 spec_rem);
2347 dump_overall_stats ();
2348 fprintf (dump_file, "\nWhy inlining failed?\n");
2349 for (i = 0; i < CIF_N_REASONS; i++)
2350 if (reason[i][2])
2351 fprintf (dump_file, "%-50s: %8i calls, %8i freq, %" PRId64" count\n",
2352 cgraph_inline_failed_string ((cgraph_inline_failed_t) i),
2353 (int) reason[i][2], (int) reason[i][1], reason[i][0]);
2356 /* Decide on the inlining. We do so in the topological order to avoid
2357 expenses on updating data structures. */
2359 static unsigned int
2360 ipa_inline (void)
2362 struct cgraph_node *node;
2363 int nnodes;
2364 struct cgraph_node **order;
2365 int i;
2366 int cold;
2367 bool remove_functions = false;
2369 if (!optimize)
2370 return 0;
2372 cgraph_freq_base_rec = (sreal) 1 / (sreal) CGRAPH_FREQ_BASE;
2373 percent_rec = (sreal) 1 / (sreal) 100;
2375 order = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count);
2377 if (dump_file)
2378 dump_inline_summaries (dump_file);
2380 nnodes = ipa_reverse_postorder (order);
2382 FOR_EACH_FUNCTION (node)
2384 node->aux = 0;
2386 /* Recompute the default reasons for inlining because they may have
2387 changed during merging. */
2388 if (in_lto_p)
2390 for (cgraph_edge *e = node->callees; e; e = e->next_callee)
2392 gcc_assert (e->inline_failed);
2393 initialize_inline_failed (e);
2395 for (cgraph_edge *e = node->indirect_calls; e; e = e->next_callee)
2396 initialize_inline_failed (e);
2400 if (dump_file)
2401 fprintf (dump_file, "\nFlattening functions:\n");
2403 /* In the first pass handle functions to be flattened. Do this with
2404 a priority so none of our later choices will make this impossible. */
2405 for (i = nnodes - 1; i >= 0; i--)
2407 node = order[i];
2409 /* Handle nodes to be flattened.
2410 Ideally when processing callees we stop inlining at the
2411 entry of cycles, possibly cloning that entry point and
2412 try to flatten itself turning it into a self-recursive
2413 function. */
2414 if (lookup_attribute ("flatten",
2415 DECL_ATTRIBUTES (node->decl)) != NULL)
2417 if (dump_file)
2418 fprintf (dump_file,
2419 "Flattening %s\n", node->name ());
2420 flatten_function (node, false);
2423 if (dump_file)
2424 dump_overall_stats ();
2426 inline_small_functions ();
2428 gcc_assert (symtab->state == IPA_SSA);
2429 symtab->state = IPA_SSA_AFTER_INLINING;
2430 /* Do first after-inlining removal. We want to remove all "stale" extern
2431 inline functions and virtual functions so we really know what is called
2432 once. */
2433 symtab->remove_unreachable_nodes (dump_file);
2434 free (order);
2436 /* Inline functions with a property that after inlining into all callers the
2437 code size will shrink because the out-of-line copy is eliminated.
2438 We do this regardless on the callee size as long as function growth limits
2439 are met. */
2440 if (dump_file)
2441 fprintf (dump_file,
2442 "\nDeciding on functions to be inlined into all callers and "
2443 "removing useless speculations:\n");
2445 /* Inlining one function called once has good chance of preventing
2446 inlining other function into the same callee. Ideally we should
2447 work in priority order, but probably inlining hot functions first
2448 is good cut without the extra pain of maintaining the queue.
2450 ??? this is not really fitting the bill perfectly: inlining function
2451 into callee often leads to better optimization of callee due to
2452 increased context for optimization.
2453 For example if main() function calls a function that outputs help
2454 and then function that does the main optmization, we should inline
2455 the second with priority even if both calls are cold by themselves.
2457 We probably want to implement new predicate replacing our use of
2458 maybe_hot_edge interpreted as maybe_hot_edge || callee is known
2459 to be hot. */
2460 for (cold = 0; cold <= 1; cold ++)
2462 FOR_EACH_DEFINED_FUNCTION (node)
2464 struct cgraph_edge *edge, *next;
2465 bool update=false;
2467 for (edge = node->callees; edge; edge = next)
2469 next = edge->next_callee;
2470 if (edge->speculative && !speculation_useful_p (edge, false))
2472 edge->resolve_speculation ();
2473 spec_rem += edge->count;
2474 update = true;
2475 remove_functions = true;
2478 if (update)
2480 struct cgraph_node *where = node->global.inlined_to
2481 ? node->global.inlined_to : node;
2482 reset_edge_caches (where);
2483 inline_update_overall_summary (where);
2485 if (want_inline_function_to_all_callers_p (node, cold))
2487 int num_calls = 0;
2488 node->call_for_symbol_and_aliases (sum_callers, &num_calls,
2489 true);
2490 while (node->call_for_symbol_and_aliases
2491 (inline_to_all_callers, &num_calls, true))
2493 remove_functions = true;
2498 /* Free ipa-prop structures if they are no longer needed. */
2499 if (optimize)
2500 ipa_free_all_structures_after_iinln ();
2502 if (dump_file)
2504 fprintf (dump_file,
2505 "\nInlined %i calls, eliminated %i functions\n\n",
2506 ncalls_inlined, nfunctions_inlined);
2507 dump_inline_stats ();
2510 if (dump_file)
2511 dump_inline_summaries (dump_file);
2512 /* In WPA we use inline summaries for partitioning process. */
2513 if (!flag_wpa)
2514 inline_free_summary ();
2515 return remove_functions ? TODO_remove_functions : 0;
2518 /* Inline always-inline function calls in NODE. */
2520 static bool
2521 inline_always_inline_functions (struct cgraph_node *node)
2523 struct cgraph_edge *e;
2524 bool inlined = false;
2526 for (e = node->callees; e; e = e->next_callee)
2528 struct cgraph_node *callee = e->callee->ultimate_alias_target ();
2529 if (!DECL_DISREGARD_INLINE_LIMITS (callee->decl))
2530 continue;
2532 if (e->recursive_p ())
2534 if (dump_file)
2535 fprintf (dump_file, " Not inlining recursive call to %s.\n",
2536 e->callee->name ());
2537 e->inline_failed = CIF_RECURSIVE_INLINING;
2538 continue;
2541 if (!can_early_inline_edge_p (e))
2543 /* Set inlined to true if the callee is marked "always_inline" but
2544 is not inlinable. This will allow flagging an error later in
2545 expand_call_inline in tree-inline.c. */
2546 if (lookup_attribute ("always_inline",
2547 DECL_ATTRIBUTES (callee->decl)) != NULL)
2548 inlined = true;
2549 continue;
2552 if (dump_file)
2553 fprintf (dump_file, " Inlining %s into %s (always_inline).\n",
2554 xstrdup_for_dump (e->callee->name ()),
2555 xstrdup_for_dump (e->caller->name ()));
2556 inline_call (e, true, NULL, NULL, false);
2557 inlined = true;
2559 if (inlined)
2560 inline_update_overall_summary (node);
2562 return inlined;
2565 /* Decide on the inlining. We do so in the topological order to avoid
2566 expenses on updating data structures. */
2568 static bool
2569 early_inline_small_functions (struct cgraph_node *node)
2571 struct cgraph_edge *e;
2572 bool inlined = false;
2574 for (e = node->callees; e; e = e->next_callee)
2576 struct cgraph_node *callee = e->callee->ultimate_alias_target ();
2577 if (!inline_summaries->get (callee)->inlinable
2578 || !e->inline_failed)
2579 continue;
2581 /* Do not consider functions not declared inline. */
2582 if (!DECL_DECLARED_INLINE_P (callee->decl)
2583 && !opt_for_fn (node->decl, flag_inline_small_functions)
2584 && !opt_for_fn (node->decl, flag_inline_functions))
2585 continue;
2587 if (dump_file)
2588 fprintf (dump_file, "Considering inline candidate %s.\n",
2589 callee->name ());
2591 if (!can_early_inline_edge_p (e))
2592 continue;
2594 if (e->recursive_p ())
2596 if (dump_file)
2597 fprintf (dump_file, " Not inlining: recursive call.\n");
2598 continue;
2601 if (!want_early_inline_function_p (e))
2602 continue;
2604 if (dump_file)
2605 fprintf (dump_file, " Inlining %s into %s.\n",
2606 xstrdup_for_dump (callee->name ()),
2607 xstrdup_for_dump (e->caller->name ()));
2608 inline_call (e, true, NULL, NULL, false);
2609 inlined = true;
2612 if (inlined)
2613 inline_update_overall_summary (node);
2615 return inlined;
2618 unsigned int
2619 early_inliner (function *fun)
2621 struct cgraph_node *node = cgraph_node::get (current_function_decl);
2622 struct cgraph_edge *edge;
2623 unsigned int todo = 0;
2624 int iterations = 0;
2625 bool inlined = false;
2627 if (seen_error ())
2628 return 0;
2630 /* Do nothing if datastructures for ipa-inliner are already computed. This
2631 happens when some pass decides to construct new function and
2632 cgraph_add_new_function calls lowering passes and early optimization on
2633 it. This may confuse ourself when early inliner decide to inline call to
2634 function clone, because function clones don't have parameter list in
2635 ipa-prop matching their signature. */
2636 if (ipa_node_params_sum)
2637 return 0;
2639 if (flag_checking)
2640 node->verify ();
2641 node->remove_all_references ();
2643 /* Rebuild this reference because it dosn't depend on
2644 function's body and it's required to pass cgraph_node
2645 verification. */
2646 if (node->instrumented_version
2647 && !node->instrumentation_clone)
2648 node->create_reference (node->instrumented_version, IPA_REF_CHKP, NULL);
2650 /* Even when not optimizing or not inlining inline always-inline
2651 functions. */
2652 inlined = inline_always_inline_functions (node);
2654 if (!optimize
2655 || flag_no_inline
2656 || !flag_early_inlining
2657 /* Never inline regular functions into always-inline functions
2658 during incremental inlining. This sucks as functions calling
2659 always inline functions will get less optimized, but at the
2660 same time inlining of functions calling always inline
2661 function into an always inline function might introduce
2662 cycles of edges to be always inlined in the callgraph.
2664 We might want to be smarter and just avoid this type of inlining. */
2665 || (DECL_DISREGARD_INLINE_LIMITS (node->decl)
2666 && lookup_attribute ("always_inline",
2667 DECL_ATTRIBUTES (node->decl))))
2669 else if (lookup_attribute ("flatten",
2670 DECL_ATTRIBUTES (node->decl)) != NULL)
2672 /* When the function is marked to be flattened, recursively inline
2673 all calls in it. */
2674 if (dump_file)
2675 fprintf (dump_file,
2676 "Flattening %s\n", node->name ());
2677 flatten_function (node, true);
2678 inlined = true;
2680 else
2682 /* If some always_inline functions was inlined, apply the changes.
2683 This way we will not account always inline into growth limits and
2684 moreover we will inline calls from always inlines that we skipped
2685 previously because of conditional above. */
2686 if (inlined)
2688 timevar_push (TV_INTEGRATION);
2689 todo |= optimize_inline_calls (current_function_decl);
2690 /* optimize_inline_calls call above might have introduced new
2691 statements that don't have inline parameters computed. */
2692 for (edge = node->callees; edge; edge = edge->next_callee)
2694 struct ipa_call_summary *es = ipa_call_summaries->get (edge);
2695 es->call_stmt_size
2696 = estimate_num_insns (edge->call_stmt, &eni_size_weights);
2697 es->call_stmt_time
2698 = estimate_num_insns (edge->call_stmt, &eni_time_weights);
2700 inline_update_overall_summary (node);
2701 inlined = false;
2702 timevar_pop (TV_INTEGRATION);
2704 /* We iterate incremental inlining to get trivial cases of indirect
2705 inlining. */
2706 while (iterations < PARAM_VALUE (PARAM_EARLY_INLINER_MAX_ITERATIONS)
2707 && early_inline_small_functions (node))
2709 timevar_push (TV_INTEGRATION);
2710 todo |= optimize_inline_calls (current_function_decl);
2712 /* Technically we ought to recompute inline parameters so the new
2713 iteration of early inliner works as expected. We however have
2714 values approximately right and thus we only need to update edge
2715 info that might be cleared out for newly discovered edges. */
2716 for (edge = node->callees; edge; edge = edge->next_callee)
2718 /* We have no summary for new bound store calls yet. */
2719 struct ipa_call_summary *es = ipa_call_summaries->get (edge);
2720 es->call_stmt_size
2721 = estimate_num_insns (edge->call_stmt, &eni_size_weights);
2722 es->call_stmt_time
2723 = estimate_num_insns (edge->call_stmt, &eni_time_weights);
2725 if (edge->callee->decl
2726 && !gimple_check_call_matching_types (
2727 edge->call_stmt, edge->callee->decl, false))
2729 edge->inline_failed = CIF_MISMATCHED_ARGUMENTS;
2730 edge->call_stmt_cannot_inline_p = true;
2733 if (iterations < PARAM_VALUE (PARAM_EARLY_INLINER_MAX_ITERATIONS) - 1)
2734 inline_update_overall_summary (node);
2735 timevar_pop (TV_INTEGRATION);
2736 iterations++;
2737 inlined = false;
2739 if (dump_file)
2740 fprintf (dump_file, "Iterations: %i\n", iterations);
2743 if (inlined)
2745 timevar_push (TV_INTEGRATION);
2746 todo |= optimize_inline_calls (current_function_decl);
2747 timevar_pop (TV_INTEGRATION);
2750 fun->always_inline_functions_inlined = true;
2752 return todo;
2755 /* Do inlining of small functions. Doing so early helps profiling and other
2756 passes to be somewhat more effective and avoids some code duplication in
2757 later real inlining pass for testcases with very many function calls. */
2759 namespace {
2761 const pass_data pass_data_early_inline =
2763 GIMPLE_PASS, /* type */
2764 "einline", /* name */
2765 OPTGROUP_INLINE, /* optinfo_flags */
2766 TV_EARLY_INLINING, /* tv_id */
2767 PROP_ssa, /* properties_required */
2768 0, /* properties_provided */
2769 0, /* properties_destroyed */
2770 0, /* todo_flags_start */
2771 0, /* todo_flags_finish */
2774 class pass_early_inline : public gimple_opt_pass
2776 public:
2777 pass_early_inline (gcc::context *ctxt)
2778 : gimple_opt_pass (pass_data_early_inline, ctxt)
2781 /* opt_pass methods: */
2782 virtual unsigned int execute (function *);
2784 }; // class pass_early_inline
2786 unsigned int
2787 pass_early_inline::execute (function *fun)
2789 return early_inliner (fun);
2792 } // anon namespace
2794 gimple_opt_pass *
2795 make_pass_early_inline (gcc::context *ctxt)
2797 return new pass_early_inline (ctxt);
2800 namespace {
2802 const pass_data pass_data_ipa_inline =
2804 IPA_PASS, /* type */
2805 "inline", /* name */
2806 OPTGROUP_INLINE, /* optinfo_flags */
2807 TV_IPA_INLINING, /* tv_id */
2808 0, /* properties_required */
2809 0, /* properties_provided */
2810 0, /* properties_destroyed */
2811 0, /* todo_flags_start */
2812 ( TODO_dump_symtab ), /* todo_flags_finish */
2815 class pass_ipa_inline : public ipa_opt_pass_d
2817 public:
2818 pass_ipa_inline (gcc::context *ctxt)
2819 : ipa_opt_pass_d (pass_data_ipa_inline, ctxt,
2820 inline_generate_summary, /* generate_summary */
2821 inline_write_summary, /* write_summary */
2822 inline_read_summary, /* read_summary */
2823 NULL, /* write_optimization_summary */
2824 NULL, /* read_optimization_summary */
2825 NULL, /* stmt_fixup */
2826 0, /* function_transform_todo_flags_start */
2827 inline_transform, /* function_transform */
2828 NULL) /* variable_transform */
2831 /* opt_pass methods: */
2832 virtual unsigned int execute (function *) { return ipa_inline (); }
2834 }; // class pass_ipa_inline
2836 } // anon namespace
2838 ipa_opt_pass_d *
2839 make_pass_ipa_inline (gcc::context *ctxt)
2841 return new pass_ipa_inline (ctxt);