gcc50: Disconnect from buildworld.
[dragonfly.git] / contrib / gcc-5.0 / gcc / ipa-inline.c
1 /* Inlining decision heuristics.
2    Copyright (C) 2003-2015 Free Software Foundation, Inc.
3    Contributed by Jan Hubicka
4
5 This file is part of GCC.
6
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.
11
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.
16
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/>.  */
20
21 /*  Inlining decision heuristics
22
23     The implementation of inliner is organized as follows:
24
25     inlining heuristics limits
26
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).
30
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.
35
36     inlining heuristics
37
38        The inliner itself is split into two passes:
39
40        pass_early_inlining
41
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.
45
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.
52
53          The pass handle the obvious inlining decisions within the compilation
54          unit - inlining auto inline functions, inlining for size and
55          flattening.
56
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.
61
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.
67
68        pass_ipa_inline
69
70          This is the real inliner able to handle inlining with whole program
71          knowledge. It performs following steps:
72
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.
76
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.
81
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.
87
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.  */
91
92 #include "config.h"
93 #include "system.h"
94 #include "coretypes.h"
95 #include "tm.h"
96 #include "hash-set.h"
97 #include "machmode.h"
98 #include "vec.h"
99 #include "double-int.h"
100 #include "input.h"
101 #include "alias.h"
102 #include "symtab.h"
103 #include "wide-int.h"
104 #include "inchash.h"
105 #include "tree.h"
106 #include "fold-const.h"
107 #include "trans-mem.h"
108 #include "calls.h"
109 #include "tree-inline.h"
110 #include "langhooks.h"
111 #include "flags.h"
112 #include "diagnostic.h"
113 #include "gimple-pretty-print.h"
114 #include "params.h"
115 #include "intl.h"
116 #include "tree-pass.h"
117 #include "coverage.h"
118 #include "rtl.h"
119 #include "bitmap.h"
120 #include "profile.h"
121 #include "predict.h"
122 #include "hard-reg-set.h"
123 #include "input.h"
124 #include "function.h"
125 #include "basic-block.h"
126 #include "tree-ssa-alias.h"
127 #include "internal-fn.h"
128 #include "gimple-expr.h"
129 #include "is-a.h"
130 #include "gimple.h"
131 #include "gimple-ssa.h"
132 #include "hash-map.h"
133 #include "plugin-api.h"
134 #include "ipa-ref.h"
135 #include "cgraph.h"
136 #include "alloc-pool.h"
137 #include "symbol-summary.h"
138 #include "ipa-prop.h"
139 #include "except.h"
140 #include "target.h"
141 #include "ipa-inline.h"
142 #include "ipa-utils.h"
143 #include "sreal.h"
144 #include "auto-profile.h"
145 #include "builtins.h"
146 #include "fibonacci_heap.h"
147 #include "lto-streamer.h"
148
149 typedef fibonacci_heap <sreal, cgraph_edge> edge_heap_t;
150 typedef fibonacci_node <sreal, cgraph_edge> edge_heap_node_t;
151
152 /* Statistics we collect about inlining algorithm.  */
153 static int overall_size;
154 static gcov_type max_count;
155 static gcov_type spec_rem;
156
157 /* Pre-computed constants 1/CGRAPH_FREQ_BASE and 1/100. */
158 static sreal cgraph_freq_base_rec, percent_rec;
159
160 /* Return false when inlining edge E would lead to violating
161    limits on function unit growth or stack usage growth.  
162
163    The relative function body growth limit is present generally
164    to avoid problems with non-linear behavior of the compiler.
165    To allow inlining huge functions into tiny wrapper, the limit
166    is always based on the bigger of the two functions considered.
167
168    For stack growth limits we always base the growth in stack usage
169    of the callers.  We want to prevent applications from segfaulting
170    on stack overflow when functions with huge stack frames gets
171    inlined. */
172
173 static bool
174 caller_growth_limits (struct cgraph_edge *e)
175 {
176   struct cgraph_node *to = e->caller;
177   struct cgraph_node *what = e->callee->ultimate_alias_target ();
178   int newsize;
179   int limit = 0;
180   HOST_WIDE_INT stack_size_limit = 0, inlined_stack;
181   inline_summary *info, *what_info, *outer_info = inline_summaries->get (to);
182
183   /* Look for function e->caller is inlined to.  While doing
184      so work out the largest function body on the way.  As
185      described above, we want to base our function growth
186      limits based on that.  Not on the self size of the
187      outer function, not on the self size of inline code
188      we immediately inline to.  This is the most relaxed
189      interpretation of the rule "do not grow large functions
190      too much in order to prevent compiler from exploding".  */
191   while (true)
192     {
193       info = inline_summaries->get (to);
194       if (limit < info->self_size)
195         limit = info->self_size;
196       if (stack_size_limit < info->estimated_self_stack_size)
197         stack_size_limit = info->estimated_self_stack_size;
198       if (to->global.inlined_to)
199         to = to->callers->caller;
200       else
201         break;
202     }
203
204   what_info = inline_summaries->get (what);
205
206   if (limit < what_info->self_size)
207     limit = what_info->self_size;
208
209   limit += limit * PARAM_VALUE (PARAM_LARGE_FUNCTION_GROWTH) / 100;
210
211   /* Check the size after inlining against the function limits.  But allow
212      the function to shrink if it went over the limits by forced inlining.  */
213   newsize = estimate_size_after_inlining (to, e);
214   if (newsize >= info->size
215       && newsize > PARAM_VALUE (PARAM_LARGE_FUNCTION_INSNS)
216       && newsize > limit)
217     {
218       e->inline_failed = CIF_LARGE_FUNCTION_GROWTH_LIMIT;
219       return false;
220     }
221
222   if (!what_info->estimated_stack_size)
223     return true;
224
225   /* FIXME: Stack size limit often prevents inlining in Fortran programs
226      due to large i/o datastructures used by the Fortran front-end.
227      We ought to ignore this limit when we know that the edge is executed
228      on every invocation of the caller (i.e. its call statement dominates
229      exit block).  We do not track this information, yet.  */
230   stack_size_limit += ((gcov_type)stack_size_limit
231                        * PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) / 100);
232
233   inlined_stack = (outer_info->stack_frame_offset
234                    + outer_info->estimated_self_stack_size
235                    + what_info->estimated_stack_size);
236   /* Check new stack consumption with stack consumption at the place
237      stack is used.  */
238   if (inlined_stack > stack_size_limit
239       /* If function already has large stack usage from sibling
240          inline call, we can inline, too.
241          This bit overoptimistically assume that we are good at stack
242          packing.  */
243       && inlined_stack > info->estimated_stack_size
244       && inlined_stack > PARAM_VALUE (PARAM_LARGE_STACK_FRAME))
245     {
246       e->inline_failed = CIF_LARGE_STACK_FRAME_GROWTH_LIMIT;
247       return false;
248     }
249   return true;
250 }
251
252 /* Dump info about why inlining has failed.  */
253
254 static void
255 report_inline_failed_reason (struct cgraph_edge *e)
256 {
257   if (dump_file)
258     {
259       fprintf (dump_file, "  not inlinable: %s/%i -> %s/%i, %s\n",
260                xstrdup_for_dump (e->caller->name ()), e->caller->order,
261                xstrdup_for_dump (e->callee->name ()), e->callee->order,
262                cgraph_inline_failed_string (e->inline_failed));
263       if ((e->inline_failed == CIF_TARGET_OPTION_MISMATCH
264            || e->inline_failed == CIF_OPTIMIZATION_MISMATCH)
265           && e->caller->lto_file_data
266           && e->callee->function_symbol ()->lto_file_data)
267         {
268           fprintf (dump_file, "  LTO objects: %s, %s\n",
269                    e->caller->lto_file_data->file_name,
270                    e->callee->function_symbol ()->lto_file_data->file_name);
271         }
272       if (e->inline_failed == CIF_TARGET_OPTION_MISMATCH)
273         cl_target_option_print_diff
274          (dump_file, 2, target_opts_for_fn (e->caller->decl),
275           target_opts_for_fn (e->callee->ultimate_alias_target ()->decl));
276       if (e->inline_failed == CIF_OPTIMIZATION_MISMATCH)
277         cl_optimization_print_diff
278           (dump_file, 2, opts_for_fn (e->caller->decl),
279            opts_for_fn (e->callee->ultimate_alias_target ()->decl));
280     }
281 }
282
283  /* Decide whether sanitizer-related attributes allow inlining. */
284
285 static bool
286 sanitize_attrs_match_for_inline_p (const_tree caller, const_tree callee)
287 {
288   /* Don't care if sanitizer is disabled */
289   if (!(flag_sanitize & SANITIZE_ADDRESS))
290     return true;
291
292   if (!caller || !callee)
293     return true;
294
295   return !!lookup_attribute ("no_sanitize_address",
296       DECL_ATTRIBUTES (caller)) == 
297       !!lookup_attribute ("no_sanitize_address",
298       DECL_ATTRIBUTES (callee));
299 }
300
301 /* Used for flags where it is safe to inline when caller's value is
302    grater than callee's.  */
303 #define check_maybe_up(flag) \
304       (opts_for_fn (caller->decl)->x_##flag             \
305        != opts_for_fn (callee->decl)->x_##flag          \
306        && (!always_inline                               \
307            || opts_for_fn (caller->decl)->x_##flag      \
308               < opts_for_fn (callee->decl)->x_##flag))
309 /* Used for flags where it is safe to inline when caller's value is
310    smaller than callee's.  */
311 #define check_maybe_down(flag) \
312       (opts_for_fn (caller->decl)->x_##flag             \
313        != opts_for_fn (callee->decl)->x_##flag          \
314        && (!always_inline                               \
315            || opts_for_fn (caller->decl)->x_##flag      \
316               > opts_for_fn (callee->decl)->x_##flag))
317 /* Used for flags where exact match is needed for correctness.  */
318 #define check_match(flag) \
319       (opts_for_fn (caller->decl)->x_##flag             \
320        != opts_for_fn (callee->decl)->x_##flag)
321
322  /* Decide if we can inline the edge and possibly update
323    inline_failed reason.  
324    We check whether inlining is possible at all and whether
325    caller growth limits allow doing so.  
326
327    if REPORT is true, output reason to the dump file.  
328
329    if DISREGARD_LIMITS is true, ignore size limits.*/
330
331 static bool
332 can_inline_edge_p (struct cgraph_edge *e, bool report,
333                    bool disregard_limits = false, bool early = false)
334 {
335   gcc_checking_assert (e->inline_failed);
336
337   if (cgraph_inline_failed_type (e->inline_failed) == CIF_FINAL_ERROR)
338     {
339       if (report)
340         report_inline_failed_reason (e);
341       return false;
342     }
343
344   bool inlinable = true;
345   enum availability avail;
346   cgraph_node *callee = e->callee->ultimate_alias_target (&avail);
347   cgraph_node *caller = e->caller->global.inlined_to
348                         ? e->caller->global.inlined_to : e->caller;
349   tree caller_tree = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (caller->decl);
350   tree callee_tree
351     = callee ? DECL_FUNCTION_SPECIFIC_OPTIMIZATION (callee->decl) : NULL;
352
353   if (!callee->definition)
354     {
355       e->inline_failed = CIF_BODY_NOT_AVAILABLE;
356       inlinable = false;
357     }
358   else if (callee->calls_comdat_local)
359     {
360       e->inline_failed = CIF_USES_COMDAT_LOCAL;
361       inlinable = false;
362     }
363   else if (avail <= AVAIL_INTERPOSABLE)
364     {
365       e->inline_failed = CIF_OVERWRITABLE;
366       inlinable = false;
367     }
368   else if (e->call_stmt_cannot_inline_p)
369     {
370       if (e->inline_failed != CIF_FUNCTION_NOT_OPTIMIZED)
371         e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
372       inlinable = false;
373     }
374   /* Don't inline if the functions have different EH personalities.  */
375   else if (DECL_FUNCTION_PERSONALITY (caller->decl)
376            && DECL_FUNCTION_PERSONALITY (callee->decl)
377            && (DECL_FUNCTION_PERSONALITY (caller->decl)
378                != DECL_FUNCTION_PERSONALITY (callee->decl)))
379     {
380       e->inline_failed = CIF_EH_PERSONALITY;
381       inlinable = false;
382     }
383   /* TM pure functions should not be inlined into non-TM_pure
384      functions.  */
385   else if (is_tm_pure (callee->decl) && !is_tm_pure (caller->decl))
386     {
387       e->inline_failed = CIF_UNSPECIFIED;
388       inlinable = false;
389     }
390   /* Check compatibility of target optimization options.  */
391   else if (!targetm.target_option.can_inline_p (caller->decl,
392                                                 callee->decl))
393     {
394       e->inline_failed = CIF_TARGET_OPTION_MISMATCH;
395       inlinable = false;
396     }
397   else if (!inline_summaries->get (callee)->inlinable)
398     {
399       e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
400       inlinable = false;
401     }
402   else if (inline_summaries->get (caller)->contains_cilk_spawn)
403     {
404       e->inline_failed = CIF_CILK_SPAWN;
405       inlinable = false;
406     }
407   /* Don't inline a function with mismatched sanitization attributes. */
408   else if (!sanitize_attrs_match_for_inline_p (caller->decl, callee->decl))
409     {
410       e->inline_failed = CIF_ATTRIBUTE_MISMATCH;
411       inlinable = false;
412     }
413   /* Check if caller growth allows the inlining.  */
414   else if (!DECL_DISREGARD_INLINE_LIMITS (callee->decl)
415            && !disregard_limits
416            && !lookup_attribute ("flatten",
417                                  DECL_ATTRIBUTES (caller->decl))
418            && !caller_growth_limits (e))
419     inlinable = false;
420   /* Don't inline a function with a higher optimization level than the
421      caller.  FIXME: this is really just tip of iceberg of handling
422      optimization attribute.  */
423   else if (caller_tree != callee_tree)
424     {
425       bool always_inline =
426              (DECL_DISREGARD_INLINE_LIMITS (callee->decl)
427               && lookup_attribute ("always_inline",
428                                    DECL_ATTRIBUTES (callee->decl)));
429
430      /* Until GCC 4.9 we did not check the semantics alterning flags
431         bellow and inline across optimization boundry.
432         Enabling checks bellow breaks several packages by refusing
433         to inline library always_inline functions. See PR65873.
434         Disable the check for early inlining for now until better solution
435         is found.  */
436      if (always_inline && early)
437         ;
438       /* There are some options that change IL semantics which means
439          we cannot inline in these cases for correctness reason.
440          Not even for always_inline declared functions.  */
441       /* Strictly speaking only when the callee contains signed integer
442          math where overflow is undefined.  */
443      else if ((check_maybe_up (flag_strict_overflow)
444                /* this flag is set by optimize.  Allow inlining across
445                   optimize boundary.  */
446                && (!opt_for_fn (caller->decl, optimize)
447                    == !opt_for_fn (callee->decl, optimize) || !always_inline))
448               || check_match (flag_wrapv)
449               || check_match (flag_trapv)
450               /* Strictly speaking only when the callee uses FP math.  */
451               || check_maybe_up (flag_rounding_math)
452               || check_maybe_up (flag_trapping_math)
453               || check_maybe_down (flag_unsafe_math_optimizations)
454               || check_maybe_down (flag_finite_math_only)
455               || check_maybe_up (flag_signaling_nans)
456               || check_maybe_down (flag_cx_limited_range)
457               || check_maybe_up (flag_signed_zeros)
458               || check_maybe_down (flag_associative_math)
459               || check_maybe_down (flag_reciprocal_math)
460               /* We do not want to make code compiled with exceptions to be
461                  brought into a non-EH function unless we know that the callee
462                  does not throw.
463                  This is tracked by DECL_FUNCTION_PERSONALITY.  */
464               || (check_match (flag_non_call_exceptions)
465                   /* TODO: We also may allow bringing !flag_non_call_exceptions
466                      to flag_non_call_exceptions function, but that may need
467                      extra work in tree-inline to add the extra EH edges.  */
468                   && (!opt_for_fn (callee->decl, flag_non_call_exceptions)
469                       || DECL_FUNCTION_PERSONALITY (callee->decl)))
470               || (check_maybe_up (flag_exceptions)
471                   && DECL_FUNCTION_PERSONALITY (callee->decl))
472               /* Strictly speaking only when the callee contains function
473                  calls that may end up setting errno.  */
474               || check_maybe_up (flag_errno_math)
475               /* When devirtualization is diabled for callee, it is not safe
476                  to inline it as we possibly mangled the type info.
477                  Allow early inlining of always inlines.  */
478               || (!early && check_maybe_down (flag_devirtualize)))
479         {
480           e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
481           inlinable = false;
482         }
483       /* gcc.dg/pr43564.c.  Apply user-forced inline even at -O0.  */
484       else if (always_inline)
485         ;
486       /* When user added an attribute to the callee honor it.  */
487       else if (lookup_attribute ("optimize", DECL_ATTRIBUTES (callee->decl))
488                && opts_for_fn (caller->decl) != opts_for_fn (callee->decl))
489         {
490           e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
491           inlinable = false;
492         }
493       /* If explicit optimize attribute are not used, the mismatch is caused
494          by different command line options used to build different units.
495          Do not care about COMDAT functions - those are intended to be
496          optimized with the optimization flags of module they are used in.
497          Also do not care about mixing up size/speed optimization when
498          DECL_DISREGARD_INLINE_LIMITS is set.  */
499       else if ((callee->merged
500                 && !lookup_attribute ("optimize",
501                                       DECL_ATTRIBUTES (caller->decl)))
502                || DECL_DISREGARD_INLINE_LIMITS (callee->decl))
503         ;
504       /* If mismatch is caused by merging two LTO units with different
505          optimizationflags we want to be bit nicer.  However never inline
506          if one of functions is not optimized at all.  */
507       else if (!opt_for_fn (callee->decl, optimize)
508                || !opt_for_fn (caller->decl, optimize))
509         {
510           e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
511           inlinable = false;
512         }
513       /* If callee is optimized for size and caller is not, allow inlining if
514          code shrinks or we are in MAX_INLINE_INSNS_SINGLE limit and callee
515          is inline (and thus likely an unified comdat).  This will allow caller
516          to run faster.  */
517       else if (opt_for_fn (callee->decl, optimize_size)
518                > opt_for_fn (caller->decl, optimize_size))
519         {
520           int growth = estimate_edge_growth (e);
521           if (growth > 0
522               && (!DECL_DECLARED_INLINE_P (callee->decl)
523                   && growth >= MAX (MAX_INLINE_INSNS_SINGLE,
524                                     MAX_INLINE_INSNS_AUTO)))
525             {
526               e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
527               inlinable = false;
528             }
529         }
530       /* If callee is more aggressively optimized for performance than caller,
531          we generally want to inline only cheap (runtime wise) functions.  */
532       else if (opt_for_fn (callee->decl, optimize_size)
533                < opt_for_fn (caller->decl, optimize_size)
534                || (opt_for_fn (callee->decl, optimize)
535                    > opt_for_fn (caller->decl, optimize)))
536         {
537           if (estimate_edge_time (e)
538               >= 20 + inline_edge_summary (e)->call_stmt_time)
539             {
540               e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
541               inlinable = false;
542             }
543         }
544
545     }
546
547   if (!inlinable && report)
548     report_inline_failed_reason (e);
549   return inlinable;
550 }
551
552
553 /* Return true if the edge E is inlinable during early inlining.  */
554
555 static bool
556 can_early_inline_edge_p (struct cgraph_edge *e)
557 {
558   struct cgraph_node *callee = e->callee->ultimate_alias_target ();
559   /* Early inliner might get called at WPA stage when IPA pass adds new
560      function.  In this case we can not really do any of early inlining
561      because function bodies are missing.  */
562   if (!gimple_has_body_p (callee->decl))
563     {
564       e->inline_failed = CIF_BODY_NOT_AVAILABLE;
565       return false;
566     }
567   /* In early inliner some of callees may not be in SSA form yet
568      (i.e. the callgraph is cyclic and we did not process
569      the callee by early inliner, yet).  We don't have CIF code for this
570      case; later we will re-do the decision in the real inliner.  */
571   if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->caller->decl))
572       || !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
573     {
574       if (dump_file)
575         fprintf (dump_file, "  edge not inlinable: not in SSA form\n");
576       return false;
577     }
578   if (!can_inline_edge_p (e, true, false, true))
579     return false;
580   return true;
581 }
582
583
584 /* Return number of calls in N.  Ignore cheap builtins.  */
585
586 static int
587 num_calls (struct cgraph_node *n)
588 {
589   struct cgraph_edge *e;
590   int num = 0;
591
592   for (e = n->callees; e; e = e->next_callee)
593     if (!is_inexpensive_builtin (e->callee->decl))
594       num++;
595   return num;
596 }
597
598
599 /* Return true if we are interested in inlining small function.  */
600
601 static bool
602 want_early_inline_function_p (struct cgraph_edge *e)
603 {
604   bool want_inline = true;
605   struct cgraph_node *callee = e->callee->ultimate_alias_target ();
606
607   if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
608     ;
609   /* For AutoFDO, we need to make sure that before profile summary, all
610      hot paths' IR look exactly the same as profiled binary. As a result,
611      in einliner, we will disregard size limit and inline those callsites
612      that are:
613        * inlined in the profiled binary, and
614        * the cloned callee has enough samples to be considered "hot".  */
615   else if (flag_auto_profile && afdo_callsite_hot_enough_for_early_inline (e))
616     ;
617   else if (!DECL_DECLARED_INLINE_P (callee->decl)
618            && !opt_for_fn (e->caller->decl, flag_inline_small_functions))
619     {
620       e->inline_failed = CIF_FUNCTION_NOT_INLINE_CANDIDATE;
621       report_inline_failed_reason (e);
622       want_inline = false;
623     }
624   else
625     {
626       int growth = estimate_edge_growth (e);
627       int n;
628
629       if (growth <= 0)
630         ;
631       else if (!e->maybe_hot_p ()
632                && growth > 0)
633         {
634           if (dump_file)
635             fprintf (dump_file, "  will not early inline: %s/%i->%s/%i, "
636                      "call is cold and code would grow by %i\n",
637                      xstrdup_for_dump (e->caller->name ()),
638                      e->caller->order,
639                      xstrdup_for_dump (callee->name ()), callee->order,
640                      growth);
641           want_inline = false;
642         }
643       else if (growth > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
644         {
645           if (dump_file)
646             fprintf (dump_file, "  will not early inline: %s/%i->%s/%i, "
647                      "growth %i exceeds --param early-inlining-insns\n",
648                      xstrdup_for_dump (e->caller->name ()),
649                      e->caller->order,
650                      xstrdup_for_dump (callee->name ()), callee->order,
651                      growth);
652           want_inline = false;
653         }
654       else if ((n = num_calls (callee)) != 0
655                && growth * (n + 1) > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
656         {
657           if (dump_file)
658             fprintf (dump_file, "  will not early inline: %s/%i->%s/%i, "
659                      "growth %i exceeds --param early-inlining-insns "
660                      "divided by number of calls\n",
661                      xstrdup_for_dump (e->caller->name ()),
662                      e->caller->order,
663                      xstrdup_for_dump (callee->name ()), callee->order,
664                      growth);
665           want_inline = false;
666         }
667     }
668   return want_inline;
669 }
670
671 /* Compute time of the edge->caller + edge->callee execution when inlining
672    does not happen.  */
673
674 inline sreal
675 compute_uninlined_call_time (struct inline_summary *callee_info,
676                              struct cgraph_edge *edge)
677 {
678   sreal uninlined_call_time = (sreal)callee_info->time;
679   cgraph_node *caller = (edge->caller->global.inlined_to 
680                          ? edge->caller->global.inlined_to
681                          : edge->caller);
682
683   if (edge->count && caller->count)
684     uninlined_call_time *= (sreal)edge->count / caller->count;
685   if (edge->frequency)
686     uninlined_call_time *= cgraph_freq_base_rec * edge->frequency;
687   else
688     uninlined_call_time = uninlined_call_time >> 11;
689
690   int caller_time = inline_summaries->get (caller)->time;
691   return uninlined_call_time + caller_time;
692 }
693
694 /* Same as compute_uinlined_call_time but compute time when inlining
695    does happen.  */
696
697 inline sreal
698 compute_inlined_call_time (struct cgraph_edge *edge,
699                            int edge_time)
700 {
701   cgraph_node *caller = (edge->caller->global.inlined_to 
702                          ? edge->caller->global.inlined_to
703                          : edge->caller);
704   int caller_time = inline_summaries->get (caller)->time;
705   sreal time = edge_time;
706
707   if (edge->count && caller->count)
708     time *= (sreal)edge->count / caller->count;
709   if (edge->frequency)
710     time *= cgraph_freq_base_rec * edge->frequency;
711   else
712     time = time >> 11;
713
714   /* This calculation should match one in ipa-inline-analysis.
715      FIXME: Once ipa-inline-analysis is converted to sreal this can be
716      simplified.  */
717   time -= (sreal) ((gcov_type) edge->frequency
718                    * inline_edge_summary (edge)->call_stmt_time
719                    * (INLINE_TIME_SCALE / CGRAPH_FREQ_BASE)) / INLINE_TIME_SCALE;
720   time += caller_time;
721   if (time <= 0)
722     time = ((sreal) 1) >> 8;
723   gcc_checking_assert (time >= 0);
724   return time;
725 }
726
727 /* Return true if the speedup for inlining E is bigger than
728    PARAM_MAX_INLINE_MIN_SPEEDUP.  */
729
730 static bool
731 big_speedup_p (struct cgraph_edge *e)
732 {
733   sreal time = compute_uninlined_call_time (inline_summaries->get (e->callee),
734                                             e);
735   sreal inlined_time = compute_inlined_call_time (e, estimate_edge_time (e));
736
737   if (time - inlined_time
738       > (sreal) time * PARAM_VALUE (PARAM_INLINE_MIN_SPEEDUP)
739          * percent_rec)
740     return true;
741   return false;
742 }
743
744 /* Return true if we are interested in inlining small function.
745    When REPORT is true, report reason to dump file.  */
746
747 static bool
748 want_inline_small_function_p (struct cgraph_edge *e, bool report)
749 {
750   bool want_inline = true;
751   struct cgraph_node *callee = e->callee->ultimate_alias_target ();
752
753   if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
754     ;
755   else if (!DECL_DECLARED_INLINE_P (callee->decl)
756            && !opt_for_fn (e->caller->decl, flag_inline_small_functions))
757     {
758       e->inline_failed = CIF_FUNCTION_NOT_INLINE_CANDIDATE;
759       want_inline = false;
760     }
761   /* Do fast and conservative check if the function can be good
762      inline candidate.  At the moment we allow inline hints to
763      promote non-inline functions to inline and we increase
764      MAX_INLINE_INSNS_SINGLE 16-fold for inline functions.  */
765   else if ((!DECL_DECLARED_INLINE_P (callee->decl)
766            && (!e->count || !e->maybe_hot_p ()))
767            && inline_summaries->get (callee)->min_size
768                 - inline_edge_summary (e)->call_stmt_size
769               > MAX (MAX_INLINE_INSNS_SINGLE, MAX_INLINE_INSNS_AUTO))
770     {
771       e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
772       want_inline = false;
773     }
774   else if ((DECL_DECLARED_INLINE_P (callee->decl) || e->count)
775            && inline_summaries->get (callee)->min_size
776                 - inline_edge_summary (e)->call_stmt_size
777               > 16 * MAX_INLINE_INSNS_SINGLE)
778     {
779       e->inline_failed = (DECL_DECLARED_INLINE_P (callee->decl)
780                           ? CIF_MAX_INLINE_INSNS_SINGLE_LIMIT
781                           : CIF_MAX_INLINE_INSNS_AUTO_LIMIT);
782       want_inline = false;
783     }
784   else
785     {
786       int growth = estimate_edge_growth (e);
787       inline_hints hints = estimate_edge_hints (e);
788       bool big_speedup = big_speedup_p (e);
789
790       if (growth <= 0)
791         ;
792       /* Apply MAX_INLINE_INSNS_SINGLE limit.  Do not do so when
793          hints suggests that inlining given function is very profitable.  */
794       else if (DECL_DECLARED_INLINE_P (callee->decl)
795                && growth >= MAX_INLINE_INSNS_SINGLE
796                && ((!big_speedup
797                     && !(hints & (INLINE_HINT_indirect_call
798                                   | INLINE_HINT_known_hot
799                                   | INLINE_HINT_loop_iterations
800                                   | INLINE_HINT_array_index
801                                   | INLINE_HINT_loop_stride)))
802                    || growth >= MAX_INLINE_INSNS_SINGLE * 16))
803         {
804           e->inline_failed = CIF_MAX_INLINE_INSNS_SINGLE_LIMIT;
805           want_inline = false;
806         }
807       else if (!DECL_DECLARED_INLINE_P (callee->decl)
808                && !opt_for_fn (e->caller->decl, flag_inline_functions))
809         {
810           /* growth_likely_positive is expensive, always test it last.  */
811           if (growth >= MAX_INLINE_INSNS_SINGLE
812               || growth_likely_positive (callee, growth))
813             {
814               e->inline_failed = CIF_NOT_DECLARED_INLINED;
815               want_inline = false;
816             }
817         }
818       /* Apply MAX_INLINE_INSNS_AUTO limit for functions not declared inline
819          Upgrade it to MAX_INLINE_INSNS_SINGLE when hints suggests that
820          inlining given function is very profitable.  */
821       else if (!DECL_DECLARED_INLINE_P (callee->decl)
822                && !big_speedup
823                && !(hints & INLINE_HINT_known_hot)
824                && growth >= ((hints & (INLINE_HINT_indirect_call
825                                        | INLINE_HINT_loop_iterations
826                                        | INLINE_HINT_array_index
827                                        | INLINE_HINT_loop_stride))
828                              ? MAX (MAX_INLINE_INSNS_AUTO,
829                                     MAX_INLINE_INSNS_SINGLE)
830                              : MAX_INLINE_INSNS_AUTO))
831         {
832           /* growth_likely_positive is expensive, always test it last.  */
833           if (growth >= MAX_INLINE_INSNS_SINGLE
834               || growth_likely_positive (callee, growth))
835             {
836               e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
837               want_inline = false;
838             }
839         }
840       /* If call is cold, do not inline when function body would grow. */
841       else if (!e->maybe_hot_p ()
842                && (growth >= MAX_INLINE_INSNS_SINGLE
843                    || growth_likely_positive (callee, growth)))
844         {
845           e->inline_failed = CIF_UNLIKELY_CALL;
846           want_inline = false;
847         }
848     }
849   if (!want_inline && report)
850     report_inline_failed_reason (e);
851   return want_inline;
852 }
853
854 /* EDGE is self recursive edge.
855    We hand two cases - when function A is inlining into itself
856    or when function A is being inlined into another inliner copy of function
857    A within function B.  
858
859    In first case OUTER_NODE points to the toplevel copy of A, while
860    in the second case OUTER_NODE points to the outermost copy of A in B.
861
862    In both cases we want to be extra selective since
863    inlining the call will just introduce new recursive calls to appear.  */
864
865 static bool
866 want_inline_self_recursive_call_p (struct cgraph_edge *edge,
867                                    struct cgraph_node *outer_node,
868                                    bool peeling,
869                                    int depth)
870 {
871   char const *reason = NULL;
872   bool want_inline = true;
873   int caller_freq = CGRAPH_FREQ_BASE;
874   int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO);
875
876   if (DECL_DECLARED_INLINE_P (edge->caller->decl))
877     max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH);
878
879   if (!edge->maybe_hot_p ())
880     {
881       reason = "recursive call is cold";
882       want_inline = false;
883     }
884   else if (max_count && !outer_node->count)
885     {
886       reason = "not executed in profile";
887       want_inline = false;
888     }
889   else if (depth > max_depth)
890     {
891       reason = "--param max-inline-recursive-depth exceeded.";
892       want_inline = false;
893     }
894
895   if (outer_node->global.inlined_to)
896     caller_freq = outer_node->callers->frequency;
897
898   if (!caller_freq)
899     {
900       reason = "function is inlined and unlikely";
901       want_inline = false;
902     }
903
904   if (!want_inline)
905     ;
906   /* Inlining of self recursive function into copy of itself within other function
907      is transformation similar to loop peeling.
908
909      Peeling is profitable if we can inline enough copies to make probability
910      of actual call to the self recursive function very small.  Be sure that
911      the probability of recursion is small.
912
913      We ensure that the frequency of recursing is at most 1 - (1/max_depth).
914      This way the expected number of recision is at most max_depth.  */
915   else if (peeling)
916     {
917       int max_prob = CGRAPH_FREQ_BASE - ((CGRAPH_FREQ_BASE + max_depth - 1)
918                                          / max_depth);
919       int i;
920       for (i = 1; i < depth; i++)
921         max_prob = max_prob * max_prob / CGRAPH_FREQ_BASE;
922       if (max_count
923           && (edge->count * CGRAPH_FREQ_BASE / outer_node->count
924               >= max_prob))
925         {
926           reason = "profile of recursive call is too large";
927           want_inline = false;
928         }
929       if (!max_count
930           && (edge->frequency * CGRAPH_FREQ_BASE / caller_freq
931               >= max_prob))
932         {
933           reason = "frequency of recursive call is too large";
934           want_inline = false;
935         }
936     }
937   /* Recursive inlining, i.e. equivalent of unrolling, is profitable if recursion
938      depth is large.  We reduce function call overhead and increase chances that
939      things fit in hardware return predictor.
940
941      Recursive inlining might however increase cost of stack frame setup
942      actually slowing down functions whose recursion tree is wide rather than
943      deep.
944
945      Deciding reliably on when to do recursive inlining without profile feedback
946      is tricky.  For now we disable recursive inlining when probability of self
947      recursion is low. 
948
949      Recursive inlining of self recursive call within loop also results in large loop
950      depths that generally optimize badly.  We may want to throttle down inlining
951      in those cases.  In particular this seems to happen in one of libstdc++ rb tree
952      methods.  */
953   else
954     {
955       if (max_count
956           && (edge->count * 100 / outer_node->count
957               <= PARAM_VALUE (PARAM_MIN_INLINE_RECURSIVE_PROBABILITY)))
958         {
959           reason = "profile of recursive call is too small";
960           want_inline = false;
961         }
962       else if (!max_count
963                && (edge->frequency * 100 / caller_freq
964                    <= PARAM_VALUE (PARAM_MIN_INLINE_RECURSIVE_PROBABILITY)))
965         {
966           reason = "frequency of recursive call is too small";
967           want_inline = false;
968         }
969     }
970   if (!want_inline && dump_file)
971     fprintf (dump_file, "   not inlining recursively: %s\n", reason);
972   return want_inline;
973 }
974
975 /* Return true when NODE has uninlinable caller;
976    set HAS_HOT_CALL if it has hot call. 
977    Worker for cgraph_for_node_and_aliases.  */
978
979 static bool
980 check_callers (struct cgraph_node *node, void *has_hot_call)
981 {
982   struct cgraph_edge *e;
983    for (e = node->callers; e; e = e->next_caller)
984      {
985        if (!opt_for_fn (e->caller->decl, flag_inline_functions_called_once))
986          return true;
987        if (!can_inline_edge_p (e, true))
988          return true;
989        if (e->recursive_p ())
990          return true;
991        if (!(*(bool *)has_hot_call) && e->maybe_hot_p ())
992          *(bool *)has_hot_call = true;
993      }
994   return false;
995 }
996
997 /* If NODE has a caller, return true.  */
998
999 static bool
1000 has_caller_p (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
1001 {
1002   if (node->callers)
1003     return true;
1004   return false;
1005 }
1006
1007 /* Decide if inlining NODE would reduce unit size by eliminating
1008    the offline copy of function.  
1009    When COLD is true the cold calls are considered, too.  */
1010
1011 static bool
1012 want_inline_function_to_all_callers_p (struct cgraph_node *node, bool cold)
1013 {
1014   bool has_hot_call = false;
1015
1016   /* Aliases gets inlined along with the function they alias.  */
1017   if (node->alias)
1018     return false;
1019   /* Already inlined?  */
1020   if (node->global.inlined_to)
1021     return false;
1022   /* Does it have callers?  */
1023   if (!node->call_for_symbol_and_aliases (has_caller_p, NULL, true))
1024     return false;
1025   /* Inlining into all callers would increase size?  */
1026   if (estimate_growth (node) > 0)
1027     return false;
1028   /* All inlines must be possible.  */
1029   if (node->call_for_symbol_and_aliases (check_callers, &has_hot_call,
1030                                          true))
1031     return false;
1032   if (!cold && !has_hot_call)
1033     return false;
1034   return true;
1035 }
1036
1037 /* A cost model driving the inlining heuristics in a way so the edges with
1038    smallest badness are inlined first.  After each inlining is performed
1039    the costs of all caller edges of nodes affected are recomputed so the
1040    metrics may accurately depend on values such as number of inlinable callers
1041    of the function or function body size.  */
1042
1043 static sreal
1044 edge_badness (struct cgraph_edge *edge, bool dump)
1045 {
1046   sreal badness;
1047   int growth, edge_time;
1048   struct cgraph_node *callee = edge->callee->ultimate_alias_target ();
1049   struct inline_summary *callee_info = inline_summaries->get (callee);
1050   inline_hints hints;
1051   cgraph_node *caller = (edge->caller->global.inlined_to 
1052                          ? edge->caller->global.inlined_to
1053                          : edge->caller);
1054
1055   growth = estimate_edge_growth (edge);
1056   edge_time = estimate_edge_time (edge);
1057   hints = estimate_edge_hints (edge);
1058   gcc_checking_assert (edge_time >= 0);
1059   gcc_checking_assert (edge_time <= callee_info->time);
1060   gcc_checking_assert (growth <= callee_info->size);
1061
1062   if (dump)
1063     {
1064       fprintf (dump_file, "    Badness calculation for %s/%i -> %s/%i\n",
1065                xstrdup_for_dump (edge->caller->name ()),
1066                edge->caller->order,
1067                xstrdup_for_dump (callee->name ()),
1068                edge->callee->order);
1069       fprintf (dump_file, "      size growth %i, time %i ",
1070                growth,
1071                edge_time);
1072       dump_inline_hints (dump_file, hints);
1073       if (big_speedup_p (edge))
1074         fprintf (dump_file, " big_speedup");
1075       fprintf (dump_file, "\n");
1076     }
1077
1078   /* Always prefer inlining saving code size.  */
1079   if (growth <= 0)
1080     {
1081       badness = (sreal) (-SREAL_MIN_SIG + growth) << (SREAL_MAX_EXP / 256);
1082       if (dump)
1083         fprintf (dump_file, "      %f: Growth %d <= 0\n", badness.to_double (),
1084                  growth);
1085     }
1086    /* Inlining into EXTERNAL functions is not going to change anything unless
1087       they are themselves inlined.  */
1088    else if (DECL_EXTERNAL (caller->decl))
1089     {
1090       if (dump)
1091         fprintf (dump_file, "      max: function is external\n");
1092       return sreal::max ();
1093     }
1094   /* When profile is available. Compute badness as:
1095      
1096                  time_saved * caller_count
1097      goodness =  -------------------------------------------------
1098                  growth_of_caller * overall_growth * combined_size
1099
1100      badness = - goodness
1101
1102      Again use negative value to make calls with profile appear hotter
1103      then calls without.
1104   */
1105   else if (opt_for_fn (caller->decl, flag_guess_branch_prob) || caller->count)
1106     {
1107       sreal numerator, denominator;
1108       int overall_growth;
1109
1110       numerator = (compute_uninlined_call_time (callee_info, edge)
1111                    - compute_inlined_call_time (edge, edge_time));
1112       if (numerator == 0)
1113         numerator = ((sreal) 1 >> 8);
1114       if (caller->count)
1115         numerator *= caller->count;
1116       else if (opt_for_fn (caller->decl, flag_branch_probabilities))
1117         numerator = numerator >> 11;
1118       denominator = growth;
1119
1120       overall_growth = callee_info->growth;
1121
1122       /* Look for inliner wrappers of the form:
1123
1124          inline_caller ()
1125            {
1126              do_fast_job...
1127              if (need_more_work)
1128                noninline_callee ();
1129            }
1130          Withhout panilizing this case, we usually inline noninline_callee
1131          into the inline_caller because overall_growth is small preventing
1132          further inlining of inline_caller.
1133
1134          Penalize only callgraph edges to functions with small overall
1135          growth ...
1136         */
1137       if (growth > overall_growth
1138           /* ... and having only one caller which is not inlined ... */
1139           && callee_info->single_caller
1140           && !edge->caller->global.inlined_to
1141           /* ... and edges executed only conditionally ... */
1142           && edge->frequency < CGRAPH_FREQ_BASE
1143           /* ... consider case where callee is not inline but caller is ... */
1144           && ((!DECL_DECLARED_INLINE_P (edge->callee->decl)
1145                && DECL_DECLARED_INLINE_P (caller->decl))
1146               /* ... or when early optimizers decided to split and edge
1147                  frequency still indicates splitting is a win ... */
1148               || (callee->split_part && !caller->split_part
1149                   && edge->frequency
1150                      < CGRAPH_FREQ_BASE
1151                        * PARAM_VALUE
1152                           (PARAM_PARTIAL_INLINING_ENTRY_PROBABILITY) / 100
1153                   /* ... and do not overwrite user specified hints.   */
1154                   && (!DECL_DECLARED_INLINE_P (edge->callee->decl)
1155                       || DECL_DECLARED_INLINE_P (caller->decl)))))
1156         {
1157           struct inline_summary *caller_info = inline_summaries->get (caller);
1158           int caller_growth = caller_info->growth;
1159
1160           /* Only apply the penalty when caller looks like inline candidate,
1161              and it is not called once and.  */
1162           if (!caller_info->single_caller && overall_growth < caller_growth
1163               && caller_info->inlinable
1164               && caller_info->size
1165                  < (DECL_DECLARED_INLINE_P (caller->decl)
1166                     ? MAX_INLINE_INSNS_SINGLE : MAX_INLINE_INSNS_AUTO))
1167             {
1168               if (dump)
1169                 fprintf (dump_file,
1170                          "     Wrapper penalty. Increasing growth %i to %i\n",
1171                          overall_growth, caller_growth);
1172               overall_growth = caller_growth;
1173             }
1174         }
1175       if (overall_growth > 0)
1176         {
1177           /* Strongly preffer functions with few callers that can be inlined
1178              fully.  The square root here leads to smaller binaries at average.
1179              Watch however for extreme cases and return to linear function
1180              when growth is large.  */
1181           if (overall_growth < 256)
1182             overall_growth *= overall_growth;
1183           else
1184             overall_growth += 256 * 256 - 256;
1185           denominator *= overall_growth;
1186         }
1187       denominator *= inline_summaries->get (caller)->self_size + growth;
1188
1189       badness = - numerator / denominator;
1190
1191       if (dump)
1192         {
1193           fprintf (dump_file,
1194                    "      %f: guessed profile. frequency %f, count %" PRId64
1195                    " caller count %" PRId64
1196                    " time w/o inlining %f, time w inlining %f"
1197                    " overall growth %i (current) %i (original)"
1198                    " %i (compensated)\n",
1199                    badness.to_double (),
1200                   (double)edge->frequency / CGRAPH_FREQ_BASE,
1201                    edge->count, caller->count,
1202                    compute_uninlined_call_time (callee_info, edge).to_double (),
1203                    compute_inlined_call_time (edge, edge_time).to_double (),
1204                    estimate_growth (callee),
1205                    callee_info->growth, overall_growth);
1206         }
1207     }
1208   /* When function local profile is not available or it does not give
1209      useful information (ie frequency is zero), base the cost on
1210      loop nest and overall size growth, so we optimize for overall number
1211      of functions fully inlined in program.  */
1212   else
1213     {
1214       int nest = MIN (inline_edge_summary (edge)->loop_depth, 8);
1215       badness = growth;
1216
1217       /* Decrease badness if call is nested.  */
1218       if (badness > 0)
1219         badness = badness >> nest;
1220       else
1221         badness = badness << nest;
1222       if (dump)
1223         fprintf (dump_file, "      %f: no profile. nest %i\n",
1224                  badness.to_double (), nest);
1225     }
1226   gcc_checking_assert (badness != 0);
1227
1228   if (edge->recursive_p ())
1229     badness = badness.shift (badness > 0 ? 4 : -4);
1230   if ((hints & (INLINE_HINT_indirect_call
1231                 | INLINE_HINT_loop_iterations
1232                 | INLINE_HINT_array_index
1233                 | INLINE_HINT_loop_stride))
1234       || callee_info->growth <= 0)
1235     badness = badness.shift (badness > 0 ? -2 : 2);
1236   if (hints & (INLINE_HINT_same_scc))
1237     badness = badness.shift (badness > 0 ? 3 : -3);
1238   else if (hints & (INLINE_HINT_in_scc))
1239     badness = badness.shift (badness > 0 ? 2 : -2);
1240   else if (hints & (INLINE_HINT_cross_module))
1241     badness = badness.shift (badness > 0 ? 1 : -1);
1242   if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
1243     badness = badness.shift (badness > 0 ? -4 : 4);
1244   else if ((hints & INLINE_HINT_declared_inline))
1245     badness = badness.shift (badness > 0 ? -3 : 3);
1246   if (dump)
1247     fprintf (dump_file, "      Adjusted by hints %f\n", badness.to_double ());
1248   return badness;
1249 }
1250
1251 /* Recompute badness of EDGE and update its key in HEAP if needed.  */
1252 static inline void
1253 update_edge_key (edge_heap_t *heap, struct cgraph_edge *edge)
1254 {
1255   sreal badness = edge_badness (edge, false);
1256   if (edge->aux)
1257     {
1258       edge_heap_node_t *n = (edge_heap_node_t *) edge->aux;
1259       gcc_checking_assert (n->get_data () == edge);
1260
1261       /* fibonacci_heap::replace_key does busy updating of the
1262          heap that is unnecesarily expensive.
1263          We do lazy increases: after extracting minimum if the key
1264          turns out to be out of date, it is re-inserted into heap
1265          with correct value.  */
1266       if (badness < n->get_key ())
1267         {
1268           if (dump_file && (dump_flags & TDF_DETAILS))
1269             {
1270               fprintf (dump_file,
1271                        "  decreasing badness %s/%i -> %s/%i, %f"
1272                        " to %f\n",
1273                        xstrdup_for_dump (edge->caller->name ()),
1274                        edge->caller->order,
1275                        xstrdup_for_dump (edge->callee->name ()),
1276                        edge->callee->order,
1277                        n->get_key ().to_double (),
1278                        badness.to_double ());
1279             }
1280           heap->decrease_key (n, badness);
1281         }
1282     }
1283   else
1284     {
1285        if (dump_file && (dump_flags & TDF_DETAILS))
1286          {
1287            fprintf (dump_file,
1288                     "  enqueuing call %s/%i -> %s/%i, badness %f\n",
1289                     xstrdup_for_dump (edge->caller->name ()),
1290                     edge->caller->order,
1291                     xstrdup_for_dump (edge->callee->name ()),
1292                     edge->callee->order,
1293                     badness.to_double ());
1294          }
1295       edge->aux = heap->insert (badness, edge);
1296     }
1297 }
1298
1299
1300 /* NODE was inlined.
1301    All caller edges needs to be resetted because
1302    size estimates change. Similarly callees needs reset
1303    because better context may be known.  */
1304
1305 static void
1306 reset_edge_caches (struct cgraph_node *node)
1307 {
1308   struct cgraph_edge *edge;
1309   struct cgraph_edge *e = node->callees;
1310   struct cgraph_node *where = node;
1311   struct ipa_ref *ref;
1312
1313   if (where->global.inlined_to)
1314     where = where->global.inlined_to;
1315
1316   for (edge = where->callers; edge; edge = edge->next_caller)
1317     if (edge->inline_failed)
1318       reset_edge_growth_cache (edge);
1319
1320   FOR_EACH_ALIAS (where, ref)
1321     reset_edge_caches (dyn_cast <cgraph_node *> (ref->referring));
1322
1323   if (!e)
1324     return;
1325
1326   while (true)
1327     if (!e->inline_failed && e->callee->callees)
1328       e = e->callee->callees;
1329     else
1330       {
1331         if (e->inline_failed)
1332           reset_edge_growth_cache (e);
1333         if (e->next_callee)
1334           e = e->next_callee;
1335         else
1336           {
1337             do
1338               {
1339                 if (e->caller == node)
1340                   return;
1341                 e = e->caller->callers;
1342               }
1343             while (!e->next_callee);
1344             e = e->next_callee;
1345           }
1346       }
1347 }
1348
1349 /* Recompute HEAP nodes for each of caller of NODE.
1350    UPDATED_NODES track nodes we already visited, to avoid redundant work.
1351    When CHECK_INLINABLITY_FOR is set, re-check for specified edge that
1352    it is inlinable. Otherwise check all edges.  */
1353
1354 static void
1355 update_caller_keys (edge_heap_t *heap, struct cgraph_node *node,
1356                     bitmap updated_nodes,
1357                     struct cgraph_edge *check_inlinablity_for)
1358 {
1359   struct cgraph_edge *edge;
1360   struct ipa_ref *ref;
1361
1362   if ((!node->alias && !inline_summaries->get (node)->inlinable)
1363       || node->global.inlined_to)
1364     return;
1365   if (!bitmap_set_bit (updated_nodes, node->uid))
1366     return;
1367
1368   FOR_EACH_ALIAS (node, ref)
1369     {
1370       struct cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
1371       update_caller_keys (heap, alias, updated_nodes, check_inlinablity_for);
1372     }
1373
1374   for (edge = node->callers; edge; edge = edge->next_caller)
1375     if (edge->inline_failed)
1376       {
1377         if (!check_inlinablity_for
1378             || check_inlinablity_for == edge)
1379           {
1380             if (can_inline_edge_p (edge, false)
1381                 && want_inline_small_function_p (edge, false))
1382               update_edge_key (heap, edge);
1383             else if (edge->aux)
1384               {
1385                 report_inline_failed_reason (edge);
1386                 heap->delete_node ((edge_heap_node_t *) edge->aux);
1387                 edge->aux = NULL;
1388               }
1389           }
1390         else if (edge->aux)
1391           update_edge_key (heap, edge);
1392       }
1393 }
1394
1395 /* Recompute HEAP nodes for each uninlined call in NODE.
1396    This is used when we know that edge badnesses are going only to increase
1397    (we introduced new call site) and thus all we need is to insert newly
1398    created edges into heap.  */
1399
1400 static void
1401 update_callee_keys (edge_heap_t *heap, struct cgraph_node *node,
1402                     bitmap updated_nodes)
1403 {
1404   struct cgraph_edge *e = node->callees;
1405
1406   if (!e)
1407     return;
1408   while (true)
1409     if (!e->inline_failed && e->callee->callees)
1410       e = e->callee->callees;
1411     else
1412       {
1413         enum availability avail;
1414         struct cgraph_node *callee;
1415         /* We do not reset callee growth cache here.  Since we added a new call,
1416            growth chould have just increased and consequentely badness metric
1417            don't need updating.  */
1418         if (e->inline_failed
1419             && (callee = e->callee->ultimate_alias_target (&avail))
1420             && inline_summaries->get (callee)->inlinable
1421             && avail >= AVAIL_AVAILABLE
1422             && !bitmap_bit_p (updated_nodes, callee->uid))
1423           {
1424             if (can_inline_edge_p (e, false)
1425                 && want_inline_small_function_p (e, false))
1426               update_edge_key (heap, e);
1427             else if (e->aux)
1428               {
1429                 report_inline_failed_reason (e);
1430                 heap->delete_node ((edge_heap_node_t *) e->aux);
1431                 e->aux = NULL;
1432               }
1433           }
1434         if (e->next_callee)
1435           e = e->next_callee;
1436         else
1437           {
1438             do
1439               {
1440                 if (e->caller == node)
1441                   return;
1442                 e = e->caller->callers;
1443               }
1444             while (!e->next_callee);
1445             e = e->next_callee;
1446           }
1447       }
1448 }
1449
1450 /* Enqueue all recursive calls from NODE into priority queue depending on
1451    how likely we want to recursively inline the call.  */
1452
1453 static void
1454 lookup_recursive_calls (struct cgraph_node *node, struct cgraph_node *where,
1455                         edge_heap_t *heap)
1456 {
1457   struct cgraph_edge *e;
1458   enum availability avail;
1459
1460   for (e = where->callees; e; e = e->next_callee)
1461     if (e->callee == node
1462         || (e->callee->ultimate_alias_target (&avail) == node
1463             && avail > AVAIL_INTERPOSABLE))
1464       {
1465         /* When profile feedback is available, prioritize by expected number
1466            of calls.  */
1467         heap->insert (!max_count ? -e->frequency
1468                       : -(e->count / ((max_count + (1<<24) - 1) / (1<<24))),
1469                       e);
1470       }
1471   for (e = where->callees; e; e = e->next_callee)
1472     if (!e->inline_failed)
1473       lookup_recursive_calls (node, e->callee, heap);
1474 }
1475
1476 /* Decide on recursive inlining: in the case function has recursive calls,
1477    inline until body size reaches given argument.  If any new indirect edges
1478    are discovered in the process, add them to *NEW_EDGES, unless NEW_EDGES
1479    is NULL.  */
1480
1481 static bool
1482 recursive_inlining (struct cgraph_edge *edge,
1483                     vec<cgraph_edge *> *new_edges)
1484 {
1485   int limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO);
1486   edge_heap_t heap (sreal::min ());
1487   struct cgraph_node *node;
1488   struct cgraph_edge *e;
1489   struct cgraph_node *master_clone = NULL, *next;
1490   int depth = 0;
1491   int n = 0;
1492
1493   node = edge->caller;
1494   if (node->global.inlined_to)
1495     node = node->global.inlined_to;
1496
1497   if (DECL_DECLARED_INLINE_P (node->decl))
1498     limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE);
1499
1500   /* Make sure that function is small enough to be considered for inlining.  */
1501   if (estimate_size_after_inlining (node, edge)  >= limit)
1502     return false;
1503   lookup_recursive_calls (node, node, &heap);
1504   if (heap.empty ())
1505     return false;
1506
1507   if (dump_file)
1508     fprintf (dump_file,
1509              "  Performing recursive inlining on %s\n",
1510              node->name ());
1511
1512   /* Do the inlining and update list of recursive call during process.  */
1513   while (!heap.empty ())
1514     {
1515       struct cgraph_edge *curr = heap.extract_min ();
1516       struct cgraph_node *cnode, *dest = curr->callee;
1517
1518       if (!can_inline_edge_p (curr, true))
1519         continue;
1520
1521       /* MASTER_CLONE is produced in the case we already started modified
1522          the function. Be sure to redirect edge to the original body before
1523          estimating growths otherwise we will be seeing growths after inlining
1524          the already modified body.  */
1525       if (master_clone)
1526         {
1527           curr->redirect_callee (master_clone);
1528           reset_edge_growth_cache (curr);
1529         }
1530
1531       if (estimate_size_after_inlining (node, curr) > limit)
1532         {
1533           curr->redirect_callee (dest);
1534           reset_edge_growth_cache (curr);
1535           break;
1536         }
1537
1538       depth = 1;
1539       for (cnode = curr->caller;
1540            cnode->global.inlined_to; cnode = cnode->callers->caller)
1541         if (node->decl
1542             == curr->callee->ultimate_alias_target ()->decl)
1543           depth++;
1544
1545       if (!want_inline_self_recursive_call_p (curr, node, false, depth))
1546         {
1547           curr->redirect_callee (dest);
1548           reset_edge_growth_cache (curr);
1549           continue;
1550         }
1551
1552       if (dump_file)
1553         {
1554           fprintf (dump_file,
1555                    "   Inlining call of depth %i", depth);
1556           if (node->count)
1557             {
1558               fprintf (dump_file, " called approx. %.2f times per call",
1559                        (double)curr->count / node->count);
1560             }
1561           fprintf (dump_file, "\n");
1562         }
1563       if (!master_clone)
1564         {
1565           /* We need original clone to copy around.  */
1566           master_clone = node->create_clone (node->decl, node->count,
1567             CGRAPH_FREQ_BASE, false, vNULL,
1568             true, NULL, NULL);
1569           for (e = master_clone->callees; e; e = e->next_callee)
1570             if (!e->inline_failed)
1571               clone_inlined_nodes (e, true, false, NULL, CGRAPH_FREQ_BASE);
1572           curr->redirect_callee (master_clone);
1573           reset_edge_growth_cache (curr);
1574         }
1575
1576       inline_call (curr, false, new_edges, &overall_size, true);
1577       lookup_recursive_calls (node, curr->callee, &heap);
1578       n++;
1579     }
1580
1581   if (!heap.empty () && dump_file)
1582     fprintf (dump_file, "    Recursive inlining growth limit met.\n");
1583
1584   if (!master_clone)
1585     return false;
1586
1587   if (dump_file)
1588     fprintf (dump_file,
1589              "\n   Inlined %i times, "
1590              "body grown from size %i to %i, time %i to %i\n", n,
1591              inline_summaries->get (master_clone)->size, inline_summaries->get (node)->size,
1592              inline_summaries->get (master_clone)->time, inline_summaries->get (node)->time);
1593
1594   /* Remove master clone we used for inlining.  We rely that clones inlined
1595      into master clone gets queued just before master clone so we don't
1596      need recursion.  */
1597   for (node = symtab->first_function (); node != master_clone;
1598        node = next)
1599     {
1600       next = symtab->next_function (node);
1601       if (node->global.inlined_to == master_clone)
1602         node->remove ();
1603     }
1604   master_clone->remove ();
1605   return true;
1606 }
1607
1608
1609 /* Given whole compilation unit estimate of INSNS, compute how large we can
1610    allow the unit to grow.  */
1611
1612 static int
1613 compute_max_insns (int insns)
1614 {
1615   int max_insns = insns;
1616   if (max_insns < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS))
1617     max_insns = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS);
1618
1619   return ((int64_t) max_insns
1620           * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100);
1621 }
1622
1623
1624 /* Compute badness of all edges in NEW_EDGES and add them to the HEAP.  */
1625
1626 static void
1627 add_new_edges_to_heap (edge_heap_t *heap, vec<cgraph_edge *> new_edges)
1628 {
1629   while (new_edges.length () > 0)
1630     {
1631       struct cgraph_edge *edge = new_edges.pop ();
1632
1633       gcc_assert (!edge->aux);
1634       if (edge->inline_failed
1635           && can_inline_edge_p (edge, true)
1636           && want_inline_small_function_p (edge, true))
1637         edge->aux = heap->insert (edge_badness (edge, false), edge);
1638     }
1639 }
1640
1641 /* Remove EDGE from the fibheap.  */
1642
1643 static void
1644 heap_edge_removal_hook (struct cgraph_edge *e, void *data)
1645 {
1646   if (e->aux)
1647     {
1648       ((edge_heap_t *)data)->delete_node ((edge_heap_node_t *)e->aux);
1649       e->aux = NULL;
1650     }
1651 }
1652
1653 /* Return true if speculation of edge E seems useful.
1654    If ANTICIPATE_INLINING is true, be conservative and hope that E
1655    may get inlined.  */
1656
1657 bool
1658 speculation_useful_p (struct cgraph_edge *e, bool anticipate_inlining)
1659 {
1660   enum availability avail;
1661   struct cgraph_node *target = e->callee->ultimate_alias_target (&avail);
1662   struct cgraph_edge *direct, *indirect;
1663   struct ipa_ref *ref;
1664
1665   gcc_assert (e->speculative && !e->indirect_unknown_callee);
1666
1667   if (!e->maybe_hot_p ())
1668     return false;
1669
1670   /* See if IP optimizations found something potentially useful about the
1671      function.  For now we look only for CONST/PURE flags.  Almost everything
1672      else we propagate is useless.  */
1673   if (avail >= AVAIL_AVAILABLE)
1674     {
1675       int ecf_flags = flags_from_decl_or_type (target->decl);
1676       if (ecf_flags & ECF_CONST)
1677         {
1678           e->speculative_call_info (direct, indirect, ref);
1679           if (!(indirect->indirect_info->ecf_flags & ECF_CONST))
1680             return true;
1681         }
1682       else if (ecf_flags & ECF_PURE)
1683         {
1684           e->speculative_call_info (direct, indirect, ref);
1685           if (!(indirect->indirect_info->ecf_flags & ECF_PURE))
1686             return true;
1687         }
1688     }
1689   /* If we did not managed to inline the function nor redirect
1690      to an ipa-cp clone (that are seen by having local flag set),
1691      it is probably pointless to inline it unless hardware is missing
1692      indirect call predictor.  */
1693   if (!anticipate_inlining && e->inline_failed && !target->local.local)
1694     return false;
1695   /* For overwritable targets there is not much to do.  */
1696   if (e->inline_failed && !can_inline_edge_p (e, false, true))
1697     return false;
1698   /* OK, speculation seems interesting.  */
1699   return true;
1700 }
1701
1702 /* We know that EDGE is not going to be inlined.
1703    See if we can remove speculation.  */
1704
1705 static void
1706 resolve_noninline_speculation (edge_heap_t *edge_heap, struct cgraph_edge *edge)
1707 {
1708   if (edge->speculative && !speculation_useful_p (edge, false))
1709     {
1710       struct cgraph_node *node = edge->caller;
1711       struct cgraph_node *where = node->global.inlined_to
1712                                   ? node->global.inlined_to : node;
1713       bitmap updated_nodes = BITMAP_ALLOC (NULL);
1714
1715       spec_rem += edge->count;
1716       edge->resolve_speculation ();
1717       reset_edge_caches (where);
1718       inline_update_overall_summary (where);
1719       update_caller_keys (edge_heap, where,
1720                           updated_nodes, NULL);
1721       update_callee_keys (edge_heap, where,
1722                           updated_nodes);
1723       BITMAP_FREE (updated_nodes);
1724     }
1725 }
1726
1727 /* Return true if NODE should be accounted for overall size estimate.
1728    Skip all nodes optimized for size so we can measure the growth of hot
1729    part of program no matter of the padding.  */
1730
1731 bool
1732 inline_account_function_p (struct cgraph_node *node)
1733 {
1734    return (!DECL_EXTERNAL (node->decl)
1735            && !opt_for_fn (node->decl, optimize_size)
1736            && node->frequency != NODE_FREQUENCY_UNLIKELY_EXECUTED);
1737 }
1738
1739 /* Count number of callers of NODE and store it into DATA (that
1740    points to int.  Worker for cgraph_for_node_and_aliases.  */
1741
1742 static bool
1743 sum_callers (struct cgraph_node *node, void *data)
1744 {
1745   struct cgraph_edge *e;
1746   int *num_calls = (int *)data;
1747
1748   for (e = node->callers; e; e = e->next_caller)
1749     (*num_calls)++;
1750   return false;
1751 }
1752
1753 /* We use greedy algorithm for inlining of small functions:
1754    All inline candidates are put into prioritized heap ordered in
1755    increasing badness.
1756
1757    The inlining of small functions is bounded by unit growth parameters.  */
1758
1759 static void
1760 inline_small_functions (void)
1761 {
1762   struct cgraph_node *node;
1763   struct cgraph_edge *edge;
1764   edge_heap_t edge_heap (sreal::min ());
1765   bitmap updated_nodes = BITMAP_ALLOC (NULL);
1766   int min_size, max_size;
1767   auto_vec<cgraph_edge *> new_indirect_edges;
1768   int initial_size = 0;
1769   struct cgraph_node **order = XCNEWVEC (cgraph_node *, symtab->cgraph_count);
1770   struct cgraph_edge_hook_list *edge_removal_hook_holder;
1771   new_indirect_edges.create (8);
1772
1773   edge_removal_hook_holder
1774     = symtab->add_edge_removal_hook (&heap_edge_removal_hook, &edge_heap);
1775
1776   /* Compute overall unit size and other global parameters used by badness
1777      metrics.  */
1778
1779   max_count = 0;
1780   ipa_reduced_postorder (order, true, true, NULL);
1781   free (order);
1782
1783   FOR_EACH_DEFINED_FUNCTION (node)
1784     if (!node->global.inlined_to)
1785       {
1786         if (!node->alias && node->analyzed
1787             && (node->has_gimple_body_p () || node->thunk.thunk_p))
1788           {
1789             struct inline_summary *info = inline_summaries->get (node);
1790             struct ipa_dfs_info *dfs = (struct ipa_dfs_info *) node->aux;
1791
1792             /* Do not account external functions, they will be optimized out
1793                if not inlined.  Also only count the non-cold portion of program.  */
1794             if (inline_account_function_p (node))
1795               initial_size += info->size;
1796             info->growth = estimate_growth (node);
1797
1798             int num_calls = 0;
1799             node->call_for_symbol_and_aliases (sum_callers, &num_calls,
1800                                                true);
1801             if (num_calls == 1)
1802               info->single_caller = true;
1803             if (dfs && dfs->next_cycle)
1804               {
1805                 struct cgraph_node *n2;
1806                 int id = dfs->scc_no + 1;
1807                 for (n2 = node; n2;
1808                      n2 = ((struct ipa_dfs_info *) node->aux)->next_cycle)
1809                   {
1810                     struct inline_summary *info2 = inline_summaries->get (n2);
1811                     if (info2->scc_no)
1812                       break;
1813                     info2->scc_no = id;
1814                   }
1815               }
1816           }
1817
1818         for (edge = node->callers; edge; edge = edge->next_caller)
1819           if (max_count < edge->count)
1820             max_count = edge->count;
1821       }
1822   ipa_free_postorder_info ();
1823   initialize_growth_caches ();
1824
1825   if (dump_file)
1826     fprintf (dump_file,
1827              "\nDeciding on inlining of small functions.  Starting with size %i.\n",
1828              initial_size);
1829
1830   overall_size = initial_size;
1831   max_size = compute_max_insns (overall_size);
1832   min_size = overall_size;
1833
1834   /* Populate the heap with all edges we might inline.  */
1835
1836   FOR_EACH_DEFINED_FUNCTION (node)
1837     {
1838       bool update = false;
1839       struct cgraph_edge *next = NULL;
1840       bool has_speculative = false;
1841
1842       if (dump_file)
1843         fprintf (dump_file, "Enqueueing calls in %s/%i.\n",
1844                  node->name (), node->order);
1845
1846       for (edge = node->callees; edge; edge = next)
1847         {
1848           next = edge->next_callee;
1849           if (edge->inline_failed
1850               && !edge->aux
1851               && can_inline_edge_p (edge, true)
1852               && want_inline_small_function_p (edge, true)
1853               && edge->inline_failed)
1854             {
1855               gcc_assert (!edge->aux);
1856               update_edge_key (&edge_heap, edge);
1857             }
1858           if (edge->speculative)
1859             has_speculative = true;
1860         }
1861       if (has_speculative)
1862         for (edge = node->callees; edge; edge = next)
1863           if (edge->speculative && !speculation_useful_p (edge,
1864                                                           edge->aux != NULL))
1865             {
1866               edge->resolve_speculation ();
1867               update = true;
1868             }
1869       if (update)
1870         {
1871           struct cgraph_node *where = node->global.inlined_to
1872                                       ? node->global.inlined_to : node;
1873           inline_update_overall_summary (where);
1874           reset_edge_caches (where);
1875           update_caller_keys (&edge_heap, where,
1876                               updated_nodes, NULL);
1877           update_callee_keys (&edge_heap, where,
1878                               updated_nodes);
1879           bitmap_clear (updated_nodes);
1880         }
1881     }
1882
1883   gcc_assert (in_lto_p
1884               || !max_count
1885               || (profile_info && flag_branch_probabilities));
1886
1887   while (!edge_heap.empty ())
1888     {
1889       int old_size = overall_size;
1890       struct cgraph_node *where, *callee;
1891       sreal badness = edge_heap.min_key ();
1892       sreal current_badness;
1893       int growth;
1894
1895       edge = edge_heap.extract_min ();
1896       gcc_assert (edge->aux);
1897       edge->aux = NULL;
1898       if (!edge->inline_failed || !edge->callee->analyzed)
1899         continue;
1900
1901 #ifdef ENABLE_CHECKING
1902       /* Be sure that caches are maintained consistent.  */
1903       sreal cached_badness = edge_badness (edge, false);
1904  
1905       int old_size_est = estimate_edge_size (edge);
1906       int old_time_est = estimate_edge_time (edge);
1907       int old_hints_est = estimate_edge_hints (edge);
1908
1909       reset_edge_growth_cache (edge);
1910       gcc_assert (old_size_est == estimate_edge_size (edge));
1911       gcc_assert (old_time_est == estimate_edge_time (edge));
1912       /* FIXME:
1913
1914          gcc_assert (old_hints_est == estimate_edge_hints (edge));
1915
1916          fails with profile feedback because some hints depends on
1917          maybe_hot_edge_p predicate and because callee gets inlined to other
1918          calls, the edge may become cold.
1919          This ought to be fixed by computing relative probabilities
1920          for given invocation but that will be better done once whole
1921          code is converted to sreals.  Disable for now and revert to "wrong"
1922          value so enable/disable checking paths agree.  */
1923       edge_growth_cache[edge->uid].hints = old_hints_est + 1;
1924
1925       /* When updating the edge costs, we only decrease badness in the keys.
1926          Increases of badness are handled lazilly; when we see key with out
1927          of date value on it, we re-insert it now.  */
1928       current_badness = edge_badness (edge, false);
1929       /* Disable checking for profile because roundoff errors may cause slight
1930          deviations in the order.  */
1931       gcc_assert (max_count || cached_badness == current_badness);
1932       gcc_assert (current_badness >= badness);
1933 #else
1934       current_badness = edge_badness (edge, false);
1935 #endif
1936       if (current_badness != badness)
1937         {
1938           if (edge_heap.min () && current_badness > edge_heap.min_key ())
1939             {
1940               edge->aux = edge_heap.insert (current_badness, edge);
1941               continue;
1942             }
1943           else
1944             badness = current_badness;
1945         }
1946
1947       if (!can_inline_edge_p (edge, true))
1948         {
1949           resolve_noninline_speculation (&edge_heap, edge);
1950           continue;
1951         }
1952       
1953       callee = edge->callee->ultimate_alias_target ();
1954       growth = estimate_edge_growth (edge);
1955       if (dump_file)
1956         {
1957           fprintf (dump_file,
1958                    "\nConsidering %s/%i with %i size\n",
1959                    callee->name (), callee->order,
1960                    inline_summaries->get (callee)->size);
1961           fprintf (dump_file,
1962                    " to be inlined into %s/%i in %s:%i\n"
1963                    " Estimated badness is %f, frequency %.2f.\n",
1964                    edge->caller->name (), edge->caller->order,
1965                    edge->call_stmt
1966                    && (LOCATION_LOCUS (gimple_location ((const_gimple)
1967                                                         edge->call_stmt))
1968                        > BUILTINS_LOCATION)
1969                    ? gimple_filename ((const_gimple) edge->call_stmt)
1970                    : "unknown",
1971                    edge->call_stmt
1972                    ? gimple_lineno ((const_gimple) edge->call_stmt)
1973                    : -1,
1974                    badness.to_double (),
1975                    edge->frequency / (double)CGRAPH_FREQ_BASE);
1976           if (edge->count)
1977             fprintf (dump_file," Called %" PRId64"x\n",
1978                      edge->count);
1979           if (dump_flags & TDF_DETAILS)
1980             edge_badness (edge, true);
1981         }
1982
1983       if (overall_size + growth > max_size
1984           && !DECL_DISREGARD_INLINE_LIMITS (callee->decl))
1985         {
1986           edge->inline_failed = CIF_INLINE_UNIT_GROWTH_LIMIT;
1987           report_inline_failed_reason (edge);
1988           resolve_noninline_speculation (&edge_heap, edge);
1989           continue;
1990         }
1991
1992       if (!want_inline_small_function_p (edge, true))
1993         {
1994           resolve_noninline_speculation (&edge_heap, edge);
1995           continue;
1996         }
1997
1998       /* Heuristics for inlining small functions work poorly for
1999          recursive calls where we do effects similar to loop unrolling.
2000          When inlining such edge seems profitable, leave decision on
2001          specific inliner.  */
2002       if (edge->recursive_p ())
2003         {
2004           where = edge->caller;
2005           if (where->global.inlined_to)
2006             where = where->global.inlined_to;
2007           if (!recursive_inlining (edge,
2008                                    opt_for_fn (edge->caller->decl,
2009                                                flag_indirect_inlining)
2010                                    ? &new_indirect_edges : NULL))
2011             {
2012               edge->inline_failed = CIF_RECURSIVE_INLINING;
2013               resolve_noninline_speculation (&edge_heap, edge);
2014               continue;
2015             }
2016           reset_edge_caches (where);
2017           /* Recursive inliner inlines all recursive calls of the function
2018              at once. Consequently we need to update all callee keys.  */
2019           if (opt_for_fn (edge->caller->decl, flag_indirect_inlining))
2020             add_new_edges_to_heap (&edge_heap, new_indirect_edges);
2021           update_callee_keys (&edge_heap, where, updated_nodes);
2022           bitmap_clear (updated_nodes);
2023         }
2024       else
2025         {
2026           struct cgraph_node *outer_node = NULL;
2027           int depth = 0;
2028
2029           /* Consider the case where self recursive function A is inlined
2030              into B.  This is desired optimization in some cases, since it
2031              leads to effect similar of loop peeling and we might completely
2032              optimize out the recursive call.  However we must be extra
2033              selective.  */
2034
2035           where = edge->caller;
2036           while (where->global.inlined_to)
2037             {
2038               if (where->decl == callee->decl)
2039                 outer_node = where, depth++;
2040               where = where->callers->caller;
2041             }
2042           if (outer_node
2043               && !want_inline_self_recursive_call_p (edge, outer_node,
2044                                                      true, depth))
2045             {
2046               edge->inline_failed
2047                 = (DECL_DISREGARD_INLINE_LIMITS (edge->callee->decl)
2048                    ? CIF_RECURSIVE_INLINING : CIF_UNSPECIFIED);
2049               resolve_noninline_speculation (&edge_heap, edge);
2050               continue;
2051             }
2052           else if (depth && dump_file)
2053             fprintf (dump_file, " Peeling recursion with depth %i\n", depth);
2054
2055           gcc_checking_assert (!callee->global.inlined_to);
2056           inline_call (edge, true, &new_indirect_edges, &overall_size, true);
2057           add_new_edges_to_heap (&edge_heap, new_indirect_edges);
2058
2059           reset_edge_caches (edge->callee->function_symbol ());
2060
2061           update_callee_keys (&edge_heap, where, updated_nodes);
2062         }
2063       where = edge->caller;
2064       if (where->global.inlined_to)
2065         where = where->global.inlined_to;
2066
2067       /* Our profitability metric can depend on local properties
2068          such as number of inlinable calls and size of the function body.
2069          After inlining these properties might change for the function we
2070          inlined into (since it's body size changed) and for the functions
2071          called by function we inlined (since number of it inlinable callers
2072          might change).  */
2073       update_caller_keys (&edge_heap, where, updated_nodes, NULL);
2074       /* Offline copy count has possibly changed, recompute if profile is
2075          available.  */
2076       if (max_count)
2077         {
2078           struct cgraph_node *n = cgraph_node::get (edge->callee->decl);
2079           if (n != edge->callee && n->analyzed)
2080             update_callee_keys (&edge_heap, n, updated_nodes);
2081         }
2082       bitmap_clear (updated_nodes);
2083
2084       if (dump_file)
2085         {
2086           fprintf (dump_file,
2087                    " Inlined into %s which now has time %i and size %i,"
2088                    "net change of %+i.\n",
2089                    edge->caller->name (),
2090                    inline_summaries->get (edge->caller)->time,
2091                    inline_summaries->get (edge->caller)->size,
2092                    overall_size - old_size);
2093         }
2094       if (min_size > overall_size)
2095         {
2096           min_size = overall_size;
2097           max_size = compute_max_insns (min_size);
2098
2099           if (dump_file)
2100             fprintf (dump_file, "New minimal size reached: %i\n", min_size);
2101         }
2102     }
2103
2104   free_growth_caches ();
2105   if (dump_file)
2106     fprintf (dump_file,
2107              "Unit growth for small function inlining: %i->%i (%i%%)\n",
2108              initial_size, overall_size,
2109              initial_size ? overall_size * 100 / (initial_size) - 100: 0);
2110   BITMAP_FREE (updated_nodes);
2111   symtab->remove_edge_removal_hook (edge_removal_hook_holder);
2112 }
2113
2114 /* Flatten NODE.  Performed both during early inlining and
2115    at IPA inlining time.  */
2116
2117 static void
2118 flatten_function (struct cgraph_node *node, bool early)
2119 {
2120   struct cgraph_edge *e;
2121
2122   /* We shouldn't be called recursively when we are being processed.  */
2123   gcc_assert (node->aux == NULL);
2124
2125   node->aux = (void *) node;
2126
2127   for (e = node->callees; e; e = e->next_callee)
2128     {
2129       struct cgraph_node *orig_callee;
2130       struct cgraph_node *callee = e->callee->ultimate_alias_target ();
2131
2132       /* We've hit cycle?  It is time to give up.  */
2133       if (callee->aux)
2134         {
2135           if (dump_file)
2136             fprintf (dump_file,
2137                      "Not inlining %s into %s to avoid cycle.\n",
2138                      xstrdup_for_dump (callee->name ()),
2139                      xstrdup_for_dump (e->caller->name ()));
2140           e->inline_failed = CIF_RECURSIVE_INLINING;
2141           continue;
2142         }
2143
2144       /* When the edge is already inlined, we just need to recurse into
2145          it in order to fully flatten the leaves.  */
2146       if (!e->inline_failed)
2147         {
2148           flatten_function (callee, early);
2149           continue;
2150         }
2151
2152       /* Flatten attribute needs to be processed during late inlining. For
2153          extra code quality we however do flattening during early optimization,
2154          too.  */
2155       if (!early
2156           ? !can_inline_edge_p (e, true)
2157           : !can_early_inline_edge_p (e))
2158         continue;
2159
2160       if (e->recursive_p ())
2161         {
2162           if (dump_file)
2163             fprintf (dump_file, "Not inlining: recursive call.\n");
2164           continue;
2165         }
2166
2167       if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
2168           != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
2169         {
2170           if (dump_file)
2171             fprintf (dump_file, "Not inlining: SSA form does not match.\n");
2172           continue;
2173         }
2174
2175       /* Inline the edge and flatten the inline clone.  Avoid
2176          recursing through the original node if the node was cloned.  */
2177       if (dump_file)
2178         fprintf (dump_file, " Inlining %s into %s.\n",
2179                  xstrdup_for_dump (callee->name ()),
2180                  xstrdup_for_dump (e->caller->name ()));
2181       orig_callee = callee;
2182       inline_call (e, true, NULL, NULL, false);
2183       if (e->callee != orig_callee)
2184         orig_callee->aux = (void *) node;
2185       flatten_function (e->callee, early);
2186       if (e->callee != orig_callee)
2187         orig_callee->aux = NULL;
2188     }
2189
2190   node->aux = NULL;
2191   if (!node->global.inlined_to)
2192     inline_update_overall_summary (node);
2193 }
2194
2195 /* Inline NODE to all callers.  Worker for cgraph_for_node_and_aliases.
2196    DATA points to number of calls originally found so we avoid infinite
2197    recursion.  */
2198
2199 static bool
2200 inline_to_all_callers (struct cgraph_node *node, void *data)
2201 {
2202   int *num_calls = (int *)data;
2203   bool callee_removed = false;
2204
2205   while (node->callers && !node->global.inlined_to)
2206     {
2207       struct cgraph_node *caller = node->callers->caller;
2208
2209       if (!can_inline_edge_p (node->callers, true)
2210           || node->callers->recursive_p ())
2211         {
2212           if (dump_file)
2213             fprintf (dump_file, "Uninlinable call found; giving up.\n");
2214           *num_calls = 0;
2215           return false;
2216         }
2217
2218       if (dump_file)
2219         {
2220           fprintf (dump_file,
2221                    "\nInlining %s size %i.\n",
2222                    node->name (),
2223                    inline_summaries->get (node)->size);
2224           fprintf (dump_file,
2225                    " Called once from %s %i insns.\n",
2226                    node->callers->caller->name (),
2227                    inline_summaries->get (node->callers->caller)->size);
2228         }
2229
2230       inline_call (node->callers, true, NULL, NULL, true, &callee_removed);
2231       if (dump_file)
2232         fprintf (dump_file,
2233                  " Inlined into %s which now has %i size\n",
2234                  caller->name (),
2235                  inline_summaries->get (caller)->size);
2236       if (!(*num_calls)--)
2237         {
2238           if (dump_file)
2239             fprintf (dump_file, "New calls found; giving up.\n");
2240           return callee_removed;
2241         }
2242       if (callee_removed)
2243         return true;
2244     }
2245   return false;
2246 }
2247
2248 /* Output overall time estimate.  */
2249 static void
2250 dump_overall_stats (void)
2251 {
2252   int64_t sum_weighted = 0, sum = 0;
2253   struct cgraph_node *node;
2254
2255   FOR_EACH_DEFINED_FUNCTION (node)
2256     if (!node->global.inlined_to
2257         && !node->alias)
2258       {
2259         int time = inline_summaries->get (node)->time;
2260         sum += time;
2261         sum_weighted += time * node->count;
2262       }
2263   fprintf (dump_file, "Overall time estimate: "
2264            "%" PRId64" weighted by profile: "
2265            "%" PRId64"\n", sum, sum_weighted);
2266 }
2267
2268 /* Output some useful stats about inlining.  */
2269
2270 static void
2271 dump_inline_stats (void)
2272 {
2273   int64_t inlined_cnt = 0, inlined_indir_cnt = 0;
2274   int64_t inlined_virt_cnt = 0, inlined_virt_indir_cnt = 0;
2275   int64_t noninlined_cnt = 0, noninlined_indir_cnt = 0;
2276   int64_t noninlined_virt_cnt = 0, noninlined_virt_indir_cnt = 0;
2277   int64_t  inlined_speculative = 0, inlined_speculative_ply = 0;
2278   int64_t indirect_poly_cnt = 0, indirect_cnt = 0;
2279   int64_t reason[CIF_N_REASONS][3];
2280   int i;
2281   struct cgraph_node *node;
2282
2283   memset (reason, 0, sizeof (reason));
2284   FOR_EACH_DEFINED_FUNCTION (node)
2285   {
2286     struct cgraph_edge *e;
2287     for (e = node->callees; e; e = e->next_callee)
2288       {
2289         if (e->inline_failed)
2290           {
2291             reason[(int) e->inline_failed][0] += e->count;
2292             reason[(int) e->inline_failed][1] += e->frequency;
2293             reason[(int) e->inline_failed][2] ++;
2294             if (DECL_VIRTUAL_P (e->callee->decl))
2295               {
2296                 if (e->indirect_inlining_edge)
2297                   noninlined_virt_indir_cnt += e->count;
2298                 else
2299                   noninlined_virt_cnt += e->count;
2300               }
2301             else
2302               {
2303                 if (e->indirect_inlining_edge)
2304                   noninlined_indir_cnt += e->count;
2305                 else
2306                   noninlined_cnt += e->count;
2307               }
2308           }
2309         else
2310           {
2311             if (e->speculative)
2312               {
2313                 if (DECL_VIRTUAL_P (e->callee->decl))
2314                   inlined_speculative_ply += e->count;
2315                 else
2316                   inlined_speculative += e->count;
2317               }
2318             else if (DECL_VIRTUAL_P (e->callee->decl))
2319               {
2320                 if (e->indirect_inlining_edge)
2321                   inlined_virt_indir_cnt += e->count;
2322                 else
2323                   inlined_virt_cnt += e->count;
2324               }
2325             else
2326               {
2327                 if (e->indirect_inlining_edge)
2328                   inlined_indir_cnt += e->count;
2329                 else
2330                   inlined_cnt += e->count;
2331               }
2332           }
2333       }
2334     for (e = node->indirect_calls; e; e = e->next_callee)
2335       if (e->indirect_info->polymorphic)
2336         indirect_poly_cnt += e->count;
2337       else
2338         indirect_cnt += e->count;
2339   }
2340   if (max_count)
2341     {
2342       fprintf (dump_file,
2343                "Inlined %" PRId64 " + speculative "
2344                "%" PRId64 " + speculative polymorphic "
2345                "%" PRId64 " + previously indirect "
2346                "%" PRId64 " + virtual "
2347                "%" PRId64 " + virtual and previously indirect "
2348                "%" PRId64 "\n" "Not inlined "
2349                "%" PRId64 " + previously indirect "
2350                "%" PRId64 " + virtual "
2351                "%" PRId64 " + virtual and previously indirect "
2352                "%" PRId64 " + stil indirect "
2353                "%" PRId64 " + still indirect polymorphic "
2354                "%" PRId64 "\n", inlined_cnt,
2355                inlined_speculative, inlined_speculative_ply,
2356                inlined_indir_cnt, inlined_virt_cnt, inlined_virt_indir_cnt,
2357                noninlined_cnt, noninlined_indir_cnt, noninlined_virt_cnt,
2358                noninlined_virt_indir_cnt, indirect_cnt, indirect_poly_cnt);
2359       fprintf (dump_file,
2360                "Removed speculations %" PRId64 "\n",
2361                spec_rem);
2362     }
2363   dump_overall_stats ();
2364   fprintf (dump_file, "\nWhy inlining failed?\n");
2365   for (i = 0; i < CIF_N_REASONS; i++)
2366     if (reason[i][2])
2367       fprintf (dump_file, "%-50s: %8i calls, %8i freq, %" PRId64" count\n",
2368                cgraph_inline_failed_string ((cgraph_inline_failed_t) i),
2369                (int) reason[i][2], (int) reason[i][1], reason[i][0]);
2370 }
2371
2372 /* Decide on the inlining.  We do so in the topological order to avoid
2373    expenses on updating data structures.  */
2374
2375 static unsigned int
2376 ipa_inline (void)
2377 {
2378   struct cgraph_node *node;
2379   int nnodes;
2380   struct cgraph_node **order;
2381   int i;
2382   int cold;
2383   bool remove_functions = false;
2384
2385   if (!optimize)
2386     return 0;
2387
2388   cgraph_freq_base_rec = (sreal) 1 / (sreal) CGRAPH_FREQ_BASE;
2389   percent_rec = (sreal) 1 / (sreal) 100;
2390
2391   order = XCNEWVEC (struct cgraph_node *, symtab->cgraph_count);
2392
2393   if (in_lto_p && optimize)
2394     ipa_update_after_lto_read ();
2395
2396   if (dump_file)
2397     dump_inline_summaries (dump_file);
2398
2399   nnodes = ipa_reverse_postorder (order);
2400
2401   FOR_EACH_FUNCTION (node)
2402     {
2403       node->aux = 0;
2404
2405       /* Recompute the default reasons for inlining because they may have
2406          changed during merging.  */
2407       if (in_lto_p)
2408         {
2409           for (cgraph_edge *e = node->callees; e; e = e->next_callee)
2410             {
2411               gcc_assert (e->inline_failed);
2412               initialize_inline_failed (e);
2413             }
2414           for (cgraph_edge *e = node->indirect_calls; e; e = e->next_callee)
2415             initialize_inline_failed (e);
2416         }
2417     }
2418
2419   if (dump_file)
2420     fprintf (dump_file, "\nFlattening functions:\n");
2421
2422   /* In the first pass handle functions to be flattened.  Do this with
2423      a priority so none of our later choices will make this impossible.  */
2424   for (i = nnodes - 1; i >= 0; i--)
2425     {
2426       node = order[i];
2427
2428       /* Handle nodes to be flattened.
2429          Ideally when processing callees we stop inlining at the
2430          entry of cycles, possibly cloning that entry point and
2431          try to flatten itself turning it into a self-recursive
2432          function.  */
2433       if (lookup_attribute ("flatten",
2434                             DECL_ATTRIBUTES (node->decl)) != NULL)
2435         {
2436           if (dump_file)
2437             fprintf (dump_file,
2438                      "Flattening %s\n", node->name ());
2439           flatten_function (node, false);
2440         }
2441     }
2442   if (dump_file)
2443     dump_overall_stats ();
2444
2445   inline_small_functions ();
2446
2447   gcc_assert (symtab->state == IPA_SSA);
2448   symtab->state = IPA_SSA_AFTER_INLINING;
2449   /* Do first after-inlining removal.  We want to remove all "stale" extern
2450      inline functions and virtual functions so we really know what is called
2451      once.  */
2452   symtab->remove_unreachable_nodes (dump_file);
2453   free (order);
2454
2455   /* Inline functions with a property that after inlining into all callers the
2456      code size will shrink because the out-of-line copy is eliminated. 
2457      We do this regardless on the callee size as long as function growth limits
2458      are met.  */
2459   if (dump_file)
2460     fprintf (dump_file,
2461              "\nDeciding on functions to be inlined into all callers and "
2462              "removing useless speculations:\n");
2463
2464   /* Inlining one function called once has good chance of preventing
2465      inlining other function into the same callee.  Ideally we should
2466      work in priority order, but probably inlining hot functions first
2467      is good cut without the extra pain of maintaining the queue.
2468
2469      ??? this is not really fitting the bill perfectly: inlining function
2470      into callee often leads to better optimization of callee due to
2471      increased context for optimization.
2472      For example if main() function calls a function that outputs help
2473      and then function that does the main optmization, we should inline
2474      the second with priority even if both calls are cold by themselves.
2475
2476      We probably want to implement new predicate replacing our use of
2477      maybe_hot_edge interpreted as maybe_hot_edge || callee is known
2478      to be hot.  */
2479   for (cold = 0; cold <= 1; cold ++)
2480     {
2481       FOR_EACH_DEFINED_FUNCTION (node)
2482         {
2483           struct cgraph_edge *edge, *next;
2484           bool update=false;
2485
2486           for (edge = node->callees; edge; edge = next)
2487             {
2488               next = edge->next_callee;
2489               if (edge->speculative && !speculation_useful_p (edge, false))
2490                 {
2491                   edge->resolve_speculation ();
2492                   spec_rem += edge->count;
2493                   update = true;
2494                   remove_functions = true;
2495                 }
2496             }
2497           if (update)
2498             {
2499               struct cgraph_node *where = node->global.inlined_to
2500                                           ? node->global.inlined_to : node;
2501               reset_edge_caches (where);
2502               inline_update_overall_summary (where);
2503             }
2504           if (want_inline_function_to_all_callers_p (node, cold))
2505             {
2506               int num_calls = 0;
2507               node->call_for_symbol_and_aliases (sum_callers, &num_calls,
2508                                                  true);
2509               while (node->call_for_symbol_and_aliases
2510                        (inline_to_all_callers, &num_calls, true))
2511                 ;
2512               remove_functions = true;
2513             }
2514         }
2515     }
2516
2517   /* Free ipa-prop structures if they are no longer needed.  */
2518   if (optimize)
2519     ipa_free_all_structures_after_iinln ();
2520
2521   if (dump_file)
2522     {
2523       fprintf (dump_file,
2524                "\nInlined %i calls, eliminated %i functions\n\n",
2525                ncalls_inlined, nfunctions_inlined);
2526       dump_inline_stats ();
2527     }
2528
2529   if (dump_file)
2530     dump_inline_summaries (dump_file);
2531   /* In WPA we use inline summaries for partitioning process.  */
2532   if (!flag_wpa)
2533     inline_free_summary ();
2534   return remove_functions ? TODO_remove_functions : 0;
2535 }
2536
2537 /* Inline always-inline function calls in NODE.  */
2538
2539 static bool
2540 inline_always_inline_functions (struct cgraph_node *node)
2541 {
2542   struct cgraph_edge *e;
2543   bool inlined = false;
2544
2545   for (e = node->callees; e; e = e->next_callee)
2546     {
2547       struct cgraph_node *callee = e->callee->ultimate_alias_target ();
2548       if (!DECL_DISREGARD_INLINE_LIMITS (callee->decl))
2549         continue;
2550
2551       if (e->recursive_p ())
2552         {
2553           if (dump_file)
2554             fprintf (dump_file, "  Not inlining recursive call to %s.\n",
2555                      e->callee->name ());
2556           e->inline_failed = CIF_RECURSIVE_INLINING;
2557           continue;
2558         }
2559
2560       if (!can_early_inline_edge_p (e))
2561         {
2562           /* Set inlined to true if the callee is marked "always_inline" but
2563              is not inlinable.  This will allow flagging an error later in
2564              expand_call_inline in tree-inline.c.  */
2565           if (lookup_attribute ("always_inline",
2566                                  DECL_ATTRIBUTES (callee->decl)) != NULL)
2567             inlined = true;
2568           continue;
2569         }
2570
2571       if (dump_file)
2572         fprintf (dump_file, "  Inlining %s into %s (always_inline).\n",
2573                  xstrdup_for_dump (e->callee->name ()),
2574                  xstrdup_for_dump (e->caller->name ()));
2575       inline_call (e, true, NULL, NULL, false);
2576       inlined = true;
2577     }
2578   if (inlined)
2579     inline_update_overall_summary (node);
2580
2581   return inlined;
2582 }
2583
2584 /* Decide on the inlining.  We do so in the topological order to avoid
2585    expenses on updating data structures.  */
2586
2587 static bool
2588 early_inline_small_functions (struct cgraph_node *node)
2589 {
2590   struct cgraph_edge *e;
2591   bool inlined = false;
2592
2593   for (e = node->callees; e; e = e->next_callee)
2594     {
2595       struct cgraph_node *callee = e->callee->ultimate_alias_target ();
2596       if (!inline_summaries->get (callee)->inlinable
2597           || !e->inline_failed)
2598         continue;
2599
2600       /* Do not consider functions not declared inline.  */
2601       if (!DECL_DECLARED_INLINE_P (callee->decl)
2602           && !opt_for_fn (node->decl, flag_inline_small_functions)
2603           && !opt_for_fn (node->decl, flag_inline_functions))
2604         continue;
2605
2606       if (dump_file)
2607         fprintf (dump_file, "Considering inline candidate %s.\n",
2608                  callee->name ());
2609
2610       if (!can_early_inline_edge_p (e))
2611         continue;
2612
2613       if (e->recursive_p ())
2614         {
2615           if (dump_file)
2616             fprintf (dump_file, "  Not inlining: recursive call.\n");
2617           continue;
2618         }
2619
2620       if (!want_early_inline_function_p (e))
2621         continue;
2622
2623       if (dump_file)
2624         fprintf (dump_file, " Inlining %s into %s.\n",
2625                  xstrdup_for_dump (callee->name ()),
2626                  xstrdup_for_dump (e->caller->name ()));
2627       inline_call (e, true, NULL, NULL, true);
2628       inlined = true;
2629     }
2630
2631   return inlined;
2632 }
2633
2634 unsigned int
2635 early_inliner (function *fun)
2636 {
2637   struct cgraph_node *node = cgraph_node::get (current_function_decl);
2638   struct cgraph_edge *edge;
2639   unsigned int todo = 0;
2640   int iterations = 0;
2641   bool inlined = false;
2642
2643   if (seen_error ())
2644     return 0;
2645
2646   /* Do nothing if datastructures for ipa-inliner are already computed.  This
2647      happens when some pass decides to construct new function and
2648      cgraph_add_new_function calls lowering passes and early optimization on
2649      it.  This may confuse ourself when early inliner decide to inline call to
2650      function clone, because function clones don't have parameter list in
2651      ipa-prop matching their signature.  */
2652   if (ipa_node_params_sum)
2653     return 0;
2654
2655 #ifdef ENABLE_CHECKING
2656   node->verify ();
2657 #endif
2658   node->remove_all_references ();
2659
2660   /* Rebuild this reference because it dosn't depend on
2661      function's body and it's required to pass cgraph_node
2662      verification.  */
2663   if (node->instrumented_version
2664       && !node->instrumentation_clone)
2665     node->create_reference (node->instrumented_version, IPA_REF_CHKP, NULL);
2666
2667   /* Even when not optimizing or not inlining inline always-inline
2668      functions.  */
2669   inlined = inline_always_inline_functions (node);
2670
2671   if (!optimize
2672       || flag_no_inline
2673       || !flag_early_inlining
2674       /* Never inline regular functions into always-inline functions
2675          during incremental inlining.  This sucks as functions calling
2676          always inline functions will get less optimized, but at the
2677          same time inlining of functions calling always inline
2678          function into an always inline function might introduce
2679          cycles of edges to be always inlined in the callgraph.
2680
2681          We might want to be smarter and just avoid this type of inlining.  */
2682       || (DECL_DISREGARD_INLINE_LIMITS (node->decl)
2683           && lookup_attribute ("always_inline",
2684                                DECL_ATTRIBUTES (node->decl))))
2685     ;
2686   else if (lookup_attribute ("flatten",
2687                              DECL_ATTRIBUTES (node->decl)) != NULL)
2688     {
2689       /* When the function is marked to be flattened, recursively inline
2690          all calls in it.  */
2691       if (dump_file)
2692         fprintf (dump_file,
2693                  "Flattening %s\n", node->name ());
2694       flatten_function (node, true);
2695       inlined = true;
2696     }
2697   else
2698     {
2699       /* If some always_inline functions was inlined, apply the changes.
2700          This way we will not account always inline into growth limits and
2701          moreover we will inline calls from always inlines that we skipped
2702          previously becuase of conditional above.  */
2703       if (inlined)
2704         {
2705           timevar_push (TV_INTEGRATION);
2706           todo |= optimize_inline_calls (current_function_decl);
2707           /* optimize_inline_calls call above might have introduced new
2708              statements that don't have inline parameters computed.  */
2709           for (edge = node->callees; edge; edge = edge->next_callee)
2710             {
2711               if (inline_edge_summary_vec.length () > (unsigned) edge->uid)
2712                 {
2713                   struct inline_edge_summary *es = inline_edge_summary (edge);
2714                   es->call_stmt_size
2715                     = estimate_num_insns (edge->call_stmt, &eni_size_weights);
2716                   es->call_stmt_time
2717                     = estimate_num_insns (edge->call_stmt, &eni_time_weights);
2718                 }
2719             }
2720           inline_update_overall_summary (node);
2721           inlined = false;
2722           timevar_pop (TV_INTEGRATION);
2723         }
2724       /* We iterate incremental inlining to get trivial cases of indirect
2725          inlining.  */
2726       while (iterations < PARAM_VALUE (PARAM_EARLY_INLINER_MAX_ITERATIONS)
2727              && early_inline_small_functions (node))
2728         {
2729           timevar_push (TV_INTEGRATION);
2730           todo |= optimize_inline_calls (current_function_decl);
2731
2732           /* Technically we ought to recompute inline parameters so the new
2733              iteration of early inliner works as expected.  We however have
2734              values approximately right and thus we only need to update edge
2735              info that might be cleared out for newly discovered edges.  */
2736           for (edge = node->callees; edge; edge = edge->next_callee)
2737             {
2738               /* We have no summary for new bound store calls yet.  */
2739               if (inline_edge_summary_vec.length () > (unsigned)edge->uid)
2740                 {
2741                   struct inline_edge_summary *es = inline_edge_summary (edge);
2742                   es->call_stmt_size
2743                     = estimate_num_insns (edge->call_stmt, &eni_size_weights);
2744                   es->call_stmt_time
2745                     = estimate_num_insns (edge->call_stmt, &eni_time_weights);
2746                 }
2747               if (edge->callee->decl
2748                   && !gimple_check_call_matching_types (
2749                       edge->call_stmt, edge->callee->decl, false))
2750                 edge->call_stmt_cannot_inline_p = true;
2751             }
2752           if (iterations < PARAM_VALUE (PARAM_EARLY_INLINER_MAX_ITERATIONS) - 1)
2753             inline_update_overall_summary (node);
2754           timevar_pop (TV_INTEGRATION);
2755           iterations++;
2756           inlined = false;
2757         }
2758       if (dump_file)
2759         fprintf (dump_file, "Iterations: %i\n", iterations);
2760     }
2761
2762   if (inlined)
2763     {
2764       timevar_push (TV_INTEGRATION);
2765       todo |= optimize_inline_calls (current_function_decl);
2766       timevar_pop (TV_INTEGRATION);
2767     }
2768
2769   fun->always_inline_functions_inlined = true;
2770
2771   return todo;
2772 }
2773
2774 /* Do inlining of small functions.  Doing so early helps profiling and other
2775    passes to be somewhat more effective and avoids some code duplication in
2776    later real inlining pass for testcases with very many function calls.  */
2777
2778 namespace {
2779
2780 const pass_data pass_data_early_inline =
2781 {
2782   GIMPLE_PASS, /* type */
2783   "einline", /* name */
2784   OPTGROUP_INLINE, /* optinfo_flags */
2785   TV_EARLY_INLINING, /* tv_id */
2786   PROP_ssa, /* properties_required */
2787   0, /* properties_provided */
2788   0, /* properties_destroyed */
2789   0, /* todo_flags_start */
2790   0, /* todo_flags_finish */
2791 };
2792
2793 class pass_early_inline : public gimple_opt_pass
2794 {
2795 public:
2796   pass_early_inline (gcc::context *ctxt)
2797     : gimple_opt_pass (pass_data_early_inline, ctxt)
2798   {}
2799
2800   /* opt_pass methods: */
2801   virtual unsigned int execute (function *);
2802
2803 }; // class pass_early_inline
2804
2805 unsigned int
2806 pass_early_inline::execute (function *fun)
2807 {
2808   return early_inliner (fun);
2809 }
2810
2811 } // anon namespace
2812
2813 gimple_opt_pass *
2814 make_pass_early_inline (gcc::context *ctxt)
2815 {
2816   return new pass_early_inline (ctxt);
2817 }
2818
2819 namespace {
2820
2821 const pass_data pass_data_ipa_inline =
2822 {
2823   IPA_PASS, /* type */
2824   "inline", /* name */
2825   OPTGROUP_INLINE, /* optinfo_flags */
2826   TV_IPA_INLINING, /* tv_id */
2827   0, /* properties_required */
2828   0, /* properties_provided */
2829   0, /* properties_destroyed */
2830   0, /* todo_flags_start */
2831   ( TODO_dump_symtab ), /* todo_flags_finish */
2832 };
2833
2834 class pass_ipa_inline : public ipa_opt_pass_d
2835 {
2836 public:
2837   pass_ipa_inline (gcc::context *ctxt)
2838     : ipa_opt_pass_d (pass_data_ipa_inline, ctxt,
2839                       inline_generate_summary, /* generate_summary */
2840                       inline_write_summary, /* write_summary */
2841                       inline_read_summary, /* read_summary */
2842                       NULL, /* write_optimization_summary */
2843                       NULL, /* read_optimization_summary */
2844                       NULL, /* stmt_fixup */
2845                       0, /* function_transform_todo_flags_start */
2846                       inline_transform, /* function_transform */
2847                       NULL) /* variable_transform */
2848   {}
2849
2850   /* opt_pass methods: */
2851   virtual unsigned int execute (function *) { return ipa_inline (); }
2852
2853 }; // class pass_ipa_inline
2854
2855 } // anon namespace
2856
2857 ipa_opt_pass_d *
2858 make_pass_ipa_inline (gcc::context *ctxt)
2859 {
2860   return new pass_ipa_inline (ctxt);
2861 }