OSDN Git Service

2011-08-17 Richard Guenther <rguenther@suse.de>
[pf3gnuchains/gcc-fork.git] / gcc / ipa-inline.c
1 /* Inlining decision heuristics.
2    Copyright (C) 2003, 2004, 2007, 2008, 2009, 2010, 2011
3    Free Software Foundation, Inc.
4    Contributed by Jan Hubicka
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 /*  Inlining decision heuristics
23
24     The implementation of inliner is organized as follows:
25
26     inlining heuristics limits
27
28       can_inline_edge_p allow to check that particular inlining is allowed
29       by the limits specified by user (allowed function growth, growth and so
30       on).
31
32       Functions are inlined when it is obvious the result is profitable (such
33       as functions called once or when inlining reduce code size).
34       In addition to that we perform inlining of small functions and recursive
35       inlining.
36
37     inlining heuristics
38
39        The inliner itself is split into two passes:
40
41        pass_early_inlining
42
43          Simple local inlining pass inlining callees into current function.
44          This pass makes no use of whole unit analysis and thus it can do only
45          very simple decisions based on local properties.
46
47          The strength of the pass is that it is run in topological order
48          (reverse postorder) on the callgraph. Functions are converted into SSA
49          form just before this pass and optimized subsequently. As a result, the
50          callees of the function seen by the early inliner was already optimized
51          and results of early inlining adds a lot of optimization opportunities
52          for the local optimization.
53
54          The pass handle the obvious inlining decisions within the compilation
55          unit - inlining auto inline functions, inlining for size and
56          flattening.
57
58          main strength of the pass is the ability to eliminate abstraction
59          penalty in C++ code (via combination of inlining and early
60          optimization) and thus improve quality of analysis done by real IPA
61          optimizers.
62
63          Because of lack of whole unit knowledge, the pass can not really make
64          good code size/performance tradeoffs.  It however does very simple
65          speculative inlining allowing code size to grow by
66          EARLY_INLINING_INSNS when callee is leaf function.  In this case the
67          optimizations performed later are very likely to eliminate the cost.
68
69        pass_ipa_inline
70
71          This is the real inliner able to handle inlining with whole program
72          knowledge. It performs following steps:
73
74          1) inlining of small functions.  This is implemented by greedy
75          algorithm ordering all inlinable cgraph edges by their badness and
76          inlining them in this order as long as inline limits allows doing so.
77
78          This heuristics is not very good on inlining recursive calls. Recursive
79          calls can be inlined with results similar to loop unrolling. To do so,
80          special purpose recursive inliner is executed on function when
81          recursive edge is met as viable candidate.
82
83          2) Unreachable functions are removed from callgraph.  Inlining leads
84          to devirtualization and other modification of callgraph so functions
85          may become unreachable during the process. Also functions declared as
86          extern inline or virtual functions are removed, since after inlining
87          we no longer need the offline bodies.
88
89          3) Functions called once and not exported from the unit are inlined.
90          This should almost always lead to reduction of code size by eliminating
91          the need for offline copy of the function.  */
92
93 #include "config.h"
94 #include "system.h"
95 #include "coretypes.h"
96 #include "tm.h"
97 #include "tree.h"
98 #include "tree-inline.h"
99 #include "langhooks.h"
100 #include "flags.h"
101 #include "cgraph.h"
102 #include "diagnostic.h"
103 #include "gimple-pretty-print.h"
104 #include "timevar.h"
105 #include "params.h"
106 #include "fibheap.h"
107 #include "intl.h"
108 #include "tree-pass.h"
109 #include "coverage.h"
110 #include "ggc.h"
111 #include "rtl.h"
112 #include "tree-flow.h"
113 #include "ipa-prop.h"
114 #include "except.h"
115 #include "target.h"
116 #include "ipa-inline.h"
117 #include "ipa-utils.h"
118
119 /* Statistics we collect about inlining algorithm.  */
120 static int overall_size;
121 static gcov_type max_count;
122
123 /* Return false when inlining edge E would lead to violating
124    limits on function unit growth or stack usage growth.  
125
126    The relative function body growth limit is present generally
127    to avoid problems with non-linear behavior of the compiler.
128    To allow inlining huge functions into tiny wrapper, the limit
129    is always based on the bigger of the two functions considered.
130
131    For stack growth limits we always base the growth in stack usage
132    of the callers.  We want to prevent applications from segfaulting
133    on stack overflow when functions with huge stack frames gets
134    inlined. */
135
136 static bool
137 caller_growth_limits (struct cgraph_edge *e)
138 {
139   struct cgraph_node *to = e->caller;
140   struct cgraph_node *what = cgraph_function_or_thunk_node (e->callee, NULL);
141   int newsize;
142   int limit = 0;
143   HOST_WIDE_INT stack_size_limit = 0, inlined_stack;
144   struct inline_summary *info, *what_info, *outer_info = inline_summary (to);
145
146   /* Look for function e->caller is inlined to.  While doing
147      so work out the largest function body on the way.  As
148      described above, we want to base our function growth
149      limits based on that.  Not on the self size of the
150      outer function, not on the self size of inline code
151      we immediately inline to.  This is the most relaxed
152      interpretation of the rule "do not grow large functions
153      too much in order to prevent compiler from exploding".  */
154   while (true)
155     {
156       info = inline_summary (to);
157       if (limit < info->self_size)
158         limit = info->self_size;
159       if (stack_size_limit < info->estimated_self_stack_size)
160         stack_size_limit = info->estimated_self_stack_size;
161       if (to->global.inlined_to)
162         to = to->callers->caller;
163       else
164         break;
165     }
166
167   what_info = inline_summary (what);
168
169   if (limit < what_info->self_size)
170     limit = what_info->self_size;
171
172   limit += limit * PARAM_VALUE (PARAM_LARGE_FUNCTION_GROWTH) / 100;
173
174   /* Check the size after inlining against the function limits.  But allow
175      the function to shrink if it went over the limits by forced inlining.  */
176   newsize = estimate_size_after_inlining (to, e);
177   if (newsize >= info->size
178       && newsize > PARAM_VALUE (PARAM_LARGE_FUNCTION_INSNS)
179       && newsize > limit)
180     {
181       e->inline_failed = CIF_LARGE_FUNCTION_GROWTH_LIMIT;
182       return false;
183     }
184
185   if (!what_info->estimated_stack_size)
186     return true;
187
188   /* FIXME: Stack size limit often prevents inlining in Fortran programs
189      due to large i/o datastructures used by the Fortran front-end.
190      We ought to ignore this limit when we know that the edge is executed
191      on every invocation of the caller (i.e. its call statement dominates
192      exit block).  We do not track this information, yet.  */
193   stack_size_limit += ((gcov_type)stack_size_limit
194                        * PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) / 100);
195
196   inlined_stack = (outer_info->stack_frame_offset
197                    + outer_info->estimated_self_stack_size
198                    + what_info->estimated_stack_size);
199   /* Check new stack consumption with stack consumption at the place
200      stack is used.  */
201   if (inlined_stack > stack_size_limit
202       /* If function already has large stack usage from sibling
203          inline call, we can inline, too.
204          This bit overoptimistically assume that we are good at stack
205          packing.  */
206       && inlined_stack > info->estimated_stack_size
207       && inlined_stack > PARAM_VALUE (PARAM_LARGE_STACK_FRAME))
208     {
209       e->inline_failed = CIF_LARGE_STACK_FRAME_GROWTH_LIMIT;
210       return false;
211     }
212   return true;
213 }
214
215 /* Dump info about why inlining has failed.  */
216
217 static void
218 report_inline_failed_reason (struct cgraph_edge *e)
219 {
220   if (dump_file)
221     {
222       fprintf (dump_file, "  not inlinable: %s/%i -> %s/%i, %s\n",
223                cgraph_node_name (e->caller), e->caller->uid,
224                cgraph_node_name (e->callee), e->callee->uid,
225                cgraph_inline_failed_string (e->inline_failed));
226     }
227 }
228
229 /* Decide if we can inline the edge and possibly update
230    inline_failed reason.  
231    We check whether inlining is possible at all and whether
232    caller growth limits allow doing so.  
233
234    if REPORT is true, output reason to the dump file.  */
235
236 static bool
237 can_inline_edge_p (struct cgraph_edge *e, bool report)
238 {
239   bool inlinable = true;
240   enum availability avail;
241   struct cgraph_node *callee
242     = cgraph_function_or_thunk_node (e->callee, &avail);
243   tree caller_tree = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (e->caller->decl);
244   tree callee_tree
245     = callee ? DECL_FUNCTION_SPECIFIC_OPTIMIZATION (callee->decl) : NULL;
246   struct function *caller_cfun = DECL_STRUCT_FUNCTION (e->caller->decl);
247   struct function *callee_cfun
248     = callee ? DECL_STRUCT_FUNCTION (callee->decl) : NULL;
249
250   if (!caller_cfun && e->caller->clone_of)
251     caller_cfun = DECL_STRUCT_FUNCTION (e->caller->clone_of->decl);
252
253   if (!callee_cfun && callee && callee->clone_of)
254     callee_cfun = DECL_STRUCT_FUNCTION (callee->clone_of->decl);
255
256   gcc_assert (e->inline_failed);
257
258   if (!callee || !callee->analyzed)
259     {
260       e->inline_failed = CIF_BODY_NOT_AVAILABLE;
261       inlinable = false;
262     }
263   else if (!inline_summary (callee)->inlinable)
264     {
265       e->inline_failed = CIF_FUNCTION_NOT_INLINABLE;
266       inlinable = false;
267     }
268   else if (avail <= AVAIL_OVERWRITABLE)
269     {
270       e->inline_failed = CIF_OVERWRITABLE;
271       return false;
272     }
273   else if (e->call_stmt_cannot_inline_p)
274     {
275       e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
276       inlinable = false;
277     }
278   /* Don't inline if the functions have different EH personalities.  */
279   else if (DECL_FUNCTION_PERSONALITY (e->caller->decl)
280            && DECL_FUNCTION_PERSONALITY (callee->decl)
281            && (DECL_FUNCTION_PERSONALITY (e->caller->decl)
282                != DECL_FUNCTION_PERSONALITY (callee->decl)))
283     {
284       e->inline_failed = CIF_EH_PERSONALITY;
285       inlinable = false;
286     }
287   /* Don't inline if the callee can throw non-call exceptions but the
288      caller cannot.
289      FIXME: this is obviously wrong for LTO where STRUCT_FUNCTION is missing.
290      Move the flag into cgraph node or mirror it in the inline summary.  */
291   else if (callee_cfun && callee_cfun->can_throw_non_call_exceptions
292            && !(caller_cfun && caller_cfun->can_throw_non_call_exceptions))
293     {
294       e->inline_failed = CIF_NON_CALL_EXCEPTIONS;
295       inlinable = false;
296     }
297   /* Check compatibility of target optimization options.  */
298   else if (!targetm.target_option.can_inline_p (e->caller->decl,
299                                                 callee->decl))
300     {
301       e->inline_failed = CIF_TARGET_OPTION_MISMATCH;
302       inlinable = false;
303     }
304   /* Check if caller growth allows the inlining.  */
305   else if (!DECL_DISREGARD_INLINE_LIMITS (callee->decl)
306            && !lookup_attribute ("flatten",
307                                  DECL_ATTRIBUTES
308                                    (e->caller->global.inlined_to
309                                     ? e->caller->global.inlined_to->decl
310                                     : e->caller->decl))
311            && !caller_growth_limits (e))
312     inlinable = false;
313   /* Don't inline a function with a higher optimization level than the
314      caller.  FIXME: this is really just tip of iceberg of handling
315      optimization attribute.  */
316   else if (caller_tree != callee_tree)
317     {
318       struct cl_optimization *caller_opt
319         = TREE_OPTIMIZATION ((caller_tree)
320                              ? caller_tree
321                              : optimization_default_node);
322
323       struct cl_optimization *callee_opt
324         = TREE_OPTIMIZATION ((callee_tree)
325                              ? callee_tree
326                              : optimization_default_node);
327
328       if (((caller_opt->x_optimize > callee_opt->x_optimize)
329            || (caller_opt->x_optimize_size != callee_opt->x_optimize_size))
330           /* gcc.dg/pr43564.c.  Look at forced inline even in -O0.  */
331           && !DECL_DISREGARD_INLINE_LIMITS (e->callee->decl))
332         {
333           e->inline_failed = CIF_OPTIMIZATION_MISMATCH;
334           inlinable = false;
335         }
336     }
337
338   /* Be sure that the cannot_inline_p flag is up to date.  */
339   gcc_checking_assert (!e->call_stmt
340                        || (gimple_call_cannot_inline_p (e->call_stmt)
341                            == e->call_stmt_cannot_inline_p)
342                        /* In -flto-partition=none mode we really keep things out of
343                           sync because call_stmt_cannot_inline_p is set at cgraph
344                           merging when function bodies are not there yet.  */
345                        || (in_lto_p && !gimple_call_cannot_inline_p (e->call_stmt)));
346   if (!inlinable && report)
347     report_inline_failed_reason (e);
348   return inlinable;
349 }
350
351
352 /* Return true if the edge E is inlinable during early inlining.  */
353
354 static bool
355 can_early_inline_edge_p (struct cgraph_edge *e)
356 {
357   struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee,
358                                                               NULL);
359   /* Early inliner might get called at WPA stage when IPA pass adds new
360      function.  In this case we can not really do any of early inlining
361      because function bodies are missing.  */
362   if (!gimple_has_body_p (callee->decl))
363     {
364       e->inline_failed = CIF_BODY_NOT_AVAILABLE;
365       return false;
366     }
367   /* In early inliner some of callees may not be in SSA form yet
368      (i.e. the callgraph is cyclic and we did not process
369      the callee by early inliner, yet).  We don't have CIF code for this
370      case; later we will re-do the decision in the real inliner.  */
371   if (!gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->caller->decl))
372       || !gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
373     {
374       if (dump_file)
375         fprintf (dump_file, "  edge not inlinable: not in SSA form\n");
376       return false;
377     }
378   if (!can_inline_edge_p (e, true))
379     return false;
380   return true;
381 }
382
383
384 /* Return true when N is leaf function.  Accept cheap builtins
385    in leaf functions.  */
386
387 static bool
388 leaf_node_p (struct cgraph_node *n)
389 {
390   struct cgraph_edge *e;
391   for (e = n->callees; e; e = e->next_callee)
392     if (!is_inexpensive_builtin (e->callee->decl))
393       return false;
394   return true;
395 }
396
397
398 /* Return true if we are interested in inlining small function.  */
399
400 static bool
401 want_early_inline_function_p (struct cgraph_edge *e)
402 {
403   bool want_inline = true;
404   struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
405
406   if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
407     ;
408   else if (!DECL_DECLARED_INLINE_P (callee->decl)
409            && !flag_inline_small_functions)
410     {
411       e->inline_failed = CIF_FUNCTION_NOT_INLINE_CANDIDATE;
412       report_inline_failed_reason (e);
413       want_inline = false;
414     }
415   else
416     {
417       int growth = estimate_edge_growth (e);
418       if (growth <= 0)
419         ;
420       else if (!cgraph_maybe_hot_edge_p (e)
421                && growth > 0)
422         {
423           if (dump_file)
424             fprintf (dump_file, "  will not early inline: %s/%i->%s/%i, "
425                      "call is cold and code would grow by %i\n",
426                      cgraph_node_name (e->caller), e->caller->uid,
427                      cgraph_node_name (callee), callee->uid,
428                      growth);
429           want_inline = false;
430         }
431       else if (!leaf_node_p (callee)
432                && growth > 0)
433         {
434           if (dump_file)
435             fprintf (dump_file, "  will not early inline: %s/%i->%s/%i, "
436                      "callee is not leaf and code would grow by %i\n",
437                      cgraph_node_name (e->caller), e->caller->uid,
438                      cgraph_node_name (callee), callee->uid,
439                      growth);
440           want_inline = false;
441         }
442       else if (growth > PARAM_VALUE (PARAM_EARLY_INLINING_INSNS))
443         {
444           if (dump_file)
445             fprintf (dump_file, "  will not early inline: %s/%i->%s/%i, "
446                      "growth %i exceeds --param early-inlining-insns\n",
447                      cgraph_node_name (e->caller), e->caller->uid,
448                      cgraph_node_name (callee), callee->uid,
449                      growth);
450           want_inline = false;
451         }
452     }
453   return want_inline;
454 }
455
456 /* Return true if we are interested in inlining small function.
457    When REPORT is true, report reason to dump file.  */
458
459 static bool
460 want_inline_small_function_p (struct cgraph_edge *e, bool report)
461 {
462   bool want_inline = true;
463   struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
464
465   if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
466     ;
467   else if (!DECL_DECLARED_INLINE_P (callee->decl)
468            && !flag_inline_small_functions)
469     {
470       e->inline_failed = CIF_FUNCTION_NOT_INLINE_CANDIDATE;
471       want_inline = false;
472     }
473   else
474     {
475       int growth = estimate_edge_growth (e);
476
477       if (growth <= 0)
478         ;
479       else if (DECL_DECLARED_INLINE_P (callee->decl)
480                && growth >= MAX_INLINE_INSNS_SINGLE)
481         {
482           e->inline_failed = CIF_MAX_INLINE_INSNS_SINGLE_LIMIT;
483           want_inline = false;
484         }
485       else if (!DECL_DECLARED_INLINE_P (callee->decl)
486                && !flag_inline_functions)
487         {
488           e->inline_failed = CIF_NOT_DECLARED_INLINED;
489           want_inline = false;
490         }
491       else if (!DECL_DECLARED_INLINE_P (callee->decl)
492                && growth >= MAX_INLINE_INSNS_AUTO)
493         {
494           e->inline_failed = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
495           want_inline = false;
496         }
497       /* If call is cold, do not inline when function body would grow.
498          Still inline when the overall unit size will shrink because the offline
499          copy of function being eliminated.
500
501          This is slightly wrong on aggressive side:  it is entirely possible
502          that function is called many times with a context where inlining
503          reduces code size and few times with a context where inlining increase
504          code size.  Resoluting growth estimate will be negative even if it
505          would make more sense to keep offline copy and do not inline into the
506          call sites that makes the code size grow.  
507
508          When badness orders the calls in a way that code reducing calls come
509          first, this situation is not a problem at all: after inlining all
510          "good" calls, we will realize that keeping the function around is
511          better.  */
512       else if (!cgraph_maybe_hot_edge_p (e)
513                && (DECL_EXTERNAL (callee->decl)
514
515                    /* Unlike for functions called once, we play unsafe with
516                       COMDATs.  We can allow that since we know functions
517                       in consideration are small (and thus risk is small) and
518                       moreover grow estimates already accounts that COMDAT
519                       functions may or may not disappear when eliminated from
520                       current unit. With good probability making aggressive
521                       choice in all units is going to make overall program
522                       smaller.
523
524                       Consequently we ask cgraph_can_remove_if_no_direct_calls_p
525                       instead of
526                       cgraph_will_be_removed_from_program_if_no_direct_calls  */
527
528                    || !cgraph_can_remove_if_no_direct_calls_p (callee)
529                    || estimate_growth (callee) > 0))
530         {
531           e->inline_failed = CIF_UNLIKELY_CALL;
532           want_inline = false;
533         }
534     }
535   if (!want_inline && report)
536     report_inline_failed_reason (e);
537   return want_inline;
538 }
539
540 /* EDGE is self recursive edge.
541    We hand two cases - when function A is inlining into itself
542    or when function A is being inlined into another inliner copy of function
543    A within function B.  
544
545    In first case OUTER_NODE points to the toplevel copy of A, while
546    in the second case OUTER_NODE points to the outermost copy of A in B.
547
548    In both cases we want to be extra selective since
549    inlining the call will just introduce new recursive calls to appear.  */
550
551 static bool
552 want_inline_self_recursive_call_p (struct cgraph_edge *edge,
553                                    struct cgraph_node *outer_node,
554                                    bool peeling,
555                                    int depth)
556 {
557   char const *reason = NULL;
558   bool want_inline = true;
559   int caller_freq = CGRAPH_FREQ_BASE;
560   int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO);
561
562   if (DECL_DECLARED_INLINE_P (edge->caller->decl))
563     max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH);
564
565   if (!cgraph_maybe_hot_edge_p (edge))
566     {
567       reason = "recursive call is cold";
568       want_inline = false;
569     }
570   else if (max_count && !outer_node->count)
571     {
572       reason = "not executed in profile";
573       want_inline = false;
574     }
575   else if (depth > max_depth)
576     {
577       reason = "--param max-inline-recursive-depth exceeded.";
578       want_inline = false;
579     }
580
581   if (outer_node->global.inlined_to)
582     caller_freq = outer_node->callers->frequency;
583
584   if (!want_inline)
585     ;
586   /* Inlining of self recursive function into copy of itself within other function
587      is transformation similar to loop peeling.
588
589      Peeling is profitable if we can inline enough copies to make probability
590      of actual call to the self recursive function very small.  Be sure that
591      the probability of recursion is small.
592
593      We ensure that the frequency of recursing is at most 1 - (1/max_depth).
594      This way the expected number of recision is at most max_depth.  */
595   else if (peeling)
596     {
597       int max_prob = CGRAPH_FREQ_BASE - ((CGRAPH_FREQ_BASE + max_depth - 1)
598                                          / max_depth);
599       int i;
600       for (i = 1; i < depth; i++)
601         max_prob = max_prob * max_prob / CGRAPH_FREQ_BASE;
602       if (max_count
603           && (edge->count * CGRAPH_FREQ_BASE / outer_node->count
604               >= max_prob))
605         {
606           reason = "profile of recursive call is too large";
607           want_inline = false;
608         }
609       if (!max_count
610           && (edge->frequency * CGRAPH_FREQ_BASE / caller_freq
611               >= max_prob))
612         {
613           reason = "frequency of recursive call is too large";
614           want_inline = false;
615         }
616     }
617   /* Recursive inlining, i.e. equivalent of unrolling, is profitable if recursion
618      depth is large.  We reduce function call overhead and increase chances that
619      things fit in hardware return predictor.
620
621      Recursive inlining might however increase cost of stack frame setup
622      actually slowing down functions whose recursion tree is wide rather than
623      deep.
624
625      Deciding reliably on when to do recursive inlining without profile feedback
626      is tricky.  For now we disable recursive inlining when probability of self
627      recursion is low. 
628
629      Recursive inlining of self recursive call within loop also results in large loop
630      depths that generally optimize badly.  We may want to throttle down inlining
631      in those cases.  In particular this seems to happen in one of libstdc++ rb tree
632      methods.  */
633   else
634     {
635       if (max_count
636           && (edge->count * 100 / outer_node->count
637               <= PARAM_VALUE (PARAM_MIN_INLINE_RECURSIVE_PROBABILITY)))
638         {
639           reason = "profile of recursive call is too small";
640           want_inline = false;
641         }
642       else if (!max_count
643                && (edge->frequency * 100 / caller_freq
644                    <= PARAM_VALUE (PARAM_MIN_INLINE_RECURSIVE_PROBABILITY)))
645         {
646           reason = "frequency of recursive call is too small";
647           want_inline = false;
648         }
649     }
650   if (!want_inline && dump_file)
651     fprintf (dump_file, "   not inlining recursively: %s\n", reason);
652   return want_inline;
653 }
654
655 /* Return true when NODE has caller other than EDGE. 
656    Worker for cgraph_for_node_and_aliases.  */
657
658 static bool
659 check_caller_edge (struct cgraph_node *node, void *edge)
660 {
661   return (node->callers
662           && node->callers != edge);
663 }
664
665
666 /* Decide if NODE is called once inlining it would eliminate need
667    for the offline copy of function.  */
668
669 static bool
670 want_inline_function_called_once_p (struct cgraph_node *node)
671 {
672    struct cgraph_node *function = cgraph_function_or_thunk_node (node, NULL);
673    /* Already inlined?  */
674    if (function->global.inlined_to)
675      return false;
676    /* Zero or more then one callers?  */
677    if (!node->callers
678        || node->callers->next_caller)
679      return false;
680    /* Maybe other aliases has more direct calls.  */
681    if (cgraph_for_node_and_aliases (node, check_caller_edge, node->callers, true))
682      return false;
683    /* Recursive call makes no sense to inline.  */
684    if (cgraph_edge_recursive_p (node->callers))
685      return false;
686    /* External functions are not really in the unit, so inlining
687       them when called once would just increase the program size.  */
688    if (DECL_EXTERNAL (function->decl))
689      return false;
690    /* Offline body must be optimized out.  */
691    if (!cgraph_will_be_removed_from_program_if_no_direct_calls (function))
692      return false;
693    if (!can_inline_edge_p (node->callers, true))
694      return false;
695    return true;
696 }
697
698
699 /* Return relative time improvement for inlining EDGE in range
700    1...2^9.  */
701
702 static inline int
703 relative_time_benefit (struct inline_summary *callee_info,
704                        struct cgraph_edge *edge,
705                        int time_growth)
706 {
707   int relbenefit;
708   gcov_type uninlined_call_time;
709
710   uninlined_call_time =
711     ((gcov_type)
712      (callee_info->time
713       + inline_edge_summary (edge)->call_stmt_time
714       + CGRAPH_FREQ_BASE / 2) * edge->frequency
715      / CGRAPH_FREQ_BASE);
716   /* Compute relative time benefit, i.e. how much the call becomes faster.
717      ??? perhaps computing how much the caller+calle together become faster
718      would lead to more realistic results.  */
719   if (!uninlined_call_time)
720     uninlined_call_time = 1;
721   relbenefit =
722     (uninlined_call_time - time_growth) * 256 / (uninlined_call_time);
723   relbenefit = MIN (relbenefit, 512);
724   relbenefit = MAX (relbenefit, 1);
725   return relbenefit;
726 }
727
728
729 /* A cost model driving the inlining heuristics in a way so the edges with
730    smallest badness are inlined first.  After each inlining is performed
731    the costs of all caller edges of nodes affected are recomputed so the
732    metrics may accurately depend on values such as number of inlinable callers
733    of the function or function body size.  */
734
735 static int
736 edge_badness (struct cgraph_edge *edge, bool dump)
737 {
738   gcov_type badness;
739   int growth, time_growth;
740   struct cgraph_node *callee = cgraph_function_or_thunk_node (edge->callee,
741                                                               NULL);
742   struct inline_summary *callee_info = inline_summary (callee);
743
744   if (DECL_DISREGARD_INLINE_LIMITS (callee->decl))
745     return INT_MIN;
746
747   growth = estimate_edge_growth (edge);
748   time_growth = estimate_edge_time (edge);
749
750   if (dump)
751     {
752       fprintf (dump_file, "    Badness calculation for %s -> %s\n",
753                cgraph_node_name (edge->caller),
754                cgraph_node_name (callee));
755       fprintf (dump_file, "      size growth %i, time growth %i\n",
756                growth,
757                time_growth);
758     }
759
760   /* Always prefer inlining saving code size.  */
761   if (growth <= 0)
762     {
763       badness = INT_MIN / 2 + growth;
764       if (dump)
765         fprintf (dump_file, "      %i: Growth %i <= 0\n", (int) badness,
766                  growth);
767     }
768
769   /* When profiling is available, compute badness as:
770
771                 relative_edge_count * relative_time_benefit
772      goodness = -------------------------------------------
773                 edge_growth
774      badness = -goodness  
775
776     The fraction is upside down, becuase on edge counts and time beneits
777     the bounds are known. Edge growth is essentially unlimited.  */
778
779   else if (max_count)
780     {
781       int relbenefit = relative_time_benefit (callee_info, edge, time_growth);
782       badness =
783         ((int)
784          ((double) edge->count * INT_MIN / 2 / max_count / 512) *
785          relative_time_benefit (callee_info, edge, time_growth)) / growth;
786       
787       /* Be sure that insanity of the profile won't lead to increasing counts
788          in the scalling and thus to overflow in the computation above.  */
789       gcc_assert (max_count >= edge->count);
790       if (dump)
791         {
792           fprintf (dump_file,
793                    "      %i (relative %f): profile info. Relative count %f"
794                    " * Relative benefit %f\n",
795                    (int) badness, (double) badness / INT_MIN,
796                    (double) edge->count / max_count,
797                    relbenefit * 100 / 256.0);
798         }
799     }
800
801   /* When function local profile is available. Compute badness as:
802
803      
804                growth_of_callee
805      badness = -------------------------------------- + growth_for-all
806                relative_time_benefit * edge_frequency
807
808   */
809   else if (flag_guess_branch_prob)
810     {
811       int div = edge->frequency * (1<<10) / CGRAPH_FREQ_MAX;
812       int growth_for_all;
813
814       div = MAX (div, 1);
815       gcc_checking_assert (edge->frequency <= CGRAPH_FREQ_MAX);
816       div *= relative_time_benefit (callee_info, edge, time_growth);
817
818       /* frequency is normalized in range 1...2^10.
819          relbenefit in range 1...2^9
820          DIV should be in range 1....2^19.  */
821       gcc_checking_assert (div >= 1 && div <= (1<<19));
822
823       /* Result must be integer in range 0...INT_MAX.
824          Set the base of fixed point calculation so we don't lose much of
825          precision for small bandesses (those are interesting) yet we don't
826          overflow for growths that are still in interesting range.  */
827       badness = ((gcov_type)growth) * (1<<18);
828       badness = (badness + div / 2) / div;
829
830       /* Overall growth of inlining all calls of function matters: we want to
831          inline so offline copy of function is no longer needed.
832
833          Additionally functions that can be fully inlined without much of
834          effort are better inline candidates than functions that can be fully
835          inlined only after noticeable overall unit growths. The latter
836          are better in a sense compressing of code size by factoring out common
837          code into separate function shared by multiple code paths.
838
839          We might mix the valud into the fraction by taking into account
840          relative growth of the unit, but for now just add the number
841          into resulting fraction.  */
842       growth_for_all = estimate_growth (callee);
843       badness += growth_for_all;
844       if (badness > INT_MAX - 1)
845         badness = INT_MAX - 1;
846       if (dump)
847         {
848           fprintf (dump_file,
849                    "      %i: guessed profile. frequency %f, overall growth %i,"
850                    " benefit %f%%, divisor %i\n",
851                    (int) badness, (double)edge->frequency / CGRAPH_FREQ_BASE, growth_for_all,
852                    relative_time_benefit (callee_info, edge, time_growth) * 100 / 256.0, div);
853         }
854     }
855   /* When function local profile is not available or it does not give
856      useful information (ie frequency is zero), base the cost on
857      loop nest and overall size growth, so we optimize for overall number
858      of functions fully inlined in program.  */
859   else
860     {
861       int nest = MIN (inline_edge_summary (edge)->loop_depth, 8);
862       badness = estimate_growth (callee) * 256;
863
864       /* Decrease badness if call is nested.  */
865       if (badness > 0)
866         badness >>= nest;
867       else
868         {
869           badness <<= nest;
870         }
871       if (dump)
872         fprintf (dump_file, "      %i: no profile. nest %i\n", (int) badness,
873                  nest);
874     }
875
876   /* Ensure that we did not overflow in all the fixed point math above.  */
877   gcc_assert (badness >= INT_MIN);
878   gcc_assert (badness <= INT_MAX - 1);
879   /* Make recursive inlining happen always after other inlining is done.  */
880   if (cgraph_edge_recursive_p (edge))
881     return badness + 1;
882   else
883     return badness;
884 }
885
886 /* Recompute badness of EDGE and update its key in HEAP if needed.  */
887 static inline void
888 update_edge_key (fibheap_t heap, struct cgraph_edge *edge)
889 {
890   int badness = edge_badness (edge, false);
891   if (edge->aux)
892     {
893       fibnode_t n = (fibnode_t) edge->aux;
894       gcc_checking_assert (n->data == edge);
895
896       /* fibheap_replace_key only decrease the keys.
897          When we increase the key we do not update heap
898          and instead re-insert the element once it becomes
899          a minimum of heap.  */
900       if (badness < n->key)
901         {
902           if (dump_file && (dump_flags & TDF_DETAILS))
903             {
904               fprintf (dump_file,
905                        "  decreasing badness %s/%i -> %s/%i, %i to %i\n",
906                        cgraph_node_name (edge->caller), edge->caller->uid,
907                        cgraph_node_name (edge->callee), edge->callee->uid,
908                        (int)n->key,
909                        badness);
910             }
911           fibheap_replace_key (heap, n, badness);
912           gcc_checking_assert (n->key == badness);
913         }
914     }
915   else
916     {
917        if (dump_file && (dump_flags & TDF_DETAILS))
918          {
919            fprintf (dump_file,
920                     "  enqueuing call %s/%i -> %s/%i, badness %i\n",
921                     cgraph_node_name (edge->caller), edge->caller->uid,
922                     cgraph_node_name (edge->callee), edge->callee->uid,
923                     badness);
924          }
925       edge->aux = fibheap_insert (heap, badness, edge);
926     }
927 }
928
929
930 /* NODE was inlined.
931    All caller edges needs to be resetted because
932    size estimates change. Similarly callees needs reset
933    because better context may be known.  */
934
935 static void
936 reset_edge_caches (struct cgraph_node *node)
937 {
938   struct cgraph_edge *edge;
939   struct cgraph_edge *e = node->callees;
940   struct cgraph_node *where = node;
941   int i;
942   struct ipa_ref *ref;
943
944   if (where->global.inlined_to)
945     where = where->global.inlined_to;
946
947   /* WHERE body size has changed, the cached growth is invalid.  */
948   reset_node_growth_cache (where);
949
950   for (edge = where->callers; edge; edge = edge->next_caller)
951     if (edge->inline_failed)
952       reset_edge_growth_cache (edge);
953   for (i = 0; ipa_ref_list_refering_iterate (&where->ref_list, i, ref); i++)
954     if (ref->use == IPA_REF_ALIAS)
955       reset_edge_caches (ipa_ref_refering_node (ref));
956
957   if (!e)
958     return;
959
960   while (true)
961     if (!e->inline_failed && e->callee->callees)
962       e = e->callee->callees;
963     else
964       {
965         if (e->inline_failed)
966           reset_edge_growth_cache (e);
967         if (e->next_callee)
968           e = e->next_callee;
969         else
970           {
971             do
972               {
973                 if (e->caller == node)
974                   return;
975                 e = e->caller->callers;
976               }
977             while (!e->next_callee);
978             e = e->next_callee;
979           }
980       }
981 }
982
983 /* Recompute HEAP nodes for each of caller of NODE.
984    UPDATED_NODES track nodes we already visited, to avoid redundant work.
985    When CHECK_INLINABLITY_FOR is set, re-check for specified edge that
986    it is inlinable. Otherwise check all edges.  */
987
988 static void
989 update_caller_keys (fibheap_t heap, struct cgraph_node *node,
990                     bitmap updated_nodes,
991                     struct cgraph_edge *check_inlinablity_for)
992 {
993   struct cgraph_edge *edge;
994   int i;
995   struct ipa_ref *ref;
996
997   if ((!node->alias && !inline_summary (node)->inlinable)
998       || cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE
999       || node->global.inlined_to)
1000     return;
1001   if (!bitmap_set_bit (updated_nodes, node->uid))
1002     return;
1003
1004   for (i = 0; ipa_ref_list_refering_iterate (&node->ref_list, i, ref); i++)
1005     if (ref->use == IPA_REF_ALIAS)
1006       {
1007         struct cgraph_node *alias = ipa_ref_refering_node (ref);
1008         update_caller_keys (heap, alias, updated_nodes, check_inlinablity_for);
1009       }
1010
1011   for (edge = node->callers; edge; edge = edge->next_caller)
1012     if (edge->inline_failed)
1013       {
1014         if (!check_inlinablity_for
1015             || check_inlinablity_for == edge)
1016           {
1017             if (can_inline_edge_p (edge, false)
1018                 && want_inline_small_function_p (edge, false))
1019               update_edge_key (heap, edge);
1020             else if (edge->aux)
1021               {
1022                 report_inline_failed_reason (edge);
1023                 fibheap_delete_node (heap, (fibnode_t) edge->aux);
1024                 edge->aux = NULL;
1025               }
1026           }
1027         else if (edge->aux)
1028           update_edge_key (heap, edge);
1029       }
1030 }
1031
1032 /* Recompute HEAP nodes for each uninlined call in NODE.
1033    This is used when we know that edge badnesses are going only to increase
1034    (we introduced new call site) and thus all we need is to insert newly
1035    created edges into heap.  */
1036
1037 static void
1038 update_callee_keys (fibheap_t heap, struct cgraph_node *node,
1039                     bitmap updated_nodes)
1040 {
1041   struct cgraph_edge *e = node->callees;
1042
1043   if (!e)
1044     return;
1045   while (true)
1046     if (!e->inline_failed && e->callee->callees)
1047       e = e->callee->callees;
1048     else
1049       {
1050         enum availability avail;
1051         struct cgraph_node *callee;
1052         /* We do not reset callee growth cache here.  Since we added a new call,
1053            growth chould have just increased and consequentely badness metric
1054            don't need updating.  */
1055         if (e->inline_failed
1056             && (callee = cgraph_function_or_thunk_node (e->callee, &avail))
1057             && inline_summary (callee)->inlinable
1058             && cgraph_function_body_availability (callee) >= AVAIL_AVAILABLE
1059             && !bitmap_bit_p (updated_nodes, callee->uid))
1060           {
1061             if (can_inline_edge_p (e, false)
1062                 && want_inline_small_function_p (e, false))
1063               update_edge_key (heap, e);
1064             else if (e->aux)
1065               {
1066                 report_inline_failed_reason (e);
1067                 fibheap_delete_node (heap, (fibnode_t) e->aux);
1068                 e->aux = NULL;
1069               }
1070           }
1071         if (e->next_callee)
1072           e = e->next_callee;
1073         else
1074           {
1075             do
1076               {
1077                 if (e->caller == node)
1078                   return;
1079                 e = e->caller->callers;
1080               }
1081             while (!e->next_callee);
1082             e = e->next_callee;
1083           }
1084       }
1085 }
1086
1087 /* Recompute heap nodes for each of caller edges of each of callees.
1088    Walk recursively into all inline clones.  */
1089
1090 static void
1091 update_all_callee_keys (fibheap_t heap, struct cgraph_node *node,
1092                         bitmap updated_nodes)
1093 {
1094   struct cgraph_edge *e = node->callees;
1095   if (!e)
1096     return;
1097   while (true)
1098     if (!e->inline_failed && e->callee->callees)
1099       e = e->callee->callees;
1100     else
1101       {
1102         struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee,
1103                                                                     NULL);
1104
1105         /* We inlined and thus callees might have different number of calls.
1106            Reset their caches  */
1107         reset_node_growth_cache (callee);
1108         if (e->inline_failed)
1109           update_caller_keys (heap, callee, updated_nodes, e);
1110         if (e->next_callee)
1111           e = e->next_callee;
1112         else
1113           {
1114             do
1115               {
1116                 if (e->caller == node)
1117                   return;
1118                 e = e->caller->callers;
1119               }
1120             while (!e->next_callee);
1121             e = e->next_callee;
1122           }
1123       }
1124 }
1125
1126 /* Enqueue all recursive calls from NODE into priority queue depending on
1127    how likely we want to recursively inline the call.  */
1128
1129 static void
1130 lookup_recursive_calls (struct cgraph_node *node, struct cgraph_node *where,
1131                         fibheap_t heap)
1132 {
1133   struct cgraph_edge *e;
1134   enum availability avail;
1135
1136   for (e = where->callees; e; e = e->next_callee)
1137     if (e->callee == node
1138         || (cgraph_function_or_thunk_node (e->callee, &avail) == node
1139             && avail > AVAIL_OVERWRITABLE))
1140       {
1141         /* When profile feedback is available, prioritize by expected number
1142            of calls.  */
1143         fibheap_insert (heap,
1144                         !max_count ? -e->frequency
1145                         : -(e->count / ((max_count + (1<<24) - 1) / (1<<24))),
1146                         e);
1147       }
1148   for (e = where->callees; e; e = e->next_callee)
1149     if (!e->inline_failed)
1150       lookup_recursive_calls (node, e->callee, heap);
1151 }
1152
1153 /* Decide on recursive inlining: in the case function has recursive calls,
1154    inline until body size reaches given argument.  If any new indirect edges
1155    are discovered in the process, add them to *NEW_EDGES, unless NEW_EDGES
1156    is NULL.  */
1157
1158 static bool
1159 recursive_inlining (struct cgraph_edge *edge,
1160                     VEC (cgraph_edge_p, heap) **new_edges)
1161 {
1162   int limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO);
1163   fibheap_t heap;
1164   struct cgraph_node *node;
1165   struct cgraph_edge *e;
1166   struct cgraph_node *master_clone = NULL, *next;
1167   int depth = 0;
1168   int n = 0;
1169
1170   node = edge->caller;
1171   if (node->global.inlined_to)
1172     node = node->global.inlined_to;
1173
1174   if (DECL_DECLARED_INLINE_P (node->decl))
1175     limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE);
1176
1177   /* Make sure that function is small enough to be considered for inlining.  */
1178   if (estimate_size_after_inlining (node, edge)  >= limit)
1179     return false;
1180   heap = fibheap_new ();
1181   lookup_recursive_calls (node, node, heap);
1182   if (fibheap_empty (heap))
1183     {
1184       fibheap_delete (heap);
1185       return false;
1186     }
1187
1188   if (dump_file)
1189     fprintf (dump_file,
1190              "  Performing recursive inlining on %s\n",
1191              cgraph_node_name (node));
1192
1193   /* Do the inlining and update list of recursive call during process.  */
1194   while (!fibheap_empty (heap))
1195     {
1196       struct cgraph_edge *curr
1197         = (struct cgraph_edge *) fibheap_extract_min (heap);
1198       struct cgraph_node *cnode;
1199
1200       if (estimate_size_after_inlining (node, curr) > limit)
1201         break;
1202
1203       if (!can_inline_edge_p (curr, true))
1204         continue;
1205
1206       depth = 1;
1207       for (cnode = curr->caller;
1208            cnode->global.inlined_to; cnode = cnode->callers->caller)
1209         if (node->decl
1210             == cgraph_function_or_thunk_node (curr->callee, NULL)->decl)
1211           depth++;
1212
1213       if (!want_inline_self_recursive_call_p (curr, node, false, depth))
1214         continue;
1215
1216       if (dump_file)
1217         {
1218           fprintf (dump_file,
1219                    "   Inlining call of depth %i", depth);
1220           if (node->count)
1221             {
1222               fprintf (dump_file, " called approx. %.2f times per call",
1223                        (double)curr->count / node->count);
1224             }
1225           fprintf (dump_file, "\n");
1226         }
1227       if (!master_clone)
1228         {
1229           /* We need original clone to copy around.  */
1230           master_clone = cgraph_clone_node (node, node->decl,
1231                                             node->count, CGRAPH_FREQ_BASE,
1232                                             false, NULL, true);
1233           for (e = master_clone->callees; e; e = e->next_callee)
1234             if (!e->inline_failed)
1235               clone_inlined_nodes (e, true, false, NULL);
1236         }
1237
1238       cgraph_redirect_edge_callee (curr, master_clone);
1239       inline_call (curr, false, new_edges, &overall_size);
1240       lookup_recursive_calls (node, curr->callee, heap);
1241       n++;
1242     }
1243
1244   if (!fibheap_empty (heap) && dump_file)
1245     fprintf (dump_file, "    Recursive inlining growth limit met.\n");
1246   fibheap_delete (heap);
1247
1248   if (!master_clone)
1249     return false;
1250
1251   if (dump_file)
1252     fprintf (dump_file,
1253              "\n   Inlined %i times, "
1254              "body grown from size %i to %i, time %i to %i\n", n,
1255              inline_summary (master_clone)->size, inline_summary (node)->size,
1256              inline_summary (master_clone)->time, inline_summary (node)->time);
1257
1258   /* Remove master clone we used for inlining.  We rely that clones inlined
1259      into master clone gets queued just before master clone so we don't
1260      need recursion.  */
1261   for (node = cgraph_nodes; node != master_clone;
1262        node = next)
1263     {
1264       next = node->next;
1265       if (node->global.inlined_to == master_clone)
1266         cgraph_remove_node (node);
1267     }
1268   cgraph_remove_node (master_clone);
1269   return true;
1270 }
1271
1272
1273 /* Given whole compilation unit estimate of INSNS, compute how large we can
1274    allow the unit to grow.  */
1275
1276 static int
1277 compute_max_insns (int insns)
1278 {
1279   int max_insns = insns;
1280   if (max_insns < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS))
1281     max_insns = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS);
1282
1283   return ((HOST_WIDEST_INT) max_insns
1284           * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100);
1285 }
1286
1287
1288 /* Compute badness of all edges in NEW_EDGES and add them to the HEAP.  */
1289
1290 static void
1291 add_new_edges_to_heap (fibheap_t heap, VEC (cgraph_edge_p, heap) *new_edges)
1292 {
1293   while (VEC_length (cgraph_edge_p, new_edges) > 0)
1294     {
1295       struct cgraph_edge *edge = VEC_pop (cgraph_edge_p, new_edges);
1296
1297       gcc_assert (!edge->aux);
1298       if (edge->inline_failed
1299           && can_inline_edge_p (edge, true)
1300           && want_inline_small_function_p (edge, true))
1301         edge->aux = fibheap_insert (heap, edge_badness (edge, false), edge);
1302     }
1303 }
1304
1305
1306 /* We use greedy algorithm for inlining of small functions:
1307    All inline candidates are put into prioritized heap ordered in
1308    increasing badness.
1309
1310    The inlining of small functions is bounded by unit growth parameters.  */
1311
1312 static void
1313 inline_small_functions (void)
1314 {
1315   struct cgraph_node *node;
1316   struct cgraph_edge *edge;
1317   fibheap_t heap = fibheap_new ();
1318   bitmap updated_nodes = BITMAP_ALLOC (NULL);
1319   int min_size, max_size;
1320   VEC (cgraph_edge_p, heap) *new_indirect_edges = NULL;
1321   int initial_size = 0;
1322
1323   if (flag_indirect_inlining)
1324     new_indirect_edges = VEC_alloc (cgraph_edge_p, heap, 8);
1325
1326   if (dump_file)
1327     fprintf (dump_file,
1328              "\nDeciding on inlining of small functions.  Starting with size %i.\n",
1329              initial_size);
1330
1331   /* Compute overall unit size and other global parameters used by badness
1332      metrics.  */
1333
1334   max_count = 0;
1335   initialize_growth_caches ();
1336
1337   FOR_EACH_DEFINED_FUNCTION (node)
1338     if (!node->global.inlined_to)
1339       {
1340         if (cgraph_function_with_gimple_body_p (node)
1341             || node->thunk.thunk_p)
1342           {
1343             struct inline_summary *info = inline_summary (node);
1344
1345             if (!DECL_EXTERNAL (node->decl))
1346               initial_size += info->size;
1347           }
1348
1349         for (edge = node->callers; edge; edge = edge->next_caller)
1350           if (max_count < edge->count)
1351             max_count = edge->count;
1352       }
1353
1354   overall_size = initial_size;
1355   max_size = compute_max_insns (overall_size);
1356   min_size = overall_size;
1357
1358   /* Populate the heeap with all edges we might inline.  */
1359
1360   FOR_EACH_DEFINED_FUNCTION (node)
1361     if (!node->global.inlined_to)
1362       {
1363         if (dump_file)
1364           fprintf (dump_file, "Enqueueing calls of %s/%i.\n",
1365                    cgraph_node_name (node), node->uid);
1366
1367         for (edge = node->callers; edge; edge = edge->next_caller)
1368           if (edge->inline_failed
1369               && can_inline_edge_p (edge, true)
1370               && want_inline_small_function_p (edge, true)
1371               && edge->inline_failed)
1372             {
1373               gcc_assert (!edge->aux);
1374               update_edge_key (heap, edge);
1375             }
1376       }
1377
1378   gcc_assert (in_lto_p
1379               || !max_count
1380               || (profile_info && flag_branch_probabilities));
1381
1382   while (!fibheap_empty (heap))
1383     {
1384       int old_size = overall_size;
1385       struct cgraph_node *where, *callee;
1386       int badness = fibheap_min_key (heap);
1387       int current_badness;
1388       int growth;
1389
1390       edge = (struct cgraph_edge *) fibheap_extract_min (heap);
1391       gcc_assert (edge->aux);
1392       edge->aux = NULL;
1393       if (!edge->inline_failed)
1394         continue;
1395
1396       /* Be sure that caches are maintained consistent.  */
1397 #ifdef ENABLE_CHECKING
1398       reset_edge_growth_cache (edge);
1399       reset_node_growth_cache (edge->callee);
1400 #endif
1401
1402       /* When updating the edge costs, we only decrease badness in the keys.
1403          Increases of badness are handled lazilly; when we see key with out
1404          of date value on it, we re-insert it now.  */
1405       current_badness = edge_badness (edge, false);
1406       gcc_assert (current_badness >= badness);
1407       if (current_badness != badness)
1408         {
1409           edge->aux = fibheap_insert (heap, current_badness, edge);
1410           continue;
1411         }
1412
1413       if (!can_inline_edge_p (edge, true))
1414         continue;
1415       
1416       callee = cgraph_function_or_thunk_node (edge->callee, NULL);
1417       growth = estimate_edge_growth (edge);
1418       if (dump_file)
1419         {
1420           fprintf (dump_file,
1421                    "\nConsidering %s with %i size\n",
1422                    cgraph_node_name (callee),
1423                    inline_summary (callee)->size);
1424           fprintf (dump_file,
1425                    " to be inlined into %s in %s:%i\n"
1426                    " Estimated growth after inlined into all is %+i insns.\n"
1427                    " Estimated badness is %i, frequency %.2f.\n",
1428                    cgraph_node_name (edge->caller),
1429                    flag_wpa ? "unknown"
1430                    : gimple_filename ((const_gimple) edge->call_stmt),
1431                    flag_wpa ? -1
1432                    : gimple_lineno ((const_gimple) edge->call_stmt),
1433                    estimate_growth (callee),
1434                    badness,
1435                    edge->frequency / (double)CGRAPH_FREQ_BASE);
1436           if (edge->count)
1437             fprintf (dump_file," Called "HOST_WIDEST_INT_PRINT_DEC"x\n",
1438                      edge->count);
1439           if (dump_flags & TDF_DETAILS)
1440             edge_badness (edge, true);
1441         }
1442
1443       if (overall_size + growth > max_size
1444           && !DECL_DISREGARD_INLINE_LIMITS (callee->decl))
1445         {
1446           edge->inline_failed = CIF_INLINE_UNIT_GROWTH_LIMIT;
1447           report_inline_failed_reason (edge);
1448           continue;
1449         }
1450
1451       if (!want_inline_small_function_p (edge, true))
1452         continue;
1453
1454       /* Heuristics for inlining small functions works poorly for
1455          recursive calls where we do efect similar to loop unrolling.
1456          When inliing such edge seems profitable, leave decision on
1457          specific inliner.  */
1458       if (cgraph_edge_recursive_p (edge))
1459         {
1460           where = edge->caller;
1461           if (where->global.inlined_to)
1462             where = where->global.inlined_to;
1463           if (!recursive_inlining (edge,
1464                                    flag_indirect_inlining
1465                                    ? &new_indirect_edges : NULL))
1466             {
1467               edge->inline_failed = CIF_RECURSIVE_INLINING;
1468               continue;
1469             }
1470           reset_edge_caches (where);
1471           /* Recursive inliner inlines all recursive calls of the function
1472              at once. Consequently we need to update all callee keys.  */
1473           if (flag_indirect_inlining)
1474             add_new_edges_to_heap (heap, new_indirect_edges);
1475           update_all_callee_keys (heap, where, updated_nodes);
1476         }
1477       else
1478         {
1479           struct cgraph_node *outer_node = NULL;
1480           int depth = 0;
1481
1482           /* Consider the case where self recursive function A is inlined into B.
1483              This is desired optimization in some cases, since it leads to effect
1484              similar of loop peeling and we might completely optimize out the
1485              recursive call.  However we must be extra selective.  */
1486
1487           where = edge->caller;
1488           while (where->global.inlined_to)
1489             {
1490               if (where->decl == callee->decl)
1491                 outer_node = where, depth++;
1492               where = where->callers->caller;
1493             }
1494           if (outer_node
1495               && !want_inline_self_recursive_call_p (edge, outer_node,
1496                                                      true, depth))
1497             {
1498               edge->inline_failed
1499                 = (DECL_DISREGARD_INLINE_LIMITS (edge->callee->decl)
1500                    ? CIF_RECURSIVE_INLINING : CIF_UNSPECIFIED);
1501               continue;
1502             }
1503           else if (depth && dump_file)
1504             fprintf (dump_file, " Peeling recursion with depth %i\n", depth);
1505
1506           gcc_checking_assert (!callee->global.inlined_to);
1507           inline_call (edge, true, &new_indirect_edges, &overall_size);
1508           if (flag_indirect_inlining)
1509             add_new_edges_to_heap (heap, new_indirect_edges);
1510
1511           reset_edge_caches (edge->callee);
1512           reset_node_growth_cache (callee);
1513
1514           /* We inlined last offline copy to the body.  This might lead
1515              to callees of function having fewer call sites and thus they
1516              may need updating.  */
1517           if (callee->global.inlined_to)
1518             update_all_callee_keys (heap, callee, updated_nodes);
1519           else
1520             update_callee_keys (heap, edge->callee, updated_nodes);
1521         }
1522       where = edge->caller;
1523       if (where->global.inlined_to)
1524         where = where->global.inlined_to;
1525
1526       /* Our profitability metric can depend on local properties
1527          such as number of inlinable calls and size of the function body.
1528          After inlining these properties might change for the function we
1529          inlined into (since it's body size changed) and for the functions
1530          called by function we inlined (since number of it inlinable callers
1531          might change).  */
1532       update_caller_keys (heap, where, updated_nodes, NULL);
1533
1534       /* We removed one call of the function we just inlined.  If offline
1535          copy is still needed, be sure to update the keys.  */
1536       if (callee != where && !callee->global.inlined_to)
1537         update_caller_keys (heap, callee, updated_nodes, NULL);
1538       bitmap_clear (updated_nodes);
1539
1540       if (dump_file)
1541         {
1542           fprintf (dump_file,
1543                    " Inlined into %s which now has time %i and size %i,"
1544                    "net change of %+i.\n",
1545                    cgraph_node_name (edge->caller),
1546                    inline_summary (edge->caller)->time,
1547                    inline_summary (edge->caller)->size,
1548                    overall_size - old_size);
1549         }
1550       if (min_size > overall_size)
1551         {
1552           min_size = overall_size;
1553           max_size = compute_max_insns (min_size);
1554
1555           if (dump_file)
1556             fprintf (dump_file, "New minimal size reached: %i\n", min_size);
1557         }
1558     }
1559
1560   free_growth_caches ();
1561   if (new_indirect_edges)
1562     VEC_free (cgraph_edge_p, heap, new_indirect_edges);
1563   fibheap_delete (heap);
1564   if (dump_file)
1565     fprintf (dump_file,
1566              "Unit growth for small function inlining: %i->%i (%i%%)\n",
1567              initial_size, overall_size,
1568              initial_size ? overall_size * 100 / (initial_size) - 100: 0);
1569   BITMAP_FREE (updated_nodes);
1570 }
1571
1572 /* Flatten NODE.  Performed both during early inlining and
1573    at IPA inlining time.  */
1574
1575 static void
1576 flatten_function (struct cgraph_node *node, bool early)
1577 {
1578   struct cgraph_edge *e;
1579
1580   /* We shouldn't be called recursively when we are being processed.  */
1581   gcc_assert (node->aux == NULL);
1582
1583   node->aux = (void *) node;
1584
1585   for (e = node->callees; e; e = e->next_callee)
1586     {
1587       struct cgraph_node *orig_callee;
1588       struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
1589
1590       /* We've hit cycle?  It is time to give up.  */
1591       if (callee->aux)
1592         {
1593           if (dump_file)
1594             fprintf (dump_file,
1595                      "Not inlining %s into %s to avoid cycle.\n",
1596                      cgraph_node_name (callee),
1597                      cgraph_node_name (e->caller));
1598           e->inline_failed = CIF_RECURSIVE_INLINING;
1599           continue;
1600         }
1601
1602       /* When the edge is already inlined, we just need to recurse into
1603          it in order to fully flatten the leaves.  */
1604       if (!e->inline_failed)
1605         {
1606           flatten_function (callee, early);
1607           continue;
1608         }
1609
1610       /* Flatten attribute needs to be processed during late inlining. For
1611          extra code quality we however do flattening during early optimization,
1612          too.  */
1613       if (!early
1614           ? !can_inline_edge_p (e, true)
1615           : !can_early_inline_edge_p (e))
1616         continue;
1617
1618       if (cgraph_edge_recursive_p (e))
1619         {
1620           if (dump_file)
1621             fprintf (dump_file, "Not inlining: recursive call.\n");
1622           continue;
1623         }
1624
1625       if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
1626           != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (callee->decl)))
1627         {
1628           if (dump_file)
1629             fprintf (dump_file, "Not inlining: SSA form does not match.\n");
1630           continue;
1631         }
1632
1633       /* Inline the edge and flatten the inline clone.  Avoid
1634          recursing through the original node if the node was cloned.  */
1635       if (dump_file)
1636         fprintf (dump_file, " Inlining %s into %s.\n",
1637                  cgraph_node_name (callee),
1638                  cgraph_node_name (e->caller));
1639       orig_callee = callee;
1640       inline_call (e, true, NULL, NULL);
1641       if (e->callee != orig_callee)
1642         orig_callee->aux = (void *) node;
1643       flatten_function (e->callee, early);
1644       if (e->callee != orig_callee)
1645         orig_callee->aux = NULL;
1646     }
1647
1648   node->aux = NULL;
1649 }
1650
1651 /* Decide on the inlining.  We do so in the topological order to avoid
1652    expenses on updating data structures.  */
1653
1654 static unsigned int
1655 ipa_inline (void)
1656 {
1657   struct cgraph_node *node;
1658   int nnodes;
1659   struct cgraph_node **order =
1660     XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
1661   int i;
1662
1663   if (in_lto_p && flag_indirect_inlining)
1664     ipa_update_after_lto_read ();
1665   if (flag_indirect_inlining)
1666     ipa_create_all_structures_for_iinln ();
1667
1668   if (dump_file)
1669     dump_inline_summaries (dump_file);
1670
1671   nnodes = ipa_reverse_postorder (order);
1672
1673   for (node = cgraph_nodes; node; node = node->next)
1674     node->aux = 0;
1675
1676   if (dump_file)
1677     fprintf (dump_file, "\nFlattening functions:\n");
1678
1679   /* In the first pass handle functions to be flattened.  Do this with
1680      a priority so none of our later choices will make this impossible.  */
1681   for (i = nnodes - 1; i >= 0; i--)
1682     {
1683       node = order[i];
1684
1685       /* Handle nodes to be flattened.
1686          Ideally when processing callees we stop inlining at the
1687          entry of cycles, possibly cloning that entry point and
1688          try to flatten itself turning it into a self-recursive
1689          function.  */
1690       if (lookup_attribute ("flatten",
1691                             DECL_ATTRIBUTES (node->decl)) != NULL)
1692         {
1693           if (dump_file)
1694             fprintf (dump_file,
1695                      "Flattening %s\n", cgraph_node_name (node));
1696           flatten_function (node, false);
1697         }
1698     }
1699
1700   inline_small_functions ();
1701   cgraph_remove_unreachable_nodes (true, dump_file);
1702   free (order);
1703
1704   /* We already perform some inlining of functions called once during
1705      inlining small functions above.  After unreachable nodes are removed,
1706      we still might do a quick check that nothing new is found.  */
1707   if (flag_inline_functions_called_once)
1708     {
1709       int cold;
1710       if (dump_file)
1711         fprintf (dump_file, "\nDeciding on functions called once:\n");
1712
1713       /* Inlining one function called once has good chance of preventing
1714          inlining other function into the same callee.  Ideally we should
1715          work in priority order, but probably inlining hot functions first
1716          is good cut without the extra pain of maintaining the queue.
1717
1718          ??? this is not really fitting the bill perfectly: inlining function
1719          into callee often leads to better optimization of callee due to
1720          increased context for optimization.
1721          For example if main() function calls a function that outputs help
1722          and then function that does the main optmization, we should inline
1723          the second with priority even if both calls are cold by themselves.
1724
1725          We probably want to implement new predicate replacing our use of
1726          maybe_hot_edge interpreted as maybe_hot_edge || callee is known
1727          to be hot.  */
1728       for (cold = 0; cold <= 1; cold ++)
1729         {
1730           for (node = cgraph_nodes; node; node = node->next)
1731             {
1732               if (want_inline_function_called_once_p (node)
1733                   && (cold
1734                       || cgraph_maybe_hot_edge_p (node->callers)))
1735                 {
1736                   struct cgraph_node *caller = node->callers->caller;
1737
1738                   if (dump_file)
1739                     {
1740                       fprintf (dump_file,
1741                                "\nInlining %s size %i.\n",
1742                                cgraph_node_name (node), inline_summary (node)->size);
1743                       fprintf (dump_file,
1744                                " Called once from %s %i insns.\n",
1745                                cgraph_node_name (node->callers->caller),
1746                                inline_summary (node->callers->caller)->size);
1747                     }
1748
1749                   inline_call (node->callers, true, NULL, NULL);
1750                   if (dump_file)
1751                     fprintf (dump_file,
1752                              " Inlined into %s which now has %i size\n",
1753                              cgraph_node_name (caller),
1754                              inline_summary (caller)->size);
1755                 }
1756             }
1757         }
1758     }
1759
1760   /* Free ipa-prop structures if they are no longer needed.  */
1761   if (flag_indirect_inlining)
1762     ipa_free_all_structures_after_iinln ();
1763
1764   if (dump_file)
1765     fprintf (dump_file,
1766              "\nInlined %i calls, eliminated %i functions\n\n",
1767              ncalls_inlined, nfunctions_inlined);
1768
1769   if (dump_file)
1770     dump_inline_summaries (dump_file);
1771   /* In WPA we use inline summaries for partitioning process.  */
1772   if (!flag_wpa)
1773     inline_free_summary ();
1774   return 0;
1775 }
1776
1777 /* Inline always-inline function calls in NODE.  */
1778
1779 static bool
1780 inline_always_inline_functions (struct cgraph_node *node)
1781 {
1782   struct cgraph_edge *e;
1783   bool inlined = false;
1784
1785   for (e = node->callees; e; e = e->next_callee)
1786     {
1787       struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
1788       if (!DECL_DISREGARD_INLINE_LIMITS (callee->decl))
1789         continue;
1790
1791       if (cgraph_edge_recursive_p (e))
1792         {
1793           if (dump_file)
1794             fprintf (dump_file, "  Not inlining recursive call to %s.\n",
1795                      cgraph_node_name (e->callee));
1796           e->inline_failed = CIF_RECURSIVE_INLINING;
1797           continue;
1798         }
1799
1800       if (!can_early_inline_edge_p (e))
1801         continue;
1802
1803       if (dump_file)
1804         fprintf (dump_file, "  Inlining %s into %s (always_inline).\n",
1805                  cgraph_node_name (e->callee),
1806                  cgraph_node_name (e->caller));
1807       inline_call (e, true, NULL, NULL);
1808       inlined = true;
1809     }
1810
1811   return inlined;
1812 }
1813
1814 /* Decide on the inlining.  We do so in the topological order to avoid
1815    expenses on updating data structures.  */
1816
1817 static bool
1818 early_inline_small_functions (struct cgraph_node *node)
1819 {
1820   struct cgraph_edge *e;
1821   bool inlined = false;
1822
1823   for (e = node->callees; e; e = e->next_callee)
1824     {
1825       struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
1826       if (!inline_summary (callee)->inlinable
1827           || !e->inline_failed)
1828         continue;
1829
1830       /* Do not consider functions not declared inline.  */
1831       if (!DECL_DECLARED_INLINE_P (callee->decl)
1832           && !flag_inline_small_functions
1833           && !flag_inline_functions)
1834         continue;
1835
1836       if (dump_file)
1837         fprintf (dump_file, "Considering inline candidate %s.\n",
1838                  cgraph_node_name (callee));
1839
1840       if (!can_early_inline_edge_p (e))
1841         continue;
1842
1843       if (cgraph_edge_recursive_p (e))
1844         {
1845           if (dump_file)
1846             fprintf (dump_file, "  Not inlining: recursive call.\n");
1847           continue;
1848         }
1849
1850       if (!want_early_inline_function_p (e))
1851         continue;
1852
1853       if (dump_file)
1854         fprintf (dump_file, " Inlining %s into %s.\n",
1855                  cgraph_node_name (callee),
1856                  cgraph_node_name (e->caller));
1857       inline_call (e, true, NULL, NULL);
1858       inlined = true;
1859     }
1860
1861   return inlined;
1862 }
1863
1864 /* Do inlining of small functions.  Doing so early helps profiling and other
1865    passes to be somewhat more effective and avoids some code duplication in
1866    later real inlining pass for testcases with very many function calls.  */
1867 static unsigned int
1868 early_inliner (void)
1869 {
1870   struct cgraph_node *node = cgraph_get_node (current_function_decl);
1871   struct cgraph_edge *edge;
1872   unsigned int todo = 0;
1873   int iterations = 0;
1874   bool inlined = false;
1875
1876   if (seen_error ())
1877     return 0;
1878
1879   /* Do nothing if datastructures for ipa-inliner are already computed.  This
1880      happens when some pass decides to construct new function and
1881      cgraph_add_new_function calls lowering passes and early optimization on
1882      it.  This may confuse ourself when early inliner decide to inline call to
1883      function clone, because function clones don't have parameter list in
1884      ipa-prop matching their signature.  */
1885   if (ipa_node_params_vector)
1886     return 0;
1887
1888 #ifdef ENABLE_CHECKING
1889   verify_cgraph_node (node);
1890 #endif
1891
1892   /* Even when not optimizing or not inlining inline always-inline
1893      functions.  */
1894   inlined = inline_always_inline_functions (node);
1895
1896   if (!optimize
1897       || flag_no_inline
1898       || !flag_early_inlining
1899       /* Never inline regular functions into always-inline functions
1900          during incremental inlining.  This sucks as functions calling
1901          always inline functions will get less optimized, but at the
1902          same time inlining of functions calling always inline
1903          function into an always inline function might introduce
1904          cycles of edges to be always inlined in the callgraph.
1905
1906          We might want to be smarter and just avoid this type of inlining.  */
1907       || DECL_DISREGARD_INLINE_LIMITS (node->decl))
1908     ;
1909   else if (lookup_attribute ("flatten",
1910                              DECL_ATTRIBUTES (node->decl)) != NULL)
1911     {
1912       /* When the function is marked to be flattened, recursively inline
1913          all calls in it.  */
1914       if (dump_file)
1915         fprintf (dump_file,
1916                  "Flattening %s\n", cgraph_node_name (node));
1917       flatten_function (node, true);
1918       inlined = true;
1919     }
1920   else
1921     {
1922       /* We iterate incremental inlining to get trivial cases of indirect
1923          inlining.  */
1924       while (iterations < PARAM_VALUE (PARAM_EARLY_INLINER_MAX_ITERATIONS)
1925              && early_inline_small_functions (node))
1926         {
1927           timevar_push (TV_INTEGRATION);
1928           todo |= optimize_inline_calls (current_function_decl);
1929
1930           /* Technically we ought to recompute inline parameters so the new
1931              iteration of early inliner works as expected.  We however have
1932              values approximately right and thus we only need to update edge
1933              info that might be cleared out for newly discovered edges.  */
1934           for (edge = node->callees; edge; edge = edge->next_callee)
1935             {
1936               struct inline_edge_summary *es = inline_edge_summary (edge);
1937               es->call_stmt_size
1938                 = estimate_num_insns (edge->call_stmt, &eni_size_weights);
1939               es->call_stmt_time
1940                 = estimate_num_insns (edge->call_stmt, &eni_time_weights);
1941             }
1942           timevar_pop (TV_INTEGRATION);
1943           iterations++;
1944           inlined = false;
1945         }
1946       if (dump_file)
1947         fprintf (dump_file, "Iterations: %i\n", iterations);
1948     }
1949
1950   if (inlined)
1951     {
1952       timevar_push (TV_INTEGRATION);
1953       todo |= optimize_inline_calls (current_function_decl);
1954       timevar_pop (TV_INTEGRATION);
1955     }
1956
1957   cfun->always_inline_functions_inlined = true;
1958
1959   return todo;
1960 }
1961
1962 struct gimple_opt_pass pass_early_inline =
1963 {
1964  {
1965   GIMPLE_PASS,
1966   "einline",                            /* name */
1967   NULL,                                 /* gate */
1968   early_inliner,                        /* execute */
1969   NULL,                                 /* sub */
1970   NULL,                                 /* next */
1971   0,                                    /* static_pass_number */
1972   TV_INLINE_HEURISTICS,                 /* tv_id */
1973   PROP_ssa,                             /* properties_required */
1974   0,                                    /* properties_provided */
1975   0,                                    /* properties_destroyed */
1976   0,                                    /* todo_flags_start */
1977   0                                     /* todo_flags_finish */
1978  }
1979 };
1980
1981
1982 /* When to run IPA inlining.  Inlining of always-inline functions
1983    happens during early inlining.
1984
1985    Enable inlining unconditoinally at -flto.  We need size estimates to
1986    drive partitioning.  */
1987
1988 static bool
1989 gate_ipa_inline (void)
1990 {
1991   return optimize || flag_lto || flag_wpa;
1992 }
1993
1994 struct ipa_opt_pass_d pass_ipa_inline =
1995 {
1996  {
1997   IPA_PASS,
1998   "inline",                             /* name */
1999   gate_ipa_inline,                      /* gate */
2000   ipa_inline,                           /* execute */
2001   NULL,                                 /* sub */
2002   NULL,                                 /* next */
2003   0,                                    /* static_pass_number */
2004   TV_INLINE_HEURISTICS,                 /* tv_id */
2005   0,                                    /* properties_required */
2006   0,                                    /* properties_provided */
2007   0,                                    /* properties_destroyed */
2008   TODO_remove_functions,                /* todo_flags_finish */
2009   TODO_dump_cgraph 
2010   | TODO_remove_functions | TODO_ggc_collect    /* todo_flags_finish */
2011  },
2012  inline_generate_summary,               /* generate_summary */
2013  inline_write_summary,                  /* write_summary */
2014  inline_read_summary,                   /* read_summary */
2015  NULL,                                  /* write_optimization_summary */
2016  NULL,                                  /* read_optimization_summary */
2017  NULL,                                  /* stmt_fixup */
2018  0,                                     /* TODOs */
2019  inline_transform,                      /* function_transform */
2020  NULL,                                  /* variable_transform */
2021 };