OSDN Git Service

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