Add ability to set target options (ix86 only) and optimization options on a function...
[gcc.git] / gcc / ipa-inline.c
1 /* Inlining decision heuristics.
2 Copyright (C) 2003, 2004, 2007, 2008 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 3, 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 COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
20
21 /* Inlining decision heuristics
22
23 We separate inlining decisions from the inliner itself and store it
24 inside callgraph as so called inline plan. Refer to cgraph.c
25 documentation about particular representation of inline plans in the
26 callgraph.
27
28 There are three major parts of this file:
29
30 cgraph_mark_inline implementation
31
32 This function allows to mark given call inline and performs necessary
33 modifications of cgraph (production of the clones and updating overall
34 statistics)
35
36 inlining heuristics limits
37
38 These functions allow to check that particular inlining is allowed
39 by the limits specified by user (allowed function growth, overall unit
40 growth and so on).
41
42 inlining heuristics
43
44 This is implementation of IPA pass aiming to get as much of benefit
45 from inlining obeying the limits checked above.
46
47 The implementation of particular heuristics is separated from
48 the rest of code to make it easier to replace it with more complicated
49 implementation in the future. The rest of inlining code acts as a
50 library aimed to modify the callgraph and verify that the parameters
51 on code size growth fits.
52
53 To mark given call inline, use cgraph_mark_inline function, the
54 verification is performed by cgraph_default_inline_p and
55 cgraph_check_inline_limits.
56
57 The heuristics implements simple knapsack style algorithm ordering
58 all functions by their "profitability" (estimated by code size growth)
59 and inlining them in priority order.
60
61 cgraph_decide_inlining implements heuristics taking whole callgraph
62 into account, while cgraph_decide_inlining_incrementally considers
63 only one function at a time and is used in non-unit-at-a-time mode.
64
65 The inliner itself is split into several passes:
66
67 pass_inline_parameters
68
69 This pass computes local properties of functions that are used by inliner:
70 estimated function body size, whether function is inlinable at all and
71 stack frame consumption.
72
73 Before executing any of inliner passes, this local pass has to be applied
74 to each function in the callgraph (ie run as subpass of some earlier
75 IPA pass). The results are made out of date by any optimization applied
76 on the function body.
77
78 pass_early_inlining
79
80 Simple local inlining pass inlining callees into current function. This
81 pass makes no global whole compilation unit analysis and this when allowed
82 to do inlining expanding code size it might result in unbounded growth of
83 whole unit.
84
85 This is the main inlining pass in non-unit-at-a-time.
86
87 With unit-at-a-time the pass is run during conversion into SSA form.
88 Only functions already converted into SSA form are inlined, so the
89 conversion must happen in topological order on the callgraph (that is
90 maintained by pass manager). The functions after inlining are early
91 optimized so the early inliner sees unoptimized function itself, but
92 all considered callees are already optimized allowing it to unfold
93 abstraction penalty on C++ effectively and cheaply.
94
95 pass_ipa_early_inlining
96
97 With profiling, the early inlining is also necessary to reduce
98 instrumentation costs on program with high abstraction penalty (doing
99 many redundant calls). This can't happen in parallel with early
100 optimization and profile instrumentation, because we would end up
101 re-instrumenting already instrumented function bodies we brought in via
102 inlining.
103
104 To avoid this, this pass is executed as IPA pass before profiling. It is
105 simple wrapper to pass_early_inlining and ensures first inlining.
106
107 pass_ipa_inline
108
109 This is the main pass implementing simple greedy algorithm to do inlining
110 of small functions that results in overall growth of compilation unit and
111 inlining of functions called once. The pass compute just so called inline
112 plan (representation of inlining to be done in callgraph) and unlike early
113 inlining it is not performing the inlining itself.
114
115 pass_apply_inline
116
117 This pass performs actual inlining according to pass_ipa_inline on given
118 function. Possible the function body before inlining is saved when it is
119 needed for further inlining later.
120 */
121
122 #include "config.h"
123 #include "system.h"
124 #include "coretypes.h"
125 #include "tm.h"
126 #include "tree.h"
127 #include "tree-inline.h"
128 #include "langhooks.h"
129 #include "flags.h"
130 #include "cgraph.h"
131 #include "diagnostic.h"
132 #include "timevar.h"
133 #include "params.h"
134 #include "fibheap.h"
135 #include "intl.h"
136 #include "tree-pass.h"
137 #include "hashtab.h"
138 #include "coverage.h"
139 #include "ggc.h"
140 #include "tree-flow.h"
141 #include "rtl.h"
142
143 /* Mode incremental inliner operate on:
144
145 In ALWAYS_INLINE only functions marked
146 always_inline are inlined. This mode is used after detecting cycle during
147 flattening.
148
149 In SIZE mode, only functions that reduce function body size after inlining
150 are inlined, this is used during early inlining.
151
152 In SPEED mode, all small functions are inlined. This might result in
153 unbounded growth of compilation unit and is used only in non-unit-at-a-time
154 mode.
155
156 in ALL mode, everything is inlined. This is used during flattening. */
157 enum inlining_mode {
158 INLINE_NONE = 0,
159 INLINE_ALWAYS_INLINE,
160 INLINE_SIZE,
161 INLINE_SPEED,
162 INLINE_ALL
163 };
164 static bool
165 cgraph_decide_inlining_incrementally (struct cgraph_node *, enum inlining_mode,
166 int);
167
168
169 /* Statistics we collect about inlining algorithm. */
170 static int ncalls_inlined;
171 static int nfunctions_inlined;
172 static int overall_insns;
173 static gcov_type max_count;
174
175 static inline struct inline_summary *
176 inline_summary (struct cgraph_node *node)
177 {
178 return &node->local.inline_summary;
179 }
180
181 /* Estimate size of the function after inlining WHAT into TO. */
182
183 static int
184 cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to,
185 struct cgraph_node *what)
186 {
187 int size;
188 tree fndecl = what->decl, arg;
189 int call_insns = PARAM_VALUE (PARAM_INLINE_CALL_COST);
190
191 for (arg = DECL_ARGUMENTS (fndecl); arg; arg = TREE_CHAIN (arg))
192 call_insns += estimate_move_cost (TREE_TYPE (arg));
193 size = (what->global.insns - call_insns) * times + to->global.insns;
194 gcc_assert (size >= 0);
195 return size;
196 }
197
198 /* E is expected to be an edge being inlined. Clone destination node of
199 the edge and redirect it to the new clone.
200 DUPLICATE is used for bookkeeping on whether we are actually creating new
201 clones or re-using node originally representing out-of-line function call.
202 */
203 void
204 cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, bool update_original)
205 {
206 HOST_WIDE_INT peak;
207 if (duplicate)
208 {
209 /* We may eliminate the need for out-of-line copy to be output.
210 In that case just go ahead and re-use it. */
211 if (!e->callee->callers->next_caller
212 && !e->callee->needed
213 && !cgraph_new_nodes
214 && flag_unit_at_a_time)
215 {
216 gcc_assert (!e->callee->global.inlined_to);
217 if (DECL_SAVED_TREE (e->callee->decl))
218 overall_insns -= e->callee->global.insns, nfunctions_inlined++;
219 duplicate = false;
220 }
221 else
222 {
223 struct cgraph_node *n;
224 n = cgraph_clone_node (e->callee, e->count, e->frequency, e->loop_nest,
225 update_original);
226 cgraph_redirect_edge_callee (e, n);
227 }
228 }
229
230 if (e->caller->global.inlined_to)
231 e->callee->global.inlined_to = e->caller->global.inlined_to;
232 else
233 e->callee->global.inlined_to = e->caller;
234 e->callee->global.stack_frame_offset
235 = e->caller->global.stack_frame_offset
236 + inline_summary (e->caller)->estimated_self_stack_size;
237 peak = e->callee->global.stack_frame_offset
238 + inline_summary (e->callee)->estimated_self_stack_size;
239 if (e->callee->global.inlined_to->global.estimated_stack_size < peak)
240 e->callee->global.inlined_to->global.estimated_stack_size = peak;
241
242 /* Recursively clone all bodies. */
243 for (e = e->callee->callees; e; e = e->next_callee)
244 if (!e->inline_failed)
245 cgraph_clone_inlined_nodes (e, duplicate, update_original);
246 }
247
248 /* Mark edge E as inlined and update callgraph accordingly.
249 UPDATE_ORIGINAL specify whether profile of original function should be
250 updated. */
251
252 void
253 cgraph_mark_inline_edge (struct cgraph_edge *e, bool update_original)
254 {
255 int old_insns = 0, new_insns = 0;
256 struct cgraph_node *to = NULL, *what;
257
258 if (e->callee->inline_decl)
259 cgraph_redirect_edge_callee (e, cgraph_node (e->callee->inline_decl));
260
261 gcc_assert (e->inline_failed);
262 e->inline_failed = NULL;
263
264 if (!e->callee->global.inlined && flag_unit_at_a_time)
265 DECL_POSSIBLY_INLINED (e->callee->decl) = true;
266 e->callee->global.inlined = true;
267
268 cgraph_clone_inlined_nodes (e, true, update_original);
269
270 what = e->callee;
271
272 /* Now update size of caller and all functions caller is inlined into. */
273 for (;e && !e->inline_failed; e = e->caller->callers)
274 {
275 old_insns = e->caller->global.insns;
276 new_insns = cgraph_estimate_size_after_inlining (1, e->caller,
277 what);
278 gcc_assert (new_insns >= 0);
279 to = e->caller;
280 to->global.insns = new_insns;
281 }
282 gcc_assert (what->global.inlined_to == to);
283 if (new_insns > old_insns)
284 overall_insns += new_insns - old_insns;
285 ncalls_inlined++;
286 }
287
288 /* Mark all calls of EDGE->CALLEE inlined into EDGE->CALLER.
289 Return following unredirected edge in the list of callers
290 of EDGE->CALLEE */
291
292 static struct cgraph_edge *
293 cgraph_mark_inline (struct cgraph_edge *edge)
294 {
295 struct cgraph_node *to = edge->caller;
296 struct cgraph_node *what = edge->callee;
297 struct cgraph_edge *e, *next;
298
299 gcc_assert (!CALL_STMT_CANNOT_INLINE_P (edge->call_stmt));
300 /* Look for all calls, mark them inline and clone recursively
301 all inlined functions. */
302 for (e = what->callers; e; e = next)
303 {
304 next = e->next_caller;
305 if (e->caller == to && e->inline_failed)
306 {
307 cgraph_mark_inline_edge (e, true);
308 if (e == edge)
309 edge = next;
310 }
311 }
312
313 return edge;
314 }
315
316 /* Estimate the growth caused by inlining NODE into all callees. */
317
318 static int
319 cgraph_estimate_growth (struct cgraph_node *node)
320 {
321 int growth = 0;
322 struct cgraph_edge *e;
323 if (node->global.estimated_growth != INT_MIN)
324 return node->global.estimated_growth;
325
326 for (e = node->callers; e; e = e->next_caller)
327 if (e->inline_failed)
328 growth += (cgraph_estimate_size_after_inlining (1, e->caller, node)
329 - e->caller->global.insns);
330
331 /* ??? Wrong for self recursive functions or cases where we decide to not
332 inline for different reasons, but it is not big deal as in that case
333 we will keep the body around, but we will also avoid some inlining. */
334 if (!node->needed && !DECL_EXTERNAL (node->decl))
335 growth -= node->global.insns;
336
337 node->global.estimated_growth = growth;
338 return growth;
339 }
340
341 /* Return false when inlining WHAT into TO is not good idea
342 as it would cause too large growth of function bodies.
343 When ONE_ONLY is true, assume that only one call site is going
344 to be inlined, otherwise figure out how many call sites in
345 TO calls WHAT and verify that all can be inlined.
346 */
347
348 static bool
349 cgraph_check_inline_limits (struct cgraph_node *to, struct cgraph_node *what,
350 const char **reason, bool one_only)
351 {
352 int times = 0;
353 struct cgraph_edge *e;
354 int newsize;
355 int limit;
356 HOST_WIDE_INT stack_size_limit, inlined_stack;
357
358 if (one_only)
359 times = 1;
360 else
361 for (e = to->callees; e; e = e->next_callee)
362 if (e->callee == what)
363 times++;
364
365 if (to->global.inlined_to)
366 to = to->global.inlined_to;
367
368 /* When inlining large function body called once into small function,
369 take the inlined function as base for limiting the growth. */
370 if (inline_summary (to)->self_insns > inline_summary(what)->self_insns)
371 limit = inline_summary (to)->self_insns;
372 else
373 limit = inline_summary (what)->self_insns;
374
375 limit += limit * PARAM_VALUE (PARAM_LARGE_FUNCTION_GROWTH) / 100;
376
377 /* Check the size after inlining against the function limits. But allow
378 the function to shrink if it went over the limits by forced inlining. */
379 newsize = cgraph_estimate_size_after_inlining (times, to, what);
380 if (newsize >= to->global.insns
381 && newsize > PARAM_VALUE (PARAM_LARGE_FUNCTION_INSNS)
382 && newsize > limit)
383 {
384 if (reason)
385 *reason = N_("--param large-function-growth limit reached");
386 return false;
387 }
388
389 stack_size_limit = inline_summary (to)->estimated_self_stack_size;
390
391 stack_size_limit += stack_size_limit * PARAM_VALUE (PARAM_STACK_FRAME_GROWTH) / 100;
392
393 inlined_stack = (to->global.stack_frame_offset
394 + inline_summary (to)->estimated_self_stack_size
395 + what->global.estimated_stack_size);
396 if (inlined_stack > stack_size_limit
397 && inlined_stack > PARAM_VALUE (PARAM_LARGE_STACK_FRAME))
398 {
399 if (reason)
400 *reason = N_("--param large-stack-frame-growth limit reached");
401 return false;
402 }
403 return true;
404 }
405
406 /* Return true when function N is small enough to be inlined. */
407
408 bool
409 cgraph_default_inline_p (struct cgraph_node *n, const char **reason)
410 {
411 tree decl = n->decl;
412
413 if (n->inline_decl)
414 decl = n->inline_decl;
415 if (!flag_inline_small_functions && !DECL_DECLARED_INLINE_P (decl))
416 {
417 if (reason)
418 *reason = N_("function not inline candidate");
419 return false;
420 }
421
422 if (!DECL_STRUCT_FUNCTION (decl)->cfg)
423 {
424 if (reason)
425 *reason = N_("function body not available");
426 return false;
427 }
428
429 if (DECL_DECLARED_INLINE_P (decl))
430 {
431 if (n->global.insns >= MAX_INLINE_INSNS_SINGLE)
432 {
433 if (reason)
434 *reason = N_("--param max-inline-insns-single limit reached");
435 return false;
436 }
437 }
438 else
439 {
440 if (n->global.insns >= MAX_INLINE_INSNS_AUTO)
441 {
442 if (reason)
443 *reason = N_("--param max-inline-insns-auto limit reached");
444 return false;
445 }
446 }
447
448 return true;
449 }
450
451 /* Return true when inlining WHAT would create recursive inlining.
452 We call recursive inlining all cases where same function appears more than
453 once in the single recursion nest path in the inline graph. */
454
455 static bool
456 cgraph_recursive_inlining_p (struct cgraph_node *to,
457 struct cgraph_node *what,
458 const char **reason)
459 {
460 bool recursive;
461 if (to->global.inlined_to)
462 recursive = what->decl == to->global.inlined_to->decl;
463 else
464 recursive = what->decl == to->decl;
465 /* Marking recursive function inline has sane semantic and thus we should
466 not warn on it. */
467 if (recursive && reason)
468 *reason = (what->local.disregard_inline_limits
469 ? N_("recursive inlining") : "");
470 return recursive;
471 }
472
473 /* Return true if the call can be hot. */
474 static bool
475 cgraph_maybe_hot_edge_p (struct cgraph_edge *edge)
476 {
477 if (profile_info && flag_branch_probabilities
478 && (edge->count
479 <= profile_info->sum_max / PARAM_VALUE (HOT_BB_COUNT_FRACTION)))
480 return false;
481 if (lookup_attribute ("cold", DECL_ATTRIBUTES (edge->callee->decl))
482 || lookup_attribute ("cold", DECL_ATTRIBUTES (edge->caller->decl)))
483 return false;
484 if (lookup_attribute ("hot", DECL_ATTRIBUTES (edge->caller->decl)))
485 return true;
486 if (flag_guess_branch_prob
487 && edge->frequency < (CGRAPH_FREQ_MAX
488 / PARAM_VALUE (HOT_BB_FREQUENCY_FRACTION)))
489 return false;
490 return true;
491 }
492
493 /* A cost model driving the inlining heuristics in a way so the edges with
494 smallest badness are inlined first. After each inlining is performed
495 the costs of all caller edges of nodes affected are recomputed so the
496 metrics may accurately depend on values such as number of inlinable callers
497 of the function or function body size. */
498
499 static int
500 cgraph_edge_badness (struct cgraph_edge *edge)
501 {
502 int badness;
503 int growth =
504 cgraph_estimate_size_after_inlining (1, edge->caller, edge->callee);
505
506 growth -= edge->caller->global.insns;
507
508 /* Always prefer inlining saving code size. */
509 if (growth <= 0)
510 badness = INT_MIN - growth;
511
512 /* When profiling is available, base priorities -(#calls / growth).
513 So we optimize for overall number of "executed" inlined calls. */
514 else if (max_count)
515 badness = ((int)((double)edge->count * INT_MIN / max_count)) / growth;
516
517 /* When function local profile is available, base priorities on
518 growth / frequency, so we optimize for overall frequency of inlined
519 calls. This is not too accurate since while the call might be frequent
520 within function, the function itself is infrequent.
521
522 Other objective to optimize for is number of different calls inlined.
523 We add the estimated growth after inlining all functions to bias the
524 priorities slightly in this direction (so fewer times called functions
525 of the same size gets priority). */
526 else if (flag_guess_branch_prob)
527 {
528 int div = edge->frequency * 100 / CGRAPH_FREQ_BASE;
529 int growth =
530 cgraph_estimate_size_after_inlining (1, edge->caller, edge->callee);
531 growth -= edge->caller->global.insns;
532 badness = growth * 256;
533
534 /* Decrease badness if call is nested. */
535 /* Compress the range so we don't overflow. */
536 if (div > 256)
537 div = 256 + ceil_log2 (div) - 8;
538 if (div < 1)
539 div = 1;
540 if (badness > 0)
541 badness /= div;
542 badness += cgraph_estimate_growth (edge->callee);
543 }
544 /* When function local profile is not available or it does not give
545 useful information (ie frequency is zero), base the cost on
546 loop nest and overall size growth, so we optimize for overall number
547 of functions fully inlined in program. */
548 else
549 {
550 int nest = MIN (edge->loop_nest, 8);
551 badness = cgraph_estimate_growth (edge->callee) * 256;
552
553 /* Decrease badness if call is nested. */
554 if (badness > 0)
555 badness >>= nest;
556 else
557 {
558 badness <<= nest;
559 }
560 }
561 /* Make recursive inlining happen always after other inlining is done. */
562 if (cgraph_recursive_inlining_p (edge->caller, edge->callee, NULL))
563 return badness + 1;
564 else
565 return badness;
566 }
567
568 /* Recompute heap nodes for each of caller edge. */
569
570 static void
571 update_caller_keys (fibheap_t heap, struct cgraph_node *node,
572 bitmap updated_nodes)
573 {
574 struct cgraph_edge *edge;
575 const char *failed_reason;
576
577 if (!node->local.inlinable || node->local.disregard_inline_limits
578 || node->global.inlined_to)
579 return;
580 if (bitmap_bit_p (updated_nodes, node->uid))
581 return;
582 bitmap_set_bit (updated_nodes, node->uid);
583 node->global.estimated_growth = INT_MIN;
584
585 if (!node->local.inlinable)
586 return;
587 /* Prune out edges we won't inline into anymore. */
588 if (!cgraph_default_inline_p (node, &failed_reason))
589 {
590 for (edge = node->callers; edge; edge = edge->next_caller)
591 if (edge->aux)
592 {
593 fibheap_delete_node (heap, (fibnode_t) edge->aux);
594 edge->aux = NULL;
595 if (edge->inline_failed)
596 edge->inline_failed = failed_reason;
597 }
598 return;
599 }
600
601 for (edge = node->callers; edge; edge = edge->next_caller)
602 if (edge->inline_failed)
603 {
604 int badness = cgraph_edge_badness (edge);
605 if (edge->aux)
606 {
607 fibnode_t n = (fibnode_t) edge->aux;
608 gcc_assert (n->data == edge);
609 if (n->key == badness)
610 continue;
611
612 /* fibheap_replace_key only increase the keys. */
613 if (fibheap_replace_key (heap, n, badness))
614 continue;
615 fibheap_delete_node (heap, (fibnode_t) edge->aux);
616 }
617 edge->aux = fibheap_insert (heap, badness, edge);
618 }
619 }
620
621 /* Recompute heap nodes for each of caller edges of each of callees. */
622
623 static void
624 update_callee_keys (fibheap_t heap, struct cgraph_node *node,
625 bitmap updated_nodes)
626 {
627 struct cgraph_edge *e;
628 node->global.estimated_growth = INT_MIN;
629
630 for (e = node->callees; e; e = e->next_callee)
631 if (e->inline_failed)
632 update_caller_keys (heap, e->callee, updated_nodes);
633 else if (!e->inline_failed)
634 update_callee_keys (heap, e->callee, updated_nodes);
635 }
636
637 /* Enqueue all recursive calls from NODE into priority queue depending on
638 how likely we want to recursively inline the call. */
639
640 static void
641 lookup_recursive_calls (struct cgraph_node *node, struct cgraph_node *where,
642 fibheap_t heap)
643 {
644 static int priority;
645 struct cgraph_edge *e;
646 for (e = where->callees; e; e = e->next_callee)
647 if (e->callee == node)
648 {
649 /* When profile feedback is available, prioritize by expected number
650 of calls. Without profile feedback we maintain simple queue
651 to order candidates via recursive depths. */
652 fibheap_insert (heap,
653 !max_count ? priority++
654 : -(e->count / ((max_count + (1<<24) - 1) / (1<<24))),
655 e);
656 }
657 for (e = where->callees; e; e = e->next_callee)
658 if (!e->inline_failed)
659 lookup_recursive_calls (node, e->callee, heap);
660 }
661
662 /* Decide on recursive inlining: in the case function has recursive calls,
663 inline until body size reaches given argument. */
664
665 static bool
666 cgraph_decide_recursive_inlining (struct cgraph_node *node)
667 {
668 int limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE_AUTO);
669 int max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH_AUTO);
670 int probability = PARAM_VALUE (PARAM_MIN_INLINE_RECURSIVE_PROBABILITY);
671 fibheap_t heap;
672 struct cgraph_edge *e;
673 struct cgraph_node *master_clone, *next;
674 int depth = 0;
675 int n = 0;
676
677 if (optimize_size
678 || (!flag_inline_functions && !DECL_DECLARED_INLINE_P (node->decl)))
679 return false;
680
681 if (DECL_DECLARED_INLINE_P (node->decl))
682 {
683 limit = PARAM_VALUE (PARAM_MAX_INLINE_INSNS_RECURSIVE);
684 max_depth = PARAM_VALUE (PARAM_MAX_INLINE_RECURSIVE_DEPTH);
685 }
686
687 /* Make sure that function is small enough to be considered for inlining. */
688 if (!max_depth
689 || cgraph_estimate_size_after_inlining (1, node, node) >= limit)
690 return false;
691 heap = fibheap_new ();
692 lookup_recursive_calls (node, node, heap);
693 if (fibheap_empty (heap))
694 {
695 fibheap_delete (heap);
696 return false;
697 }
698
699 if (dump_file)
700 fprintf (dump_file,
701 " Performing recursive inlining on %s\n",
702 cgraph_node_name (node));
703
704 /* We need original clone to copy around. */
705 master_clone = cgraph_clone_node (node, node->count, CGRAPH_FREQ_BASE, 1, false);
706 master_clone->needed = true;
707 for (e = master_clone->callees; e; e = e->next_callee)
708 if (!e->inline_failed)
709 cgraph_clone_inlined_nodes (e, true, false);
710
711 /* Do the inlining and update list of recursive call during process. */
712 while (!fibheap_empty (heap)
713 && (cgraph_estimate_size_after_inlining (1, node, master_clone)
714 <= limit))
715 {
716 struct cgraph_edge *curr
717 = (struct cgraph_edge *) fibheap_extract_min (heap);
718 struct cgraph_node *cnode;
719
720 depth = 1;
721 for (cnode = curr->caller;
722 cnode->global.inlined_to; cnode = cnode->callers->caller)
723 if (node->decl == curr->callee->decl)
724 depth++;
725 if (depth > max_depth)
726 {
727 if (dump_file)
728 fprintf (dump_file,
729 " maximal depth reached\n");
730 continue;
731 }
732
733 if (max_count)
734 {
735 if (!cgraph_maybe_hot_edge_p (curr))
736 {
737 if (dump_file)
738 fprintf (dump_file, " Not inlining cold call\n");
739 continue;
740 }
741 if (curr->count * 100 / node->count < probability)
742 {
743 if (dump_file)
744 fprintf (dump_file,
745 " Probability of edge is too small\n");
746 continue;
747 }
748 }
749
750 if (dump_file)
751 {
752 fprintf (dump_file,
753 " Inlining call of depth %i", depth);
754 if (node->count)
755 {
756 fprintf (dump_file, " called approx. %.2f times per call",
757 (double)curr->count / node->count);
758 }
759 fprintf (dump_file, "\n");
760 }
761 cgraph_redirect_edge_callee (curr, master_clone);
762 cgraph_mark_inline_edge (curr, false);
763 lookup_recursive_calls (node, curr->callee, heap);
764 n++;
765 }
766 if (!fibheap_empty (heap) && dump_file)
767 fprintf (dump_file, " Recursive inlining growth limit met.\n");
768
769 fibheap_delete (heap);
770 if (dump_file)
771 fprintf (dump_file,
772 "\n Inlined %i times, body grown from %i to %i insns\n", n,
773 master_clone->global.insns, node->global.insns);
774
775 /* Remove master clone we used for inlining. We rely that clones inlined
776 into master clone gets queued just before master clone so we don't
777 need recursion. */
778 for (node = cgraph_nodes; node != master_clone;
779 node = next)
780 {
781 next = node->next;
782 if (node->global.inlined_to == master_clone)
783 cgraph_remove_node (node);
784 }
785 cgraph_remove_node (master_clone);
786 /* FIXME: Recursive inlining actually reduces number of calls of the
787 function. At this place we should probably walk the function and
788 inline clones and compensate the counts accordingly. This probably
789 doesn't matter much in practice. */
790 return n > 0;
791 }
792
793 /* Set inline_failed for all callers of given function to REASON. */
794
795 static void
796 cgraph_set_inline_failed (struct cgraph_node *node, const char *reason)
797 {
798 struct cgraph_edge *e;
799
800 if (dump_file)
801 fprintf (dump_file, "Inlining failed: %s\n", reason);
802 for (e = node->callers; e; e = e->next_caller)
803 if (e->inline_failed)
804 e->inline_failed = reason;
805 }
806
807 /* Given whole compilation unit estimate of INSNS, compute how large we can
808 allow the unit to grow. */
809 static int
810 compute_max_insns (int insns)
811 {
812 int max_insns = insns;
813 if (max_insns < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS))
814 max_insns = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS);
815
816 return ((HOST_WIDEST_INT) max_insns
817 * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100);
818 }
819
820 /* We use greedy algorithm for inlining of small functions:
821 All inline candidates are put into prioritized heap based on estimated
822 growth of the overall number of instructions and then update the estimates.
823
824 INLINED and INLINED_CALEES are just pointers to arrays large enough
825 to be passed to cgraph_inlined_into and cgraph_inlined_callees. */
826
827 static void
828 cgraph_decide_inlining_of_small_functions (void)
829 {
830 struct cgraph_node *node;
831 struct cgraph_edge *edge;
832 const char *failed_reason;
833 fibheap_t heap = fibheap_new ();
834 bitmap updated_nodes = BITMAP_ALLOC (NULL);
835 int min_insns, max_insns;
836
837 if (dump_file)
838 fprintf (dump_file, "\nDeciding on smaller functions:\n");
839
840 /* Put all inline candidates into the heap. */
841
842 for (node = cgraph_nodes; node; node = node->next)
843 {
844 if (!node->local.inlinable || !node->callers
845 || node->local.disregard_inline_limits)
846 continue;
847 if (dump_file)
848 fprintf (dump_file, "Considering inline candidate %s.\n", cgraph_node_name (node));
849
850 node->global.estimated_growth = INT_MIN;
851 if (!cgraph_default_inline_p (node, &failed_reason))
852 {
853 cgraph_set_inline_failed (node, failed_reason);
854 continue;
855 }
856
857 for (edge = node->callers; edge; edge = edge->next_caller)
858 if (edge->inline_failed)
859 {
860 gcc_assert (!edge->aux);
861 edge->aux = fibheap_insert (heap, cgraph_edge_badness (edge), edge);
862 }
863 }
864
865 max_insns = compute_max_insns (overall_insns);
866 min_insns = overall_insns;
867
868 while (overall_insns <= max_insns
869 && (edge = (struct cgraph_edge *) fibheap_extract_min (heap)))
870 {
871 int old_insns = overall_insns;
872 struct cgraph_node *where;
873 int growth =
874 cgraph_estimate_size_after_inlining (1, edge->caller, edge->callee);
875 const char *not_good = NULL;
876
877 growth -= edge->caller->global.insns;
878
879 if (dump_file)
880 {
881 fprintf (dump_file,
882 "\nConsidering %s with %i insns\n",
883 cgraph_node_name (edge->callee),
884 edge->callee->global.insns);
885 fprintf (dump_file,
886 " to be inlined into %s\n"
887 " Estimated growth after inlined into all callees is %+i insns.\n"
888 " Estimated badness is %i, frequency %.2f.\n",
889 cgraph_node_name (edge->caller),
890 cgraph_estimate_growth (edge->callee),
891 cgraph_edge_badness (edge),
892 edge->frequency / (double)CGRAPH_FREQ_BASE);
893 if (edge->count)
894 fprintf (dump_file," Called "HOST_WIDEST_INT_PRINT_DEC"x\n", edge->count);
895 }
896 gcc_assert (edge->aux);
897 edge->aux = NULL;
898 if (!edge->inline_failed)
899 continue;
900
901 /* When not having profile info ready we don't weight by any way the
902 position of call in procedure itself. This means if call of
903 function A from function B seems profitable to inline, the recursive
904 call of function A in inline copy of A in B will look profitable too
905 and we end up inlining until reaching maximal function growth. This
906 is not good idea so prohibit the recursive inlining.
907
908 ??? When the frequencies are taken into account we might not need this
909 restriction. */
910 if (!max_count)
911 {
912 where = edge->caller;
913 while (where->global.inlined_to)
914 {
915 if (where->decl == edge->callee->decl)
916 break;
917 where = where->callers->caller;
918 }
919 if (where->global.inlined_to)
920 {
921 edge->inline_failed
922 = (edge->callee->local.disregard_inline_limits ? N_("recursive inlining") : "");
923 if (dump_file)
924 fprintf (dump_file, " inline_failed:Recursive inlining performed only for function itself.\n");
925 continue;
926 }
927 }
928
929 if (!cgraph_maybe_hot_edge_p (edge))
930 not_good = N_("call is unlikely and code size would grow");
931 if (!flag_inline_functions
932 && !DECL_DECLARED_INLINE_P (edge->callee->decl))
933 not_good = N_("function not declared inline and code size would grow");
934 if (optimize_size)
935 not_good = N_("optimizing for size and code size would grow");
936 if (not_good && growth > 0 && cgraph_estimate_growth (edge->callee) > 0)
937 {
938 if (!cgraph_recursive_inlining_p (edge->caller, edge->callee,
939 &edge->inline_failed))
940 {
941 edge->inline_failed = not_good;
942 if (dump_file)
943 fprintf (dump_file, " inline_failed:%s.\n", edge->inline_failed);
944 }
945 continue;
946 }
947 if (!cgraph_default_inline_p (edge->callee, &edge->inline_failed))
948 {
949 if (!cgraph_recursive_inlining_p (edge->caller, edge->callee,
950 &edge->inline_failed))
951 {
952 if (dump_file)
953 fprintf (dump_file, " inline_failed:%s.\n", edge->inline_failed);
954 }
955 continue;
956 }
957 if (!tree_can_inline_p (edge->caller->decl, edge->callee->decl))
958 {
959 CALL_STMT_CANNOT_INLINE_P (edge->call_stmt) = true;
960 edge->inline_failed = N_("target specific option mismatch");
961 if (dump_file)
962 fprintf (dump_file, " inline_failed:%s.\n", edge->inline_failed);
963 continue;
964 }
965 if (cgraph_recursive_inlining_p (edge->caller, edge->callee,
966 &edge->inline_failed))
967 {
968 where = edge->caller;
969 if (where->global.inlined_to)
970 where = where->global.inlined_to;
971 if (!cgraph_decide_recursive_inlining (where))
972 continue;
973 update_callee_keys (heap, where, updated_nodes);
974 }
975 else
976 {
977 struct cgraph_node *callee;
978 if (CALL_STMT_CANNOT_INLINE_P (edge->call_stmt)
979 || !cgraph_check_inline_limits (edge->caller, edge->callee,
980 &edge->inline_failed, true))
981 {
982 if (dump_file)
983 fprintf (dump_file, " Not inlining into %s:%s.\n",
984 cgraph_node_name (edge->caller), edge->inline_failed);
985 continue;
986 }
987 callee = edge->callee;
988 cgraph_mark_inline_edge (edge, true);
989 update_callee_keys (heap, callee, updated_nodes);
990 }
991 where = edge->caller;
992 if (where->global.inlined_to)
993 where = where->global.inlined_to;
994
995 /* Our profitability metric can depend on local properties
996 such as number of inlinable calls and size of the function body.
997 After inlining these properties might change for the function we
998 inlined into (since it's body size changed) and for the functions
999 called by function we inlined (since number of it inlinable callers
1000 might change). */
1001 update_caller_keys (heap, where, updated_nodes);
1002 bitmap_clear (updated_nodes);
1003
1004 if (dump_file)
1005 {
1006 fprintf (dump_file,
1007 " Inlined into %s which now has %i insns,"
1008 "net change of %+i insns.\n",
1009 cgraph_node_name (edge->caller),
1010 edge->caller->global.insns,
1011 overall_insns - old_insns);
1012 }
1013 if (min_insns > overall_insns)
1014 {
1015 min_insns = overall_insns;
1016 max_insns = compute_max_insns (min_insns);
1017
1018 if (dump_file)
1019 fprintf (dump_file, "New minimal insns reached: %i\n", min_insns);
1020 }
1021 }
1022 while ((edge = (struct cgraph_edge *) fibheap_extract_min (heap)) != NULL)
1023 {
1024 gcc_assert (edge->aux);
1025 edge->aux = NULL;
1026 if (!edge->callee->local.disregard_inline_limits && edge->inline_failed
1027 && !cgraph_recursive_inlining_p (edge->caller, edge->callee,
1028 &edge->inline_failed))
1029 edge->inline_failed = N_("--param inline-unit-growth limit reached");
1030 }
1031 fibheap_delete (heap);
1032 BITMAP_FREE (updated_nodes);
1033 }
1034
1035 /* Decide on the inlining. We do so in the topological order to avoid
1036 expenses on updating data structures. */
1037
1038 static unsigned int
1039 cgraph_decide_inlining (void)
1040 {
1041 struct cgraph_node *node;
1042 int nnodes;
1043 struct cgraph_node **order =
1044 XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
1045 int old_insns = 0;
1046 int i;
1047 int initial_insns = 0;
1048
1049 max_count = 0;
1050 for (node = cgraph_nodes; node; node = node->next)
1051 if (node->analyzed && (node->needed || node->reachable))
1052 {
1053 struct cgraph_edge *e;
1054
1055 initial_insns += inline_summary (node)->self_insns;
1056 gcc_assert (inline_summary (node)->self_insns == node->global.insns);
1057 for (e = node->callees; e; e = e->next_callee)
1058 if (max_count < e->count)
1059 max_count = e->count;
1060 }
1061 overall_insns = initial_insns;
1062 gcc_assert (!max_count || (profile_info && flag_branch_probabilities));
1063
1064 nnodes = cgraph_postorder (order);
1065
1066 if (dump_file)
1067 fprintf (dump_file,
1068 "\nDeciding on inlining. Starting with %i insns.\n",
1069 initial_insns);
1070
1071 for (node = cgraph_nodes; node; node = node->next)
1072 node->aux = 0;
1073
1074 if (dump_file)
1075 fprintf (dump_file, "\nInlining always_inline functions:\n");
1076
1077 /* In the first pass mark all always_inline edges. Do this with a priority
1078 so none of our later choices will make this impossible. */
1079 for (i = nnodes - 1; i >= 0; i--)
1080 {
1081 struct cgraph_edge *e, *next;
1082
1083 node = order[i];
1084
1085 /* Handle nodes to be flattened, but don't update overall unit size. */
1086 if (lookup_attribute ("flatten", DECL_ATTRIBUTES (node->decl)) != NULL)
1087 {
1088 if (dump_file)
1089 fprintf (dump_file,
1090 "Flattening %s\n", cgraph_node_name (node));
1091 cgraph_decide_inlining_incrementally (node, INLINE_ALL, 0);
1092 }
1093
1094 if (!node->local.disregard_inline_limits)
1095 continue;
1096 if (dump_file)
1097 fprintf (dump_file,
1098 "\nConsidering %s %i insns (always inline)\n",
1099 cgraph_node_name (node), node->global.insns);
1100 old_insns = overall_insns;
1101 for (e = node->callers; e; e = next)
1102 {
1103 next = e->next_caller;
1104 if (!e->inline_failed || CALL_STMT_CANNOT_INLINE_P (e->call_stmt))
1105 continue;
1106 if (cgraph_recursive_inlining_p (e->caller, e->callee,
1107 &e->inline_failed))
1108 continue;
1109 if (!tree_can_inline_p (e->caller->decl, e->callee->decl))
1110 {
1111 CALL_STMT_CANNOT_INLINE_P (e->call_stmt) = true;
1112 continue;
1113 }
1114 cgraph_mark_inline_edge (e, true);
1115 if (dump_file)
1116 fprintf (dump_file,
1117 " Inlined into %s which now has %i insns.\n",
1118 cgraph_node_name (e->caller),
1119 e->caller->global.insns);
1120 }
1121 /* Inlining self recursive function might introduce new calls to
1122 themselves we didn't see in the loop above. Fill in the proper
1123 reason why inline failed. */
1124 for (e = node->callers; e; e = e->next_caller)
1125 if (e->inline_failed)
1126 e->inline_failed = N_("recursive inlining");
1127 if (dump_file)
1128 fprintf (dump_file,
1129 " Inlined for a net change of %+i insns.\n",
1130 overall_insns - old_insns);
1131 }
1132
1133 if (!flag_really_no_inline)
1134 cgraph_decide_inlining_of_small_functions ();
1135
1136 if (!flag_really_no_inline
1137 && flag_inline_functions_called_once)
1138 {
1139 if (dump_file)
1140 fprintf (dump_file, "\nDeciding on functions called once:\n");
1141
1142 /* And finally decide what functions are called once. */
1143
1144 for (i = nnodes - 1; i >= 0; i--)
1145 {
1146 node = order[i];
1147
1148 if (node->callers && !node->callers->next_caller && !node->needed
1149 && node->local.inlinable && node->callers->inline_failed
1150 && !CALL_STMT_CANNOT_INLINE_P (node->callers->call_stmt)
1151 && !DECL_EXTERNAL (node->decl) && !DECL_COMDAT (node->decl))
1152 {
1153 if (dump_file)
1154 {
1155 fprintf (dump_file,
1156 "\nConsidering %s %i insns.\n",
1157 cgraph_node_name (node), node->global.insns);
1158 fprintf (dump_file,
1159 " Called once from %s %i insns.\n",
1160 cgraph_node_name (node->callers->caller),
1161 node->callers->caller->global.insns);
1162 }
1163
1164 old_insns = overall_insns;
1165
1166 if (cgraph_check_inline_limits (node->callers->caller, node,
1167 NULL, false))
1168 {
1169 cgraph_mark_inline (node->callers);
1170 if (dump_file)
1171 fprintf (dump_file,
1172 " Inlined into %s which now has %i insns"
1173 " for a net change of %+i insns.\n",
1174 cgraph_node_name (node->callers->caller),
1175 node->callers->caller->global.insns,
1176 overall_insns - old_insns);
1177 }
1178 else
1179 {
1180 if (dump_file)
1181 fprintf (dump_file,
1182 " Inline limit reached, not inlined.\n");
1183 }
1184 }
1185 }
1186 }
1187
1188 if (dump_file)
1189 fprintf (dump_file,
1190 "\nInlined %i calls, eliminated %i functions, "
1191 "%i insns turned to %i insns.\n\n",
1192 ncalls_inlined, nfunctions_inlined, initial_insns,
1193 overall_insns);
1194 free (order);
1195 return 0;
1196 }
1197
1198 /* Try to inline edge E from incremental inliner. MODE specifies mode
1199 of inliner.
1200
1201 We are detecting cycles by storing mode of inliner into cgraph_node last
1202 time we visited it in the recursion. In general when mode is set, we have
1203 recursive inlining, but as an special case, we want to try harder inline
1204 ALWAYS_INLINE functions: consider callgraph a->b->c->b, with a being
1205 flatten, b being always inline. Flattening 'a' will collapse
1206 a->b->c before hitting cycle. To accommodate always inline, we however
1207 need to inline a->b->c->b.
1208
1209 So after hitting cycle first time, we switch into ALWAYS_INLINE mode and
1210 stop inlining only after hitting ALWAYS_INLINE in ALWAY_INLINE mode. */
1211 static bool
1212 try_inline (struct cgraph_edge *e, enum inlining_mode mode, int depth)
1213 {
1214 struct cgraph_node *callee = e->callee;
1215 enum inlining_mode callee_mode = (enum inlining_mode) (size_t) callee->aux;
1216 bool always_inline = e->callee->local.disregard_inline_limits;
1217
1218 /* We've hit cycle? */
1219 if (callee_mode)
1220 {
1221 /* It is first time we see it and we are not in ALWAY_INLINE only
1222 mode yet. and the function in question is always_inline. */
1223 if (always_inline && mode != INLINE_ALWAYS_INLINE)
1224 {
1225 if (dump_file)
1226 {
1227 indent_to (dump_file, depth);
1228 fprintf (dump_file,
1229 "Hit cycle in %s, switching to always inline only.\n",
1230 cgraph_node_name (callee));
1231 }
1232 mode = INLINE_ALWAYS_INLINE;
1233 }
1234 /* Otherwise it is time to give up. */
1235 else
1236 {
1237 if (dump_file)
1238 {
1239 indent_to (dump_file, depth);
1240 fprintf (dump_file,
1241 "Not inlining %s into %s to avoid cycle.\n",
1242 cgraph_node_name (callee),
1243 cgraph_node_name (e->caller));
1244 }
1245 e->inline_failed = (e->callee->local.disregard_inline_limits
1246 ? N_("recursive inlining") : "");
1247 return false;
1248 }
1249 }
1250
1251 callee->aux = (void *)(size_t) mode;
1252 if (dump_file)
1253 {
1254 indent_to (dump_file, depth);
1255 fprintf (dump_file, " Inlining %s into %s.\n",
1256 cgraph_node_name (e->callee),
1257 cgraph_node_name (e->caller));
1258 }
1259 if (e->inline_failed)
1260 cgraph_mark_inline (e);
1261
1262 /* In order to fully inline always_inline functions at -O0, we need to
1263 recurse here, since the inlined functions might not be processed by
1264 incremental inlining at all yet.
1265
1266 Also flattening needs to be done recursively. */
1267
1268 if (!flag_unit_at_a_time || mode == INLINE_ALL || always_inline)
1269 cgraph_decide_inlining_incrementally (e->callee, mode, depth + 1);
1270 callee->aux = (void *)(size_t) callee_mode;
1271 return true;
1272 }
1273
1274 /* Decide on the inlining. We do so in the topological order to avoid
1275 expenses on updating data structures.
1276 DEPTH is depth of recursion, used only for debug output. */
1277
1278 static bool
1279 cgraph_decide_inlining_incrementally (struct cgraph_node *node,
1280 enum inlining_mode mode,
1281 int depth)
1282 {
1283 struct cgraph_edge *e;
1284 bool inlined = false;
1285 const char *failed_reason;
1286 enum inlining_mode old_mode;
1287
1288 #ifdef ENABLE_CHECKING
1289 verify_cgraph_node (node);
1290 #endif
1291
1292 old_mode = (enum inlining_mode) (size_t)node->aux;
1293
1294 if (mode != INLINE_ALWAYS_INLINE
1295 && lookup_attribute ("flatten", DECL_ATTRIBUTES (node->decl)) != NULL)
1296 {
1297 if (dump_file)
1298 {
1299 indent_to (dump_file, depth);
1300 fprintf (dump_file, "Flattening %s\n", cgraph_node_name (node));
1301 }
1302 mode = INLINE_ALL;
1303 }
1304
1305 node->aux = (void *)(size_t) mode;
1306
1307 /* First of all look for always inline functions. */
1308 for (e = node->callees; e; e = e->next_callee)
1309 {
1310 if (!e->callee->local.disregard_inline_limits
1311 && (mode != INLINE_ALL || !e->callee->local.inlinable))
1312 continue;
1313 if (CALL_STMT_CANNOT_INLINE_P (e->call_stmt))
1314 continue;
1315 /* When the edge is already inlined, we just need to recurse into
1316 it in order to fully flatten the leaves. */
1317 if (!e->inline_failed && mode == INLINE_ALL)
1318 {
1319 inlined |= try_inline (e, mode, depth);
1320 continue;
1321 }
1322 if (dump_file)
1323 {
1324 indent_to (dump_file, depth);
1325 fprintf (dump_file,
1326 "Considering to always inline inline candidate %s.\n",
1327 cgraph_node_name (e->callee));
1328 }
1329 if (cgraph_recursive_inlining_p (node, e->callee, &e->inline_failed))
1330 {
1331 if (dump_file)
1332 {
1333 indent_to (dump_file, depth);
1334 fprintf (dump_file, "Not inlining: recursive call.\n");
1335 }
1336 continue;
1337 }
1338 if (!tree_can_inline_p (node->decl, e->callee->decl))
1339 {
1340 CALL_STMT_CANNOT_INLINE_P (e->call_stmt) = true;
1341 if (dump_file)
1342 {
1343 indent_to (dump_file, depth);
1344 fprintf (dump_file,
1345 "Not inlining: Target specific option mismatch.\n");
1346 }
1347 continue;
1348 }
1349 if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
1350 != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->callee->decl)))
1351 {
1352 if (dump_file)
1353 {
1354 indent_to (dump_file, depth);
1355 fprintf (dump_file, "Not inlining: SSA form does not match.\n");
1356 }
1357 continue;
1358 }
1359 if (!DECL_SAVED_TREE (e->callee->decl) && !e->callee->inline_decl)
1360 {
1361 if (dump_file)
1362 {
1363 indent_to (dump_file, depth);
1364 fprintf (dump_file,
1365 "Not inlining: Function body no longer available.\n");
1366 }
1367 continue;
1368 }
1369 inlined |= try_inline (e, mode, depth);
1370 }
1371
1372 /* Now do the automatic inlining. */
1373 if (!flag_really_no_inline && mode != INLINE_ALL
1374 && mode != INLINE_ALWAYS_INLINE)
1375 for (e = node->callees; e; e = e->next_callee)
1376 {
1377 if (!e->callee->local.inlinable
1378 || !e->inline_failed
1379 || e->callee->local.disregard_inline_limits)
1380 continue;
1381 if (dump_file)
1382 fprintf (dump_file, "Considering inline candidate %s.\n",
1383 cgraph_node_name (e->callee));
1384 if (cgraph_recursive_inlining_p (node, e->callee, &e->inline_failed))
1385 {
1386 if (dump_file)
1387 {
1388 indent_to (dump_file, depth);
1389 fprintf (dump_file, "Not inlining: recursive call.\n");
1390 }
1391 continue;
1392 }
1393 if (gimple_in_ssa_p (DECL_STRUCT_FUNCTION (node->decl))
1394 != gimple_in_ssa_p (DECL_STRUCT_FUNCTION (e->callee->decl)))
1395 {
1396 if (dump_file)
1397 {
1398 indent_to (dump_file, depth);
1399 fprintf (dump_file, "Not inlining: SSA form does not match.\n");
1400 }
1401 continue;
1402 }
1403 /* When the function body would grow and inlining the function won't
1404 eliminate the need for offline copy of the function, don't inline.
1405 */
1406 if ((mode == INLINE_SIZE
1407 || (!flag_inline_functions
1408 && !DECL_DECLARED_INLINE_P (e->callee->decl)))
1409 && (cgraph_estimate_size_after_inlining (1, e->caller, e->callee)
1410 > e->caller->global.insns)
1411 && cgraph_estimate_growth (e->callee) > 0)
1412 {
1413 if (dump_file)
1414 {
1415 indent_to (dump_file, depth);
1416 fprintf (dump_file,
1417 "Not inlining: code size would grow by %i insns.\n",
1418 cgraph_estimate_size_after_inlining (1, e->caller,
1419 e->callee)
1420 - e->caller->global.insns);
1421 }
1422 continue;
1423 }
1424 if (!cgraph_check_inline_limits (node, e->callee, &e->inline_failed,
1425 false)
1426 || CALL_STMT_CANNOT_INLINE_P (e->call_stmt))
1427 {
1428 if (dump_file)
1429 {
1430 indent_to (dump_file, depth);
1431 fprintf (dump_file, "Not inlining: %s.\n", e->inline_failed);
1432 }
1433 continue;
1434 }
1435 if (!DECL_SAVED_TREE (e->callee->decl) && !e->callee->inline_decl)
1436 {
1437 if (dump_file)
1438 {
1439 indent_to (dump_file, depth);
1440 fprintf (dump_file,
1441 "Not inlining: Function body no longer available.\n");
1442 }
1443 continue;
1444 }
1445 if (!tree_can_inline_p (node->decl, e->callee->decl))
1446 {
1447 CALL_STMT_CANNOT_INLINE_P (e->call_stmt) = true;
1448 if (dump_file)
1449 {
1450 indent_to (dump_file, depth);
1451 fprintf (dump_file,
1452 "Not inlining: Target specific option mismatch.\n");
1453 }
1454 continue;
1455 }
1456 if (cgraph_default_inline_p (e->callee, &failed_reason))
1457 inlined |= try_inline (e, mode, depth);
1458 else if (!flag_unit_at_a_time)
1459 e->inline_failed = failed_reason;
1460 }
1461 node->aux = (void *)(size_t) old_mode;
1462 return inlined;
1463 }
1464
1465 /* When inlining shall be performed. */
1466 static bool
1467 cgraph_gate_inlining (void)
1468 {
1469 return flag_inline_trees;
1470 }
1471
1472 /* Because inlining might remove no-longer reachable nodes, we need to
1473 keep the array visible to garbage collector to avoid reading collected
1474 out nodes. */
1475 static int nnodes;
1476 static GTY ((length ("nnodes"))) struct cgraph_node **order;
1477
1478 /* Do inlining of small functions. Doing so early helps profiling and other
1479 passes to be somewhat more effective and avoids some code duplication in
1480 later real inlining pass for testcases with very many function calls. */
1481 static unsigned int
1482 cgraph_early_inlining (void)
1483 {
1484 struct cgraph_node *node = cgraph_node (current_function_decl);
1485 unsigned int todo = 0;
1486
1487 if (sorrycount || errorcount)
1488 return 0;
1489 if (cgraph_decide_inlining_incrementally (node,
1490 flag_unit_at_a_time || optimize_size
1491 ? INLINE_SIZE : INLINE_SPEED, 0))
1492 {
1493 timevar_push (TV_INTEGRATION);
1494 todo = optimize_inline_calls (current_function_decl);
1495 timevar_pop (TV_INTEGRATION);
1496 }
1497 return todo;
1498 }
1499
1500 /* When inlining shall be performed. */
1501 static bool
1502 cgraph_gate_early_inlining (void)
1503 {
1504 return flag_inline_trees && flag_early_inlining;
1505 }
1506
1507 struct gimple_opt_pass pass_early_inline =
1508 {
1509 {
1510 GIMPLE_PASS,
1511 "einline", /* name */
1512 cgraph_gate_early_inlining, /* gate */
1513 cgraph_early_inlining, /* execute */
1514 NULL, /* sub */
1515 NULL, /* next */
1516 0, /* static_pass_number */
1517 TV_INLINE_HEURISTICS, /* tv_id */
1518 0, /* properties_required */
1519 PROP_cfg, /* properties_provided */
1520 0, /* properties_destroyed */
1521 0, /* todo_flags_start */
1522 TODO_dump_func /* todo_flags_finish */
1523 }
1524 };
1525
1526 /* When inlining shall be performed. */
1527 static bool
1528 cgraph_gate_ipa_early_inlining (void)
1529 {
1530 return (flag_inline_trees && flag_early_inlining
1531 && (flag_branch_probabilities || flag_test_coverage
1532 || profile_arc_flag));
1533 }
1534
1535 /* IPA pass wrapper for early inlining pass. We need to run early inlining
1536 before tree profiling so we have stand alone IPA pass for doing so. */
1537 struct simple_ipa_opt_pass pass_ipa_early_inline =
1538 {
1539 {
1540 SIMPLE_IPA_PASS,
1541 "einline_ipa", /* name */
1542 cgraph_gate_ipa_early_inlining, /* gate */
1543 NULL, /* execute */
1544 NULL, /* sub */
1545 NULL, /* next */
1546 0, /* static_pass_number */
1547 TV_INLINE_HEURISTICS, /* tv_id */
1548 0, /* properties_required */
1549 PROP_cfg, /* properties_provided */
1550 0, /* properties_destroyed */
1551 0, /* todo_flags_start */
1552 TODO_dump_cgraph /* todo_flags_finish */
1553 }
1554 };
1555
1556 /* Compute parameters of functions used by inliner. */
1557 unsigned int
1558 compute_inline_parameters (struct cgraph_node *node)
1559 {
1560 gcc_assert (!node->global.inlined_to);
1561 inline_summary (node)->estimated_self_stack_size
1562 = estimated_stack_frame_size ();
1563 node->global.estimated_stack_size
1564 = inline_summary (node)->estimated_self_stack_size;
1565 node->global.stack_frame_offset = 0;
1566 node->local.inlinable = tree_inlinable_function_p (current_function_decl);
1567 inline_summary (node)->self_insns = estimate_num_insns (current_function_decl,
1568 &eni_inlining_weights);
1569 if (node->local.inlinable && !node->local.disregard_inline_limits)
1570 node->local.disregard_inline_limits
1571 = DECL_DISREGARD_INLINE_LIMITS (current_function_decl);
1572 if (flag_really_no_inline && !node->local.disregard_inline_limits)
1573 node->local.inlinable = 0;
1574 /* Inlining characteristics are maintained by the cgraph_mark_inline. */
1575 node->global.insns = inline_summary (node)->self_insns;
1576 return 0;
1577 }
1578
1579
1580 /* Compute parameters of functions used by inliner using
1581 current_function_decl. */
1582 static unsigned int
1583 compute_inline_parameters_for_current (void)
1584 {
1585 compute_inline_parameters (cgraph_node (current_function_decl));
1586 return 0;
1587 }
1588
1589 /* When inlining shall be performed. */
1590 static bool
1591 gate_inline_passes (void)
1592 {
1593 return flag_inline_trees;
1594 }
1595
1596 struct gimple_opt_pass pass_inline_parameters =
1597 {
1598 {
1599 GIMPLE_PASS,
1600 NULL, /* name */
1601 gate_inline_passes, /* gate */
1602 compute_inline_parameters_for_current,/* execute */
1603 NULL, /* sub */
1604 NULL, /* next */
1605 0, /* static_pass_number */
1606 TV_INLINE_HEURISTICS, /* tv_id */
1607 0, /* properties_required */
1608 PROP_cfg, /* properties_provided */
1609 0, /* properties_destroyed */
1610 0, /* todo_flags_start */
1611 0 /* todo_flags_finish */
1612 }
1613 };
1614
1615 /* Note function body size. */
1616 static void
1617 inline_generate_summary (void)
1618 {
1619 struct cgraph_node **order =
1620 XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
1621 int nnodes = cgraph_postorder (order);
1622 int i;
1623
1624 for (i = nnodes - 1; i >= 0; i--)
1625 {
1626 struct cgraph_node *node = order[i];
1627
1628 /* Allow possibly removed nodes to be garbage collected. */
1629 order[i] = NULL;
1630 if (node->analyzed && (node->needed || node->reachable))
1631 {
1632 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1633 current_function_decl = node->decl;
1634 compute_inline_parameters (node);
1635 pop_cfun ();
1636 }
1637 }
1638
1639 current_function_decl = NULL;
1640 free (order);
1641 return;
1642 }
1643
1644 /* Apply inline plan to function. */
1645 static unsigned int
1646 inline_transform (struct cgraph_node *node)
1647 {
1648 unsigned int todo = 0;
1649 struct cgraph_edge *e;
1650
1651 /* We might need the body of this function so that we can expand
1652 it inline somewhere else. */
1653 if (cgraph_preserve_function_body_p (current_function_decl))
1654 save_inline_function_body (node);
1655
1656 for (e = node->callees; e; e = e->next_callee)
1657 if (!e->inline_failed || warn_inline)
1658 break;
1659 if (e)
1660 {
1661 timevar_push (TV_INTEGRATION);
1662 todo = optimize_inline_calls (current_function_decl);
1663 timevar_pop (TV_INTEGRATION);
1664 }
1665 return todo | execute_fixup_cfg ();
1666 }
1667
1668 struct ipa_opt_pass pass_ipa_inline =
1669 {
1670 {
1671 IPA_PASS,
1672 "inline", /* name */
1673 cgraph_gate_inlining, /* gate */
1674 cgraph_decide_inlining, /* execute */
1675 NULL, /* sub */
1676 NULL, /* next */
1677 0, /* static_pass_number */
1678 TV_INLINE_HEURISTICS, /* tv_id */
1679 0, /* properties_required */
1680 PROP_cfg, /* properties_provided */
1681 0, /* properties_destroyed */
1682 TODO_remove_functions, /* todo_flags_finish */
1683 TODO_dump_cgraph | TODO_dump_func
1684 | TODO_remove_functions /* todo_flags_finish */
1685 },
1686 inline_generate_summary, /* generate_summary */
1687 NULL, /* write_summary */
1688 NULL, /* read_summary */
1689 NULL, /* function_read_summary */
1690 0, /* TODOs */
1691 inline_transform, /* function_transform */
1692 NULL, /* variable_transform */
1693 };
1694
1695
1696 /* When inlining shall be performed. */
1697 static bool
1698 cgraph_gate_O0_always_inline (void)
1699 {
1700 return !flag_unit_at_a_time || !flag_inline_trees;
1701 }
1702
1703 static unsigned int
1704 cgraph_O0_always_inline (void)
1705 {
1706 struct cgraph_node *node = cgraph_node (current_function_decl);
1707 unsigned int todo = 0;
1708 bool inlined;
1709
1710 if (sorrycount || errorcount)
1711 return 0;
1712 inlined = cgraph_decide_inlining_incrementally (node, INLINE_SPEED, 0);
1713 /* We might need the body of this function so that we can expand
1714 it inline somewhere else. */
1715 if (cgraph_preserve_function_body_p (current_function_decl))
1716 save_inline_function_body (node);
1717 if (inlined || warn_inline)
1718 {
1719 timevar_push (TV_INTEGRATION);
1720 todo = optimize_inline_calls (current_function_decl);
1721 timevar_pop (TV_INTEGRATION);
1722 }
1723 /* In non-unit-at-a-time we must mark all referenced functions as needed. */
1724 if (!flag_unit_at_a_time)
1725 {
1726 struct cgraph_edge *e;
1727 for (e = node->callees; e; e = e->next_callee)
1728 if (e->callee->analyzed)
1729 cgraph_mark_needed_node (e->callee);
1730 }
1731 return todo | execute_fixup_cfg ();
1732 }
1733
1734 struct gimple_opt_pass pass_O0_always_inline =
1735 {
1736 {
1737 GIMPLE_PASS,
1738 "always_inline", /* name */
1739 cgraph_gate_O0_always_inline, /* gate */
1740 cgraph_O0_always_inline, /* execute */
1741 NULL, /* sub */
1742 NULL, /* next */
1743 0, /* static_pass_number */
1744 TV_INLINE_HEURISTICS, /* tv_id */
1745 0, /* properties_required */
1746 PROP_cfg, /* properties_provided */
1747 0, /* properties_destroyed */
1748 0, /* todo_flags_start */
1749 TODO_dump_func | TODO_verify_flow
1750 | TODO_verify_stmts /* todo_flags_finish */
1751 }
1752 };
1753
1754 #include "gt-ipa-inline.h"