OSDN Git Service

381942a55864c87d635922a5b05e35837922dce9
[pf3gnuchains/gcc-fork.git] / gcc / ipa-inline.c
1 /* Inlining decision heuristics.
2    Copyright (C) 2003, 2004, 2007, 2008, 2009, 2010
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     We separate inlining decisions from the inliner itself and store it
25     inside callgraph as so called inline plan.  Refer to cgraph.c
26     documentation about particular representation of inline plans in the
27     callgraph.
28
29     There are three major parts of this file:
30
31     cgraph_mark_inline implementation
32
33       This function allows to mark given call inline and performs necessary
34       modifications of cgraph (production of the clones and updating overall
35       statistics)
36
37     inlining heuristics limits
38
39       These functions allow to check that particular inlining is allowed
40       by the limits specified by user (allowed function growth, overall unit
41       growth and so on).
42
43     inlining heuristics
44
45       This is implementation of IPA pass aiming to get as much of benefit
46       from inlining obeying the limits checked above.
47
48       The implementation of particular heuristics is separated from
49       the rest of code to make it easier to replace it with more complicated
50       implementation in the future.  The rest of inlining code acts as a
51       library aimed to modify the callgraph and verify that the parameters
52       on code size growth fits.
53
54       To mark given call inline, use cgraph_mark_inline function, the
55       verification is performed by cgraph_default_inline_p and
56       cgraph_check_inline_limits.
57
58       The heuristics implements simple knapsack style algorithm ordering
59       all functions by their "profitability" (estimated by code size growth)
60       and inlining them in priority order.
61
62       cgraph_decide_inlining implements heuristics taking whole callgraph
63       into account, while cgraph_decide_inlining_incrementally considers
64       only one function at a time and is used by early inliner.
65
66    The inliner itself is split into several passes:
67
68    pass_inline_parameters
69
70      This pass computes local properties of functions that are used by inliner:
71      estimated function body size, whether function is inlinable at all and
72      stack frame consumption.
73
74      Before executing any of inliner passes, this local pass has to be applied
75      to each function in the callgraph (ie run as subpass of some earlier
76      IPA pass).  The results are made out of date by any optimization applied
77      on the function body.
78
79    pass_early_inlining
80
81      Simple local inlining pass inlining callees into current function.  This
82      pass makes no global whole compilation unit analysis and this when allowed
83      to do inlining expanding code size it might result in unbounded growth of
84      whole unit.
85
86      The pass is run during conversion into SSA form.  Only functions already
87      converted into SSA form are inlined, so the conversion must happen in
88      topological order on the callgraph (that is maintained by pass manager).
89      The functions after inlining are early optimized so the early inliner sees
90      unoptimized function itself, but all considered callees are already
91      optimized allowing it to unfold abstraction penalty on C++ effectively and
92      cheaply.
93
94    pass_ipa_early_inlining
95
96      With profiling, the early inlining is also necessary to reduce
97      instrumentation costs on program with high abstraction penalty (doing
98      many redundant calls).  This can't happen in parallel with early
99      optimization and profile instrumentation, because we would end up
100      re-instrumenting already instrumented function bodies we brought in via
101      inlining.
102
103      To avoid this, this pass is executed as IPA pass before profiling.  It is
104      simple wrapper to pass_early_inlining and ensures first inlining.
105
106    pass_ipa_inline
107
108      This is the main pass implementing simple greedy algorithm to do inlining
109      of small functions that results in overall growth of compilation unit and
110      inlining of functions called once.  The pass compute just so called inline
111      plan (representation of inlining to be done in callgraph) and unlike early
112      inlining it is not performing the inlining itself.
113
114    pass_apply_inline
115
116      This pass performs actual inlining according to pass_ipa_inline on given
117      function.  Possible the function body before inlining is saved when it is
118      needed for further inlining later.
119  */
120
121 #include "config.h"
122 #include "system.h"
123 #include "coretypes.h"
124 #include "tm.h"
125 #include "tree.h"
126 #include "tree-inline.h"
127 #include "langhooks.h"
128 #include "flags.h"
129 #include "cgraph.h"
130 #include "diagnostic.h"
131 #include "timevar.h"
132 #include "params.h"
133 #include "fibheap.h"
134 #include "intl.h"
135 #include "tree-pass.h"
136 #include "hashtab.h"
137 #include "coverage.h"
138 #include "ggc.h"
139 #include "tree-flow.h"
140 #include "rtl.h"
141 #include "ipa-prop.h"
142 #include "except.h"
143
144 #define MAX_TIME 1000000000
145
146 /* Mode incremental inliner operate on:
147
148    In ALWAYS_INLINE only functions marked
149    always_inline are inlined.  This mode is used after detecting cycle during
150    flattening.
151
152    In SIZE mode, only functions that reduce function body size after inlining
153    are inlined, this is used during early inlining.
154
155    in ALL mode, everything is inlined.  This is used during flattening.  */
156 enum inlining_mode {
157   INLINE_NONE = 0,
158   INLINE_ALWAYS_INLINE,
159   INLINE_SIZE_NORECURSIVE,
160   INLINE_SIZE,
161   INLINE_ALL
162 };
163
164 static bool
165 cgraph_decide_inlining_incrementally (struct cgraph_node *, enum inlining_mode);
166 static void cgraph_flatten (struct cgraph_node *node);
167
168
169 /* Statistics we collect about inlining algorithm.  */
170 static int ncalls_inlined;
171 static int nfunctions_inlined;
172 static int overall_size;
173 static gcov_type max_count, max_benefit;
174
175 /* Holders of ipa cgraph hooks: */
176 static struct cgraph_node_hook_list *function_insertion_hook_holder;
177
178 static inline struct inline_summary *
179 inline_summary (struct cgraph_node *node)
180 {
181   return &node->local.inline_summary;
182 }
183
184 /* Estimate self time of the function after inlining WHAT into TO.  */
185
186 static int
187 cgraph_estimate_time_after_inlining (int frequency, struct cgraph_node *to,
188                                      struct cgraph_node *what)
189 {
190   gcov_type time = (((gcov_type)what->global.time
191                      - inline_summary (what)->time_inlining_benefit)
192                     * frequency + CGRAPH_FREQ_BASE / 2) / CGRAPH_FREQ_BASE
193                     + to->global.time;
194   if (time < 0)
195     time = 0;
196   if (time > MAX_TIME)
197     time = MAX_TIME;
198   return time;
199 }
200
201 /* Estimate self time of the function after inlining WHAT into TO.  */
202
203 static int
204 cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to,
205                                      struct cgraph_node *what)
206 {
207   int size = (what->global.size - inline_summary (what)->size_inlining_benefit) * times + to->global.size;
208   gcc_assert (size >= 0);
209   return size;
210 }
211
212 /* Scale frequency of NODE edges by FREQ_SCALE and increase loop nest
213    by NEST.  */
214
215 static void
216 update_noncloned_frequencies (struct cgraph_node *node,
217                               int freq_scale, int nest)
218 {
219   struct cgraph_edge *e;
220
221   /* We do not want to ignore high loop nest after freq drops to 0.  */
222   if (!freq_scale)
223     freq_scale = 1;
224   for (e = node->callees; e; e = e->next_callee)
225     {
226       e->loop_nest += nest;
227       e->frequency = e->frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE;
228       if (e->frequency > CGRAPH_FREQ_MAX)
229         e->frequency = CGRAPH_FREQ_MAX;
230       if (!e->inline_failed)
231         update_noncloned_frequencies (e->callee, freq_scale, nest);
232     }
233 }
234
235 /* E is expected to be an edge being inlined.  Clone destination node of
236    the edge and redirect it to the new clone.
237    DUPLICATE is used for bookkeeping on whether we are actually creating new
238    clones or re-using node originally representing out-of-line function call.
239    */
240 void
241 cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
242                             bool update_original)
243 {
244   HOST_WIDE_INT peak;
245
246   if (duplicate)
247     {
248       /* We may eliminate the need for out-of-line copy to be output.
249          In that case just go ahead and re-use it.  */
250       if (!e->callee->callers->next_caller
251           && cgraph_can_remove_if_no_direct_calls_p (e->callee)
252           /* Don't reuse if more than one function shares a comdat group.
253              If the other function(s) are needed, we need to emit even
254              this function out of line.  */
255           && !e->callee->same_comdat_group
256           && !cgraph_new_nodes)
257         {
258           gcc_assert (!e->callee->global.inlined_to);
259           if (e->callee->analyzed)
260             {
261               overall_size -= e->callee->global.size;
262               nfunctions_inlined++;
263             }
264           duplicate = false;
265           e->callee->local.externally_visible = false;
266           update_noncloned_frequencies (e->callee, e->frequency, e->loop_nest);
267         }
268       else
269         {
270           struct cgraph_node *n;
271           n = cgraph_clone_node (e->callee, e->count, e->frequency, e->loop_nest,
272                                  update_original, NULL);
273           cgraph_redirect_edge_callee (e, n);
274         }
275     }
276
277   if (e->caller->global.inlined_to)
278     e->callee->global.inlined_to = e->caller->global.inlined_to;
279   else
280     e->callee->global.inlined_to = e->caller;
281   e->callee->global.stack_frame_offset
282     = e->caller->global.stack_frame_offset
283       + inline_summary (e->caller)->estimated_self_stack_size;
284   peak = e->callee->global.stack_frame_offset
285       + inline_summary (e->callee)->estimated_self_stack_size;
286   if (e->callee->global.inlined_to->global.estimated_stack_size < peak)
287     e->callee->global.inlined_to->global.estimated_stack_size = peak;
288   cgraph_propagate_frequency (e->callee);
289
290   /* Recursively clone all bodies.  */
291   for (e = e->callee->callees; e; e = e->next_callee)
292     if (!e->inline_failed)
293       cgraph_clone_inlined_nodes (e, duplicate, update_original);
294 }
295
296 /* Mark edge E as inlined and update callgraph accordingly.  UPDATE_ORIGINAL
297    specify whether profile of original function should be updated.  If any new
298    indirect edges are discovered in the process, add them to NEW_EDGES, unless
299    it is NULL.  Return true iff any new callgraph edges were discovered as a
300    result of inlining.  */
301
302 static bool
303 cgraph_mark_inline_edge (struct cgraph_edge *e, bool update_original,
304                          VEC (cgraph_edge_p, heap) **new_edges)
305 {
306   int old_size = 0, new_size = 0;
307   struct cgraph_node *to = NULL, *what;
308   struct cgraph_edge *curr = e;
309   int freq;
310
311   gcc_assert (e->inline_failed);
312   e->inline_failed = CIF_OK;
313
314   if (!e->callee->global.inlined)
315     DECL_POSSIBLY_INLINED (e->callee->decl) = true;
316   e->callee->global.inlined = true;
317
318   cgraph_clone_inlined_nodes (e, true, update_original);
319
320   what = e->callee;
321
322   freq = e->frequency;
323   /* Now update size of caller and all functions caller is inlined into.  */
324   for (;e && !e->inline_failed; e = e->caller->callers)
325     {
326       to = e->caller;
327       old_size = e->caller->global.size;
328       new_size = cgraph_estimate_size_after_inlining (1, to, what);
329       to->global.size = new_size;
330       to->global.time = cgraph_estimate_time_after_inlining (freq, to, what);
331     }
332   gcc_assert (what->global.inlined_to == to);
333   if (new_size > old_size)
334     overall_size += new_size - old_size;
335   ncalls_inlined++;
336
337   if (flag_indirect_inlining)
338     return ipa_propagate_indirect_call_infos (curr, new_edges);
339   else
340     return false;
341 }
342
343 /* Mark all calls of EDGE->CALLEE inlined into EDGE->CALLER.  */
344
345 static void
346 cgraph_mark_inline (struct cgraph_edge *edge)
347 {
348   struct cgraph_node *to = edge->caller;
349   struct cgraph_node *what = edge->callee;
350   struct cgraph_edge *e, *next;
351
352   gcc_assert (!edge->call_stmt_cannot_inline_p);
353   /* Look for all calls, mark them inline and clone recursively
354      all inlined functions.  */
355   for (e = what->callers; e; e = next)
356     {
357       next = e->next_caller;
358       if (e->caller == to && e->inline_failed)
359         {
360           cgraph_mark_inline_edge (e, true, NULL);
361           if (e == edge)
362             edge = next;
363         }
364     }
365 }
366
367 /* Estimate the growth caused by inlining NODE into all callees.  */
368
369 static int
370 cgraph_estimate_growth (struct cgraph_node *node)
371 {
372   int growth = 0;
373   struct cgraph_edge *e;
374   bool self_recursive = false;
375
376   if (node->global.estimated_growth != INT_MIN)
377     return node->global.estimated_growth;
378
379   for (e = node->callers; e; e = e->next_caller)
380     {
381       if (e->caller == node)
382         self_recursive = true;
383       if (e->inline_failed)
384         growth += (cgraph_estimate_size_after_inlining (1, e->caller, node)
385                    - e->caller->global.size);
386     }
387
388   /* ??? Wrong for non-trivially self recursive functions or cases where
389      we decide to not inline for different reasons, but it is not big deal
390      as in that case we will keep the body around, but we will also avoid
391      some inlining.  */
392   if (cgraph_only_called_directly_p (node)
393       && !DECL_EXTERNAL (node->decl) && !self_recursive)
394     growth -= node->global.size;
395
396   node->global.estimated_growth = growth;
397   return growth;
398 }
399
400 /* Return false when inlining WHAT into TO is not good idea
401    as it would cause too large growth of function bodies.
402    When ONE_ONLY is true, assume that only one call site is going
403    to be inlined, otherwise figure out how many call sites in
404    TO calls WHAT and verify that all can be inlined.
405    */
406
407 static bool
408 cgraph_check_inline_limits (struct cgraph_node *to, struct cgraph_node *what,
409                             cgraph_inline_failed_t *reason, bool one_only)
410 {
411   int times = 0;
412   struct cgraph_edge *e;
413   int newsize;
414   int limit;
415   HOST_WIDE_INT stack_size_limit, inlined_stack;
416
417   if (one_only)
418     times = 1;
419   else
420     for (e = to->callees; e; e = e->next_callee)
421       if (e->callee == what)
422         times++;
423
424   if (to->global.inlined_to)
425     to = to->global.inlined_to;
426
427   /* When inlining large function body called once into small function,
428      take the inlined function as base for limiting the growth.  */
429   if (inline_summary (to)->self_size > inline_summary(what)->self_size)
430     limit = inline_summary (to)->self_size;
431   else
432     limit = inline_summary (what)->self_size;
433
434   limit += limit * PARAM_VALUE (PARAM_LARGE_FUNCTION_GROWTH) / 100;
435
436   /* Check the size after inlining against the function limits.  But allow
437      the function to shrink if it went over the limits by forced inlining.  */
438   newsize = cgraph_estimate_size_after_inlining (times, to, what);
439   if (newsize >= to->global.size
440       && newsize > PARAM_VALUE (PARAM_LARGE_FUNCTION_INSNS)
441       && newsize > limit)
442     {
443       if (reason)
444         *reason = CIF_LARGE_FUNCTION_GROWTH_LIMIT;
445       return false;
446     }
447
448   stack_size_limit = inline_summary (to)->estimated_self_stack_size;
449
450   stack_size_limit += stack_size_limit * PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) / 100;
451
452   inlined_stack = (to->global.stack_frame_offset
453                    + inline_summary (to)->estimated_self_stack_size
454                    + what->global.estimated_stack_size);
455   if (inlined_stack  > stack_size_limit
456       && inlined_stack > PARAM_VALUE (PARAM_LARGE_STACK_FRAME))
457     {
458       if (reason)
459         *reason = CIF_LARGE_STACK_FRAME_GROWTH_LIMIT;
460       return false;
461     }
462   return true;
463 }
464
465 /* Return true when function N is small enough to be inlined.  */
466
467 static bool
468 cgraph_default_inline_p (struct cgraph_node *n, cgraph_inline_failed_t *reason)
469 {
470   tree decl = n->decl;
471
472   if (n->local.disregard_inline_limits)
473     return true;
474
475   if (!flag_inline_small_functions && !DECL_DECLARED_INLINE_P (decl))
476     {
477       if (reason)
478         *reason = CIF_FUNCTION_NOT_INLINE_CANDIDATE;
479       return false;
480     }
481
482   if (!n->analyzed)
483     {
484       if (reason)
485         *reason = CIF_BODY_NOT_AVAILABLE;
486       return false;
487     }
488
489   if (DECL_DECLARED_INLINE_P (decl))
490     {
491       if (n->global.size >= MAX_INLINE_INSNS_SINGLE)
492         {
493           if (reason)
494             *reason = CIF_MAX_INLINE_INSNS_SINGLE_LIMIT;
495           return false;
496         }
497     }
498   else
499     {
500       if (n->global.size >= MAX_INLINE_INSNS_AUTO)
501         {
502           if (reason)
503             *reason = CIF_MAX_INLINE_INSNS_AUTO_LIMIT;
504           return false;
505         }
506     }
507
508   return true;
509 }
510
511 /* Return true when inlining WHAT would create recursive inlining.
512    We call recursive inlining all cases where same function appears more than
513    once in the single recursion nest path in the inline graph.  */
514
515 static bool
516 cgraph_recursive_inlining_p (struct cgraph_node *to,
517                              struct cgraph_node *what,
518                              cgraph_inline_failed_t *reason)
519 {
520   bool recursive;
521   if (to->global.inlined_to)
522     recursive = what->decl == to->global.inlined_to->decl;
523   else
524     recursive = what->decl == to->decl;
525   /* Marking recursive function inline has sane semantic and thus we should
526      not warn on it.  */
527   if (recursive && reason)
528     *reason = (what->local.disregard_inline_limits
529                ? CIF_RECURSIVE_INLINING : CIF_UNSPECIFIED);
530   return recursive;
531 }
532
533 /* A cost model driving the inlining heuristics in a way so the edges with
534    smallest badness are inlined first.  After each inlining is performed
535    the costs of all caller edges of nodes affected are recomputed so the
536    metrics may accurately depend on values such as number of inlinable callers
537    of the function or function body size.  */
538
539 static int
540 cgraph_edge_badness (struct cgraph_edge *edge, bool dump)
541 {
542   gcov_type badness;
543   int growth =
544     (cgraph_estimate_size_after_inlining (1, edge->caller, edge->callee)
545      - edge->caller->global.size);
546
547   if (dump)
548     {
549       fprintf (dump_file, "    Badness calculcation for %s -> %s\n",
550                cgraph_node_name (edge->caller),
551                cgraph_node_name (edge->callee));
552       fprintf (dump_file, "      growth %i, time %i-%i, size %i-%i\n",
553                growth,
554                edge->callee->global.time,
555                inline_summary (edge->callee)->time_inlining_benefit,
556                edge->callee->global.size,
557                inline_summary (edge->callee)->size_inlining_benefit);
558     }
559
560   /* Always prefer inlining saving code size.  */
561   if (growth <= 0)
562     {
563       badness = INT_MIN - growth;
564       if (dump)
565         fprintf (dump_file, "      %i: Growth %i < 0\n", (int) badness,
566                  growth);
567     }
568
569   /* When profiling is available, base priorities -(#calls / growth).
570      So we optimize for overall number of "executed" inlined calls.  */
571   else if (max_count)
572     {
573       badness =
574         ((int)
575          ((double) edge->count * INT_MIN / max_count / (max_benefit + 1)) *
576          (inline_summary (edge->callee)->time_inlining_benefit + 1)) / growth;
577       if (dump)
578         {
579           fprintf (dump_file,
580                    "      %i (relative %f): profile info. Relative count %f"
581                    " * Relative benefit %f\n",
582                    (int) badness, (double) badness / INT_MIN,
583                    (double) edge->count / max_count,
584                    (double) (inline_summary (edge->callee)->
585                              time_inlining_benefit + 1) / (max_benefit + 1));
586         }
587     }
588
589   /* When function local profile is available, base priorities on
590      growth / frequency, so we optimize for overall frequency of inlined
591      calls.  This is not too accurate since while the call might be frequent
592      within function, the function itself is infrequent.
593
594      Other objective to optimize for is number of different calls inlined.
595      We add the estimated growth after inlining all functions to bias the
596      priorities slightly in this direction (so fewer times called functions
597      of the same size gets priority).  */
598   else if (flag_guess_branch_prob)
599     {
600       int div = edge->frequency * 100 / CGRAPH_FREQ_BASE + 1;
601       int benefitperc;
602       int growth_for_all;
603       badness = growth * 10000;
604       benefitperc =
605         MIN (100 * inline_summary (edge->callee)->time_inlining_benefit /
606              (edge->callee->global.time + 1) +1, 100);
607       div *= benefitperc;
608
609
610       /* Decrease badness if call is nested.  */
611       /* Compress the range so we don't overflow.  */
612       if (div > 10000)
613         div = 10000 + ceil_log2 (div) - 8;
614       if (div < 1)
615         div = 1;
616       if (badness > 0)
617         badness /= div;
618       growth_for_all = cgraph_estimate_growth (edge->callee);
619       badness += growth_for_all;
620       if (badness > INT_MAX)
621         badness = INT_MAX;
622       if (dump)
623         {
624           fprintf (dump_file,
625                    "      %i: guessed profile. frequency %i, overall growth %i,"
626                    " benefit %i%%, divisor %i\n",
627                    (int) badness, edge->frequency, growth_for_all, benefitperc, div);
628         }
629     }
630   /* When function local profile is not available or it does not give
631      useful information (ie frequency is zero), base the cost on
632      loop nest and overall size growth, so we optimize for overall number
633      of functions fully inlined in program.  */
634   else
635     {
636       int nest = MIN (edge->loop_nest, 8);
637       badness = cgraph_estimate_growth (edge->callee) * 256;
638
639       /* Decrease badness if call is nested.  */
640       if (badness > 0)
641         badness >>= nest;
642       else
643         {
644           badness <<= nest;
645         }
646       if (dump)
647         fprintf (dump_file, "      %i: no profile. nest %i\n", (int) badness,
648                  nest);
649     }
650
651   /* Ensure that we did not overflow in all the fixed point math above.  */
652   gcc_assert (badness >= INT_MIN);
653   gcc_assert (badness <= INT_MAX - 1);
654   /* Make recursive inlining happen always after other inlining is done.  */
655   if (cgraph_recursive_inlining_p (edge->caller, edge->callee, NULL))
656     return badness + 1;
657   else
658     return badness;
659 }
660
661 /* Recompute heap nodes for each of caller edge.  */
662
663 static void
664 update_caller_keys (fibheap_t heap, struct cgraph_node *node,
665                     bitmap updated_nodes)
666 {
667   struct cgraph_edge *edge;
668   cgraph_inline_failed_t failed_reason;
669
670   if (!node->local.inlinable || node->local.disregard_inline_limits
671       || node->global.inlined_to)
672     return;
673   if (bitmap_bit_p (updated_nodes, node->uid))
674     return;
675   bitmap_set_bit (updated_nodes, node->uid);
676   node->global.estimated_growth = INT_MIN;
677
678   if (!node->local.inlinable)
679     return;
680   /* Prune out edges we won't inline into anymore.  */
681   if (!cgraph_default_inline_p (node, &failed_reason))
682     {
683       for (edge = node->callers; edge; edge = edge->next_caller)
684         if (edge->aux)
685           {
686             fibheap_delete_node (heap, (fibnode_t) edge->aux);
687             edge->aux = NULL;
688             if (edge->inline_failed)
689               edge->inline_failed = failed_reason;
690           }
691       return;
692     }
693
694   for (edge = node->callers; edge; edge = edge->next_caller)
695     if (edge->inline_failed)
696       {
697         int badness = cgraph_edge_badness (edge, false);
698         if (edge->aux)
699           {
700             fibnode_t n = (fibnode_t) edge->aux;
701             gcc_assert (n->data == edge);
702             if (n->key == badness)
703               continue;
704
705             /* fibheap_replace_key only increase the keys.  */
706             if (badness < n->key)
707               {
708                 fibheap_replace_key (heap, n, badness);
709                 gcc_assert (n->key == badness);
710                 continue;
711               }
712             fibheap_delete_node (heap, (fibnode_t) edge->aux);
713           }
714         edge->aux = fibheap_insert (heap, badness, edge);
715       }
716 }
717
718 /* Recompute heap nodes for each of caller edges of each of callees.  */
719
720 static void
721 update_callee_keys (fibheap_t heap, struct cgraph_node *node,
722                     bitmap updated_nodes)
723 {
724   struct cgraph_edge *e;
725   node->global.estimated_growth = INT_MIN;
726
727   for (e = node->callees; e; e = e->next_callee)
728     if (e->inline_failed)
729       update_caller_keys (heap, e->callee, updated_nodes);
730     else if (!e->inline_failed)
731       update_callee_keys (heap, e->callee, updated_nodes);
732 }
733
734 /* Enqueue all recursive calls from NODE into priority queue depending on
735    how likely we want to recursively inline the call.  */
736
737 static void
738 lookup_recursive_calls (struct cgraph_node *node, struct cgraph_node *where,
739                         fibheap_t heap)
740 {
741   static int priority;
742   struct cgraph_edge *e;
743   for (e = where->callees; e; e = e->next_callee)
744     if (e->callee == node)
745       {
746         /* When profile feedback is available, prioritize by expected number
747            of calls.  Without profile feedback we maintain simple queue
748            to order candidates via recursive depths.  */
749         fibheap_insert (heap,
750                         !max_count ? priority++
751                         : -(e->count / ((max_count + (1<<24) - 1) / (1<<24))),
752                         e);
753       }
754   for (e = where->callees; e; e = e->next_callee)
755     if (!e->inline_failed)
756       lookup_recursive_calls (node, e->callee, heap);
757 }
758
759 /* Decide on recursive inlining: in the case function has recursive calls,
760    inline until body size reaches given argument.  If any new indirect edges
761    are discovered in the process, add them to *NEW_EDGES, unless NEW_EDGES
762    is NULL.  */
763
764 static bool
765 cgraph_decide_recursive_inlining (struct cgraph_node *node,
766                                   VEC (cgraph_edge_p, heap) **new_edges)
767 {
768   int limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO);
769   int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO);
770   int probability = PARAM_VALUE (PARAM_MIN_INLINE_RECURSIVE_PROBABILITY);
771   fibheap_t heap;
772   struct cgraph_edge *e;
773   struct cgraph_node *master_clone, *next;
774   int depth = 0;
775   int n = 0;
776
777   /* It does not make sense to recursively inline always-inline functions
778      as we are going to sorry() on the remaining calls anyway.  */
779   if (node->local.disregard_inline_limits
780       && lookup_attribute ("always_inline", DECL_ATTRIBUTES (node->decl)))
781     return false;
782
783   if (optimize_function_for_size_p (DECL_STRUCT_FUNCTION (node->decl))
784       || (!flag_inline_functions && !DECL_DECLARED_INLINE_P (node->decl)))
785     return false;
786
787   if (DECL_DECLARED_INLINE_P (node->decl))
788     {
789       limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE);
790       max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH);
791     }
792
793   /* Make sure that function is small enough to be considered for inlining.  */
794   if (!max_depth
795       || cgraph_estimate_size_after_inlining (1, node, node)  >= limit)
796     return false;
797   heap = fibheap_new ();
798   lookup_recursive_calls (node, node, heap);
799   if (fibheap_empty (heap))
800     {
801       fibheap_delete (heap);
802       return false;
803     }
804
805   if (dump_file)
806     fprintf (dump_file,
807              "  Performing recursive inlining on %s\n",
808              cgraph_node_name (node));
809
810   /* We need original clone to copy around.  */
811   master_clone = cgraph_clone_node (node, node->count, CGRAPH_FREQ_BASE, 1,
812                                     false, NULL);
813   master_clone->needed = true;
814   for (e = master_clone->callees; e; e = e->next_callee)
815     if (!e->inline_failed)
816       cgraph_clone_inlined_nodes (e, true, false);
817
818   /* Do the inlining and update list of recursive call during process.  */
819   while (!fibheap_empty (heap)
820          && (cgraph_estimate_size_after_inlining (1, node, master_clone)
821              <= limit))
822     {
823       struct cgraph_edge *curr
824         = (struct cgraph_edge *) fibheap_extract_min (heap);
825       struct cgraph_node *cnode;
826
827       depth = 1;
828       for (cnode = curr->caller;
829            cnode->global.inlined_to; cnode = cnode->callers->caller)
830         if (node->decl == curr->callee->decl)
831           depth++;
832       if (depth > max_depth)
833         {
834           if (dump_file)
835             fprintf (dump_file,
836                      "   maximal depth reached\n");
837           continue;
838         }
839
840       if (max_count)
841         {
842           if (!cgraph_maybe_hot_edge_p (curr))
843             {
844               if (dump_file)
845                 fprintf (dump_file, "   Not inlining cold call\n");
846               continue;
847             }
848           if (curr->count * 100 / node->count < probability)
849             {
850               if (dump_file)
851                 fprintf (dump_file,
852                          "   Probability of edge is too small\n");
853               continue;
854             }
855         }
856
857       if (dump_file)
858         {
859           fprintf (dump_file,
860                    "   Inlining call of depth %i", depth);
861           if (node->count)
862             {
863               fprintf (dump_file, " called approx. %.2f times per call",
864                        (double)curr->count / node->count);
865             }
866           fprintf (dump_file, "\n");
867         }
868       cgraph_redirect_edge_callee (curr, master_clone);
869       cgraph_mark_inline_edge (curr, false, new_edges);
870       lookup_recursive_calls (node, curr->callee, heap);
871       n++;
872     }
873   if (!fibheap_empty (heap) && dump_file)
874     fprintf (dump_file, "    Recursive inlining growth limit met.\n");
875
876   fibheap_delete (heap);
877   if (dump_file)
878     fprintf (dump_file,
879              "\n   Inlined %i times, body grown from size %i to %i, time %i to %i\n", n,
880              master_clone->global.size, node->global.size,
881              master_clone->global.time, node->global.time);
882
883   /* Remove master clone we used for inlining.  We rely that clones inlined
884      into master clone gets queued just before master clone so we don't
885      need recursion.  */
886   for (node = cgraph_nodes; node != master_clone;
887        node = next)
888     {
889       next = node->next;
890       if (node->global.inlined_to == master_clone)
891         cgraph_remove_node (node);
892     }
893   cgraph_remove_node (master_clone);
894   /* FIXME: Recursive inlining actually reduces number of calls of the
895      function.  At this place we should probably walk the function and
896      inline clones and compensate the counts accordingly.  This probably
897      doesn't matter much in practice.  */
898   return n > 0;
899 }
900
901 /* Set inline_failed for all callers of given function to REASON.  */
902
903 static void
904 cgraph_set_inline_failed (struct cgraph_node *node,
905                           cgraph_inline_failed_t reason)
906 {
907   struct cgraph_edge *e;
908
909   if (dump_file)
910     fprintf (dump_file, "Inlining failed: %s\n",
911              cgraph_inline_failed_string (reason));
912   for (e = node->callers; e; e = e->next_caller)
913     if (e->inline_failed)
914       e->inline_failed = reason;
915 }
916
917 /* Given whole compilation unit estimate of INSNS, compute how large we can
918    allow the unit to grow.  */
919 static int
920 compute_max_insns (int insns)
921 {
922   int max_insns = insns;
923   if (max_insns < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS))
924     max_insns = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS);
925
926   return ((HOST_WIDEST_INT) max_insns
927           * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100);
928 }
929
930 /* Compute badness of all edges in NEW_EDGES and add them to the HEAP.  */
931 static void
932 add_new_edges_to_heap (fibheap_t heap, VEC (cgraph_edge_p, heap) *new_edges)
933 {
934   while (VEC_length (cgraph_edge_p, new_edges) > 0)
935     {
936       struct cgraph_edge *edge = VEC_pop (cgraph_edge_p, new_edges);
937
938       gcc_assert (!edge->aux);
939       edge->aux = fibheap_insert (heap, cgraph_edge_badness (edge, false), edge);
940     }
941 }
942
943
944 /* We use greedy algorithm for inlining of small functions:
945    All inline candidates are put into prioritized heap based on estimated
946    growth of the overall number of instructions and then update the estimates.
947
948    INLINED and INLINED_CALEES are just pointers to arrays large enough
949    to be passed to cgraph_inlined_into and cgraph_inlined_callees.  */
950
951 static void
952 cgraph_decide_inlining_of_small_functions (void)
953 {
954   struct cgraph_node *node;
955   struct cgraph_edge *edge;
956   cgraph_inline_failed_t failed_reason;
957   fibheap_t heap = fibheap_new ();
958   bitmap updated_nodes = BITMAP_ALLOC (NULL);
959   int min_size, max_size;
960   VEC (cgraph_edge_p, heap) *new_indirect_edges = NULL;
961
962   if (flag_indirect_inlining)
963     new_indirect_edges = VEC_alloc (cgraph_edge_p, heap, 8);
964
965   if (dump_file)
966     fprintf (dump_file, "\nDeciding on smaller functions:\n");
967
968   /* Put all inline candidates into the heap.  */
969
970   for (node = cgraph_nodes; node; node = node->next)
971     {
972       if (!node->local.inlinable || !node->callers)
973         continue;
974       if (dump_file)
975         fprintf (dump_file, "Considering inline candidate %s.\n", cgraph_node_name (node));
976
977       node->global.estimated_growth = INT_MIN;
978       if (!cgraph_default_inline_p (node, &failed_reason))
979         {
980           cgraph_set_inline_failed (node, failed_reason);
981           continue;
982         }
983
984       for (edge = node->callers; edge; edge = edge->next_caller)
985         if (edge->inline_failed)
986           {
987             gcc_assert (!edge->aux);
988             edge->aux = fibheap_insert (heap, cgraph_edge_badness (edge, false), edge);
989           }
990     }
991
992   max_size = compute_max_insns (overall_size);
993   min_size = overall_size;
994
995   while (overall_size <= max_size
996          && !fibheap_empty (heap))
997     {
998       int old_size = overall_size;
999       struct cgraph_node *where, *callee;
1000       int badness = fibheap_min_key (heap);
1001       int growth;
1002       cgraph_inline_failed_t not_good = CIF_OK;
1003
1004       edge = (struct cgraph_edge *) fibheap_extract_min (heap);
1005       gcc_assert (edge->aux);
1006       edge->aux = NULL;
1007       if (!edge->inline_failed)
1008         continue;
1009 #ifdef ENABLE_CHECKING
1010       gcc_assert (cgraph_edge_badness (edge, false) == badness);
1011 #endif
1012       callee = edge->callee;
1013
1014       growth = (cgraph_estimate_size_after_inlining (1, edge->caller, edge->callee)
1015                 - edge->caller->global.size);
1016
1017       if (dump_file)
1018         {
1019           fprintf (dump_file,
1020                    "\nConsidering %s with %i size\n",
1021                    cgraph_node_name (edge->callee),
1022                    edge->callee->global.size);
1023           fprintf (dump_file,
1024                    " to be inlined into %s in %s:%i\n"
1025                    " Estimated growth after inlined into all callees is %+i insns.\n"
1026                    " Estimated badness is %i, frequency %.2f.\n",
1027                    cgraph_node_name (edge->caller),
1028                    flag_wpa ? "unknown"
1029                    : gimple_filename ((const_gimple) edge->call_stmt),
1030                    flag_wpa ? -1 : gimple_lineno ((const_gimple) edge->call_stmt),
1031                    cgraph_estimate_growth (edge->callee),
1032                    badness,
1033                    edge->frequency / (double)CGRAPH_FREQ_BASE);
1034           if (edge->count)
1035             fprintf (dump_file," Called "HOST_WIDEST_INT_PRINT_DEC"x\n", edge->count);
1036           if (dump_flags & TDF_DETAILS)
1037             cgraph_edge_badness (edge, true);
1038         }
1039
1040       /* When not having profile info ready we don't weight by any way the
1041          position of call in procedure itself.  This means if call of
1042          function A from function B seems profitable to inline, the recursive
1043          call of function A in inline copy of A in B will look profitable too
1044          and we end up inlining until reaching maximal function growth.  This
1045          is not good idea so prohibit the recursive inlining.
1046
1047          ??? When the frequencies are taken into account we might not need this
1048          restriction.
1049
1050          We need to be cureful here, in some testcases, e.g. directivec.c in
1051          libcpp, we can estimate self recursive function to have negative growth
1052          for inlining completely.
1053          */
1054       if (!edge->count)
1055         {
1056           where = edge->caller;
1057           while (where->global.inlined_to)
1058             {
1059               if (where->decl == edge->callee->decl)
1060                 break;
1061               where = where->callers->caller;
1062             }
1063           if (where->global.inlined_to)
1064             {
1065               edge->inline_failed
1066                 = (edge->callee->local.disregard_inline_limits
1067                    ? CIF_RECURSIVE_INLINING : CIF_UNSPECIFIED);
1068               if (dump_file)
1069                 fprintf (dump_file, " inline_failed:Recursive inlining performed only for function itself.\n");
1070               continue;
1071             }
1072         }
1073
1074       if (!cgraph_maybe_hot_edge_p (edge))
1075         not_good = CIF_UNLIKELY_CALL;
1076       if (!flag_inline_functions
1077           && !DECL_DECLARED_INLINE_P (edge->callee->decl))
1078         not_good = CIF_NOT_DECLARED_INLINED;
1079       if (optimize_function_for_size_p (DECL_STRUCT_FUNCTION(edge->caller->decl)))
1080         not_good = CIF_OPTIMIZING_FOR_SIZE;
1081       if (not_good && growth > 0 && cgraph_estimate_growth (edge->callee) > 0)
1082         {
1083           if (!cgraph_recursive_inlining_p (edge->caller, edge->callee,
1084                                             &edge->inline_failed))
1085             {
1086               edge->inline_failed = not_good;
1087               if (dump_file)
1088                 fprintf (dump_file, " inline_failed:%s.\n",
1089                          cgraph_inline_failed_string (edge->inline_failed));
1090             }
1091           continue;
1092         }
1093       if (!cgraph_default_inline_p (edge->callee, &edge->inline_failed))
1094         {
1095           if (!cgraph_recursive_inlining_p (edge->caller, edge->callee,
1096                                             &edge->inline_failed))
1097             {
1098               if (dump_file)
1099                 fprintf (dump_file, " inline_failed:%s.\n",
1100                          cgraph_inline_failed_string (edge->inline_failed));
1101             }
1102           continue;
1103         }
1104       if (!tree_can_inline_p (edge))
1105         {
1106           if (dump_file)
1107             fprintf (dump_file, " inline_failed:%s.\n",
1108                      cgraph_inline_failed_string (edge->inline_failed));
1109           continue;
1110         }
1111       if (cgraph_recursive_inlining_p (edge->caller, edge->callee,
1112                                        &edge->inline_failed))
1113         {
1114           where = edge->caller;
1115           if (where->global.inlined_to)
1116             where = where->global.inlined_to;
1117           if (!cgraph_decide_recursive_inlining (where,
1118                                                  flag_indirect_inlining
1119                                                  ? &new_indirect_edges : NULL))
1120             continue;
1121           if (flag_indirect_inlining)
1122             add_new_edges_to_heap (heap, new_indirect_edges);
1123           update_callee_keys (heap, where, updated_nodes);
1124         }
1125       else
1126         {
1127           struct cgraph_node *callee;
1128           if (edge->call_stmt_cannot_inline_p
1129               || !cgraph_check_inline_limits (edge->caller, edge->callee,
1130                                               &edge->inline_failed, true))
1131             {
1132               if (dump_file)
1133                 fprintf (dump_file, " Not inlining into %s:%s.\n",
1134                          cgraph_node_name (edge->caller),
1135                          cgraph_inline_failed_string (edge->inline_failed));
1136               continue;
1137             }
1138           callee = edge->callee;
1139           cgraph_mark_inline_edge (edge, true, &new_indirect_edges);
1140           if (flag_indirect_inlining)
1141             add_new_edges_to_heap (heap, new_indirect_edges);
1142
1143           update_callee_keys (heap, callee, updated_nodes);
1144         }
1145       where = edge->caller;
1146       if (where->global.inlined_to)
1147         where = where->global.inlined_to;
1148
1149       /* Our profitability metric can depend on local properties
1150          such as number of inlinable calls and size of the function body.
1151          After inlining these properties might change for the function we
1152          inlined into (since it's body size changed) and for the functions
1153          called by function we inlined (since number of it inlinable callers
1154          might change).  */
1155       update_caller_keys (heap, where, updated_nodes);
1156
1157       /* We removed one call of the function we just inlined.  If offline
1158          copy is still needed, be sure to update the keys.  */
1159       if (callee != where && !callee->global.inlined_to)
1160         update_caller_keys (heap, callee, updated_nodes);
1161       bitmap_clear (updated_nodes);
1162
1163       if (dump_file)
1164         {
1165           fprintf (dump_file,
1166                    " Inlined into %s which now has size %i and self time %i,"
1167                    "net change of %+i.\n",
1168                    cgraph_node_name (edge->caller),
1169                    edge->caller->global.time,
1170                    edge->caller->global.size,
1171                    overall_size - old_size);
1172         }
1173       if (min_size > overall_size)
1174         {
1175           min_size = overall_size;
1176           max_size = compute_max_insns (min_size);
1177
1178           if (dump_file)
1179             fprintf (dump_file, "New minimal size reached: %i\n", min_size);
1180         }
1181     }
1182   while (!fibheap_empty (heap))
1183     {
1184       int badness = fibheap_min_key (heap);
1185
1186       edge = (struct cgraph_edge *) fibheap_extract_min (heap);
1187       gcc_assert (edge->aux);
1188       edge->aux = NULL;
1189       if (!edge->inline_failed)
1190         continue;
1191 #ifdef ENABLE_CHECKING
1192       gcc_assert (cgraph_edge_badness (edge, false) == badness);
1193 #endif
1194       if (dump_file)
1195         {
1196           fprintf (dump_file,
1197                    "\nSkipping %s with %i size\n",
1198                    cgraph_node_name (edge->callee),
1199                    edge->callee->global.size);
1200           fprintf (dump_file,
1201                    " called by %s in %s:%i\n"
1202                    " Estimated growth after inlined into all callees is %+i insns.\n"
1203                    " Estimated badness is %i, frequency %.2f.\n",
1204                    cgraph_node_name (edge->caller),
1205                    flag_wpa ? "unknown"
1206                    : gimple_filename ((const_gimple) edge->call_stmt),
1207                    flag_wpa ? -1 : gimple_lineno ((const_gimple) edge->call_stmt),
1208                    cgraph_estimate_growth (edge->callee),
1209                    badness,
1210                    edge->frequency / (double)CGRAPH_FREQ_BASE);
1211           if (edge->count)
1212             fprintf (dump_file," Called "HOST_WIDEST_INT_PRINT_DEC"x\n", edge->count);
1213           if (dump_flags & TDF_DETAILS)
1214             cgraph_edge_badness (edge, true);
1215         }
1216       if (!edge->callee->local.disregard_inline_limits && edge->inline_failed
1217           && !cgraph_recursive_inlining_p (edge->caller, edge->callee,
1218                                            &edge->inline_failed))
1219         edge->inline_failed = CIF_INLINE_UNIT_GROWTH_LIMIT;
1220     }
1221
1222   if (new_indirect_edges)
1223     VEC_free (cgraph_edge_p, heap, new_indirect_edges);
1224   fibheap_delete (heap);
1225   BITMAP_FREE (updated_nodes);
1226 }
1227
1228 /* Flatten NODE from the IPA inliner.  */
1229
1230 static void
1231 cgraph_flatten (struct cgraph_node *node)
1232 {
1233   struct cgraph_edge *e;
1234
1235   /* We shouldn't be called recursively when we are being processed.  */
1236   gcc_assert (node->aux == NULL);
1237
1238   node->aux = (void *)(size_t) INLINE_ALL;
1239
1240   for (e = node->callees; e; e = e->next_callee)
1241     {
1242       struct cgraph_node *orig_callee;
1243
1244       if (e->call_stmt_cannot_inline_p)
1245         continue;
1246
1247       if (!e->callee->analyzed)
1248         {
1249           if (dump_file)
1250             fprintf (dump_file,
1251                      "Not inlining: Function body not available.\n");
1252           continue;
1253         }
1254
1255       /* We've hit cycle?  It is time to give up.  */
1256       if (e->callee->aux)
1257         {
1258           if (dump_file)
1259             fprintf (dump_file,
1260                      "Not inlining %s into %s to avoid cycle.\n",
1261                      cgraph_node_name (e->callee),
1262                      cgraph_node_name (e->caller));
1263           e->inline_failed = CIF_RECURSIVE_INLINING;
1264           continue;
1265         }
1266
1267       /* When the edge is already inlined, we just need to recurse into
1268          it in order to fully flatten the leaves.  */
1269       if (!e->inline_failed)
1270         {
1271           cgraph_flatten (e->callee);
1272           continue;
1273         }
1274
1275       if (cgraph_recursive_inlining_p (node, e->callee, &e->inline_failed))
1276         {
1277           if (dump_file)
1278             fprintf (dump_file, "Not inlining: recursive call.\n");
1279           continue;
1280         }
1281
1282       if (!tree_can_inline_p (e))
1283         {
1284           if (dump_file)
1285             fprintf (dump_file, "Not inlining: %s",
1286                      cgraph_inline_failed_string (e->inline_failed));
1287           continue;
1288         }
1289
1290       /* Inline the edge and flatten the inline clone.  Avoid
1291          recursing through the original node if the node was cloned.  */
1292       if (dump_file)
1293         fprintf (dump_file, " Inlining %s into %s.\n",
1294                  cgraph_node_name (e->callee),
1295                  cgraph_node_name (e->caller));
1296       orig_callee = e->callee;
1297       cgraph_mark_inline_edge (e, true, NULL);
1298       if (e->callee != orig_callee)
1299         orig_callee->aux = (void *)(size_t) INLINE_ALL;
1300       cgraph_flatten (e->callee);
1301       if (e->callee != orig_callee)
1302         orig_callee->aux = NULL;
1303     }
1304
1305   node->aux = NULL;
1306 }
1307
1308 /* Decide on the inlining.  We do so in the topological order to avoid
1309    expenses on updating data structures.  */
1310
1311 static unsigned int
1312 cgraph_decide_inlining (void)
1313 {
1314   struct cgraph_node *node;
1315   int nnodes;
1316   struct cgraph_node **order =
1317     XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
1318   int old_size = 0;
1319   int i;
1320   int initial_size = 0;
1321
1322   cgraph_remove_function_insertion_hook (function_insertion_hook_holder);
1323   if (in_lto_p && flag_indirect_inlining)
1324     ipa_update_after_lto_read ();
1325
1326   max_count = 0;
1327   max_benefit = 0;
1328   for (node = cgraph_nodes; node; node = node->next)
1329     if (node->analyzed)
1330       {
1331         struct cgraph_edge *e;
1332
1333         gcc_assert (inline_summary (node)->self_size == node->global.size);
1334         initial_size += node->global.size;
1335         for (e = node->callees; e; e = e->next_callee)
1336           if (max_count < e->count)
1337             max_count = e->count;
1338         if (max_benefit < inline_summary (node)->time_inlining_benefit)
1339           max_benefit = inline_summary (node)->time_inlining_benefit;
1340       }
1341   gcc_assert (in_lto_p
1342               || !max_count
1343               || (profile_info && flag_branch_probabilities));
1344   overall_size = initial_size;
1345
1346   nnodes = cgraph_postorder (order);
1347
1348   if (dump_file)
1349     fprintf (dump_file,
1350              "\nDeciding on inlining.  Starting with size %i.\n",
1351              initial_size);
1352
1353   for (node = cgraph_nodes; node; node = node->next)
1354     node->aux = 0;
1355
1356   if (dump_file)
1357     fprintf (dump_file, "\nFlattening functions:\n");
1358
1359   /* In the first pass handle functions to be flattened.  Do this with
1360      a priority so none of our later choices will make this impossible.  */
1361   for (i = nnodes - 1; i >= 0; i--)
1362     {
1363       node = order[i];
1364
1365       /* Handle nodes to be flattened, but don't update overall unit
1366          size.  Calling the incremental inliner here is lame,
1367          a simple worklist should be enough.  What should be left
1368          here from the early inliner (if it runs) is cyclic cases.
1369          Ideally when processing callees we stop inlining at the
1370          entry of cycles, possibly cloning that entry point and
1371          try to flatten itself turning it into a self-recursive
1372          function.  */
1373       if (lookup_attribute ("flatten",
1374                             DECL_ATTRIBUTES (node->decl)) != NULL)
1375         {
1376           if (dump_file)
1377             fprintf (dump_file,
1378                      "Flattening %s\n", cgraph_node_name (node));
1379           cgraph_flatten (node);
1380         }
1381     }
1382
1383   cgraph_decide_inlining_of_small_functions ();
1384
1385   if (flag_inline_functions_called_once)
1386     {
1387       if (dump_file)
1388         fprintf (dump_file, "\nDeciding on functions called once:\n");
1389
1390       /* And finally decide what functions are called once.  */
1391       for (i = nnodes - 1; i >= 0; i--)
1392         {
1393           node = order[i];
1394
1395           if (node->callers
1396               && !node->callers->next_caller
1397               && cgraph_only_called_directly_p (node)
1398               && node->local.inlinable
1399               && node->callers->inline_failed
1400               && node->callers->caller != node
1401               && node->callers->caller->global.inlined_to != node
1402               && !node->callers->call_stmt_cannot_inline_p
1403               && !DECL_EXTERNAL (node->decl)
1404               && !DECL_COMDAT (node->decl))
1405             {
1406               cgraph_inline_failed_t reason;
1407               old_size = overall_size;
1408               if (dump_file)
1409                 {
1410                   fprintf (dump_file,
1411                            "\nConsidering %s size %i.\n",
1412                            cgraph_node_name (node), node->global.size);
1413                   fprintf (dump_file,
1414                            " Called once from %s %i insns.\n",
1415                            cgraph_node_name (node->callers->caller),
1416                            node->callers->caller->global.size);
1417                 }
1418
1419               if (cgraph_check_inline_limits (node->callers->caller, node,
1420                                               &reason, false))
1421                 {
1422                   struct cgraph_node *caller = node->callers->caller;
1423                   cgraph_mark_inline (node->callers);
1424                   if (dump_file)
1425                     fprintf (dump_file,
1426                              " Inlined into %s which now has %i size"
1427                              " for a net change of %+i size.\n",
1428                              cgraph_node_name (caller),
1429                              caller->global.size,
1430                              overall_size - old_size);
1431                 }
1432               else
1433                 {
1434                   if (dump_file)
1435                     fprintf (dump_file,
1436                              " Not inlining: %s.\n",
1437                              cgraph_inline_failed_string (reason));
1438                 }
1439             }
1440         }
1441     }
1442
1443   /* Free ipa-prop structures if they are no longer needed.  */
1444   if (flag_indirect_inlining)
1445     free_all_ipa_structures_after_iinln ();
1446
1447   if (dump_file)
1448     fprintf (dump_file,
1449              "\nInlined %i calls, eliminated %i functions, "
1450              "size %i turned to %i size.\n\n",
1451              ncalls_inlined, nfunctions_inlined, initial_size,
1452              overall_size);
1453   free (order);
1454   return 0;
1455 }
1456
1457 /* Return true when N is leaf function.  Accept cheap (pure&const) builtins
1458    in leaf functions.  */
1459 static bool
1460 leaf_node_p (struct cgraph_node *n)
1461 {
1462   struct cgraph_edge *e;
1463   for (e = n->callees; e; e = e->next_callee)
1464     if (!DECL_BUILT_IN (e->callee->decl)
1465         || (!TREE_READONLY (e->callee->decl)
1466             || DECL_PURE_P (e->callee->decl)))
1467       return false;
1468   return true;
1469 }
1470
1471 /* Decide on the inlining.  We do so in the topological order to avoid
1472    expenses on updating data structures.  */
1473
1474 static bool
1475 cgraph_decide_inlining_incrementally (struct cgraph_node *node,
1476                                       enum inlining_mode mode)
1477 {
1478   struct cgraph_edge *e;
1479   bool inlined = false;
1480   cgraph_inline_failed_t failed_reason;
1481
1482 #ifdef ENABLE_CHECKING
1483   verify_cgraph_node (node);
1484 #endif
1485
1486   if (mode != INLINE_ALWAYS_INLINE && mode != INLINE_SIZE_NORECURSIVE
1487       && lookup_attribute ("flatten", DECL_ATTRIBUTES (node->decl)) != NULL)
1488     {
1489       if (dump_file)
1490         fprintf (dump_file, "Incrementally flattening %s\n",
1491                  cgraph_node_name (node));
1492       mode = INLINE_ALL;
1493     }
1494
1495   /* First of all look for always inline functions.  */
1496   if (mode != INLINE_SIZE_NORECURSIVE)
1497     for (e = node->callees; e; e = e->next_callee)
1498       {
1499         if (!e->callee->local.disregard_inline_limits
1500             && (mode != INLINE_ALL || !e->callee->local.inlinable))
1501           continue;
1502         if (e->call_stmt_cannot_inline_p)
1503           continue;
1504         if (dump_file)
1505           fprintf (dump_file,
1506                    "Considering to always inline inline candidate %s.\n",
1507                    cgraph_node_name (e->callee));
1508         if (cgraph_recursive_inlining_p (node, e->callee, &e->inline_failed))
1509           {
1510             if (dump_file)
1511               fprintf (dump_file, "Not inlining: recursive call.\n");
1512             continue;
1513           }
1514         if (!tree_can_inline_p (e))
1515           {
1516             if (dump_file)
1517               fprintf (dump_file,
1518                        "Not inlining: %s",
1519                        cgraph_inline_failed_string (e->inline_failed));
1520             continue;
1521           }
1522         if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
1523             != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->callee->decl)))
1524           {
1525             if (dump_file)
1526               fprintf (dump_file, "Not inlining: SSA form does not match.\n");
1527             continue;
1528           }
1529         if (!e->callee->analyzed)
1530           {
1531             if (dump_file)
1532               fprintf (dump_file,
1533                        "Not inlining: Function body no longer available.\n");
1534             continue;
1535           }
1536
1537         if (dump_file)
1538           fprintf (dump_file, " Inlining %s into %s.\n",
1539                    cgraph_node_name (e->callee),
1540                    cgraph_node_name (e->caller));
1541         cgraph_mark_inline (e);
1542         inlined = true;
1543       }
1544
1545   /* Now do the automatic inlining.  */
1546   if (mode != INLINE_ALL && mode != INLINE_ALWAYS_INLINE
1547       /* Never inline regular functions into always-inline functions
1548          during incremental inlining.  */
1549       && !node->local.disregard_inline_limits)
1550     {
1551       bitmap visited = BITMAP_ALLOC (NULL);
1552       for (e = node->callees; e; e = e->next_callee)
1553         {
1554           int allowed_growth = 0;
1555           if (!e->callee->local.inlinable
1556               || !e->inline_failed
1557               || e->callee->local.disregard_inline_limits)
1558             continue;
1559           /* We are inlining a function to all call-sites in node
1560              or to none.  So visit each candidate only once.  */
1561           if (!bitmap_set_bit (visited, e->callee->uid))
1562             continue;
1563           if (dump_file)
1564             fprintf (dump_file, "Considering inline candidate %s.\n",
1565                      cgraph_node_name (e->callee));
1566           if (cgraph_recursive_inlining_p (node, e->callee, &e->inline_failed))
1567             {
1568               if (dump_file)
1569                 fprintf (dump_file, "Not inlining: recursive call.\n");
1570               continue;
1571             }
1572           if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
1573               != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->callee->decl)))
1574             {
1575               if (dump_file)
1576                 fprintf (dump_file,
1577                          "Not inlining: SSA form does not match.\n");
1578               continue;
1579             }
1580
1581           if (cgraph_maybe_hot_edge_p (e) && leaf_node_p (e->callee)
1582               && optimize_function_for_speed_p (cfun))
1583             allowed_growth = PARAM_VALUE (PARAM_EARLY_INLINING_INSNS);
1584
1585           /* When the function body would grow and inlining the function
1586              won't eliminate the need for offline copy of the function,
1587              don't inline.  */
1588           if (((mode == INLINE_SIZE || mode == INLINE_SIZE_NORECURSIVE)
1589                || (!flag_inline_functions
1590                    && !DECL_DECLARED_INLINE_P (e->callee->decl)))
1591               && (cgraph_estimate_size_after_inlining (1, e->caller, e->callee)
1592                   > e->caller->global.size + allowed_growth)
1593               && cgraph_estimate_growth (e->callee) > allowed_growth)
1594             {
1595               if (dump_file)
1596                 fprintf (dump_file,
1597                          "Not inlining: code size would grow by %i.\n",
1598                          cgraph_estimate_size_after_inlining (1, e->caller,
1599                                                               e->callee)
1600                          - e->caller->global.size);
1601               continue;
1602             }
1603           if (!cgraph_check_inline_limits (node, e->callee, &e->inline_failed,
1604                                            false)
1605               || e->call_stmt_cannot_inline_p)
1606             {
1607               if (dump_file)
1608                 fprintf (dump_file, "Not inlining: %s.\n",
1609                          cgraph_inline_failed_string (e->inline_failed));
1610               continue;
1611             }
1612           if (!e->callee->analyzed)
1613             {
1614               if (dump_file)
1615                 fprintf (dump_file,
1616                          "Not inlining: Function body no longer available.\n");
1617               continue;
1618             }
1619           if (!tree_can_inline_p (e))
1620             {
1621               if (dump_file)
1622                 fprintf (dump_file,
1623                          "Not inlining: %s.",
1624                          cgraph_inline_failed_string (e->inline_failed));
1625               continue;
1626             }
1627           if (cgraph_default_inline_p (e->callee, &failed_reason))
1628             {
1629               if (dump_file)
1630                 fprintf (dump_file, " Inlining %s into %s.\n",
1631                          cgraph_node_name (e->callee),
1632                          cgraph_node_name (e->caller));
1633               cgraph_mark_inline (e);
1634               inlined = true;
1635             }
1636         }
1637       BITMAP_FREE (visited);
1638     }
1639   return inlined;
1640 }
1641
1642 /* Because inlining might remove no-longer reachable nodes, we need to
1643    keep the array visible to garbage collector to avoid reading collected
1644    out nodes.  */
1645 static int nnodes;
1646 static GTY ((length ("nnodes"))) struct cgraph_node **order;
1647
1648 /* Do inlining of small functions.  Doing so early helps profiling and other
1649    passes to be somewhat more effective and avoids some code duplication in
1650    later real inlining pass for testcases with very many function calls.  */
1651 static unsigned int
1652 cgraph_early_inlining (void)
1653 {
1654   struct cgraph_node *node = cgraph_node (current_function_decl);
1655   unsigned int todo = 0;
1656   int iterations = 0;
1657
1658   if (sorrycount || errorcount)
1659     return 0;
1660
1661   if (!optimize
1662       || flag_no_inline
1663       || !flag_early_inlining)
1664     {
1665       /* When not optimizing or not inlining inline only always-inline
1666          functions.  */
1667       cgraph_decide_inlining_incrementally (node, INLINE_ALWAYS_INLINE);
1668       timevar_push (TV_INTEGRATION);
1669       todo |= optimize_inline_calls (current_function_decl);
1670       timevar_pop (TV_INTEGRATION);
1671     }
1672   else
1673     {
1674       if (lookup_attribute ("flatten",
1675                             DECL_ATTRIBUTES (node->decl)) != NULL)
1676         {
1677           if (dump_file)
1678             fprintf (dump_file,
1679                      "Flattening %s\n", cgraph_node_name (node));
1680           cgraph_flatten (node);
1681           timevar_push (TV_INTEGRATION);
1682           todo |= optimize_inline_calls (current_function_decl);
1683           timevar_pop (TV_INTEGRATION);
1684         }
1685       /* We iterate incremental inlining to get trivial cases of indirect
1686          inlining.  */
1687       while (iterations < PARAM_VALUE (PARAM_EARLY_INLINER_MAX_ITERATIONS)
1688              && cgraph_decide_inlining_incrementally (node,
1689                                                       iterations
1690                                                       ? INLINE_SIZE_NORECURSIVE
1691                                                       : INLINE_SIZE))
1692         {
1693           timevar_push (TV_INTEGRATION);
1694           todo |= optimize_inline_calls (current_function_decl);
1695           iterations++;
1696           timevar_pop (TV_INTEGRATION);
1697         }
1698       if (dump_file)
1699         fprintf (dump_file, "Iterations: %i\n", iterations);
1700     }
1701
1702   cfun->always_inline_functions_inlined = true;
1703
1704   return todo;
1705 }
1706
1707 struct gimple_opt_pass pass_early_inline =
1708 {
1709  {
1710   GIMPLE_PASS,
1711   "einline",                            /* name */
1712   NULL,                                 /* gate */
1713   cgraph_early_inlining,                /* execute */
1714   NULL,                                 /* sub */
1715   NULL,                                 /* next */
1716   0,                                    /* static_pass_number */
1717   TV_INLINE_HEURISTICS,                 /* tv_id */
1718   0,                                    /* properties_required */
1719   0,                                    /* properties_provided */
1720   0,                                    /* properties_destroyed */
1721   0,                                    /* todo_flags_start */
1722   TODO_dump_func                        /* todo_flags_finish */
1723  }
1724 };
1725
1726 /* When inlining shall be performed.  */
1727 static bool
1728 cgraph_gate_ipa_early_inlining (void)
1729 {
1730   return (flag_early_inlining
1731           && !in_lto_p
1732           && (flag_branch_probabilities || flag_test_coverage
1733               || profile_arc_flag));
1734 }
1735
1736 /* IPA pass wrapper for early inlining pass.  We need to run early inlining
1737    before tree profiling so we have stand alone IPA pass for doing so.  */
1738 struct simple_ipa_opt_pass pass_ipa_early_inline =
1739 {
1740  {
1741   SIMPLE_IPA_PASS,
1742   "einline_ipa",                        /* name */
1743   cgraph_gate_ipa_early_inlining,       /* gate */
1744   NULL,                                 /* execute */
1745   NULL,                                 /* sub */
1746   NULL,                                 /* next */
1747   0,                                    /* static_pass_number */
1748   TV_INLINE_HEURISTICS,                 /* tv_id */
1749   0,                                    /* properties_required */
1750   0,                                    /* properties_provided */
1751   0,                                    /* properties_destroyed */
1752   0,                                    /* todo_flags_start */
1753   TODO_dump_cgraph                      /* todo_flags_finish */
1754  }
1755 };
1756
1757 /* See if statement might disappear after inlining.  We are not terribly
1758    sophisficated, basically looking for simple abstraction penalty wrappers.  */
1759
1760 static bool
1761 likely_eliminated_by_inlining_p (gimple stmt)
1762 {
1763   enum gimple_code code = gimple_code (stmt);
1764   switch (code)
1765     {
1766       case GIMPLE_RETURN:
1767         return true;
1768       case GIMPLE_ASSIGN:
1769         if (gimple_num_ops (stmt) != 2)
1770           return false;
1771
1772         /* Casts of parameters, loads from parameters passed by reference
1773            and stores to return value or parameters are probably free after
1774            inlining.  */
1775         if (gimple_assign_rhs_code (stmt) == CONVERT_EXPR
1776             || gimple_assign_rhs_code (stmt) == NOP_EXPR
1777             || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR
1778             || gimple_assign_rhs_class (stmt) == GIMPLE_SINGLE_RHS)
1779           {
1780             tree rhs = gimple_assign_rhs1 (stmt);
1781             tree lhs = gimple_assign_lhs (stmt);
1782             tree inner_rhs = rhs;
1783             tree inner_lhs = lhs;
1784             bool rhs_free = false;
1785             bool lhs_free = false;
1786
1787             while (handled_component_p (inner_lhs) || TREE_CODE (inner_lhs) == INDIRECT_REF)
1788               inner_lhs = TREE_OPERAND (inner_lhs, 0);
1789             while (handled_component_p (inner_rhs)
1790                    || TREE_CODE (inner_rhs) == ADDR_EXPR || TREE_CODE (inner_rhs) == INDIRECT_REF)
1791               inner_rhs = TREE_OPERAND (inner_rhs, 0);
1792
1793
1794             if (TREE_CODE (inner_rhs) == PARM_DECL
1795                 || (TREE_CODE (inner_rhs) == SSA_NAME
1796                     && SSA_NAME_IS_DEFAULT_DEF (inner_rhs)
1797                     && TREE_CODE (SSA_NAME_VAR (inner_rhs)) == PARM_DECL))
1798               rhs_free = true;
1799             if (rhs_free && is_gimple_reg (lhs))
1800               lhs_free = true;
1801             if (((TREE_CODE (inner_lhs) == PARM_DECL
1802                   || (TREE_CODE (inner_lhs) == SSA_NAME
1803                       && SSA_NAME_IS_DEFAULT_DEF (inner_lhs)
1804                       && TREE_CODE (SSA_NAME_VAR (inner_lhs)) == PARM_DECL))
1805                  && inner_lhs != lhs)
1806                 || TREE_CODE (inner_lhs) == RESULT_DECL
1807                 || (TREE_CODE (inner_lhs) == SSA_NAME
1808                     && TREE_CODE (SSA_NAME_VAR (inner_lhs)) == RESULT_DECL))
1809               lhs_free = true;
1810             if (lhs_free && (is_gimple_reg (rhs) || is_gimple_min_invariant (rhs)))
1811               rhs_free = true;
1812             if (lhs_free && rhs_free)
1813               return true;
1814           }
1815         return false;
1816       default:
1817         return false;
1818     }
1819 }
1820
1821 /* Compute function body size parameters for NODE.  */
1822
1823 static void
1824 estimate_function_body_sizes (struct cgraph_node *node)
1825 {
1826   gcov_type time = 0;
1827   gcov_type time_inlining_benefit = 0;
1828   int size = 0;
1829   int size_inlining_benefit = 0;
1830   basic_block bb;
1831   gimple_stmt_iterator bsi;
1832   struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
1833   tree arg;
1834   int freq;
1835   tree funtype = TREE_TYPE (node->decl);
1836
1837   if (node->local.disregard_inline_limits)
1838     {
1839       inline_summary (node)->self_time = 0;
1840       inline_summary (node)->self_size = 0;
1841       inline_summary (node)->time_inlining_benefit = 0;
1842       inline_summary (node)->size_inlining_benefit = 0;
1843     }
1844
1845   if (dump_file)
1846     fprintf (dump_file, "Analyzing function body size: %s\n",
1847              cgraph_node_name (node));
1848
1849   gcc_assert (my_function && my_function->cfg);
1850   FOR_EACH_BB_FN (bb, my_function)
1851     {
1852       freq = compute_call_stmt_bb_frequency (node->decl, bb);
1853       for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1854         {
1855           gimple stmt = gsi_stmt (bsi);
1856           int this_size = estimate_num_insns (stmt, &eni_size_weights);
1857           int this_time = estimate_num_insns (stmt, &eni_time_weights);
1858
1859           if (dump_file && (dump_flags & TDF_DETAILS))
1860             {
1861               fprintf (dump_file, "  freq:%6i size:%3i time:%3i ",
1862                        freq, this_size, this_time);
1863               print_gimple_stmt (dump_file, stmt, 0, 0);
1864             }
1865           this_time *= freq;
1866           time += this_time;
1867           size += this_size;
1868           if (likely_eliminated_by_inlining_p (stmt))
1869             {
1870               size_inlining_benefit += this_size;
1871               time_inlining_benefit += this_time;
1872               if (dump_file && (dump_flags & TDF_DETAILS))
1873                 fprintf (dump_file, "    Likely eliminated\n");
1874             }
1875           gcc_assert (time >= 0);
1876           gcc_assert (size >= 0);
1877         }
1878     }
1879   time = (time + CGRAPH_FREQ_BASE / 2) / CGRAPH_FREQ_BASE;
1880   time_inlining_benefit = ((time_inlining_benefit + CGRAPH_FREQ_BASE / 2)
1881                            / CGRAPH_FREQ_BASE);
1882   if (dump_file)
1883     fprintf (dump_file, "Overall function body time: %i-%i size: %i-%i\n",
1884              (int)time, (int)time_inlining_benefit,
1885              size, size_inlining_benefit);
1886   time_inlining_benefit += eni_time_weights.call_cost;
1887   size_inlining_benefit += eni_size_weights.call_cost;
1888   if (!VOID_TYPE_P (TREE_TYPE (funtype)))
1889     {
1890       int cost = estimate_move_cost (TREE_TYPE (funtype));
1891       time_inlining_benefit += cost;
1892       size_inlining_benefit += cost;
1893     }
1894   for (arg = DECL_ARGUMENTS (node->decl); arg; arg = TREE_CHAIN (arg))
1895     if (!VOID_TYPE_P (TREE_TYPE (arg)))
1896       {
1897         int cost = estimate_move_cost (TREE_TYPE (arg));
1898         time_inlining_benefit += cost;
1899         size_inlining_benefit += cost;
1900       }
1901   if (time_inlining_benefit > MAX_TIME)
1902     time_inlining_benefit = MAX_TIME;
1903   if (time > MAX_TIME)
1904     time = MAX_TIME;
1905   inline_summary (node)->self_time = time;
1906   inline_summary (node)->self_size = size;
1907   if (dump_file)
1908     fprintf (dump_file, "With function call overhead time: %i-%i size: %i-%i\n",
1909              (int)time, (int)time_inlining_benefit,
1910              size, size_inlining_benefit);
1911   inline_summary (node)->time_inlining_benefit = time_inlining_benefit;
1912   inline_summary (node)->size_inlining_benefit = size_inlining_benefit;
1913 }
1914
1915 /* Compute parameters of functions used by inliner.  */
1916 unsigned int
1917 compute_inline_parameters (struct cgraph_node *node)
1918 {
1919   HOST_WIDE_INT self_stack_size;
1920
1921   gcc_assert (!node->global.inlined_to);
1922
1923   /* Estimate the stack size for the function.  But not at -O0
1924      because estimated_stack_frame_size is a quadratic problem.  */
1925   self_stack_size = optimize ? estimated_stack_frame_size () : 0;
1926   inline_summary (node)->estimated_self_stack_size = self_stack_size;
1927   node->global.estimated_stack_size = self_stack_size;
1928   node->global.stack_frame_offset = 0;
1929
1930   /* Can this function be inlined at all?  */
1931   node->local.inlinable = tree_inlinable_function_p (node->decl);
1932   if (node->local.inlinable && !node->local.disregard_inline_limits)
1933     node->local.disregard_inline_limits
1934       = DECL_DISREGARD_INLINE_LIMITS (node->decl);
1935   estimate_function_body_sizes (node);
1936   /* Inlining characteristics are maintained by the cgraph_mark_inline.  */
1937   node->global.time = inline_summary (node)->self_time;
1938   node->global.size = inline_summary (node)->self_size;
1939   return 0;
1940 }
1941
1942
1943 /* Compute parameters of functions used by inliner using
1944    current_function_decl.  */
1945 static unsigned int
1946 compute_inline_parameters_for_current (void)
1947 {
1948   compute_inline_parameters (cgraph_node (current_function_decl));
1949   return 0;
1950 }
1951
1952 struct gimple_opt_pass pass_inline_parameters =
1953 {
1954  {
1955   GIMPLE_PASS,
1956   "inline_param",                       /* name */
1957   NULL,                                 /* gate */
1958   compute_inline_parameters_for_current,/* execute */
1959   NULL,                                 /* sub */
1960   NULL,                                 /* next */
1961   0,                                    /* static_pass_number */
1962   TV_INLINE_HEURISTICS,                 /* tv_id */
1963   0,                                    /* properties_required */
1964   0,                                    /* properties_provided */
1965   0,                                    /* properties_destroyed */
1966   0,                                    /* todo_flags_start */
1967   0                                     /* todo_flags_finish */
1968  }
1969 };
1970
1971 /* This function performs intraprocedural analyzis in NODE that is required to
1972    inline indirect calls.  */
1973 static void
1974 inline_indirect_intraprocedural_analysis (struct cgraph_node *node)
1975 {
1976   struct cgraph_edge *cs;
1977
1978   if (!flag_ipa_cp)
1979     {
1980       ipa_initialize_node_params (node);
1981       ipa_detect_param_modifications (node);
1982     }
1983   ipa_analyze_params_uses (node);
1984
1985   if (!flag_ipa_cp)
1986     for (cs = node->callees; cs; cs = cs->next_callee)
1987       {
1988         ipa_count_arguments (cs);
1989         ipa_compute_jump_functions (cs);
1990       }
1991
1992   if (dump_file)
1993     {
1994       ipa_print_node_params (dump_file, node);
1995       ipa_print_node_jump_functions (dump_file, node);
1996     }
1997 }
1998
1999 /* Note function body size.  */
2000 static void
2001 analyze_function (struct cgraph_node *node)
2002 {
2003   push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2004   current_function_decl = node->decl;
2005
2006   compute_inline_parameters (node);
2007   if (flag_indirect_inlining)
2008     inline_indirect_intraprocedural_analysis (node);
2009
2010   current_function_decl = NULL;
2011   pop_cfun ();
2012 }
2013
2014 /* Called when new function is inserted to callgraph late.  */
2015 static void
2016 add_new_function (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
2017 {
2018   analyze_function (node);
2019 }
2020
2021 /* Note function body size.  */
2022 static void
2023 inline_generate_summary (void)
2024 {
2025   struct cgraph_node *node;
2026
2027   function_insertion_hook_holder =
2028       cgraph_add_function_insertion_hook (&add_new_function, NULL);
2029
2030   if (flag_indirect_inlining)
2031     {
2032       ipa_register_cgraph_hooks ();
2033       ipa_check_create_node_params ();
2034       ipa_check_create_edge_args ();
2035     }
2036
2037   for (node = cgraph_nodes; node; node = node->next)
2038     if (node->analyzed)
2039       analyze_function (node);
2040
2041   return;
2042 }
2043
2044 /* Apply inline plan to function.  */
2045 static unsigned int
2046 inline_transform (struct cgraph_node *node)
2047 {
2048   unsigned int todo = 0;
2049   struct cgraph_edge *e;
2050
2051   /* FIXME: Currently the passmanager is adding inline transform more than once to some
2052      clones.  This needs revisiting after WPA cleanups.  */
2053   if (cfun->after_inlining)
2054     return 0;
2055
2056   /* We might need the body of this function so that we can expand
2057      it inline somewhere else.  */
2058   if (cgraph_preserve_function_body_p (node->decl))
2059     save_inline_function_body (node);
2060
2061   for (e = node->callees; e; e = e->next_callee)
2062     if (!e->inline_failed || warn_inline)
2063       break;
2064
2065   if (e)
2066     {
2067       timevar_push (TV_INTEGRATION);
2068       todo = optimize_inline_calls (current_function_decl);
2069       timevar_pop (TV_INTEGRATION);
2070     }
2071   cfun->always_inline_functions_inlined = true;
2072   cfun->after_inlining = true;
2073   return todo | execute_fixup_cfg ();
2074 }
2075
2076 /* Read inline summary.  Jump functions are shared among ipa-cp
2077    and inliner, so when ipa-cp is active, we don't need to write them
2078    twice.  */
2079
2080 static void
2081 inline_read_summary (void)
2082 {
2083   if (flag_indirect_inlining)
2084     {
2085       ipa_register_cgraph_hooks ();
2086       if (!flag_ipa_cp)
2087         ipa_prop_read_jump_functions ();
2088     }
2089   function_insertion_hook_holder =
2090       cgraph_add_function_insertion_hook (&add_new_function, NULL);
2091 }
2092
2093 /* Write inline summary for node in SET.
2094    Jump functions are shared among ipa-cp and inliner, so when ipa-cp is
2095    active, we don't need to write them twice.  */
2096
2097 static void
2098 inline_write_summary (cgraph_node_set set)
2099 {
2100   if (flag_indirect_inlining && !flag_ipa_cp)
2101     ipa_prop_write_jump_functions (set);
2102 }
2103
2104 /* When to run IPA inlining.  Inlining of always-inline functions
2105    happens during early inlining.  */
2106
2107 static bool
2108 gate_cgraph_decide_inlining (void)
2109 {
2110   /* ???  We'd like to skip this if not optimizing or not inlining as
2111      all always-inline functions have been processed by early
2112      inlining already.  But this at least breaks EH with C++ as
2113      we need to unconditionally run fixup_cfg even at -O0.
2114      So leave it on unconditionally for now.  */
2115   return 1;
2116 }
2117
2118 struct ipa_opt_pass_d pass_ipa_inline =
2119 {
2120  {
2121   IPA_PASS,
2122   "inline",                             /* name */
2123   gate_cgraph_decide_inlining,          /* gate */
2124   cgraph_decide_inlining,               /* execute */
2125   NULL,                                 /* sub */
2126   NULL,                                 /* next */
2127   0,                                    /* static_pass_number */
2128   TV_INLINE_HEURISTICS,                 /* tv_id */
2129   0,                                    /* properties_required */
2130   0,                                    /* properties_provided */
2131   0,                                    /* properties_destroyed */
2132   TODO_remove_functions,                /* todo_flags_finish */
2133   TODO_dump_cgraph | TODO_dump_func
2134   | TODO_remove_functions               /* todo_flags_finish */
2135  },
2136  inline_generate_summary,               /* generate_summary */
2137  inline_write_summary,                  /* write_summary */
2138  inline_read_summary,                   /* read_summary */
2139  NULL,                                  /* write_optimization_summary */
2140  NULL,                                  /* read_optimization_summary */
2141  lto_ipa_fixup_call_notes,              /* stmt_fixup */
2142  0,                                     /* TODOs */
2143  inline_transform,                      /* function_transform */
2144  NULL,                                  /* variable_transform */
2145 };
2146
2147
2148 #include "gt-ipa-inline.h"