1 /* Callgraph based intraprocedural optimizations.
2 Copyright (C) 2003, 2004 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
5 This file is part of GCC.
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
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
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
24 #include "coretypes.h"
27 #include "tree-inline.h"
28 #include "langhooks.h"
36 #include "diagnostic.h"
43 #define INSNS_PER_CALL 10
45 static void cgraph_expand_all_functions (void);
46 static void cgraph_mark_functions_to_output (void);
47 static void cgraph_expand_function (struct cgraph_node *);
48 static tree record_call_1 (tree *, int *, void *);
49 static void cgraph_mark_local_functions (void);
50 static void cgraph_optimize_function (struct cgraph_node *);
51 static bool cgraph_default_inline_p (struct cgraph_node *n);
52 static void cgraph_analyze_function (struct cgraph_node *node);
53 static void cgraph_decide_inlining_incrementally (struct cgraph_node *);
55 /* Statistics we collect about inlining algorithm. */
56 static int ncalls_inlined;
57 static int nfunctions_inlined;
58 static int initial_insns;
59 static int overall_insns;
61 /* Records tree nodes seen in cgraph_create_edges. Simply using
62 walk_tree_without_duplicates doesn't guarantee each node is visited
63 once because it gets a new htab upon each recursive call from
65 static htab_t visited_nodes;
67 /* Determine if function DECL is needed. That is, visible to something
68 either outside this translation unit, something magic in the system
69 configury, or (if not doing unit-at-a-time) to something we havn't
73 decide_is_function_needed (struct cgraph_node *node, tree decl)
75 /* If we decided it was needed before, but at the time we didn't have
76 the body of the function available, then it's still needed. We have
77 to go back and re-check its dependencies now. */
81 /* Externally visible functions must be output. The exception is
82 COMDAT functions that must be output only when they are needed. */
83 if (TREE_PUBLIC (decl) && !DECL_COMDAT (decl) && !DECL_EXTERNAL (decl))
86 /* Constructors and destructors are reachable from the runtime by
88 if (DECL_STATIC_CONSTRUCTOR (decl) || DECL_STATIC_DESTRUCTOR (decl))
91 /* If the user told us it is used, then it must be so. */
92 if (lookup_attribute ("used", DECL_ATTRIBUTES (decl)))
95 /* ??? If the assembler name is set by hand, it is possible to assemble
96 the name later after finalizing the function and the fact is noticed
97 in assemble_name then. This is arguably a bug. */
98 if (DECL_ASSEMBLER_NAME_SET_P (decl)
99 && TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl)))
102 if (flag_unit_at_a_time)
105 /* If not doing unit at a time, then we'll only defer this function
106 if its marked for inlining. Otherwise we want to emit it now. */
108 /* "extern inline" functions are never output locally. */
109 if (DECL_EXTERNAL (decl))
111 /* We want to emit COMDAT functions only when absolutely necessary. */
112 if (DECL_COMDAT (decl))
114 if (!DECL_INLINE (decl)
115 || (!node->local.disregard_inline_limits
116 /* When declared inline, defer even the uninlinable functions.
117 This allows them to be eliminated when unused. */
118 && !DECL_DECLARED_INLINE_P (decl)
119 && (!node->local.inlinable || !cgraph_default_inline_p (node))))
125 /* When not doing unit-at-a-time, output all functions enqueued.
126 Return true when such a functions were found. */
129 cgraph_assemble_pending_functions (void)
133 if (flag_unit_at_a_time)
136 while (cgraph_nodes_queue)
138 struct cgraph_node *n = cgraph_nodes_queue;
140 cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
141 if (!n->origin && !DECL_EXTERNAL (n->decl))
143 cgraph_expand_function (n);
151 /* DECL has been parsed. Take it, queue it, compile it at the whim of the
152 logic in effect. If NESTED is true, then our caller cannot stand to have
153 the garbage collector run at the moment. We would need to either create
154 a new GC context, or just not compile right now. */
157 cgraph_finalize_function (tree decl, bool nested)
159 struct cgraph_node *node = cgraph_node (decl);
161 if (node->local.finalized)
163 /* As an GCC extension we allow redefinition of the function. The
164 semantics when both copies of bodies differ is not well defined.
165 We replace the old body with new body so in unit at a time mode
166 we always use new body, while in normal mode we may end up with
167 old body inlined into some functions and new body expanded and
170 ??? It may make more sense to use one body for inlining and other
171 body for expanding the function but this is difficult to do. */
173 /* If node->output is set, then this is a unit-at-a-time compilation
174 and we have already begun whole-unit analysis. This is *not*
175 testing for whether we've already emitted the function. That
176 case can be sort-of legitimately seen with real function
177 redefinition errors. I would argue that the front end should
178 never present us with such a case, but don't enforce that for now. */
182 /* Reset our datastructures so we can analyze the function again. */
183 memset (&node->local, 0, sizeof (node->local));
184 memset (&node->global, 0, sizeof (node->global));
185 memset (&node->rtl, 0, sizeof (node->rtl));
186 node->analyzed = false;
187 node->local.redefined_extern_inline = true;
188 while (node->callees)
189 cgraph_remove_edge (node, node->callees->callee);
191 /* We may need to re-queue the node for assembling in case
192 we already proceeded it and ignored as not needed. */
193 if (node->reachable && !flag_unit_at_a_time)
195 struct cgraph_node *n;
197 for (n = cgraph_nodes_queue; n; n = n->next_needed)
205 notice_global_symbol (decl);
207 node->local.finalized = true;
209 /* If not unit at a time, then we need to create the call graph
210 now, so that called functions can be queued and emitted now. */
211 if (!flag_unit_at_a_time)
213 cgraph_analyze_function (node);
214 cgraph_decide_inlining_incrementally (node);
217 if (decide_is_function_needed (node, decl))
218 cgraph_mark_needed_node (node);
220 /* If not unit at a time, go ahead and emit everything we've found
221 to be reachable at this time. */
224 if (!cgraph_assemble_pending_functions ())
228 /* If we've not yet emitted decl, tell the debug info about it. */
229 if (!TREE_ASM_WRITTEN (decl))
230 (*debug_hooks->deferred_inline_function) (decl);
233 /* Walk tree and record all calls. Called via walk_tree. */
235 record_call_1 (tree *tp, int *walk_subtrees, void *data)
239 switch (TREE_CODE (t))
242 /* ??? Really, we should mark this decl as *potentially* referenced
243 by this function and re-examine whether the decl is actually used
244 after rtl has been generated. */
246 cgraph_varpool_mark_needed_node (cgraph_varpool_node (t));
250 if (flag_unit_at_a_time)
252 /* Record dereferences to the functions. This makes the
253 functions reachable unconditionally. */
254 tree decl = TREE_OPERAND (*tp, 0);
255 if (TREE_CODE (decl) == FUNCTION_DECL)
256 cgraph_mark_needed_node (cgraph_node (decl));
262 tree decl = get_callee_fndecl (*tp);
263 if (decl && TREE_CODE (decl) == FUNCTION_DECL)
265 cgraph_record_call (data, decl);
267 /* When we see a function call, we don't want to look at the
268 function reference in the ADDR_EXPR that is hanging from
269 the CALL_EXPR we're examining here, because we would
270 conclude incorrectly that the function's address could be
271 taken by something that is not a function call. So only
272 walk the function parameter list, skip the other subtrees. */
274 walk_tree (&TREE_OPERAND (*tp, 1), record_call_1, data,
282 /* Save some cycles by not walking types and declaration as we
283 won't find anything useful there anyway. */
284 if (DECL_P (*tp) || TYPE_P (*tp))
290 if ((unsigned int) TREE_CODE (t) >= LAST_AND_UNUSED_TREE_CODE)
291 return (*lang_hooks.callgraph.analyze_expr) (tp, walk_subtrees, data);
298 /* Create cgraph edges for function calls inside BODY from DECL. */
301 cgraph_create_edges (tree decl, tree body)
303 /* The nodes we're interested in are never shared, so walk
304 the tree ignoring duplicates. */
305 visited_nodes = htab_create (37, htab_hash_pointer,
306 htab_eq_pointer, NULL);
307 walk_tree (&body, record_call_1, decl, visited_nodes);
308 htab_delete (visited_nodes);
309 visited_nodes = NULL;
312 /* Analyze the function scheduled to be output. */
314 cgraph_analyze_function (struct cgraph_node *node)
316 tree decl = node->decl;
317 struct cgraph_edge *e;
319 current_function_decl = decl;
321 /* First kill forward declaration so reverse inlining works properly. */
322 cgraph_create_edges (decl, DECL_SAVED_TREE (decl));
324 node->local.inlinable = tree_inlinable_function_p (decl);
325 if (!DECL_ESTIMATED_INSNS (decl))
326 DECL_ESTIMATED_INSNS (decl)
327 = (*lang_hooks.tree_inlining.estimate_num_insns) (decl);
328 node->local.self_insns = DECL_ESTIMATED_INSNS (decl);
329 if (node->local.inlinable)
330 node->local.disregard_inline_limits
331 = (*lang_hooks.tree_inlining.disregard_inline_limits) (decl);
332 for (e = node->callers; e; e = e->next_caller)
333 if (e->inline_failed)
335 if (node->local.redefined_extern_inline)
336 e->inline_failed = N_("redefined extern inline functions are not "
337 "considered for inlining");
338 else if (!node->local.inlinable)
339 e->inline_failed = N_("function not inlinable");
341 e->inline_failed = N_("function not considered for inlining");
343 if (flag_really_no_inline && !node->local.disregard_inline_limits)
344 node->local.inlinable = 0;
345 /* Inlining characteristics are maintained by the cgraph_mark_inline. */
346 node->global.insns = node->local.self_insns;
347 if (!DECL_EXTERNAL (decl))
349 node->global.cloned_times = 1;
350 node->global.will_be_output = true;
353 node->analyzed = true;
354 current_function_decl = NULL;
357 /* Analyze the whole compilation unit once it is parsed completely. */
360 cgraph_finalize_compilation_unit (void)
362 struct cgraph_node *node;
364 if (!flag_unit_at_a_time)
366 cgraph_assemble_pending_functions ();
370 cgraph_varpool_assemble_pending_decls ();
372 fprintf (stderr, "\nAnalyzing compilation unit\n");
374 timevar_push (TV_CGRAPH);
375 if (cgraph_dump_file)
377 fprintf (cgraph_dump_file, "Initial entry points:");
378 for (node = cgraph_nodes; node; node = node->next)
379 if (node->needed && DECL_SAVED_TREE (node->decl))
380 fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
381 fprintf (cgraph_dump_file, "\n");
384 /* Propagate reachability flag and lower representation of all reachable
385 functions. In the future, lowering will introduce new functions and
386 new entry points on the way (by template instantiation and virtual
387 method table generation for instance). */
388 while (cgraph_nodes_queue)
390 struct cgraph_edge *edge;
391 tree decl = cgraph_nodes_queue->decl;
393 node = cgraph_nodes_queue;
394 cgraph_nodes_queue = cgraph_nodes_queue->next_needed;
396 /* ??? It is possible to create extern inline function and later using
397 weak alas attribute to kill it's body. See
398 gcc.c-torture/compile/20011119-1.c */
399 if (!DECL_SAVED_TREE (decl))
402 if (node->analyzed || !node->reachable || !DECL_SAVED_TREE (decl))
405 cgraph_analyze_function (node);
407 for (edge = node->callees; edge; edge = edge->next_callee)
408 if (!edge->callee->reachable)
409 cgraph_mark_reachable_node (edge->callee);
411 cgraph_varpool_assemble_pending_decls ();
414 /* Collect entry points to the unit. */
416 if (cgraph_dump_file)
418 fprintf (cgraph_dump_file, "Unit entry points:");
419 for (node = cgraph_nodes; node; node = node->next)
420 if (node->needed && DECL_SAVED_TREE (node->decl))
421 fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
422 fprintf (cgraph_dump_file, "\n\nInitial ");
423 dump_cgraph (cgraph_dump_file);
426 if (cgraph_dump_file)
427 fprintf (cgraph_dump_file, "\nReclaiming functions:");
429 for (node = cgraph_nodes; node; node = node->next)
431 tree decl = node->decl;
433 if (!node->reachable && DECL_SAVED_TREE (decl))
435 cgraph_remove_node (node);
436 if (cgraph_dump_file)
437 fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
440 if (cgraph_dump_file)
442 fprintf (cgraph_dump_file, "\n\nReclaimed ");
443 dump_cgraph (cgraph_dump_file);
446 timevar_pop (TV_CGRAPH);
449 /* Figure out what functions we want to assemble. */
452 cgraph_mark_functions_to_output (void)
454 struct cgraph_node *node;
456 for (node = cgraph_nodes; node; node = node->next)
458 tree decl = node->decl;
459 struct cgraph_edge *e;
464 for (e = node->callers; e; e = e->next_caller)
465 if (e->inline_failed)
468 /* We need to output all local functions that are used and not
469 always inlined, as well as those that are reachable from
470 outside the current compilation unit. */
471 if (DECL_SAVED_TREE (decl)
473 || (e && node->reachable))
474 && !TREE_ASM_WRITTEN (decl) && !node->origin
475 && !DECL_EXTERNAL (decl))
480 /* Optimize the function before expansion. */
483 cgraph_optimize_function (struct cgraph_node *node)
485 tree decl = node->decl;
487 timevar_push (TV_INTEGRATION);
488 /* optimize_inline_calls avoids inlining of current_function_decl. */
489 current_function_decl = decl;
490 if (flag_inline_trees)
492 struct cgraph_edge *e;
494 for (e = node->callees; e; e = e->next_callee)
495 if (!e->inline_failed || warn_inline
496 || (DECL_DECLARED_INLINE_P (e->callee->decl)
497 && lookup_attribute ("always_inline",
498 DECL_ATTRIBUTES (e->callee->decl))))
501 optimize_inline_calls (decl);
505 for (node = node->nested; node; node = node->next_nested)
506 cgraph_optimize_function (node);
508 timevar_pop (TV_INTEGRATION);
511 /* Expand function specified by NODE. */
514 cgraph_expand_function (struct cgraph_node *node)
516 tree decl = node->decl;
518 if (flag_unit_at_a_time)
519 announce_function (decl);
521 cgraph_optimize_function (node);
523 /* Generate RTL for the body of DECL. Nested functions are expanded
524 via lang_expand_decl_stmt. */
525 (*lang_hooks.callgraph.expand_function) (decl);
527 if (!cgraph_function_possibly_inlined_p (decl))
528 DECL_SAVED_TREE (decl) = NULL;
529 current_function_decl = NULL;
532 /* Fill array order with all nodes with output flag set in the reverse
533 topological order. */
536 cgraph_postorder (struct cgraph_node **order)
538 struct cgraph_node *node, *node2;
541 struct cgraph_edge *edge, last;
543 struct cgraph_node **stack =
544 xcalloc (cgraph_n_nodes, sizeof (struct cgraph_node *));
546 /* We have to deal with cycles nicely, so use a depth first traversal
547 output algorithm. Ignore the fact that some functions won't need
548 to be output and put them into order as well, so we get dependencies
549 right through intline functions. */
550 for (node = cgraph_nodes; node; node = node->next)
552 for (node = cgraph_nodes; node; node = node->next)
559 node->aux = node->callers;
562 while (node2->aux != &last)
565 if (edge->next_caller)
566 node2->aux = edge->next_caller;
569 if (!edge->caller->aux)
571 if (!edge->caller->callers)
572 edge->caller->aux = &last;
574 edge->caller->aux = edge->caller->callers;
575 stack[stack_size++] = node2;
576 node2 = edge->caller;
580 if (node2->aux == &last)
582 order[order_pos++] = node2;
584 node2 = stack[--stack_size];
594 #define INLINED_TIMES(node) ((size_t)(node)->aux)
595 #define SET_INLINED_TIMES(node,times) ((node)->aux = (void *)(times))
597 /* Return list of nodes we decided to inline NODE into, set their output
598 flag and compute INLINED_TIMES.
600 We do simple backtracing to get INLINED_TIMES right. This should not be
601 expensive as we limit the amount of inlining. Alternatively we may first
602 discover set of nodes, topologically sort these and propagate
606 cgraph_inlined_into (struct cgraph_node *node, struct cgraph_node **array)
609 struct cgraph_edge **stack;
610 struct cgraph_edge *e, *e1;
614 /* Fast path: since we traverse in mostly topological order, we will likely
616 for (e = node->callers; e; e = e->next_caller)
617 if (!e->inline_failed)
623 /* Allocate stack for back-tracking up callgraph. */
624 stack = xmalloc ((cgraph_n_nodes + 1) * sizeof (struct cgraph_edge));
627 /* Push the first edge on to the stack. */
632 struct cgraph_node *caller;
634 /* Look at the edge on the top of the stack. */
638 /* Check if the caller destination has been visited yet. */
641 array[nfound++] = e->caller;
642 /* Mark that we have visited the destination. */
643 caller->output = true;
644 SET_INLINED_TIMES (caller, 0);
646 SET_INLINED_TIMES (caller, INLINED_TIMES (caller) + 1);
648 for (e1 = caller->callers; e1; e1 = e1->next_caller)
649 if (!e1->inline_failed)
658 for (e1 = e->next_caller; e1; e1 = e1->next_caller)
659 if (!e1->inline_failed)
681 if (cgraph_dump_file)
683 fprintf (cgraph_dump_file, " Found inline predecesors of %s:",
684 cgraph_node_name (node));
685 for (i = 0; i < nfound; i++)
687 fprintf (cgraph_dump_file, " %s", cgraph_node_name (array[i]));
688 if (INLINED_TIMES (array[i]) != 1)
689 fprintf (cgraph_dump_file, " (%i times)",
690 (int)INLINED_TIMES (array[i]));
692 fprintf (cgraph_dump_file, "\n");
698 /* Return list of nodes we decided to inline into NODE, set their output
699 flag and compute INLINED_TIMES.
701 This function is identical to cgraph_inlined_into with callers and callees
705 cgraph_inlined_callees (struct cgraph_node *node, struct cgraph_node **array)
708 struct cgraph_edge **stack;
709 struct cgraph_edge *e, *e1;
713 /* Fast path: since we traverse in mostly topological order, we will likely
715 for (e = node->callees; e; e = e->next_callee)
716 if (!e->inline_failed)
722 /* Allocate stack for back-tracking up callgraph. */
723 stack = xmalloc ((cgraph_n_nodes + 1) * sizeof (struct cgraph_edge));
726 /* Push the first edge on to the stack. */
731 struct cgraph_node *callee;
733 /* Look at the edge on the top of the stack. */
737 /* Check if the callee destination has been visited yet. */
740 array[nfound++] = e->callee;
741 /* Mark that we have visited the destination. */
742 callee->output = true;
743 SET_INLINED_TIMES (callee, 0);
745 SET_INLINED_TIMES (callee, INLINED_TIMES (callee) + 1);
747 for (e1 = callee->callees; e1; e1 = e1->next_callee)
748 if (!e1->inline_failed)
756 for (e1 = e->next_callee; e1; e1 = e1->next_callee)
757 if (!e1->inline_failed)
778 if (cgraph_dump_file)
780 fprintf (cgraph_dump_file, " Found inline successors of %s:",
781 cgraph_node_name (node));
782 for (i = 0; i < nfound; i++)
784 fprintf (cgraph_dump_file, " %s", cgraph_node_name (array[i]));
785 if (INLINED_TIMES (array[i]) != 1)
786 fprintf (cgraph_dump_file, " (%i times)",
787 (int)INLINED_TIMES (array[i]));
789 fprintf (cgraph_dump_file, "\n");
795 /* Estimate size of the function after inlining WHAT into TO. */
798 cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to,
799 struct cgraph_node *what)
801 return (what->global.insns - INSNS_PER_CALL) * times + to->global.insns;
804 /* Estimate the growth caused by inlining NODE into all callees. */
807 cgraph_estimate_growth (struct cgraph_node *node)
811 int clones_added = 0;
812 struct cgraph_edge *e;
814 for (e = node->callers; e; e = e->next_caller)
815 if (e->inline_failed)
817 growth += ((cgraph_estimate_size_after_inlining (1, e->caller, node)
819 e->caller->global.insns) *e->caller->global.cloned_times);
820 calls_saved += e->caller->global.cloned_times;
821 clones_added += e->caller->global.cloned_times;
824 /* ??? Wrong for self recursive functions or cases where we decide to not
825 inline for different reasons, but it is not big deal as in that case
826 we will keep the body around, but we will also avoid some inlining. */
827 if (!node->needed && !node->origin && !DECL_EXTERNAL (node->decl))
828 growth -= node->global.insns, clones_added--;
836 /* Update insn sizes after inlining WHAT into TO that is already inlined into
837 all nodes in INLINED array. */
840 cgraph_mark_inline (struct cgraph_node *to, struct cgraph_node *what,
841 struct cgraph_node **inlined, int ninlined,
842 struct cgraph_node **inlined_callees,
843 int ninlined_callees)
848 struct cgraph_edge *e;
852 what->global.inlined = 1;
853 for (e = what->callers; e; e = e->next_caller)
857 if (!e->inline_failed)
859 e->inline_failed = NULL;
861 clones += e->caller->global.cloned_times;
863 else if (e->inline_failed)
868 ncalls_inlined += times;
870 new_insns = cgraph_estimate_size_after_inlining (times, to, what);
871 if (to->global.will_be_output)
872 overall_insns += new_insns - to->global.insns;
873 to->global.insns = new_insns;
875 if (!called && !what->needed && !what->origin
876 && flag_unit_at_a_time
877 && !DECL_EXTERNAL (what->decl))
879 if (!what->global.will_be_output)
882 nfunctions_inlined++;
883 what->global.will_be_output = 0;
884 overall_insns -= what->global.insns;
886 what->global.cloned_times += clones;
887 for (i = 0; i < ninlined; i++)
890 cgraph_estimate_size_after_inlining (INLINED_TIMES (inlined[i]) *
891 times, inlined[i], what);
892 if (inlined[i]->global.will_be_output)
893 overall_insns += new_insns - inlined[i]->global.insns;
894 inlined[i]->global.insns = new_insns;
896 for (i = 0; i < ninlined_callees; i++)
898 inlined_callees[i]->global.cloned_times +=
899 INLINED_TIMES (inlined_callees[i]) * clones;
903 /* Return false when inlining WHAT into TO is not good idea as it would cause
904 too large growth of function bodies. */
907 cgraph_check_inline_limits (struct cgraph_node *to, struct cgraph_node *what,
908 struct cgraph_node **inlined, int ninlined,
913 struct cgraph_edge *e;
917 for (e = to->callees; e; e = e->next_callee)
918 if (e->callee == what)
921 /* When inlining large function body called once into small function,
922 take the inlined function as base for limiting the growth. */
923 if (to->local.self_insns > what->local.self_insns)
924 limit = to->local.self_insns;
926 limit = what->local.self_insns;
928 limit += limit * PARAM_VALUE (PARAM_LARGE_FUNCTION_GROWTH) / 100;
930 newsize = cgraph_estimate_size_after_inlining (times, to, what);
931 if (newsize > PARAM_VALUE (PARAM_LARGE_FUNCTION_INSNS)
934 *reason = N_("--param large-function-growth limit reached");
937 for (i = 0; i < ninlined; i++)
940 cgraph_estimate_size_after_inlining (INLINED_TIMES (inlined[i]) *
941 times, inlined[i], what);
942 if (newsize > PARAM_VALUE (PARAM_LARGE_FUNCTION_INSNS)
944 inlined[i]->local.self_insns *
945 (100 + PARAM_VALUE (PARAM_LARGE_FUNCTION_GROWTH)) / 100)
947 *reason = N_("--param large-function-growth limit reached while inlining the caller");
954 /* Return true when function N is small enough to be inlined. */
957 cgraph_default_inline_p (struct cgraph_node *n)
959 if (!DECL_INLINE (n->decl) || !DECL_SAVED_TREE (n->decl))
961 if (DECL_DECLARED_INLINE_P (n->decl))
962 return n->global.insns < MAX_INLINE_INSNS_SINGLE;
964 return n->global.insns < MAX_INLINE_INSNS_AUTO;
967 /* Set inline_failed for all callers of given function to REASON. */
970 cgraph_set_inline_failed (struct cgraph_node *node, const char *reason)
972 struct cgraph_edge *e;
974 if (cgraph_dump_file)
975 fprintf (cgraph_dump_file, "Inlining failed: %s\n", reason);
976 for (e = node->callers; e; e = e->next_caller)
977 if (e->inline_failed)
978 e->inline_failed = reason;
981 /* We use greedy algorithm for inlining of small functions:
982 All inline candidates are put into prioritized heap based on estimated
983 growth of the overall number of instructions and then update the estimates.
985 INLINED and INLINED_CALEES are just pointers to arrays large enough
986 to be passed to cgraph_inlined_into and cgraph_inlined_callees. */
989 cgraph_decide_inlining_of_small_functions (struct cgraph_node **inlined,
990 struct cgraph_node **inlined_callees)
993 struct cgraph_node *node;
994 fibheap_t heap = fibheap_new ();
995 struct fibnode **heap_node =
996 xcalloc (cgraph_max_uid, sizeof (struct fibnode *));
997 int ninlined, ninlined_callees;
998 int max_insns = ((HOST_WIDEST_INT) initial_insns
999 * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100);
1001 /* Put all inline candidates into the heap. */
1003 for (node = cgraph_nodes; node; node = node->next)
1005 if (!node->local.inlinable || !node->callers
1006 || node->local.disregard_inline_limits)
1009 if (!cgraph_default_inline_p (node))
1011 cgraph_set_inline_failed (node,
1012 N_("--param max-inline-insns-single limit reached"));
1015 heap_node[node->uid] =
1016 fibheap_insert (heap, cgraph_estimate_growth (node), node);
1019 if (cgraph_dump_file)
1020 fprintf (cgraph_dump_file, "\nDeciding on smaller functions:\n");
1021 while (overall_insns <= max_insns && (node = fibheap_extract_min (heap)))
1023 struct cgraph_edge *e;
1024 int old_insns = overall_insns;
1026 heap_node[node->uid] = NULL;
1027 if (cgraph_dump_file)
1028 fprintf (cgraph_dump_file,
1029 "\nConsidering %s with %i insns\n"
1030 " Estimated growth is %+i insns.\n",
1031 cgraph_node_name (node), node->global.insns,
1032 cgraph_estimate_growth (node));
1033 if (!cgraph_default_inline_p (node))
1035 cgraph_set_inline_failed (node,
1036 N_("--param max-inline-insns-single limit reached after inlining into the callee"));
1039 ninlined_callees = cgraph_inlined_callees (node, inlined_callees);
1040 for (e = node->callers; e; e = e->next_caller)
1041 if (e->inline_failed)
1043 /* Marking recursive function inlinine has sane semantic and
1044 thus we should not warn on it. */
1045 if (e->caller == node)
1047 e->inline_failed = "";
1050 ninlined = cgraph_inlined_into (e->caller, inlined);
1051 if (e->callee->output)
1052 e->inline_failed = "";
1053 if (e->callee->output
1054 || !cgraph_check_inline_limits (e->caller, node, inlined,
1055 ninlined, &e->inline_failed))
1057 for (i = 0; i < ninlined; i++)
1058 inlined[i]->output = 0, node->aux = 0;
1059 if (cgraph_dump_file)
1060 fprintf (cgraph_dump_file, " Not inlining into %s.\n",
1061 cgraph_node_name (e->caller));
1064 cgraph_mark_inline (e->caller, node, inlined, ninlined,
1065 inlined_callees, ninlined_callees);
1066 if (heap_node[e->caller->uid])
1067 fibheap_replace_key (heap, heap_node[e->caller->uid],
1068 cgraph_estimate_growth (e->caller));
1070 /* Size of the functions we updated into has changed, so update
1072 for (i = 0; i < ninlined; i++)
1074 inlined[i]->output = 0, node->aux = 0;
1075 if (heap_node[inlined[i]->uid])
1076 fibheap_replace_key (heap, heap_node[inlined[i]->uid],
1077 cgraph_estimate_growth (inlined[i]));
1079 if (cgraph_dump_file)
1080 fprintf (cgraph_dump_file,
1081 " Inlined into %s which now has %i insns.\n",
1082 cgraph_node_name (e->caller),
1083 e->caller->global.insns);
1087 /* Similarly all functions called by the function we just inlined
1088 are now called more times; update keys. */
1090 for (e = node->callees; e; e = e->next_callee)
1091 if (e->inline_failed && heap_node[e->callee->uid])
1092 fibheap_replace_key (heap, heap_node[e->callee->uid],
1093 cgraph_estimate_growth (e->callee));
1095 for (i = 0; i < ninlined_callees; i++)
1097 struct cgraph_edge *e;
1099 for (e = inlined_callees[i]->callees; e; e = e->next_callee)
1100 if (e->inline_failed && heap_node[e->callee->uid])
1101 fibheap_replace_key (heap, heap_node[e->callee->uid],
1102 cgraph_estimate_growth (e->callee));
1104 inlined_callees[i]->output = 0, node->aux = 0;
1106 if (cgraph_dump_file)
1107 fprintf (cgraph_dump_file,
1108 " Inlined %i times for a net change of %+i insns.\n",
1109 node->global.cloned_times, overall_insns - old_insns);
1111 while ((node = fibheap_extract_min (heap)) != NULL)
1112 if (!node->local.disregard_inline_limits)
1113 cgraph_set_inline_failed (node, N_("--param inline-unit-growth limit reached"));
1114 fibheap_delete (heap);
1118 /* Decide on the inlining. We do so in the topological order to avoid
1119 expenses on updating datastructures. */
1122 cgraph_decide_inlining (void)
1124 struct cgraph_node *node;
1126 struct cgraph_node **order =
1127 xcalloc (cgraph_n_nodes, sizeof (struct cgraph_node *));
1128 struct cgraph_node **inlined =
1129 xcalloc (cgraph_n_nodes, sizeof (struct cgraph_node *));
1130 struct cgraph_node **inlined_callees =
1131 xcalloc (cgraph_n_nodes, sizeof (struct cgraph_node *));
1133 int ninlined_callees;
1137 for (node = cgraph_nodes; node; node = node->next)
1138 initial_insns += node->local.self_insns;
1139 overall_insns = initial_insns;
1141 nnodes = cgraph_postorder (order);
1143 if (cgraph_dump_file)
1144 fprintf (cgraph_dump_file,
1145 "\nDeciding on inlining. Starting with %i insns.\n",
1148 for (node = cgraph_nodes; node; node = node->next)
1151 if (cgraph_dump_file)
1152 fprintf (cgraph_dump_file, "\nInlining always_inline functions:\n");
1154 /* In the first pass mark all always_inline edges. Do this with a priority
1155 so none of our later choices will make this impossible. */
1156 for (i = nnodes - 1; i >= 0; i--)
1158 struct cgraph_edge *e;
1162 for (e = node->callees; e; e = e->next_callee)
1163 if (e->callee->local.disregard_inline_limits)
1167 if (cgraph_dump_file)
1168 fprintf (cgraph_dump_file,
1169 "\nConsidering %s %i insns (always inline)\n",
1170 cgraph_node_name (e->callee), e->callee->global.insns);
1171 ninlined = cgraph_inlined_into (order[i], inlined);
1172 for (; e; e = e->next_callee)
1174 old_insns = overall_insns;
1175 if (!e->inline_failed || !e->callee->local.inlinable
1176 || !e->callee->local.disregard_inline_limits)
1178 if (e->callee->output || e->callee == node)
1180 e->inline_failed = N_("recursive inlining");
1184 cgraph_inlined_callees (e->callee, inlined_callees);
1185 cgraph_mark_inline (node, e->callee, inlined, ninlined,
1186 inlined_callees, ninlined_callees);
1187 for (y = 0; y < ninlined_callees; y++)
1188 inlined_callees[y]->output = 0, node->aux = 0;
1189 if (cgraph_dump_file)
1190 fprintf (cgraph_dump_file,
1191 " Inlined into %s which now has %i insns.\n",
1192 cgraph_node_name (node->callees->caller),
1193 node->callees->caller->global.insns);
1195 if (cgraph_dump_file && node->global.cloned_times > 0)
1196 fprintf (cgraph_dump_file,
1197 " Inlined %i times for a net change of %+i insns.\n",
1198 node->global.cloned_times, overall_insns - old_insns);
1199 for (y = 0; y < ninlined; y++)
1200 inlined[y]->output = 0, node->aux = 0;
1203 if (!flag_really_no_inline)
1205 cgraph_decide_inlining_of_small_functions (inlined, inlined_callees);
1207 if (cgraph_dump_file)
1208 fprintf (cgraph_dump_file, "\nDeciding on functions called once:\n");
1210 /* And finally decide what functions are called once. */
1212 for (i = nnodes - 1; i >= 0; i--)
1216 if (node->callers && !node->callers->next_caller && !node->needed
1217 && node->local.inlinable && node->callers->inline_failed
1218 && !DECL_EXTERNAL (node->decl) && !DECL_COMDAT (node->decl))
1221 struct cgraph_node *node1;
1223 /* Verify that we won't duplicate the caller. */
1224 for (node1 = node->callers->caller;
1225 node1->callers && !node1->callers->inline_failed
1226 && ok; node1 = node1->callers->caller)
1227 if (node1->callers->next_caller || node1->needed)
1231 const char *dummy_reason;
1232 if (cgraph_dump_file)
1233 fprintf (cgraph_dump_file,
1234 "\nConsidering %s %i insns.\n"
1235 " Called once from %s %i insns.\n",
1236 cgraph_node_name (node), node->global.insns,
1237 cgraph_node_name (node->callers->caller),
1238 node->callers->caller->global.insns);
1239 ninlined = cgraph_inlined_into (node->callers->caller,
1241 old_insns = overall_insns;
1243 /* Inlining functions once would never cause inlining warnings. */
1244 if (cgraph_check_inline_limits
1245 (node->callers->caller, node, inlined, ninlined,
1249 cgraph_inlined_callees (node, inlined_callees);
1250 cgraph_mark_inline (node->callers->caller, node, inlined,
1251 ninlined, inlined_callees,
1253 for (y = 0; y < ninlined_callees; y++)
1254 inlined_callees[y]->output = 0, node->aux = 0;
1255 if (cgraph_dump_file)
1256 fprintf (cgraph_dump_file,
1257 " Inlined into %s which now has %i insns"
1258 " for a net change of %+i insns.\n",
1259 cgraph_node_name (node->callers->caller),
1260 node->callers->caller->global.insns,
1261 overall_insns - old_insns);
1265 if (cgraph_dump_file)
1266 fprintf (cgraph_dump_file,
1267 " Inline limit reached, not inlined.\n");
1269 for (y = 0; y < ninlined; y++)
1270 inlined[y]->output = 0, node->aux = 0;
1276 if (cgraph_dump_file)
1277 fprintf (cgraph_dump_file,
1278 "\nInlined %i calls, eliminated %i functions, "
1279 "%i insns turned to %i insns.\n\n",
1280 ncalls_inlined, nfunctions_inlined, initial_insns,
1284 free (inlined_callees);
1287 /* Decide on the inlining. We do so in the topological order to avoid
1288 expenses on updating datastructures. */
1291 cgraph_decide_inlining_incrementally (struct cgraph_node *node)
1293 struct cgraph_edge *e;
1294 struct cgraph_node **inlined =
1295 xmalloc (sizeof (struct cgraph_node *) * cgraph_n_nodes);
1296 struct cgraph_node **inlined_callees =
1297 xmalloc (sizeof (struct cgraph_node *) * cgraph_n_nodes);
1299 int ninlined_callees;
1302 ninlined = cgraph_inlined_into (node, inlined);
1304 /* First of all look for always inline functions. */
1305 for (e = node->callees; e; e = e->next_callee)
1306 if (e->callee->local.disregard_inline_limits && e->inline_failed
1307 /* ??? It is possible that renaming variable removed the function body
1308 in duplicate_decls. See gcc.c-torture/compile/20011119-2.c */
1309 && DECL_SAVED_TREE (e->callee->decl))
1311 if (e->callee->output || e->callee == node)
1313 e->inline_failed = N_("recursive inlining");
1316 ninlined_callees = cgraph_inlined_callees (e->callee, inlined_callees);
1317 cgraph_mark_inline (node, e->callee, inlined, ninlined,
1318 inlined_callees, ninlined_callees);
1319 for (y = 0; y < ninlined_callees; y++)
1320 inlined_callees[y]->output = 0, node->aux = 0;
1323 if (!flag_really_no_inline)
1325 /* Now do the automatic inlining. */
1326 for (e = node->callees; e; e = e->next_callee)
1327 if (e->callee->local.inlinable && e->inline_failed
1328 && cgraph_default_inline_p (e->callee)
1329 && cgraph_check_inline_limits (node, e->callee, inlined,
1330 ninlined, &e->inline_failed)
1331 && DECL_SAVED_TREE (e->callee->decl))
1333 /* Marking recursive function inlinine has sane semantic and thus
1334 we should not warn on it. */
1335 if (e->callee->output || e->callee == node)
1337 e->inline_failed = "";
1340 ninlined_callees = cgraph_inlined_callees (e->callee,
1342 cgraph_mark_inline (node, e->callee, inlined, ninlined,
1343 inlined_callees, ninlined_callees);
1344 for (y = 0; y < ninlined_callees; y++)
1345 inlined_callees[y]->output = 0, node->aux = 0;
1349 /* Clear the flags set by cgraph_inlined_into. */
1350 for (y = 0; y < ninlined; y++)
1351 inlined[y]->output = 0, node->aux = 0;
1354 free (inlined_callees);
1358 /* Return true when CALLER_DECL should be inlined into CALLEE_DECL.
1359 When returned false and reason is non-NULL, set it to the reason
1360 why the call was not inlined. */
1363 cgraph_inline_p (tree caller_decl, tree callee_decl, const char **reason)
1365 struct cgraph_node *caller = cgraph_node (caller_decl);
1366 struct cgraph_node *callee = cgraph_node (callee_decl);
1367 struct cgraph_edge *e;
1369 for (e = caller->callees; e; e = e->next_callee)
1370 if (e->callee == callee)
1372 if (e->inline_failed && reason)
1373 *reason = e->inline_failed;
1374 return !e->inline_failed;
1376 /* We do not record builtins in the callgraph. Perhaps it would make more
1377 sense to do so and then prune out those not overwritten by explicit
1380 *reason = "originally indirect function calls never inlined";
1383 /* Expand all functions that must be output.
1385 Attempt to topologically sort the nodes so function is output when
1386 all called functions are already assembled to allow data to be
1387 propagated across the callgraph. Use a stack to get smaller distance
1388 between a function and it's callees (later we may choose to use a more
1389 sophisticated algorithm for function reordering; we will likely want
1390 to use subsections to make the output functions appear in top-down
1394 cgraph_expand_all_functions (void)
1396 struct cgraph_node *node;
1397 struct cgraph_node **order =
1398 xcalloc (cgraph_n_nodes, sizeof (struct cgraph_node *));
1402 cgraph_mark_functions_to_output ();
1404 order_pos = cgraph_postorder (order);
1406 for (i = order_pos - 1; i >= 0; i--)
1411 if (!node->reachable)
1414 cgraph_expand_function (node);
1420 /* Mark all local functions.
1422 A local function is one whose calls can occur only in the
1423 current compilation unit and all it's calls are explicit,
1424 so we can change its calling convention.
1425 We simply mark all static functions whose address is not taken
1429 cgraph_mark_local_functions (void)
1431 struct cgraph_node *node;
1433 if (cgraph_dump_file)
1434 fprintf (cgraph_dump_file, "\nMarking local functions:");
1436 /* Figure out functions we want to assemble. */
1437 for (node = cgraph_nodes; node; node = node->next)
1439 node->local.local = (!node->needed
1440 && DECL_SAVED_TREE (node->decl)
1441 && !TREE_PUBLIC (node->decl));
1442 if (cgraph_dump_file && node->local.local)
1443 fprintf (cgraph_dump_file, " %s", cgraph_node_name (node));
1445 if (cgraph_dump_file)
1446 fprintf (cgraph_dump_file, "\n\n");
1449 /* Perform simple optimizations based on callgraph. */
1452 cgraph_optimize (void)
1454 if (!flag_unit_at_a_time)
1456 timevar_push (TV_CGRAPHOPT);
1458 fprintf (stderr, "Performing intraprocedural optimizations\n");
1460 cgraph_mark_local_functions ();
1461 if (cgraph_dump_file)
1463 fprintf (cgraph_dump_file, "Marked ");
1464 dump_cgraph (cgraph_dump_file);
1467 cgraph_decide_inlining ();
1468 cgraph_global_info_ready = true;
1469 if (cgraph_dump_file)
1471 fprintf (cgraph_dump_file, "Optimized ");
1472 dump_cgraph (cgraph_dump_file);
1474 timevar_pop (TV_CGRAPHOPT);
1476 /* Output everything. */
1478 fprintf (stderr, "Assembling functions:\n");
1479 cgraph_expand_all_functions ();
1480 if (cgraph_dump_file)
1482 fprintf (cgraph_dump_file, "\nFinal ");
1483 dump_cgraph (cgraph_dump_file);