OSDN Git Service

* cgraphunit.c (cgraph_mark_functions_to_output): Renable node
[pf3gnuchains/gcc-fork.git] / gcc / cgraphunit.c
1 /* Callgraph based intraprocedural optimizations.
2    Copyright (C) 2003, 2004 Free Software Foundation, Inc.
3    Contributed by Jan Hubicka
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 2, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to the Free
19 Software Foundation, 59 Temple Place - Suite 330, Boston, MA
20 02111-1307, USA.  */
21
22 /* This module implements main driver of compilation process as well as
23    few basic intraprocedural optimizers.
24
25    The main scope of this file is to act as an interface in between
26    tree based frontends and the backend (and middle end)
27
28    The front-end is supposed to use following functionality:
29
30     - cgraph_finalize_function
31
32       This function is called once front-end has parsed whole body of function
33       and it is certain that the function body nor the declaration will change.
34
35       (There is one exception needed for implementing GCC extern inline function.)
36
37     - cgraph_varpool_finalize_variable
38
39       This function has same behavior as the above but is used for static
40       variables.
41
42     - cgraph_finalize_compilation_unit
43
44       This function is called once compilation unit is finalized and it will
45       no longer change.
46
47       In the unit-at-a-time the call-graph construction and local function
48       analysis takes place here.  Bodies of unreachable functions are released
49       to conserve memory usage.
50
51       ???  The compilation unit in this point of view should be compilation
52       unit as defined by the language - for instance C frontend allows multiple
53       compilation units to be parsed at once and it should call function each
54       time parsing is done so we save memory.
55
56     - cgraph_optimize
57
58       In this unit-at-a-time compilation the intra procedural analysis takes
59       place here.  In particular the static functions whose address is never
60       taken are marked as local.  Backend can then use this information to
61       modify calling conventions, do better inlining or similar optimizations.
62
63     - cgraph_assemble_pending_functions
64     - cgraph_varpool_assemble_pending_variables
65
66       In non-unit-at-a-time mode these functions can be used to force compilation
67       of functions or variables that are known to be needed at given stage
68       of compilation
69
70     - cgraph_mark_needed_node
71     - cgraph_varpool_mark_needed_node
72
73       When function or variable is referenced by some hidden way (for instance
74       via assembly code and marked by attribute "used"), the call-graph data structure
75       must be updated accordingly by this function.
76
77     - analyze_expr callback
78
79       This function is responsible for lowering tree nodes not understood by
80       generic code into understandable ones or alternatively marking
81       callgraph and varpool nodes referenced by the as needed.
82
83       ??? On the tree-ssa genericizing should take place here and we will avoid
84       need for these hooks (replacing them by genericizing hook)
85
86     - expand_function callback
87
88       This function is used to expand function and pass it into RTL back-end.
89       Front-end should not make any assumptions about when this function can be
90       called.  In particular cgraph_assemble_pending_functions,
91       cgraph_varpool_assemble_pending_variables, cgraph_finalize_function,
92       cgraph_varpool_finalize_function, cgraph_optimize can cause arbitrarily
93       previously finalized functions to be expanded.
94
95     We implement two compilation modes.
96
97       - unit-at-a-time:  In this mode analyzing of all functions is deferred
98         to cgraph_finalize_compilation_unit and expansion into cgraph_optimize.
99
100         In cgraph_finalize_compilation_unit the reachable functions are
101         analyzed.  During analysis the call-graph edges from reachable
102         functions are constructed and their destinations are marked as
103         reachable.  References to functions and variables are discovered too
104         and variables found to be needed output to the assembly file.  Via
105         mark_referenced call in assemble_variable functions referenced by
106         static variables are noticed too.
107
108         The intra-procedural information is produced and it's existence
109         indicated by global_info_ready.  Once this flag is set it is impossible
110         to change function from !reachable to reachable and thus
111         assemble_variable no longer call mark_referenced.
112
113         Finally the call-graph is topologically sorted and all reachable functions
114         that has not been completely inlined or are not external are output.
115
116         ??? It is possible that reference to function or variable is optimized
117         out.  We can not deal with this nicely because topological order is not
118         suitable for it.  For tree-ssa we may consider another pass doing
119         optimization and re-discovering reachable functions.
120
121         ??? Reorganize code so variables are output very last and only if they
122         really has been referenced by produced code, so we catch more cases
123         where reference has been optimized out.
124
125       - non-unit-at-a-time
126
127         All functions are variables are output as early as possible to conserve
128         memory consumption.  This may or may not result in less memory used but
129         it is still needed for some legacy code that rely on particular ordering
130         of things output from the compiler.
131
132         Varpool data structures are not used and variables are output directly.
133
134         Functions are output early using call of
135         cgraph_assemble_pending_function from cgraph_finalize_function.  The
136         decision on whether function is needed is made more conservative so
137         uninlininable static functions are needed too.  During the call-graph
138         construction the edge destinations are not marked as reachable and it
139         is completely relied upn assemble_variable to mark them.
140         
141      Inlining decision heuristics
142         ??? Move this to separate file after tree-ssa merge.
143
144         We separate inlining decisions from the inliner itself and store it
145         inside callgraph as so called inline plan.  Reffer to cgraph.c
146         documentation about particular representation of inline plans in the
147         callgraph
148
149         The implementation of particular heuristics is separated from
150         the rest of code to make it easier to replace it with more complicated
151         implementation in the future.  The rest of inlining code acts as a
152         library aimed to modify the callgraph and verify that the parameters
153         on code size growth fits.
154
155         To mark given call inline, use cgraph_mark_inline function, the
156         verification is performed by cgraph_default_inline_p and
157         cgraph_check_inline_limits.
158
159         The heuristics implements simple knapsack style algorithm ordering
160         all functions by their "profitability" (estimated by code size growth)
161         and inlining them in priority order.
162
163         cgraph_decide_inlining implements heuristics taking whole callgraph
164         into account, while cgraph_decide_inlining_incrementally considers
165         only one function at a time and is used in non-unit-at-a-time mode.  */
166 #include "config.h"
167 #include "system.h"
168 #include "coretypes.h"
169 #include "tm.h"
170 #include "tree.h"
171 #include "rtl.h"
172 #include "tree-inline.h"
173 #include "langhooks.h"
174 #include "hashtab.h"
175 #include "toplev.h"
176 #include "flags.h"
177 #include "ggc.h"
178 #include "debug.h"
179 #include "target.h"
180 #include "cgraph.h"
181 #include "diagnostic.h"
182 #include "timevar.h"
183 #include "params.h"
184 #include "fibheap.h"
185 #include "c-common.h"
186 #include "intl.h"
187 #include "function.h"
188
189 #define INSNS_PER_CALL 10
190
191 static void cgraph_expand_all_functions (void);
192 static void cgraph_mark_functions_to_output (void);
193 static void cgraph_expand_function (struct cgraph_node *);
194 static tree record_call_1 (tree *, int *, void *);
195 static void cgraph_mark_local_functions (void);
196 static bool cgraph_default_inline_p (struct cgraph_node *n);
197 static void cgraph_analyze_function (struct cgraph_node *node);
198 static void cgraph_decide_inlining_incrementally (struct cgraph_node *);
199
200 /* Statistics we collect about inlining algorithm.  */
201 static int ncalls_inlined;
202 static int nfunctions_inlined;
203 static int initial_insns;
204 static int overall_insns;
205
206 /* Records tree nodes seen in cgraph_create_edges.  Simply using
207    walk_tree_without_duplicates doesn't guarantee each node is visited
208    once because it gets a new htab upon each recursive call from
209    record_calls_1.  */
210 static htab_t visited_nodes;
211
212 /* Determine if function DECL is needed.  That is, visible to something
213    either outside this translation unit, something magic in the system
214    configury, or (if not doing unit-at-a-time) to something we havn't
215    seen yet.  */
216
217 static bool
218 decide_is_function_needed (struct cgraph_node *node, tree decl)
219 {
220   struct cgraph_node *origin;
221
222   /* If we decided it was needed before, but at the time we didn't have
223      the body of the function available, then it's still needed.  We have
224      to go back and re-check its dependencies now.  */
225   if (node->needed)
226     return true;
227
228   /* Externally visible functions must be output.  The exception is
229      COMDAT functions that must be output only when they are needed.  */
230   if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
231     return true;
232
233   /* Constructors and destructors are reachable from the runtime by
234      some mechanism.  */
235   if (DECL_STATIC_CONSTRUCTOR (decl) || DECL_STATIC_DESTRUCTOR (decl))
236     return true;
237
238   /* If the user told us it is used, then it must be so.  */
239   if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
240     return true;
241
242   /* ??? If the assembler name is set by hand, it is possible to assemble
243      the name later after finalizing the function and the fact is noticed
244      in assemble_name then.  This is arguably a bug.  */
245   if (DECL_ASSEMBLER_NAME_SET_P (decl)
246       && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
247     return true;
248
249   if (flag_unit_at_a_time)
250     return false;
251
252   /* If not doing unit at a time, then we'll only defer this function
253      if its marked for inlining.  Otherwise we want to emit it now.  */
254
255   /* "extern inline" functions are never output locally.  */
256   if (DECL_EXTERNAL (decl))
257     return false;
258   /* Nested functions of extern inline function shall not be emit unless
259      we inlined the origin.  */
260   for (origin = node->origin; origin; origin = origin->origin)
261     if (DECL_EXTERNAL (origin->decl))
262       return false;
263   /* We want to emit COMDAT functions only when absolutely necessary.  */
264   if (DECL_COMDAT (decl))
265     return false;
266   if (!DECL_INLINE (decl)
267       || (!node->local.disregard_inline_limits
268           /* When declared inline, defer even the uninlinable functions.
269              This allows them to be eliminated when unused.  */
270           && !DECL_DECLARED_INLINE_P (decl) 
271           && (!node->local.inlinable || !cgraph_default_inline_p (node))))
272     return true;
273
274   return false;
275 }
276
277 /* When not doing unit-at-a-time, output all functions enqueued.
278    Return true when such a functions were found.  */
279
280 bool
281 cgraph_assemble_pending_functions (void)
282 {
283   bool output = false;
284
285   if (flag_unit_at_a_time)
286     return false;
287
288   while (cgraph_nodes_queue)
289     {
290       struct cgraph_node *n = cgraph_nodes_queue;
291
292       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
293       n->next_needed = NULL;
294       if (!n->global.inlined_to && !DECL_EXTERNAL (n->decl))
295         {
296           cgraph_expand_function (n);
297           output = true;
298         }
299     }
300
301   return output;
302 }
303
304 /* DECL has been parsed.  Take it, queue it, compile it at the whim of the
305    logic in effect.  If NESTED is true, then our caller cannot stand to have
306    the garbage collector run at the moment.  We would need to either create
307    a new GC context, or just not compile right now.  */
308
309 void
310 cgraph_finalize_function (tree decl, bool nested)
311 {
312   struct cgraph_node *node = cgraph_node (decl);
313
314   if (node->local.finalized)
315     {
316       /* As an GCC extension we allow redefinition of the function.  The
317          semantics when both copies of bodies differ is not well defined.
318          We replace the old body with new body so in unit at a time mode
319          we always use new body, while in normal mode we may end up with
320          old body inlined into some functions and new body expanded and
321          inlined in others.
322          
323          ??? It may make more sense to use one body for inlining and other
324          body for expanding the function but this is difficult to do.  */
325
326       /* If node->output is set, then this is a unit-at-a-time compilation
327          and we have already begun whole-unit analysis.  This is *not*
328          testing for whether we've already emitted the function.  That
329          case can be sort-of legitimately seen with real function 
330          redefinition errors.  I would argue that the front end should
331          never present us with such a case, but don't enforce that for now.  */
332       gcc_assert (!node->output);
333
334       /* Reset our data structures so we can analyze the function again.  */
335       memset (&node->local, 0, sizeof (node->local));
336       memset (&node->global, 0, sizeof (node->global));
337       memset (&node->rtl, 0, sizeof (node->rtl));
338       node->analyzed = false;
339       node->local.redefined_extern_inline = true;
340       while (node->callees)
341         cgraph_remove_edge (node->callees);
342
343       /* We may need to re-queue the node for assembling in case
344          we already proceeded it and ignored as not needed.  */
345       if (node->reachable && !flag_unit_at_a_time)
346         {
347           struct cgraph_node *n;
348
349           for (n = cgraph_nodes_queue; n; n = n->next_needed)
350             if (n == node)
351               break;
352           if (!n)
353             node->reachable = 0;
354         }
355     }
356
357   notice_global_symbol (decl);
358   node->decl = decl;
359   node->local.finalized = true;
360
361   /* If not unit at a time, then we need to create the call graph
362      now, so that called functions can be queued and emitted now.  */
363   if (!flag_unit_at_a_time)
364     {
365       cgraph_analyze_function (node);
366       cgraph_decide_inlining_incrementally (node);
367     }
368
369   if (decide_is_function_needed (node, decl))
370     cgraph_mark_needed_node (node);
371
372   /* If not unit at a time, go ahead and emit everything we've found
373      to be reachable at this time.  */
374   if (!nested)
375     {
376       if (!cgraph_assemble_pending_functions ())
377         ggc_collect ();
378     }
379
380   /* If we've not yet emitted decl, tell the debug info about it.  */
381   if (!TREE_ASM_WRITTEN (decl))
382     (*debug_hooks->deferred_inline_function) (decl);
383
384   /* Possibly warn about unused parameters.  */
385   if (warn_unused_parameter)
386     do_warn_unused_parameter (decl);
387 }
388
389 /* Walk tree and record all calls.  Called via walk_tree.  */
390 static tree
391 record_call_1 (tree *tp, int *walk_subtrees, void *data)
392 {
393   tree t = *tp;
394
395   switch (TREE_CODE (t))
396     {
397     case VAR_DECL:
398       /* ??? Really, we should mark this decl as *potentially* referenced
399          by this function and re-examine whether the decl is actually used
400          after rtl has been generated.  */
401       if (TREE_STATIC (t))
402         {
403           cgraph_varpool_mark_needed_node (cgraph_varpool_node (t));
404           if (lang_hooks.callgraph.analyze_expr)
405             return lang_hooks.callgraph.analyze_expr (tp, walk_subtrees, 
406                                                       data);
407         }
408       break;
409
410     case ADDR_EXPR:
411       if (flag_unit_at_a_time)
412         {
413           /* Record dereferences to the functions.  This makes the
414              functions reachable unconditionally.  */
415           tree decl = TREE_OPERAND (*tp, 0);
416           if (TREE_CODE (decl) == FUNCTION_DECL)
417             cgraph_mark_needed_node (cgraph_node (decl));
418         }
419       break;
420
421     case CALL_EXPR:
422       {
423         tree decl = get_callee_fndecl (*tp);
424         if (decl && TREE_CODE (decl) == FUNCTION_DECL)
425           {
426             cgraph_create_edge (data, cgraph_node (decl), *tp);
427
428             /* When we see a function call, we don't want to look at the
429                function reference in the ADDR_EXPR that is hanging from
430                the CALL_EXPR we're examining here, because we would
431                conclude incorrectly that the function's address could be
432                taken by something that is not a function call.  So only
433                walk the function parameter list, skip the other subtrees.  */
434
435             walk_tree (&TREE_OPERAND (*tp, 1), record_call_1, data,
436                        visited_nodes);
437             *walk_subtrees = 0;
438           }
439         break;
440       }
441
442     default:
443       /* Save some cycles by not walking types and declaration as we
444          won't find anything useful there anyway.  */
445       if (DECL_P (*tp) || TYPE_P (*tp))
446         {
447           *walk_subtrees = 0;
448           break;
449         }
450
451       if ((unsigned int) TREE_CODE (t) >= LAST_AND_UNUSED_TREE_CODE)
452         return lang_hooks.callgraph.analyze_expr (tp, walk_subtrees, data);
453       break;
454     }
455
456   return NULL;
457 }
458
459 /* Create cgraph edges for function calls inside BODY from NODE.  */
460
461 void
462 cgraph_create_edges (struct cgraph_node *node, tree body)
463 {
464   /* The nodes we're interested in are never shared, so walk
465      the tree ignoring duplicates.  */
466   visited_nodes = htab_create (37, htab_hash_pointer,
467                                     htab_eq_pointer, NULL);
468   walk_tree (&body, record_call_1, node, visited_nodes);
469   htab_delete (visited_nodes);
470   visited_nodes = NULL;
471 }
472
473 static bool error_found;
474
475 /* Callbrack of verify_cgraph_node.  Check that all call_exprs have cgraph
476    nodes.  */
477
478 static tree
479 verify_cgraph_node_1 (tree *tp, int *walk_subtrees, void *data)
480 {
481   tree t = *tp;
482   tree decl;
483
484   if (TREE_CODE (t) == CALL_EXPR && (decl = get_callee_fndecl (t)))
485     {
486       struct cgraph_edge *e = cgraph_edge (data, t);
487       if (e)
488         {
489           if (e->aux)
490             {
491               error ("Shared call_expr:");
492               debug_tree (t);
493               error_found = true;
494             }
495           if (e->callee->decl != cgraph_node (decl)->decl)
496             {
497               error ("Edge points to wrong declaration:");
498               debug_tree (e->callee->decl);
499               fprintf (stderr," Instead of:");
500               debug_tree (decl);
501             }
502           e->aux = (void *)1;
503         }
504       else
505         {
506           error ("Missing callgraph edge for call expr:");
507           debug_tree (t);
508           error_found = true;
509         }
510     }
511
512   /* Save some cycles by not walking types and declaration as we
513      won't find anything useful there anyway.  */
514   if (DECL_P (*tp) || TYPE_P (*tp))
515     *walk_subtrees = 0;
516
517   return NULL_TREE;
518 }
519
520 /* Verify cgraph nodes of given cgraph node.  */
521 void
522 verify_cgraph_node (struct cgraph_node *node)
523 {
524   struct cgraph_edge *e;
525   struct cgraph_node *main_clone;
526
527   timevar_push (TV_CGRAPH_VERIFY);
528   error_found = false;
529   for (e = node->callees; e; e = e->next_callee)
530     if (e->aux)
531       {
532         error ("Aux field set for edge %s->%s",
533                cgraph_node_name (e->caller), cgraph_node_name (e->callee));
534         error_found = true;
535       }
536   for (e = node->callers; e; e = e->next_caller)
537     {
538       if (!e->inline_failed)
539         {
540           if (node->global.inlined_to
541               != (e->caller->global.inlined_to
542                   ? e->caller->global.inlined_to : e->caller))
543             {
544               error ("Inlined_to pointer is wrong");
545               error_found = true;
546             }
547           if (node->callers->next_caller)
548             {
549               error ("Multiple inline callers");
550               error_found = true;
551             }
552         }
553       else
554         if (node->global.inlined_to)
555           {
556             error ("Inlined_to pointer set for noninline callers");
557             error_found = true;
558           }
559     }
560   if (!node->callers && node->global.inlined_to)
561     {
562       error ("Inlined_to pointer is set but no predecesors found");
563       error_found = true;
564     }
565   if (node->global.inlined_to == node)
566     {
567       error ("Inlined_to pointer reffers to itself");
568       error_found = true;
569     }
570
571   for (main_clone = cgraph_node (node->decl); main_clone;
572        main_clone = main_clone->next_clone)
573     if (main_clone == node)
574       break;
575   if (!node)
576     {
577       error ("Node not found in DECL_ASSEMBLER_NAME hash");
578       error_found = true;
579     }
580   
581   if (node->analyzed
582       && DECL_SAVED_TREE (node->decl) && !TREE_ASM_WRITTEN (node->decl)
583       && (!DECL_EXTERNAL (node->decl) || node->global.inlined_to))
584     {
585       walk_tree_without_duplicates (&DECL_SAVED_TREE (node->decl),
586                                     verify_cgraph_node_1, node);
587       for (e = node->callees; e; e = e->next_callee)
588         {
589           if (!e->aux)
590             {
591               error ("Edge %s->%s has no corresponding call_expr",
592                      cgraph_node_name (e->caller),
593                      cgraph_node_name (e->callee));
594               error_found = true;
595             }
596           e->aux = 0;
597         }
598     }
599   if (error_found)
600     {
601       dump_cgraph_node (stderr, node);
602       internal_error ("verify_cgraph_node failed.");
603     }
604   timevar_pop (TV_CGRAPH_VERIFY);
605 }
606
607 /* Verify whole cgraph structure.  */
608 void
609 verify_cgraph (void)
610 {
611   struct cgraph_node *node;
612
613   if (sorrycount || errorcount)
614     return;
615
616   for (node = cgraph_nodes; node; node = node->next)
617     verify_cgraph_node (node);
618 }
619
620 /* Analyze the function scheduled to be output.  */
621 static void
622 cgraph_analyze_function (struct cgraph_node *node)
623 {
624   tree decl = node->decl;
625   struct cgraph_edge *e;
626
627   current_function_decl = decl;
628
629   /* First kill forward declaration so reverse inlining works properly.  */
630   cgraph_create_edges (node, DECL_SAVED_TREE (decl));
631
632   node->local.inlinable = tree_inlinable_function_p (decl);
633   node->local.self_insns = estimate_num_insns (DECL_SAVED_TREE (decl));
634   if (node->local.inlinable)
635     node->local.disregard_inline_limits
636       = lang_hooks.tree_inlining.disregard_inline_limits (decl);
637   for (e = node->callers; e; e = e->next_caller)
638     {
639       if (node->local.redefined_extern_inline)
640         e->inline_failed = N_("redefined extern inline functions are not "
641                            "considered for inlining");
642       else if (!node->local.inlinable)
643         e->inline_failed = N_("function not inlinable");
644       else
645         e->inline_failed = N_("function not considered for inlining");
646     }
647   if (flag_really_no_inline && !node->local.disregard_inline_limits)
648     node->local.inlinable = 0;
649   /* Inlining characteristics are maintained by the cgraph_mark_inline.  */
650   node->global.insns = node->local.self_insns;
651
652   node->analyzed = true;
653   current_function_decl = NULL;
654 }
655
656 /* Analyze the whole compilation unit once it is parsed completely.  */
657
658 void
659 cgraph_finalize_compilation_unit (void)
660 {
661   struct cgraph_node *node;
662
663   if (!flag_unit_at_a_time)
664     {
665       cgraph_assemble_pending_functions ();
666       return;
667     }
668
669   cgraph_varpool_assemble_pending_decls ();
670   if (!quiet_flag)
671     fprintf (stderr, "\nAnalyzing compilation unit\n");
672
673   timevar_push (TV_CGRAPH);
674   if (cgraph_dump_file)
675     {
676       fprintf (cgraph_dump_file, "Initial entry points:");
677       for (node = cgraph_nodes; node; node = node->next)
678         if (node->needed && DECL_SAVED_TREE (node->decl))
679           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
680       fprintf (cgraph_dump_file, "\n");
681     }
682
683   /* Propagate reachability flag and lower representation of all reachable
684      functions.  In the future, lowering will introduce new functions and
685      new entry points on the way (by template instantiation and virtual
686      method table generation for instance).  */
687   while (cgraph_nodes_queue)
688     {
689       struct cgraph_edge *edge;
690       tree decl = cgraph_nodes_queue->decl;
691
692       node = cgraph_nodes_queue;
693       cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
694       node->next_needed = NULL;
695
696       /* ??? It is possible to create extern inline function and later using
697          weak alas attribute to kill its body. See
698          gcc.c-torture/compile/20011119-1.c  */
699       if (!DECL_SAVED_TREE (decl))
700         continue;
701
702       gcc_assert (!node->analyzed && node->reachable);
703       gcc_assert (DECL_SAVED_TREE (decl));
704
705       cgraph_analyze_function (node);
706
707       for (edge = node->callees; edge; edge = edge->next_callee)
708         if (!edge->callee->reachable)
709           cgraph_mark_reachable_node (edge->callee);
710
711       cgraph_varpool_assemble_pending_decls ();
712     }
713
714   /* Collect entry points to the unit.  */
715
716   if (cgraph_dump_file)
717     {
718       fprintf (cgraph_dump_file, "Unit entry points:");
719       for (node = cgraph_nodes; node; node = node->next)
720         if (node->needed && DECL_SAVED_TREE (node->decl))
721           fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
722       fprintf (cgraph_dump_file, "\n\nInitial ");
723       dump_cgraph (cgraph_dump_file);
724     }
725
726   if (cgraph_dump_file)
727     fprintf (cgraph_dump_file, "\nReclaiming functions:");
728
729   for (node = cgraph_nodes; node; node = node->next)
730     {
731       tree decl = node->decl;
732
733       if (!node->reachable && DECL_SAVED_TREE (decl))
734         {
735           if (cgraph_dump_file)
736             fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
737           cgraph_remove_node (node);
738         }
739       else
740         node->next_needed = NULL;
741     }
742   if (cgraph_dump_file)
743     {
744       fprintf (cgraph_dump_file, "\n\nReclaimed ");
745       dump_cgraph (cgraph_dump_file);
746     }
747   ggc_collect ();
748   timevar_pop (TV_CGRAPH);
749 }
750 /* Figure out what functions we want to assemble.  */
751
752 static void
753 cgraph_mark_functions_to_output (void)
754 {
755   struct cgraph_node *node;
756
757   for (node = cgraph_nodes; node; node = node->next)
758     {
759       tree decl = node->decl;
760       struct cgraph_edge *e;
761       
762       gcc_assert (!node->output);
763
764       for (e = node->callers; e; e = e->next_caller)
765         if (e->inline_failed)
766           break;
767
768       /* We need to output all local functions that are used and not
769          always inlined, as well as those that are reachable from
770          outside the current compilation unit.  */
771       if (DECL_SAVED_TREE (decl)
772           && !node->global.inlined_to
773           && (node->needed
774               || (e && node->reachable))
775           && !TREE_ASM_WRITTEN (decl)
776           && !DECL_EXTERNAL (decl))
777         node->output = 1;
778       else
779         {
780           /* We should've reclaimed all functions that are not needed.  */
781 #ifdef ENABLE_CHECKING
782           if (!node->global.inlined_to && DECL_SAVED_TREE (decl)
783               && !DECL_EXTERNAL (decl))
784             {
785               dump_cgraph_node (stderr, node);
786               internal_error ("failed to reclaim unneeded function");
787             }
788 #endif
789           gcc_assert (node->global.inlined_to || !DECL_SAVED_TREE (decl)
790                       || DECL_EXTERNAL (decl));
791
792         }
793       
794     }
795 }
796
797 /* Expand function specified by NODE.  */
798
799 static void
800 cgraph_expand_function (struct cgraph_node *node)
801 {
802   tree decl = node->decl;
803
804   /* We ought to not compile any inline clones.  */
805   gcc_assert (!node->global.inlined_to);
806
807   if (flag_unit_at_a_time)
808     announce_function (decl);
809
810   /* Generate RTL for the body of DECL.  */
811   lang_hooks.callgraph.expand_function (decl);
812
813   /* Make sure that BE didn't give up on compiling.  */
814   /* ??? Can happen with nested function of extern inline.  */
815   gcc_assert (TREE_ASM_WRITTEN (node->decl));
816
817   current_function_decl = NULL;
818   if (!cgraph_preserve_function_body_p (node->decl))
819     {
820       DECL_SAVED_TREE (node->decl) = NULL;
821       DECL_STRUCT_FUNCTION (node->decl) = NULL;
822       DECL_INITIAL (node->decl) = error_mark_node;
823       /* Elliminate all call edges.  This is important so the call_expr no longer
824          points to the dead function body.  */
825       while (node->callees)
826         cgraph_remove_edge (node->callees);
827     }
828 }
829
830 /* Fill array order with all nodes with output flag set in the reverse
831    topological order.  */
832
833 static int
834 cgraph_postorder (struct cgraph_node **order)
835 {
836   struct cgraph_node *node, *node2;
837   int stack_size = 0;
838   int order_pos = 0;
839   struct cgraph_edge *edge, last;
840
841   struct cgraph_node **stack =
842     xcalloc (cgraph_n_nodes, sizeof (struct cgraph_node *));
843
844   /* We have to deal with cycles nicely, so use a depth first traversal
845      output algorithm.  Ignore the fact that some functions won't need
846      to be output and put them into order as well, so we get dependencies
847      right through intline functions.  */
848   for (node = cgraph_nodes; node; node = node->next)
849     node->aux = NULL;
850   for (node = cgraph_nodes; node; node = node->next)
851     if (!node->aux)
852       {
853         node2 = node;
854         if (!node->callers)
855           node->aux = &last;
856         else
857           node->aux = node->callers;
858         while (node2)
859           {
860             while (node2->aux != &last)
861               {
862                 edge = node2->aux;
863                 if (edge->next_caller)
864                   node2->aux = edge->next_caller;
865                 else
866                   node2->aux = &last;
867                 if (!edge->caller->aux)
868                   {
869                     if (!edge->caller->callers)
870                       edge->caller->aux = &last;
871                     else
872                       edge->caller->aux = edge->caller->callers;
873                     stack[stack_size++] = node2;
874                     node2 = edge->caller;
875                     break;
876                   }
877               }
878             if (node2->aux == &last)
879               {
880                 order[order_pos++] = node2;
881                 if (stack_size)
882                   node2 = stack[--stack_size];
883                 else
884                   node2 = NULL;
885               }
886           }
887       }
888   free (stack);
889   return order_pos;
890 }
891
892 /* Perform reachability analysis and reclaim all unreachable nodes.
893    This function also remove unneeded bodies of extern inline functions
894    and thus needs to be done only after inlining decisions has been made.  */
895 static bool
896 cgraph_remove_unreachable_nodes (void)
897 {
898   struct cgraph_node *first = (void *) 1;
899   struct cgraph_node *node;
900   bool changed = false;
901   int insns = 0;
902
903 #ifdef ENABLE_CHECKING
904   verify_cgraph ();
905 #endif
906   if (cgraph_dump_file)
907     fprintf (cgraph_dump_file, "\nReclaiming functions:");
908 #ifdef ENABLE_CHECKING
909   for (node = cgraph_nodes; node; node = node->next)
910     gcc_assert (!node->aux);
911 #endif
912   for (node = cgraph_nodes; node; node = node->next)
913     if (node->needed && !node->global.inlined_to
914         && (!DECL_EXTERNAL (node->decl) || !node->analyzed))
915       {
916         node->aux = first;
917         first = node;
918       }
919     else
920       gcc_assert (!node->aux);
921
922   /* Perform reachability analysis.  As a special case do not consider
923      extern inline functions not inlined as live because we won't output
924      them at all.  */
925   while (first != (void *) 1)
926     {
927       struct cgraph_edge *e;
928       node = first;
929       first = first->aux;
930
931       for (e = node->callees; e; e = e->next_callee)
932         if (!e->callee->aux
933             && node->analyzed
934             && (!e->inline_failed || !e->callee->analyzed
935                 || !DECL_EXTERNAL (e->callee->decl)))
936           {
937             e->callee->aux = first;
938             first = e->callee;
939           }
940     }
941
942   /* Remove unreachable nodes.  Extern inline functions need special care;
943      Unreachable extern inline functions shall be removed.
944      Reachable extern inline functions we never inlined shall get their bodies
945      eliminated.
946      Reachable extern inline functions we sometimes inlined will be turned into
947      unanalyzed nodes so they look like for true extern functions to the rest
948      of code.  Body of such functions is released via remove_node once the
949      inline clones are eliminated.  */
950   for (node = cgraph_nodes; node; node = node->next)
951     {
952       if (!node->aux)
953         {
954           int local_insns;
955           tree decl = node->decl;
956
957           node->global.inlined_to = NULL;
958           if (DECL_STRUCT_FUNCTION (decl))
959             local_insns = node->local.self_insns;
960           else
961             local_insns = 0;
962           if (cgraph_dump_file)
963             fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
964           if (!node->analyzed || !DECL_EXTERNAL (node->decl))
965             cgraph_remove_node (node);
966           else
967             {
968               struct cgraph_edge *e;
969
970               for (e = node->callers; e; e = e->next_caller)
971                 if (e->caller->aux)
972                   break;
973               if (e || node->needed)
974                 {
975                   struct cgraph_node *clone;
976
977                   for (clone = node->next_clone; clone;
978                        clone = clone->next_clone)
979                     if (clone->aux)
980                       break;
981                   if (!clone)
982                     {
983                       DECL_SAVED_TREE (node->decl) = NULL;
984                       DECL_STRUCT_FUNCTION (node->decl) = NULL;
985                       DECL_INITIAL (node->decl) = error_mark_node;
986                     }
987                   while (node->callees)
988                     cgraph_remove_edge (node->callees);
989                   node->analyzed = false;
990                 }
991               else
992                 cgraph_remove_node (node);
993             }
994           if (!DECL_SAVED_TREE (decl))
995             insns += local_insns;
996           changed = true;
997         }
998     }
999   for (node = cgraph_nodes; node; node = node->next)
1000     node->aux = NULL;
1001   if (cgraph_dump_file)
1002     fprintf (cgraph_dump_file, "\nReclaimed %i insns", insns);
1003   return changed;
1004 }
1005
1006 /* Estimate size of the function after inlining WHAT into TO.  */
1007
1008 static int
1009 cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to,
1010                                      struct cgraph_node *what)
1011 {
1012   return (what->global.insns - INSNS_PER_CALL) * times + to->global.insns;
1013 }
1014
1015 /* Estimate the growth caused by inlining NODE into all callees.  */
1016
1017 static int
1018 cgraph_estimate_growth (struct cgraph_node *node)
1019 {
1020   int growth = 0;
1021   struct cgraph_edge *e;
1022
1023   for (e = node->callers; e; e = e->next_caller)
1024     if (e->inline_failed)
1025       growth += (cgraph_estimate_size_after_inlining (1, e->caller, node)
1026                  - e->caller->global.insns);
1027
1028   /* ??? Wrong for self recursive functions or cases where we decide to not
1029      inline for different reasons, but it is not big deal as in that case
1030      we will keep the body around, but we will also avoid some inlining.  */
1031   if (!node->needed && !DECL_EXTERNAL (node->decl))
1032     growth -= node->global.insns;
1033
1034   return growth;
1035 }
1036
1037 /* E is expected to be an edge being inlined.  Clone destination node of
1038    the edge and redirect it to the new clone.
1039    DUPLICATE is used for bookkeeping on whether we are actually creating new
1040    clones or re-using node originally representing out-of-line function call.
1041    */
1042 void
1043 cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate)
1044 {
1045   struct cgraph_node *n;
1046
1047   /* We may eliminate the need for out-of-line copy to be output.  In that
1048      case just go ahead and re-use it.  */
1049   if (!e->callee->callers->next_caller
1050       && (!e->callee->needed || DECL_EXTERNAL (e->callee->decl))
1051       && duplicate
1052       && flag_unit_at_a_time)
1053     {
1054       gcc_assert (!e->callee->global.inlined_to);
1055       if (!DECL_EXTERNAL (e->callee->decl))
1056         overall_insns -= e->callee->global.insns, nfunctions_inlined++;
1057       duplicate = 0;
1058     }
1059    else if (duplicate)
1060     {
1061       n = cgraph_clone_node (e->callee);
1062       cgraph_redirect_edge_callee (e, n);
1063     }
1064
1065   if (e->caller->global.inlined_to)
1066     e->callee->global.inlined_to = e->caller->global.inlined_to;
1067   else
1068     e->callee->global.inlined_to = e->caller;
1069
1070   /* Recursively clone all bodies.  */
1071   for (e = e->callee->callees; e; e = e->next_callee)
1072     if (!e->inline_failed)
1073       cgraph_clone_inlined_nodes (e, duplicate);
1074 }
1075
1076 /* Mark edge E as inlined and update callgraph accordingly.  */
1077
1078 void
1079 cgraph_mark_inline_edge (struct cgraph_edge *e)
1080 {
1081   int old_insns = 0, new_insns = 0;
1082   struct cgraph_node *to = NULL, *what;
1083
1084   gcc_assert (e->inline_failed);
1085   e->inline_failed = NULL;
1086
1087   if (!e->callee->global.inlined && flag_unit_at_a_time)
1088     DECL_POSSIBLY_INLINED (e->callee->decl) = true;
1089   e->callee->global.inlined = true;
1090
1091   cgraph_clone_inlined_nodes (e, true);
1092
1093   what = e->callee;
1094
1095   /* Now update size of caller and all functions caller is inlined into.  */
1096   for (;e && !e->inline_failed; e = e->caller->callers)
1097     {
1098       old_insns = e->caller->global.insns;
1099       new_insns = cgraph_estimate_size_after_inlining (1, e->caller,
1100                                                        what);
1101       gcc_assert (new_insns >= 0);
1102       to = e->caller;
1103       to->global.insns = new_insns;
1104     }
1105   gcc_assert (what->global.inlined_to == to);
1106   overall_insns += new_insns - old_insns;
1107   ncalls_inlined++;
1108 }
1109
1110 /* Mark all calls of EDGE->CALLEE inlined into EDGE->CALLER.
1111    Return following unredirected edge in the list of callers
1112    of EDGE->CALLEE  */
1113
1114 static struct cgraph_edge *
1115 cgraph_mark_inline (struct cgraph_edge *edge)
1116 {
1117   struct cgraph_node *to = edge->caller;
1118   struct cgraph_node *what = edge->callee;
1119   struct cgraph_edge *e, *next;
1120   int times = 0;
1121
1122   /* Look for all calls, mark them inline and clone recursively
1123      all inlined functions.  */
1124   for (e = what->callers; e; e = next)
1125     {
1126       next = e->next_caller;
1127       if (e->caller == to && e->inline_failed)
1128         {
1129           cgraph_mark_inline_edge (e);
1130           if (e == edge)
1131             edge = next;
1132           times++;
1133         }
1134     }
1135   gcc_assert (times);
1136   return edge;
1137 }
1138
1139 /* Return false when inlining WHAT into TO is not good idea
1140    as it would cause too large growth of function bodies.  */
1141
1142 static bool
1143 cgraph_check_inline_limits (struct cgraph_node *to, struct cgraph_node *what,
1144                             const char **reason)
1145 {
1146   int times = 0;
1147   struct cgraph_edge *e;
1148   int newsize;
1149   int limit;
1150
1151   if (to->global.inlined_to)
1152     to = to->global.inlined_to;
1153
1154   for (e = to->callees; e; e = e->next_callee)
1155     if (e->callee == what)
1156       times++;
1157
1158   /* When inlining large function body called once into small function,
1159      take the inlined function as base for limiting the growth.  */
1160   if (to->local.self_insns > what->local.self_insns)
1161     limit = to->local.self_insns;
1162   else
1163     limit = what->local.self_insns;
1164
1165   limit += limit * PARAM_VALUE (PARAM_LARGE_FUNCTION_GROWTH) / 100;
1166
1167   newsize = cgraph_estimate_size_after_inlining (times, to, what);
1168   if (newsize > PARAM_VALUE (PARAM_LARGE_FUNCTION_INSNS)
1169       && newsize > limit)
1170     {
1171       if (reason)
1172         *reason = N_("--param large-function-growth limit reached");
1173       return false;
1174     }
1175   return true;
1176 }
1177
1178 /* Return true when function N is small enough to be inlined.  */
1179
1180 static bool
1181 cgraph_default_inline_p (struct cgraph_node *n)
1182 {
1183   if (!DECL_INLINE (n->decl) || !DECL_SAVED_TREE (n->decl))
1184     return false;
1185   if (DECL_DECLARED_INLINE_P (n->decl))
1186     return n->global.insns < MAX_INLINE_INSNS_SINGLE;
1187   else
1188     return n->global.insns < MAX_INLINE_INSNS_AUTO;
1189 }
1190
1191 /* Return true when inlining WHAT would create recursive inlining.
1192    We call recursive inlining all cases where same function appears more than
1193    once in the single recursion nest path in the inline graph.  */
1194
1195 static bool
1196 cgraph_recursive_inlining_p (struct cgraph_node *to,
1197                              struct cgraph_node *what,
1198                              const char **reason)
1199 {
1200   bool recursive;
1201   if (to->global.inlined_to)
1202     recursive = what->decl == to->global.inlined_to->decl;
1203   else
1204     recursive = what->decl == to->decl;
1205   /* Marking recursive function inline has sane semantic and thus we should
1206      not warn on it.  */
1207   if (recursive && reason)
1208     *reason = (what->local.disregard_inline_limits
1209                ? N_("recursive inlining") : "");
1210   return recursive;
1211 }
1212
1213 /* Recompute heap nodes for each of callees.  */
1214 static void
1215 update_callee_keys (fibheap_t heap, struct fibnode **heap_node,
1216                     struct cgraph_node *node)
1217 {
1218   struct cgraph_edge *e;
1219
1220   for (e = node->callees; e; e = e->next_callee)
1221     if (e->inline_failed && heap_node[e->callee->uid])
1222       fibheap_replace_key (heap, heap_node[e->callee->uid],
1223                            cgraph_estimate_growth (e->callee));
1224     else if (!e->inline_failed)
1225       update_callee_keys (heap, heap_node, e->callee);
1226 }
1227
1228 /* Enqueue all recursive calls from NODE into queue linked via aux pointers
1229    in between FIRST and LAST.  WHERE is used for bookkeeping while looking
1230    int calls inlined within NODE.  */
1231 static void
1232 lookup_recursive_calls (struct cgraph_node *node, struct cgraph_node *where,
1233                         struct cgraph_edge **first, struct cgraph_edge **last)
1234 {
1235   struct cgraph_edge *e;
1236   for (e = where->callees; e; e = e->next_callee)
1237     if (e->callee == node)
1238       {
1239         if (!*first)
1240           *first = e;
1241         else
1242           (*last)->aux = e;
1243         *last = e;
1244       }
1245   for (e = where->callees; e; e = e->next_callee)
1246     if (!e->inline_failed)
1247       lookup_recursive_calls (node, e->callee, first, last);
1248 }
1249
1250 /* Decide on recursive inlining: in the case function has recursive calls,
1251    inline until body size reaches given argument.  */
1252 static void
1253 cgraph_decide_recursive_inlining (struct cgraph_node *node)
1254 {
1255   int limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO);
1256   int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO);
1257   struct cgraph_edge *first_call = NULL, *last_call = NULL;
1258   struct cgraph_edge *last_in_current_depth;
1259   struct cgraph_edge *e;
1260   struct cgraph_node *master_clone;
1261   int depth = 0;
1262   int n = 0;
1263
1264   if (DECL_DECLARED_INLINE_P (node->decl))
1265     {
1266       limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE);
1267       max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH);
1268     }
1269
1270   /* Make sure that function is small enough to be considered for inlining.  */
1271   if (!max_depth
1272       || cgraph_estimate_size_after_inlining (1, node, node)  >= limit)
1273     return;
1274   lookup_recursive_calls (node, node, &first_call, &last_call);
1275   if (!first_call)
1276     return;
1277
1278   if (cgraph_dump_file)
1279     fprintf (cgraph_dump_file, 
1280              "\nPerforming recursive inlining on %s\n",
1281              cgraph_node_name (node));
1282
1283   /* We need original clone to copy around.  */
1284   master_clone = cgraph_clone_node (node);
1285   master_clone->needed = true;
1286   for (e = master_clone->callees; e; e = e->next_callee)
1287     if (!e->inline_failed)
1288       cgraph_clone_inlined_nodes (e, true);
1289
1290   /* Do the inlining and update list of recursive call during process.  */
1291   last_in_current_depth = last_call;
1292   while (first_call
1293          && cgraph_estimate_size_after_inlining (1, node, master_clone) <= limit)
1294     {
1295       struct cgraph_edge *curr = first_call;
1296
1297       first_call = first_call->aux;
1298       curr->aux = NULL;
1299
1300       cgraph_redirect_edge_callee (curr, master_clone);
1301       cgraph_mark_inline_edge (curr);
1302       lookup_recursive_calls (node, curr->callee, &first_call, &last_call);
1303
1304       if (last_in_current_depth
1305           && ++depth >= max_depth)
1306         break;
1307       n++;
1308     }
1309
1310   /* Cleanup queue pointers.  */
1311   while (first_call)
1312     {
1313       struct cgraph_edge *next = first_call->aux;
1314       first_call->aux = NULL;
1315       first_call = next;
1316     }
1317   if (cgraph_dump_file)
1318     fprintf (cgraph_dump_file, 
1319              "\n   Inlined %i times, body grown from %i to %i insns\n", n,
1320              master_clone->global.insns, node->global.insns);
1321
1322   /* Remove master clone we used for inlining.  We rely that clones inlined
1323      into master clone gets queued just before master clone so we don't
1324      need recursion.  */
1325   for (node = cgraph_nodes; node != master_clone;
1326        node = node->next)
1327     if (node->global.inlined_to == master_clone)
1328       cgraph_remove_node (node);
1329   cgraph_remove_node (master_clone);
1330 }
1331
1332 /* Set inline_failed for all callers of given function to REASON.  */
1333
1334 static void
1335 cgraph_set_inline_failed (struct cgraph_node *node, const char *reason)
1336 {
1337   struct cgraph_edge *e;
1338
1339   if (cgraph_dump_file)
1340     fprintf (cgraph_dump_file, "Inlining failed: %s\n", reason);
1341   for (e = node->callers; e; e = e->next_caller)
1342     if (e->inline_failed)
1343       e->inline_failed = reason;
1344 }
1345
1346 /* We use greedy algorithm for inlining of small functions:
1347    All inline candidates are put into prioritized heap based on estimated
1348    growth of the overall number of instructions and then update the estimates.
1349
1350    INLINED and INLINED_CALEES are just pointers to arrays large enough
1351    to be passed to cgraph_inlined_into and cgraph_inlined_callees.  */
1352
1353 static void
1354 cgraph_decide_inlining_of_small_functions (void)
1355 {
1356   struct cgraph_node *node;
1357   fibheap_t heap = fibheap_new ();
1358   struct fibnode **heap_node =
1359     xcalloc (cgraph_max_uid, sizeof (struct fibnode *));
1360   int max_insns = ((HOST_WIDEST_INT) initial_insns
1361                    * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100);
1362
1363   /* Put all inline candidates into the heap.  */
1364
1365   for (node = cgraph_nodes; node; node = node->next)
1366     {
1367       if (!node->local.inlinable || !node->callers
1368           || node->local.disregard_inline_limits)
1369         continue;
1370
1371       if (!cgraph_default_inline_p (node))
1372         {
1373           cgraph_set_inline_failed (node,
1374             N_("--param max-inline-insns-single limit reached"));
1375           continue;
1376         }
1377       heap_node[node->uid] =
1378         fibheap_insert (heap, cgraph_estimate_growth (node), node);
1379     }
1380
1381   if (cgraph_dump_file)
1382     fprintf (cgraph_dump_file, "\nDeciding on smaller functions:\n");
1383   while (overall_insns <= max_insns && (node = fibheap_extract_min (heap)))
1384     {
1385       struct cgraph_edge *e, *next;
1386       int old_insns = overall_insns;
1387
1388       heap_node[node->uid] = NULL;
1389       if (cgraph_dump_file)
1390         fprintf (cgraph_dump_file, 
1391                  "\nConsidering %s with %i insns\n"
1392                  " Estimated growth is %+i insns.\n",
1393                  cgraph_node_name (node), node->global.insns,
1394                  cgraph_estimate_growth (node));
1395       if (!cgraph_default_inline_p (node))
1396         {
1397           cgraph_set_inline_failed (node,
1398             N_("--param max-inline-insns-single limit reached after inlining into the callee"));
1399           continue;
1400         }
1401       for (e = node->callers; e; e = next)
1402         {
1403           next = e->next_caller;
1404           if (e->inline_failed)
1405             {
1406               struct cgraph_node *where;
1407
1408               if (cgraph_recursive_inlining_p (e->caller, e->callee,
1409                                                &e->inline_failed)
1410                   || !cgraph_check_inline_limits (e->caller, e->callee,
1411                                                   &e->inline_failed))
1412                 {
1413                   if (cgraph_dump_file)
1414                     fprintf (cgraph_dump_file, " Not inlining into %s:%s.\n",
1415                              cgraph_node_name (e->caller), e->inline_failed);
1416                   continue;
1417                 }
1418               next = cgraph_mark_inline (e);
1419               where = e->caller;
1420               if (where->global.inlined_to)
1421                 where = where->global.inlined_to;
1422
1423               if (heap_node[where->uid])
1424                 fibheap_replace_key (heap, heap_node[where->uid],
1425                                      cgraph_estimate_growth (where));
1426
1427               if (cgraph_dump_file)
1428                 fprintf (cgraph_dump_file, 
1429                          " Inlined into %s which now has %i insns.\n",
1430                          cgraph_node_name (e->caller),
1431                          e->caller->global.insns);
1432             }
1433         }
1434
1435       cgraph_decide_recursive_inlining (node);
1436
1437       /* Similarly all functions called by the function we just inlined
1438          are now called more times; update keys.  */
1439       update_callee_keys (heap, heap_node, node);
1440
1441       if (cgraph_dump_file)
1442         fprintf (cgraph_dump_file, 
1443                  " Inlined for a net change of %+i insns.\n",
1444                  overall_insns - old_insns);
1445     }
1446   while ((node = fibheap_extract_min (heap)) != NULL)
1447     if (!node->local.disregard_inline_limits)
1448       cgraph_set_inline_failed (node, N_("--param inline-unit-growth limit reached"));
1449   fibheap_delete (heap);
1450   free (heap_node);
1451 }
1452
1453 /* Decide on the inlining.  We do so in the topological order to avoid
1454    expenses on updating data structures.  */
1455
1456 static void
1457 cgraph_decide_inlining (void)
1458 {
1459   struct cgraph_node *node;
1460   int nnodes;
1461   struct cgraph_node **order =
1462     xcalloc (cgraph_n_nodes, sizeof (struct cgraph_node *));
1463   int old_insns = 0;
1464   int i;
1465
1466   for (node = cgraph_nodes; node; node = node->next)
1467     initial_insns += node->local.self_insns;
1468   overall_insns = initial_insns;
1469
1470   nnodes = cgraph_postorder (order);
1471
1472   if (cgraph_dump_file)
1473     fprintf (cgraph_dump_file,
1474              "\nDeciding on inlining.  Starting with %i insns.\n",
1475              initial_insns);
1476
1477   for (node = cgraph_nodes; node; node = node->next)
1478     node->aux = 0;
1479
1480   if (cgraph_dump_file)
1481     fprintf (cgraph_dump_file, "\nInlining always_inline functions:\n");
1482
1483   /* In the first pass mark all always_inline edges.  Do this with a priority
1484      so none of our later choices will make this impossible.  */
1485   for (i = nnodes - 1; i >= 0; i--)
1486     {
1487       struct cgraph_edge *e, *next;
1488
1489       node = order[i];
1490
1491       if (!node->local.disregard_inline_limits)
1492         continue;
1493       if (cgraph_dump_file)
1494         fprintf (cgraph_dump_file,
1495                  "\nConsidering %s %i insns (always inline)\n",
1496                  cgraph_node_name (node), node->global.insns);
1497       old_insns = overall_insns;
1498       for (e = node->callers; e; e = next)
1499         {
1500           next = e->next_caller;
1501           if (!e->inline_failed)
1502             continue;
1503           if (cgraph_recursive_inlining_p (e->caller, e->callee,
1504                                            &e->inline_failed))
1505             continue;
1506           cgraph_mark_inline_edge (e);
1507           if (cgraph_dump_file)
1508             fprintf (cgraph_dump_file, 
1509                      " Inlined into %s which now has %i insns.\n",
1510                      cgraph_node_name (e->caller),
1511                      e->caller->global.insns);
1512         }
1513       if (cgraph_dump_file)
1514         fprintf (cgraph_dump_file, 
1515                  " Inlined for a net change of %+i insns.\n",
1516                  overall_insns - old_insns);
1517     }
1518
1519   if (!flag_really_no_inline)
1520     {
1521       cgraph_decide_inlining_of_small_functions ();
1522
1523       if (cgraph_dump_file)
1524         fprintf (cgraph_dump_file, "\nDeciding on functions called once:\n");
1525
1526       /* And finally decide what functions are called once.  */
1527
1528       for (i = nnodes - 1; i >= 0; i--)
1529         {
1530           node = order[i];
1531
1532           if (node->callers && !node->callers->next_caller && !node->needed
1533               && node->local.inlinable && node->callers->inline_failed
1534               && !DECL_EXTERNAL (node->decl) && !DECL_COMDAT (node->decl))
1535             {
1536               bool ok = true;
1537               struct cgraph_node *node1;
1538
1539               /* Verify that we won't duplicate the caller.  */
1540               for (node1 = node->callers->caller;
1541                    node1->callers && !node1->callers->inline_failed
1542                    && ok; node1 = node1->callers->caller)
1543                 if (node1->callers->next_caller || node1->needed)
1544                   ok = false;
1545               if (ok)
1546                 {
1547                   if (cgraph_dump_file)
1548                     fprintf (cgraph_dump_file,
1549                              "\nConsidering %s %i insns.\n"
1550                              " Called once from %s %i insns.\n",
1551                              cgraph_node_name (node), node->global.insns,
1552                              cgraph_node_name (node->callers->caller),
1553                              node->callers->caller->global.insns);
1554
1555                   old_insns = overall_insns;
1556
1557                   if (cgraph_check_inline_limits (node->callers->caller, node,
1558                                                   NULL))
1559                     {
1560                       cgraph_mark_inline (node->callers);
1561                       if (cgraph_dump_file)
1562                         fprintf (cgraph_dump_file,
1563                                  " Inlined into %s which now has %i insns"
1564                                  " for a net change of %+i insns.\n",
1565                                  cgraph_node_name (node->callers->caller),
1566                                  node->callers->caller->global.insns,
1567                                  overall_insns - old_insns);
1568                     }
1569                   else
1570                     {
1571                       if (cgraph_dump_file)
1572                         fprintf (cgraph_dump_file,
1573                                  " Inline limit reached, not inlined.\n");
1574                     }
1575                 }
1576             }
1577         }
1578     }
1579
1580   /* We will never output extern functions we didn't inline. 
1581      ??? Perhaps we can prevent accounting of growth of external
1582      inline functions.  */
1583   cgraph_remove_unreachable_nodes ();
1584
1585   if (cgraph_dump_file)
1586     fprintf (cgraph_dump_file,
1587              "\nInlined %i calls, eliminated %i functions, "
1588              "%i insns turned to %i insns.\n\n",
1589              ncalls_inlined, nfunctions_inlined, initial_insns,
1590              overall_insns);
1591   free (order);
1592 }
1593
1594 /* Decide on the inlining.  We do so in the topological order to avoid
1595    expenses on updating data structures.  */
1596
1597 static void
1598 cgraph_decide_inlining_incrementally (struct cgraph_node *node)
1599 {
1600   struct cgraph_edge *e;
1601
1602   /* First of all look for always inline functions.  */
1603   for (e = node->callees; e; e = e->next_callee)
1604     if (e->callee->local.disregard_inline_limits
1605         && e->inline_failed
1606         && !cgraph_recursive_inlining_p (node, e->callee, &e->inline_failed)
1607         /* ??? It is possible that renaming variable removed the function body
1608            in duplicate_decls. See gcc.c-torture/compile/20011119-2.c  */
1609         && DECL_SAVED_TREE (e->callee->decl))
1610       cgraph_mark_inline (e);
1611
1612   /* Now do the automatic inlining.  */
1613   if (!flag_really_no_inline)
1614     for (e = node->callees; e; e = e->next_callee)
1615       if (e->callee->local.inlinable
1616           && e->inline_failed
1617           && !e->callee->local.disregard_inline_limits
1618           && !cgraph_recursive_inlining_p (node, e->callee, &e->inline_failed)
1619           && cgraph_check_inline_limits (node, e->callee, &e->inline_failed)
1620           && DECL_SAVED_TREE (e->callee->decl))
1621         {
1622           if (cgraph_default_inline_p (e->callee))
1623             cgraph_mark_inline (e);
1624           else
1625             e->inline_failed
1626               = N_("--param max-inline-insns-single limit reached");
1627         }
1628 }
1629
1630
1631 /* Return true when CALLER_DECL should be inlined into CALLEE_DECL.  */
1632
1633 bool
1634 cgraph_inline_p (struct cgraph_edge *e, const char **reason)
1635 {
1636   *reason = e->inline_failed;
1637   return !e->inline_failed;
1638 }
1639
1640 /* Expand all functions that must be output.
1641
1642    Attempt to topologically sort the nodes so function is output when
1643    all called functions are already assembled to allow data to be
1644    propagated across the callgraph.  Use a stack to get smaller distance
1645    between a function and its callees (later we may choose to use a more
1646    sophisticated algorithm for function reordering; we will likely want
1647    to use subsections to make the output functions appear in top-down
1648    order).  */
1649
1650 static void
1651 cgraph_expand_all_functions (void)
1652 {
1653   struct cgraph_node *node;
1654   struct cgraph_node **order =
1655     xcalloc (cgraph_n_nodes, sizeof (struct cgraph_node *));
1656   int order_pos = 0, new_order_pos = 0;
1657   int i;
1658
1659   cgraph_mark_functions_to_output ();
1660
1661   order_pos = cgraph_postorder (order);
1662   gcc_assert (order_pos == cgraph_n_nodes);
1663
1664   /* Garbage collector may remove inline clones we eliminate during
1665      optimization.  So we must be sure to not reference them.  */
1666   for (i = 0; i < order_pos; i++)
1667     if (order[i]->output)
1668       order[new_order_pos++] = order[i];
1669
1670   for (i = new_order_pos - 1; i >= 0; i--)
1671     {
1672       node = order[i];
1673       if (node->output)
1674         {
1675           gcc_assert (node->reachable);
1676           node->output = 0;
1677           cgraph_expand_function (node);
1678         }
1679     }
1680   free (order);
1681 }
1682
1683 /* Mark all local functions.
1684
1685    A local function is one whose calls can occur only in the
1686    current compilation unit and all its calls are explicit,
1687    so we can change its calling convention.
1688    We simply mark all static functions whose address is not taken
1689    as local.  */
1690
1691 static void
1692 cgraph_mark_local_functions (void)
1693 {
1694   struct cgraph_node *node;
1695
1696   if (cgraph_dump_file)
1697     fprintf (cgraph_dump_file, "\nMarking local functions:");
1698
1699   /* Figure out functions we want to assemble.  */
1700   for (node = cgraph_nodes; node; node = node->next)
1701     {
1702       node->local.local = (!node->needed
1703                            && DECL_SAVED_TREE (node->decl)
1704                            && !TREE_PUBLIC (node->decl));
1705       if (cgraph_dump_file && node->local.local)
1706         fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
1707     }
1708   if (cgraph_dump_file)
1709     fprintf (cgraph_dump_file, "\n\n");
1710 }
1711
1712 /* Return true when function body of DECL still needs to be kept around
1713    for later re-use.  */
1714 bool
1715 cgraph_preserve_function_body_p (tree decl)
1716 {
1717   struct cgraph_node *node;
1718   /* Keep the body; we're going to dump it.  */
1719   if (dump_enabled_p (TDI_tree_all))
1720     return true;
1721   if (!cgraph_global_info_ready)
1722     return (DECL_INLINE (decl) && !flag_really_no_inline);
1723   /* Look if there is any clone around.  */
1724   for (node = cgraph_node (decl); node; node = node->next_clone)
1725     if (node->global.inlined_to)
1726       return true;
1727   return false;
1728 }
1729
1730 /* Perform simple optimizations based on callgraph.  */
1731
1732 void
1733 cgraph_optimize (void)
1734 {
1735 #ifdef ENABLE_CHECKING
1736   verify_cgraph ();
1737 #endif
1738   if (!flag_unit_at_a_time)
1739     return;
1740   timevar_push (TV_CGRAPHOPT);
1741   if (!quiet_flag)
1742     fprintf (stderr, "Performing intraprocedural optimizations\n");
1743
1744   cgraph_mark_local_functions ();
1745   if (cgraph_dump_file)
1746     {
1747       fprintf (cgraph_dump_file, "Marked ");
1748       dump_cgraph (cgraph_dump_file);
1749     }
1750
1751   if (flag_inline_trees)
1752     cgraph_decide_inlining ();
1753   cgraph_global_info_ready = true;
1754   if (cgraph_dump_file)
1755     {
1756       fprintf (cgraph_dump_file, "Optimized ");
1757       dump_cgraph (cgraph_dump_file);
1758     }
1759   timevar_pop (TV_CGRAPHOPT);
1760
1761   /* Output everything.  */
1762   if (!quiet_flag)
1763     fprintf (stderr, "Assembling functions:\n");
1764 #ifdef ENABLE_CHECKING
1765   verify_cgraph ();
1766 #endif
1767   cgraph_expand_all_functions ();
1768   if (cgraph_dump_file)
1769     {
1770       fprintf (cgraph_dump_file, "\nFinal ");
1771       dump_cgraph (cgraph_dump_file);
1772     }
1773 #ifdef ENABLE_CHECKING
1774   verify_cgraph ();
1775   /* Double check that all inline clones are gone and that all
1776      function bodies have been released from memory.  */
1777   if (flag_unit_at_a_time
1778       && !dump_enabled_p (TDI_tree_all)
1779       && !(sorrycount || errorcount))
1780     {
1781       struct cgraph_node *node;
1782       bool error_found = false;
1783
1784       for (node = cgraph_nodes; node; node = node->next)
1785         if (node->analyzed
1786             && (node->global.inlined_to
1787                 || DECL_SAVED_TREE (node->decl)))
1788           {
1789             error_found = true;
1790             dump_cgraph_node (stderr, node);
1791           }
1792       if (error_found)
1793         internal_error ("Nodes with no released memory found.");
1794     }
1795 #endif
1796 }
1797
1798 /* Generate and emit a static constructor or destructor.  WHICH must be
1799    one of 'I' or 'D'.  BODY should be a STATEMENT_LIST containing 
1800    GENERIC statements.  */
1801
1802 void
1803 cgraph_build_static_cdtor (char which, tree body, int priority)
1804 {
1805   static int counter = 0;
1806   char which_buf[16];
1807   tree decl, name, resdecl;
1808
1809   sprintf (which_buf, "%c_%d", which, counter++);
1810   name = get_file_function_name_long (which_buf);
1811
1812   decl = build_decl (FUNCTION_DECL, name,
1813                      build_function_type (void_type_node, void_list_node));
1814   current_function_decl = decl;
1815
1816   resdecl = build_decl (RESULT_DECL, NULL_TREE, void_type_node);
1817   DECL_ARTIFICIAL (resdecl) = 1;
1818   DECL_IGNORED_P (resdecl) = 1;
1819   DECL_RESULT (decl) = resdecl;
1820
1821   allocate_struct_function (decl);
1822
1823   TREE_STATIC (decl) = 1;
1824   TREE_USED (decl) = 1;
1825   DECL_ARTIFICIAL (decl) = 1;
1826   DECL_IGNORED_P (decl) = 1;
1827   DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (decl) = 1;
1828   DECL_SAVED_TREE (decl) = body;
1829   TREE_PUBLIC (decl) = ! targetm.have_ctors_dtors;
1830   DECL_UNINLINABLE (decl) = 1;
1831
1832   DECL_INITIAL (decl) = make_node (BLOCK);
1833   TREE_USED (DECL_INITIAL (decl)) = 1;
1834
1835   DECL_SOURCE_LOCATION (decl) = input_location;
1836   cfun->function_end_locus = input_location;
1837
1838   switch (which)
1839     {
1840     case 'I':
1841       DECL_STATIC_CONSTRUCTOR (decl) = 1;
1842       break;
1843     case 'D':
1844       DECL_STATIC_DESTRUCTOR (decl) = 1;
1845       break;
1846     default:
1847       gcc_unreachable ();
1848     }
1849
1850   gimplify_function_tree (decl);
1851
1852   /* ??? We will get called LATE in the compilation process.  */
1853   if (cgraph_global_info_ready)
1854     tree_rest_of_compilation (decl, false);
1855   else
1856     cgraph_finalize_function (decl, 0);
1857   
1858   if (targetm.have_ctors_dtors)
1859     {
1860       void (*fn) (rtx, int);
1861
1862       if (which == 'I')
1863         fn = targetm.asm_out.constructor;
1864       else
1865         fn = targetm.asm_out.destructor;
1866       fn (XEXP (DECL_RTL (decl), 0), priority);
1867     }
1868 }