inline-1.c: new testcase.
[gcc.git] / gcc / ipa-inline-analysis.c
1 /* Inlining decision heuristics.
2 Copyright (C) 2003, 2004, 2007, 2008, 2009, 2010, 2011
3 Free Software Foundation, Inc.
4 Contributed by Jan Hubicka
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 /* Analysis used by the inliner and other passes limiting code size growth.
23
24 We estimate for each function
25 - function body size
26 - average function execution time
27 - inlining size benefit (that is how much of function body size
28 and its call sequence is expected to disappear by inlining)
29 - inlining time benefit
30 - function frame size
31 For each call
32 - call statement size and time
33
34 inlinie_summary datastructures store above information locally (i.e.
35 parameters of the function itself) and globally (i.e. parameters of
36 the function created by applying all the inline decisions already
37 present in the callgraph).
38
39 We provide accestor to the inline_summary datastructure and
40 basic logic updating the parameters when inlining is performed.
41
42 The summaries are context sensitive. Context means
43 1) partial assignment of known constant values of operands
44 2) whether function is inlined into the call or not.
45 It is easy to add more variants. To represent function size and time
46 that depends on context (i.e. it is known to be optimized away when
47 context is known either by inlining or from IP-CP and clonning),
48 we use predicates. Predicates are logical formulas in
49 conjunctive-disjunctive form consisting of clauses. Clauses are bitmaps
50 specifying what conditions must be true. Conditions are simple test
51 of the form described above.
52
53 In order to make predicate (possibly) true, all of its clauses must
54 be (possibly) true. To make clause (possibly) true, one of conditions
55 it mentions must be (possibly) true. There are fixed bounds on
56 number of clauses and conditions and all the manipulation functions
57 are conservative in positive direction. I.e. we may lose precision
58 by thinking that predicate may be true even when it is not.
59
60 estimate_edge_size and estimate_edge_growth can be used to query
61 function size/time in the given context. inline_merge_summary merges
62 properties of caller and callee after inlining.
63
64 Finally pass_inline_parameters is exported. This is used to drive
65 computation of function parameters used by the early inliner. IPA
66 inlined performs analysis via its analyze_function method. */
67
68 #include "config.h"
69 #include "system.h"
70 #include "coretypes.h"
71 #include "tm.h"
72 #include "tree.h"
73 #include "tree-inline.h"
74 #include "langhooks.h"
75 #include "flags.h"
76 #include "cgraph.h"
77 #include "diagnostic.h"
78 #include "gimple-pretty-print.h"
79 #include "timevar.h"
80 #include "params.h"
81 #include "tree-pass.h"
82 #include "coverage.h"
83 #include "ggc.h"
84 #include "tree-flow.h"
85 #include "ipa-prop.h"
86 #include "lto-streamer.h"
87 #include "data-streamer.h"
88 #include "tree-streamer.h"
89 #include "ipa-inline.h"
90 #include "alloc-pool.h"
91
92 /* Estimate runtime of function can easilly run into huge numbers with many
93 nested loops. Be sure we can compute time * INLINE_SIZE_SCALE in integer.
94 For anything larger we use gcov_type. */
95 #define MAX_TIME 1000000
96
97 /* Number of bits in integer, but we really want to be stable across different
98 hosts. */
99 #define NUM_CONDITIONS 32
100
101 enum predicate_conditions
102 {
103 predicate_false_condition = 0,
104 predicate_not_inlined_condition = 1,
105 predicate_first_dynamic_condition = 2
106 };
107
108 /* Special condition code we use to represent test that operand is compile time
109 constant. */
110 #define IS_NOT_CONSTANT ERROR_MARK
111 /* Special condition code we use to represent test that operand is not changed
112 across invocation of the function. When operand IS_NOT_CONSTANT it is always
113 CHANGED, however i.e. loop invariants can be NOT_CHANGED given percentage
114 of executions even when they are not compile time constants. */
115 #define CHANGED IDENTIFIER_NODE
116
117 /* Holders of ipa cgraph hooks: */
118 static struct cgraph_node_hook_list *function_insertion_hook_holder;
119 static struct cgraph_node_hook_list *node_removal_hook_holder;
120 static struct cgraph_2node_hook_list *node_duplication_hook_holder;
121 static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
122 static struct cgraph_edge_hook_list *edge_removal_hook_holder;
123 static void inline_node_removal_hook (struct cgraph_node *, void *);
124 static void inline_node_duplication_hook (struct cgraph_node *,
125 struct cgraph_node *, void *);
126 static void inline_edge_removal_hook (struct cgraph_edge *, void *);
127 static void inline_edge_duplication_hook (struct cgraph_edge *,
128 struct cgraph_edge *,
129 void *);
130
131 /* VECtor holding inline summaries.
132 In GGC memory because conditions might point to constant trees. */
133 VEC(inline_summary_t,gc) *inline_summary_vec;
134 VEC(inline_edge_summary_t,heap) *inline_edge_summary_vec;
135
136 /* Cached node/edge growths. */
137 VEC(int,heap) *node_growth_cache;
138 VEC(edge_growth_cache_entry,heap) *edge_growth_cache;
139
140 /* Edge predicates goes here. */
141 static alloc_pool edge_predicate_pool;
142
143 /* Return true predicate (tautology).
144 We represent it by empty list of clauses. */
145
146 static inline struct predicate
147 true_predicate (void)
148 {
149 struct predicate p;
150 p.clause[0]=0;
151 return p;
152 }
153
154
155 /* Return predicate testing single condition number COND. */
156
157 static inline struct predicate
158 single_cond_predicate (int cond)
159 {
160 struct predicate p;
161 p.clause[0]=1 << cond;
162 p.clause[1]=0;
163 return p;
164 }
165
166
167 /* Return false predicate. First clause require false condition. */
168
169 static inline struct predicate
170 false_predicate (void)
171 {
172 return single_cond_predicate (predicate_false_condition);
173 }
174
175
176 /* Return true if P is (false). */
177
178 static inline bool
179 true_predicate_p (struct predicate *p)
180 {
181 return !p->clause[0];
182 }
183
184
185 /* Return true if P is (false). */
186
187 static inline bool
188 false_predicate_p (struct predicate *p)
189 {
190 if (p->clause[0] == (1 << predicate_false_condition))
191 {
192 gcc_checking_assert (!p->clause[1]
193 && p->clause[0] == 1 << predicate_false_condition);
194 return true;
195 }
196 return false;
197 }
198
199
200 /* Return predicate that is set true when function is not inlined. */
201 static inline struct predicate
202 not_inlined_predicate (void)
203 {
204 return single_cond_predicate (predicate_not_inlined_condition);
205 }
206
207
208 /* Add condition to condition list CONDS. */
209
210 static struct predicate
211 add_condition (struct inline_summary *summary, int operand_num,
212 enum tree_code code, tree val)
213 {
214 int i;
215 struct condition *c;
216 struct condition new_cond;
217
218 for (i = 0; VEC_iterate (condition, summary->conds, i, c); i++)
219 {
220 if (c->operand_num == operand_num
221 && c->code == code
222 && c->val == val)
223 return single_cond_predicate (i + predicate_first_dynamic_condition);
224 }
225 /* Too many conditions. Give up and return constant true. */
226 if (i == NUM_CONDITIONS - predicate_first_dynamic_condition)
227 return true_predicate ();
228
229 new_cond.operand_num = operand_num;
230 new_cond.code = code;
231 new_cond.val = val;
232 VEC_safe_push (condition, gc, summary->conds, &new_cond);
233 return single_cond_predicate (i + predicate_first_dynamic_condition);
234 }
235
236
237 /* Add clause CLAUSE into the predicate P. */
238
239 static inline void
240 add_clause (conditions conditions, struct predicate *p, clause_t clause)
241 {
242 int i;
243 int i2;
244 int insert_here = -1;
245 int c1, c2;
246
247 /* True clause. */
248 if (!clause)
249 return;
250
251 /* False clause makes the whole predicate false. Kill the other variants. */
252 if (clause == (1 << predicate_false_condition))
253 {
254 p->clause[0] = (1 << predicate_false_condition);
255 p->clause[1] = 0;
256 return;
257 }
258 if (false_predicate_p (p))
259 return;
260
261 /* No one should be sily enough to add false into nontrivial clauses. */
262 gcc_checking_assert (!(clause & (1 << predicate_false_condition)));
263
264 /* Look where to insert the clause. At the same time prune out
265 clauses of P that are implied by the new clause and thus
266 redundant. */
267 for (i = 0, i2 = 0; i <= MAX_CLAUSES; i++)
268 {
269 p->clause[i2] = p->clause[i];
270
271 if (!p->clause[i])
272 break;
273
274 /* If p->clause[i] implies clause, there is nothing to add. */
275 if ((p->clause[i] & clause) == p->clause[i])
276 {
277 /* We had nothing to add, none of clauses should've become
278 redundant. */
279 gcc_checking_assert (i == i2);
280 return;
281 }
282
283 if (p->clause[i] < clause && insert_here < 0)
284 insert_here = i2;
285
286 /* If clause implies p->clause[i], then p->clause[i] becomes redundant.
287 Otherwise the p->clause[i] has to stay. */
288 if ((p->clause[i] & clause) != clause)
289 i2++;
290 }
291
292 /* Look for clauses that are obviously true. I.e.
293 op0 == 5 || op0 != 5. */
294 for (c1 = predicate_first_dynamic_condition; c1 < NUM_CONDITIONS; c1++)
295 {
296 condition *cc1;
297 if (!(clause & (1 << c1)))
298 continue;
299 cc1 = VEC_index (condition,
300 conditions,
301 c1 - predicate_first_dynamic_condition);
302 /* We have no way to represent !CHANGED and !IS_NOT_CONSTANT
303 and thus there is no point for looking for them. */
304 if (cc1->code == CHANGED
305 || cc1->code == IS_NOT_CONSTANT)
306 continue;
307 for (c2 = c1 + 1; c2 <= NUM_CONDITIONS; c2++)
308 if (clause & (1 << c2))
309 {
310 condition *cc1 = VEC_index (condition,
311 conditions,
312 c1 - predicate_first_dynamic_condition);
313 condition *cc2 = VEC_index (condition,
314 conditions,
315 c2 - predicate_first_dynamic_condition);
316 if (cc1->operand_num == cc2->operand_num
317 && cc1->val == cc2->val
318 && cc2->code != IS_NOT_CONSTANT
319 && cc2->code != CHANGED
320 && cc1->code == invert_tree_comparison
321 (cc2->code,
322 HONOR_NANS (TYPE_MODE (TREE_TYPE (cc1->val)))))
323 return;
324 }
325 }
326
327
328 /* We run out of variants. Be conservative in positive direction. */
329 if (i2 == MAX_CLAUSES)
330 return;
331 /* Keep clauses in decreasing order. This makes equivalence testing easy. */
332 p->clause[i2 + 1] = 0;
333 if (insert_here >= 0)
334 for (;i2 > insert_here; i2--)
335 p->clause[i2] = p->clause[i2 - 1];
336 else
337 insert_here = i2;
338 p->clause[insert_here] = clause;
339 }
340
341
342 /* Return P & P2. */
343
344 static struct predicate
345 and_predicates (conditions conditions,
346 struct predicate *p, struct predicate *p2)
347 {
348 struct predicate out = *p;
349 int i;
350
351 /* Avoid busy work. */
352 if (false_predicate_p (p2) || true_predicate_p (p))
353 return *p2;
354 if (false_predicate_p (p) || true_predicate_p (p2))
355 return *p;
356
357 /* See how far predicates match. */
358 for (i = 0; p->clause[i] && p->clause[i] == p2->clause[i]; i++)
359 {
360 gcc_checking_assert (i < MAX_CLAUSES);
361 }
362
363 /* Combine the predicates rest. */
364 for (; p2->clause[i]; i++)
365 {
366 gcc_checking_assert (i < MAX_CLAUSES);
367 add_clause (conditions, &out, p2->clause[i]);
368 }
369 return out;
370 }
371
372
373 /* Return true if predicates are obviously equal. */
374
375 static inline bool
376 predicates_equal_p (struct predicate *p, struct predicate *p2)
377 {
378 int i;
379 for (i = 0; p->clause[i]; i++)
380 {
381 gcc_checking_assert (i < MAX_CLAUSES);
382 gcc_checking_assert (p->clause [i] > p->clause[i + 1]);
383 gcc_checking_assert (!p2->clause[i]
384 || p2->clause [i] > p2->clause[i + 1]);
385 if (p->clause[i] != p2->clause[i])
386 return false;
387 }
388 return !p2->clause[i];
389 }
390
391
392 /* Return P | P2. */
393
394 static struct predicate
395 or_predicates (conditions conditions, struct predicate *p, struct predicate *p2)
396 {
397 struct predicate out = true_predicate ();
398 int i,j;
399
400 /* Avoid busy work. */
401 if (false_predicate_p (p2) || true_predicate_p (p))
402 return *p;
403 if (false_predicate_p (p) || true_predicate_p (p2))
404 return *p2;
405 if (predicates_equal_p (p, p2))
406 return *p;
407
408 /* OK, combine the predicates. */
409 for (i = 0; p->clause[i]; i++)
410 for (j = 0; p2->clause[j]; j++)
411 {
412 gcc_checking_assert (i < MAX_CLAUSES && j < MAX_CLAUSES);
413 add_clause (conditions, &out, p->clause[i] | p2->clause[j]);
414 }
415 return out;
416 }
417
418
419 /* Having partial truth assignment in POSSIBLE_TRUTHS, return false
420 if predicate P is known to be false. */
421
422 static bool
423 evaluate_predicate (struct predicate *p, clause_t possible_truths)
424 {
425 int i;
426
427 /* True remains true. */
428 if (true_predicate_p (p))
429 return true;
430
431 gcc_assert (!(possible_truths & (1 << predicate_false_condition)));
432
433 /* See if we can find clause we can disprove. */
434 for (i = 0; p->clause[i]; i++)
435 {
436 gcc_checking_assert (i < MAX_CLAUSES);
437 if (!(p->clause[i] & possible_truths))
438 return false;
439 }
440 return true;
441 }
442
443 /* Return the probability in range 0...REG_BR_PROB_BASE that the predicated
444 instruction will be recomputed per invocation of the inlined call. */
445
446 static int
447 predicate_probability (conditions conds,
448 struct predicate *p, clause_t possible_truths,
449 VEC (inline_param_summary_t, heap) *inline_param_summary)
450 {
451 int i;
452 int combined_prob = REG_BR_PROB_BASE;
453
454 /* True remains true. */
455 if (true_predicate_p (p))
456 return REG_BR_PROB_BASE;
457
458 if (false_predicate_p (p))
459 return 0;
460
461 gcc_assert (!(possible_truths & (1 << predicate_false_condition)));
462
463 /* See if we can find clause we can disprove. */
464 for (i = 0; p->clause[i]; i++)
465 {
466 gcc_checking_assert (i < MAX_CLAUSES);
467 if (!(p->clause[i] & possible_truths))
468 return 0;
469 else
470 {
471 int this_prob = 0;
472 int i2;
473 if (!inline_param_summary)
474 return REG_BR_PROB_BASE;
475 for (i2 = 0; i2 < NUM_CONDITIONS; i2++)
476 if ((p->clause[i] & possible_truths) & (1 << i2))
477 {
478 if (i2 >= predicate_first_dynamic_condition)
479 {
480 condition *c = VEC_index
481 (condition, conds,
482 i2 - predicate_first_dynamic_condition);
483 if (c->code == CHANGED
484 && (c->operand_num
485 < VEC_length (inline_param_summary_t,
486 inline_param_summary)))
487 {
488 int iprob = VEC_index (inline_param_summary_t,
489 inline_param_summary,
490 c->operand_num)->change_prob;
491 this_prob = MAX (this_prob, iprob);
492 }
493 else
494 this_prob = REG_BR_PROB_BASE;
495 }
496 else
497 this_prob = REG_BR_PROB_BASE;
498 }
499 combined_prob = MIN (this_prob, combined_prob);
500 if (!combined_prob)
501 return 0;
502 }
503 }
504 return combined_prob;
505 }
506
507
508 /* Dump conditional COND. */
509
510 static void
511 dump_condition (FILE *f, conditions conditions, int cond)
512 {
513 condition *c;
514 if (cond == predicate_false_condition)
515 fprintf (f, "false");
516 else if (cond == predicate_not_inlined_condition)
517 fprintf (f, "not inlined");
518 else
519 {
520 c = VEC_index (condition, conditions,
521 cond - predicate_first_dynamic_condition);
522 fprintf (f, "op%i", c->operand_num);
523 if (c->code == IS_NOT_CONSTANT)
524 {
525 fprintf (f, " not constant");
526 return;
527 }
528 if (c->code == CHANGED)
529 {
530 fprintf (f, " changed");
531 return;
532 }
533 fprintf (f, " %s ", op_symbol_code (c->code));
534 print_generic_expr (f, c->val, 1);
535 }
536 }
537
538
539 /* Dump clause CLAUSE. */
540
541 static void
542 dump_clause (FILE *f, conditions conds, clause_t clause)
543 {
544 int i;
545 bool found = false;
546 fprintf (f, "(");
547 if (!clause)
548 fprintf (f, "true");
549 for (i = 0; i < NUM_CONDITIONS; i++)
550 if (clause & (1 << i))
551 {
552 if (found)
553 fprintf (f, " || ");
554 found = true;
555 dump_condition (f, conds, i);
556 }
557 fprintf (f, ")");
558 }
559
560
561 /* Dump predicate PREDICATE. */
562
563 static void
564 dump_predicate (FILE *f, conditions conds, struct predicate *pred)
565 {
566 int i;
567 if (true_predicate_p (pred))
568 dump_clause (f, conds, 0);
569 else
570 for (i = 0; pred->clause[i]; i++)
571 {
572 if (i)
573 fprintf (f, " && ");
574 dump_clause (f, conds, pred->clause[i]);
575 }
576 fprintf (f, "\n");
577 }
578
579
580 /* Record SIZE and TIME under condition PRED into the inline summary. */
581
582 static void
583 account_size_time (struct inline_summary *summary, int size, int time,
584 struct predicate *pred)
585 {
586 size_time_entry *e;
587 bool found = false;
588 int i;
589
590 if (false_predicate_p (pred))
591 return;
592
593 /* We need to create initial empty unconitional clause, but otherwie
594 we don't need to account empty times and sizes. */
595 if (!size && !time && summary->entry)
596 return;
597
598 /* Watch overflow that might result from insane profiles. */
599 if (time > MAX_TIME * INLINE_TIME_SCALE)
600 time = MAX_TIME * INLINE_TIME_SCALE;
601 gcc_assert (time >= 0);
602
603 for (i = 0; VEC_iterate (size_time_entry, summary->entry, i, e); i++)
604 if (predicates_equal_p (&e->predicate, pred))
605 {
606 found = true;
607 break;
608 }
609 if (i == 32)
610 {
611 i = 0;
612 found = true;
613 e = VEC_index (size_time_entry, summary->entry, 0);
614 gcc_assert (!e->predicate.clause[0]);
615 }
616 if (dump_file && (dump_flags & TDF_DETAILS) && (time || size))
617 {
618 fprintf (dump_file, "\t\tAccounting size:%3.2f, time:%3.2f on %spredicate:",
619 ((double)size) / INLINE_SIZE_SCALE,
620 ((double)time) / INLINE_TIME_SCALE,
621 found ? "" : "new ");
622 dump_predicate (dump_file, summary->conds, pred);
623 }
624 if (!found)
625 {
626 struct size_time_entry new_entry;
627 new_entry.size = size;
628 new_entry.time = time;
629 new_entry.predicate = *pred;
630 VEC_safe_push (size_time_entry, gc, summary->entry, &new_entry);
631 }
632 else
633 {
634 e->size += size;
635 e->time += time;
636 if (e->time > MAX_TIME * INLINE_TIME_SCALE)
637 e->time = MAX_TIME * INLINE_TIME_SCALE;
638 }
639 }
640
641 /* Set predicate for edge E. */
642
643 static void
644 edge_set_predicate (struct cgraph_edge *e, struct predicate *predicate)
645 {
646 struct inline_edge_summary *es = inline_edge_summary (e);
647 if (predicate && !true_predicate_p (predicate))
648 {
649 if (!es->predicate)
650 es->predicate = (struct predicate *)pool_alloc (edge_predicate_pool);
651 *es->predicate = *predicate;
652 }
653 else
654 {
655 if (es->predicate)
656 pool_free (edge_predicate_pool, es->predicate);
657 es->predicate = NULL;
658 }
659 }
660
661
662 /* KNOWN_VALS is partial mapping of parameters of NODE to constant values.
663 Return clause of possible truths. When INLINE_P is true, assume that
664 we are inlining.
665
666 ERROR_MARK means compile time invariant. */
667
668 static clause_t
669 evaluate_conditions_for_known_args (struct cgraph_node *node,
670 bool inline_p,
671 VEC (tree, heap) *known_vals)
672 {
673 clause_t clause = inline_p ? 0 : 1 << predicate_not_inlined_condition;
674 struct inline_summary *info = inline_summary (node);
675 int i;
676 struct condition *c;
677
678 for (i = 0; VEC_iterate (condition, info->conds, i, c); i++)
679 {
680 tree val;
681 tree res;
682
683 /* We allow call stmt to have fewer arguments than the callee
684 function (especially for K&R style programs). So bound
685 check here. */
686 if (c->operand_num < (int)VEC_length (tree, known_vals))
687 val = VEC_index (tree, known_vals, c->operand_num);
688 else
689 val = NULL;
690
691 if (val == error_mark_node && c->code != CHANGED)
692 val = NULL;
693
694 if (!val)
695 {
696 clause |= 1 << (i + predicate_first_dynamic_condition);
697 continue;
698 }
699 if (c->code == IS_NOT_CONSTANT || c->code == CHANGED)
700 continue;
701 res = fold_binary_to_constant (c->code, boolean_type_node, val, c->val);
702 if (res
703 && integer_zerop (res))
704 continue;
705 clause |= 1 << (i + predicate_first_dynamic_condition);
706 }
707 return clause;
708 }
709
710
711 /* Work out what conditions might be true at invocation of E. */
712
713 static clause_t
714 evaluate_conditions_for_edge (struct cgraph_edge *e, bool inline_p)
715 {
716 clause_t clause = inline_p ? 0 : 1 << predicate_not_inlined_condition;
717 struct cgraph_node *callee = cgraph_function_or_thunk_node (e->callee, NULL);
718 struct inline_summary *info = inline_summary (callee);
719 int i;
720
721 if (ipa_node_params_vector && info->conds)
722 {
723 struct ipa_node_params *parms_info;
724 struct ipa_edge_args *args = IPA_EDGE_REF (e);
725 struct inline_edge_summary *es = inline_edge_summary (e);
726 int i, count = ipa_get_cs_argument_count (args);
727 VEC (tree, heap) *known_vals = NULL;
728
729 if (e->caller->global.inlined_to)
730 parms_info = IPA_NODE_REF (e->caller->global.inlined_to);
731 else
732 parms_info = IPA_NODE_REF (e->caller);
733
734 if (count)
735 VEC_safe_grow_cleared (tree, heap, known_vals, count);
736 for (i = 0; i < count; i++)
737 {
738 tree cst = ipa_cst_from_jfunc (parms_info,
739 ipa_get_ith_jump_func (args, i));
740 if (cst)
741 VEC_replace (tree, known_vals, i, cst);
742 else if (inline_p
743 && !VEC_index (inline_param_summary_t,
744 es->param,
745 i)->change_prob)
746 VEC_replace (tree, known_vals, i, error_mark_node);
747 }
748 clause = evaluate_conditions_for_known_args (callee,
749 inline_p, known_vals);
750 VEC_free (tree, heap, known_vals);
751 }
752 else
753 for (i = 0; i < (int)VEC_length (condition, info->conds); i++)
754 clause |= 1 << (i + predicate_first_dynamic_condition);
755
756 return clause;
757 }
758
759
760 /* Allocate the inline summary vector or resize it to cover all cgraph nodes. */
761
762 static void
763 inline_summary_alloc (void)
764 {
765 if (!node_removal_hook_holder)
766 node_removal_hook_holder =
767 cgraph_add_node_removal_hook (&inline_node_removal_hook, NULL);
768 if (!edge_removal_hook_holder)
769 edge_removal_hook_holder =
770 cgraph_add_edge_removal_hook (&inline_edge_removal_hook, NULL);
771 if (!node_duplication_hook_holder)
772 node_duplication_hook_holder =
773 cgraph_add_node_duplication_hook (&inline_node_duplication_hook, NULL);
774 if (!edge_duplication_hook_holder)
775 edge_duplication_hook_holder =
776 cgraph_add_edge_duplication_hook (&inline_edge_duplication_hook, NULL);
777
778 if (VEC_length (inline_summary_t, inline_summary_vec)
779 <= (unsigned) cgraph_max_uid)
780 VEC_safe_grow_cleared (inline_summary_t, gc,
781 inline_summary_vec, cgraph_max_uid + 1);
782 if (VEC_length (inline_edge_summary_t, inline_edge_summary_vec)
783 <= (unsigned) cgraph_edge_max_uid)
784 VEC_safe_grow_cleared (inline_edge_summary_t, heap,
785 inline_edge_summary_vec, cgraph_edge_max_uid + 1);
786 if (!edge_predicate_pool)
787 edge_predicate_pool = create_alloc_pool ("edge predicates",
788 sizeof (struct predicate),
789 10);
790 }
791
792 /* Hook that is called by cgraph.c when a node is removed. */
793
794 static void
795 inline_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
796 {
797 struct inline_summary *info;
798 if (VEC_length (inline_summary_t, inline_summary_vec)
799 <= (unsigned)node->uid)
800 return;
801 info = inline_summary (node);
802 reset_node_growth_cache (node);
803 VEC_free (condition, gc, info->conds);
804 VEC_free (size_time_entry, gc, info->entry);
805 info->conds = NULL;
806 info->entry = NULL;
807 memset (info, 0, sizeof (inline_summary_t));
808 }
809
810
811 /* Hook that is called by cgraph.c when a node is duplicated. */
812
813 static void
814 inline_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
815 ATTRIBUTE_UNUSED void *data)
816 {
817 struct inline_summary *info;
818 inline_summary_alloc ();
819 info = inline_summary (dst);
820 memcpy (info, inline_summary (src),
821 sizeof (struct inline_summary));
822 /* TODO: as an optimization, we may avoid copying conditions
823 that are known to be false or true. */
824 info->conds = VEC_copy (condition, gc, info->conds);
825
826 /* When there are any replacements in the function body, see if we can figure
827 out that something was optimized out. */
828 if (ipa_node_params_vector && dst->clone.tree_map)
829 {
830 VEC(size_time_entry,gc) *entry = info->entry;
831 /* Use SRC parm info since it may not be copied yet. */
832 struct ipa_node_params *parms_info = IPA_NODE_REF (src);
833 VEC (tree, heap) *known_vals = NULL;
834 int count = ipa_get_param_count (parms_info);
835 int i,j;
836 clause_t possible_truths;
837 struct predicate true_pred = true_predicate ();
838 size_time_entry *e;
839 int optimized_out_size = 0;
840 gcov_type optimized_out_time = 0;
841 bool inlined_to_p = false;
842 struct cgraph_edge *edge;
843
844 info->entry = 0;
845 VEC_safe_grow_cleared (tree, heap, known_vals, count);
846 for (i = 0; i < count; i++)
847 {
848 tree t = ipa_get_param (parms_info, i);
849 struct ipa_replace_map *r;
850
851 for (j = 0;
852 VEC_iterate (ipa_replace_map_p, dst->clone.tree_map, j, r);
853 j++)
854 {
855 if (r->old_tree == t
856 && r->replace_p
857 && !r->ref_p)
858 {
859 VEC_replace (tree, known_vals, i, r->new_tree);
860 break;
861 }
862 }
863 }
864 possible_truths = evaluate_conditions_for_known_args (dst,
865 false, known_vals);
866 VEC_free (tree, heap, known_vals);
867
868 account_size_time (info, 0, 0, &true_pred);
869
870 /* Remap size_time vectors.
871 Simplify the predicate by prunning out alternatives that are known
872 to be false.
873 TODO: as on optimization, we can also eliminate conditions known
874 to be true. */
875 for (i = 0; VEC_iterate (size_time_entry, entry, i, e); i++)
876 {
877 struct predicate new_predicate = true_predicate ();
878 for (j = 0; e->predicate.clause[j]; j++)
879 if (!(possible_truths & e->predicate.clause[j]))
880 {
881 new_predicate = false_predicate ();
882 break;
883 }
884 else
885 add_clause (info->conds, &new_predicate,
886 possible_truths & e->predicate.clause[j]);
887 if (false_predicate_p (&new_predicate))
888 {
889 optimized_out_size += e->size;
890 optimized_out_time += e->time;
891 }
892 else
893 account_size_time (info, e->size, e->time, &new_predicate);
894 }
895
896 /* Remap edge predicates with the same simplification as above.
897 Also copy constantness arrays. */
898 for (edge = dst->callees; edge; edge = edge->next_callee)
899 {
900 struct predicate new_predicate = true_predicate ();
901 struct inline_edge_summary *es = inline_edge_summary (edge);
902
903 if (!edge->inline_failed)
904 inlined_to_p = true;
905 if (!es->predicate)
906 continue;
907 for (j = 0; es->predicate->clause[j]; j++)
908 if (!(possible_truths & es->predicate->clause[j]))
909 {
910 new_predicate = false_predicate ();
911 break;
912 }
913 else
914 add_clause (info->conds, &new_predicate,
915 possible_truths & es->predicate->clause[j]);
916 if (false_predicate_p (&new_predicate)
917 && !false_predicate_p (es->predicate))
918 {
919 optimized_out_size += es->call_stmt_size * INLINE_SIZE_SCALE;
920 optimized_out_time += (es->call_stmt_time
921 * (INLINE_TIME_SCALE / CGRAPH_FREQ_BASE)
922 * edge->frequency);
923 edge->frequency = 0;
924 }
925 *es->predicate = new_predicate;
926 }
927
928 /* Remap indirect edge predicates with the same simplificaiton as above.
929 Also copy constantness arrays. */
930 for (edge = dst->indirect_calls; edge; edge = edge->next_callee)
931 {
932 struct predicate new_predicate = true_predicate ();
933 struct inline_edge_summary *es = inline_edge_summary (edge);
934
935 if (!edge->inline_failed)
936 inlined_to_p = true;
937 if (!es->predicate)
938 continue;
939 for (j = 0; es->predicate->clause[j]; j++)
940 if (!(possible_truths & es->predicate->clause[j]))
941 {
942 new_predicate = false_predicate ();
943 break;
944 }
945 else
946 add_clause (info->conds, &new_predicate,
947 possible_truths & es->predicate->clause[j]);
948 if (false_predicate_p (&new_predicate)
949 && !false_predicate_p (es->predicate))
950 {
951 optimized_out_size += es->call_stmt_size * INLINE_SIZE_SCALE;
952 optimized_out_time += (es->call_stmt_time
953 * (INLINE_TIME_SCALE / CGRAPH_FREQ_BASE)
954 * edge->frequency);
955 edge->frequency = 0;
956 }
957 *es->predicate = new_predicate;
958 }
959
960 /* If inliner or someone after inliner will ever start producing
961 non-trivial clones, we will get trouble with lack of information
962 about updating self sizes, because size vectors already contains
963 sizes of the calees. */
964 gcc_assert (!inlined_to_p
965 || (!optimized_out_size && !optimized_out_time));
966
967 info->size -= optimized_out_size / INLINE_SIZE_SCALE;
968 info->self_size -= optimized_out_size / INLINE_SIZE_SCALE;
969 gcc_assert (info->size > 0);
970 gcc_assert (info->self_size > 0);
971
972 optimized_out_time /= INLINE_TIME_SCALE;
973 if (optimized_out_time > MAX_TIME)
974 optimized_out_time = MAX_TIME;
975 info->time -= optimized_out_time;
976 info->self_time -= optimized_out_time;
977 if (info->time < 0)
978 info->time = 0;
979 if (info->self_time < 0)
980 info->self_time = 0;
981 }
982 else
983 info->entry = VEC_copy (size_time_entry, gc, info->entry);
984 }
985
986
987 /* Hook that is called by cgraph.c when a node is duplicated. */
988
989 static void
990 inline_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
991 ATTRIBUTE_UNUSED void *data)
992 {
993 struct inline_edge_summary *info;
994 struct inline_edge_summary *srcinfo;
995 inline_summary_alloc ();
996 info = inline_edge_summary (dst);
997 srcinfo = inline_edge_summary (src);
998 memcpy (info, srcinfo,
999 sizeof (struct inline_edge_summary));
1000 info->predicate = NULL;
1001 edge_set_predicate (dst, srcinfo->predicate);
1002 info->param = VEC_copy (inline_param_summary_t, heap, srcinfo->param);
1003 }
1004
1005
1006 /* Keep edge cache consistent across edge removal. */
1007
1008 static void
1009 inline_edge_removal_hook (struct cgraph_edge *edge, void *data ATTRIBUTE_UNUSED)
1010 {
1011 if (edge_growth_cache)
1012 reset_edge_growth_cache (edge);
1013 if (edge->uid
1014 < (int)VEC_length (inline_edge_summary_t, inline_edge_summary_vec))
1015 {
1016 edge_set_predicate (edge, NULL);
1017 VEC_free (inline_param_summary_t, heap,
1018 inline_edge_summary (edge)->param);
1019 memset (inline_edge_summary (edge), 0,
1020 sizeof (struct inline_edge_summary));
1021 }
1022 }
1023
1024
1025 /* Initialize growth caches. */
1026
1027 void
1028 initialize_growth_caches (void)
1029 {
1030 if (cgraph_edge_max_uid)
1031 VEC_safe_grow_cleared (edge_growth_cache_entry, heap, edge_growth_cache,
1032 cgraph_edge_max_uid);
1033 if (cgraph_max_uid)
1034 VEC_safe_grow_cleared (int, heap, node_growth_cache, cgraph_max_uid);
1035 }
1036
1037
1038 /* Free growth caches. */
1039
1040 void
1041 free_growth_caches (void)
1042 {
1043 VEC_free (edge_growth_cache_entry, heap, edge_growth_cache);
1044 edge_growth_cache = 0;
1045 VEC_free (int, heap, node_growth_cache);
1046 node_growth_cache = 0;
1047 }
1048
1049
1050 /* Dump edge summaries associated to NODE and recursively to all clones.
1051 Indent by INDENT. */
1052
1053 static void
1054 dump_inline_edge_summary (FILE * f, int indent, struct cgraph_node *node,
1055 struct inline_summary *info)
1056 {
1057 struct cgraph_edge *edge;
1058 for (edge = node->callees; edge; edge = edge->next_callee)
1059 {
1060 struct inline_edge_summary *es = inline_edge_summary (edge);
1061 struct cgraph_node *callee = cgraph_function_or_thunk_node (edge->callee, NULL);
1062 int i;
1063
1064 fprintf (f, "%*s%s/%i %s\n%*s loop depth:%2i freq:%4i size:%2i time: %2i callee size:%2i stack:%2i",
1065 indent, "", cgraph_node_name (callee),
1066 callee->uid,
1067 !edge->inline_failed ? "inlined"
1068 : cgraph_inline_failed_string (edge->inline_failed),
1069 indent, "",
1070 es->loop_depth,
1071 edge->frequency,
1072 es->call_stmt_size,
1073 es->call_stmt_time,
1074 (int)inline_summary (callee)->size / INLINE_SIZE_SCALE,
1075 (int)inline_summary (callee)->estimated_stack_size);
1076
1077 if (es->predicate)
1078 {
1079 fprintf (f, " predicate: ");
1080 dump_predicate (f, info->conds, es->predicate);
1081 }
1082 else
1083 fprintf (f, "\n");
1084 if (es->param)
1085 for (i = 0; i < (int)VEC_length (inline_param_summary_t, es->param);
1086 i++)
1087 {
1088 int prob = VEC_index (inline_param_summary_t,
1089 es->param, i)->change_prob;
1090
1091 if (!prob)
1092 fprintf (f, "%*s op%i is compile time invariant\n",
1093 indent + 2, "", i);
1094 else if (prob != REG_BR_PROB_BASE)
1095 fprintf (f, "%*s op%i change %f%% of time\n", indent + 2, "", i,
1096 prob * 100.0 / REG_BR_PROB_BASE);
1097 }
1098 if (!edge->inline_failed)
1099 {
1100 fprintf (f, "%*sStack frame offset %i, callee self size %i,"
1101 " callee size %i\n",
1102 indent+2, "",
1103 (int)inline_summary (callee)->stack_frame_offset,
1104 (int)inline_summary (callee)->estimated_self_stack_size,
1105 (int)inline_summary (callee)->estimated_stack_size);
1106 dump_inline_edge_summary (f, indent+2, callee, info);
1107 }
1108 }
1109 for (edge = node->indirect_calls; edge; edge = edge->next_callee)
1110 {
1111 struct inline_edge_summary *es = inline_edge_summary (edge);
1112 fprintf (f, "%*sindirect call loop depth:%2i freq:%4i size:%2i"
1113 " time: %2i",
1114 indent, "",
1115 es->loop_depth,
1116 edge->frequency,
1117 es->call_stmt_size,
1118 es->call_stmt_time);
1119 if (es->predicate)
1120 {
1121 fprintf (f, "predicate: ");
1122 dump_predicate (f, info->conds, es->predicate);
1123 }
1124 else
1125 fprintf (f, "\n");
1126 }
1127 }
1128
1129
1130 void
1131 dump_inline_summary (FILE * f, struct cgraph_node *node)
1132 {
1133 if (node->analyzed)
1134 {
1135 struct inline_summary *s = inline_summary (node);
1136 size_time_entry *e;
1137 int i;
1138 fprintf (f, "Inline summary for %s/%i", cgraph_node_name (node),
1139 node->uid);
1140 if (DECL_DISREGARD_INLINE_LIMITS (node->decl))
1141 fprintf (f, " always_inline");
1142 if (s->inlinable)
1143 fprintf (f, " inlinable");
1144 fprintf (f, "\n self time: %i\n",
1145 s->self_time);
1146 fprintf (f, " global time: %i\n", s->time);
1147 fprintf (f, " self size: %i\n",
1148 s->self_size);
1149 fprintf (f, " global size: %i\n", s->size);
1150 fprintf (f, " self stack: %i\n",
1151 (int) s->estimated_self_stack_size);
1152 fprintf (f, " global stack: %i\n",
1153 (int) s->estimated_stack_size);
1154 for (i = 0;
1155 VEC_iterate (size_time_entry, s->entry, i, e);
1156 i++)
1157 {
1158 fprintf (f, " size:%f, time:%f, predicate:",
1159 (double) e->size / INLINE_SIZE_SCALE,
1160 (double) e->time / INLINE_TIME_SCALE);
1161 dump_predicate (f, s->conds, &e->predicate);
1162 }
1163 fprintf (f, " calls:\n");
1164 dump_inline_edge_summary (f, 4, node, s);
1165 fprintf (f, "\n");
1166 }
1167 }
1168
1169 DEBUG_FUNCTION void
1170 debug_inline_summary (struct cgraph_node *node)
1171 {
1172 dump_inline_summary (stderr, node);
1173 }
1174
1175 void
1176 dump_inline_summaries (FILE *f)
1177 {
1178 struct cgraph_node *node;
1179
1180 for (node = cgraph_nodes; node; node = node->next)
1181 if (node->analyzed && !node->global.inlined_to)
1182 dump_inline_summary (f, node);
1183 }
1184
1185 /* Give initial reasons why inlining would fail on EDGE. This gets either
1186 nullified or usually overwritten by more precise reasons later. */
1187
1188 void
1189 initialize_inline_failed (struct cgraph_edge *e)
1190 {
1191 struct cgraph_node *callee = e->callee;
1192
1193 if (e->indirect_unknown_callee)
1194 e->inline_failed = CIF_INDIRECT_UNKNOWN_CALL;
1195 else if (!callee->analyzed)
1196 e->inline_failed = CIF_BODY_NOT_AVAILABLE;
1197 else if (callee->local.redefined_extern_inline)
1198 e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
1199 else if (e->call_stmt && gimple_call_cannot_inline_p (e->call_stmt))
1200 e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
1201 else
1202 e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
1203 }
1204
1205 /* Callback of walk_aliased_vdefs. Flags that it has been invoked to the
1206 boolean variable pointed to by DATA. */
1207
1208 static bool
1209 mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
1210 void *data)
1211 {
1212 bool *b = (bool *) data;
1213 *b = true;
1214 return true;
1215 }
1216
1217 /* If OP reffers to value of function parameter, return
1218 the corresponding parameter. */
1219
1220 static tree
1221 unmodified_parm (gimple stmt, tree op)
1222 {
1223 /* SSA_NAME referring to parm default def? */
1224 if (TREE_CODE (op) == SSA_NAME
1225 && SSA_NAME_IS_DEFAULT_DEF (op)
1226 && TREE_CODE (SSA_NAME_VAR (op)) == PARM_DECL)
1227 return SSA_NAME_VAR (op);
1228 /* Non-SSA parm reference? */
1229 if (TREE_CODE (op) == PARM_DECL)
1230 {
1231 bool modified = false;
1232
1233 ao_ref refd;
1234 ao_ref_init (&refd, op);
1235 walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified, &modified,
1236 NULL);
1237 if (!modified)
1238 return op;
1239 }
1240 /* Assignment from a parameter? */
1241 if (TREE_CODE (op) == SSA_NAME
1242 && !SSA_NAME_IS_DEFAULT_DEF (op)
1243 && gimple_assign_single_p (SSA_NAME_DEF_STMT (op)))
1244 return unmodified_parm (SSA_NAME_DEF_STMT (op),
1245 gimple_assign_rhs1 (SSA_NAME_DEF_STMT (op)));
1246 return NULL;
1247 }
1248
1249 /* See if statement might disappear after inlining.
1250 0 - means not eliminated
1251 1 - half of statements goes away
1252 2 - for sure it is eliminated.
1253 We are not terribly sophisticated, basically looking for simple abstraction
1254 penalty wrappers. */
1255
1256 static int
1257 eliminated_by_inlining_prob (gimple stmt)
1258 {
1259 enum gimple_code code = gimple_code (stmt);
1260
1261 if (!optimize)
1262 return 0;
1263
1264 switch (code)
1265 {
1266 case GIMPLE_RETURN:
1267 return 2;
1268 case GIMPLE_ASSIGN:
1269 if (gimple_num_ops (stmt) != 2)
1270 return 0;
1271
1272 /* Casts of parameters, loads from parameters passed by reference
1273 and stores to return value or parameters are often free after
1274 inlining dua to SRA and further combining.
1275 Assume that half of statements goes away. */
1276 if (gimple_assign_rhs_code (stmt) == CONVERT_EXPR
1277 || gimple_assign_rhs_code (stmt) == NOP_EXPR
1278 || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR
1279 || gimple_assign_rhs_class (stmt) == GIMPLE_SINGLE_RHS)
1280 {
1281 tree rhs = gimple_assign_rhs1 (stmt);
1282 tree lhs = gimple_assign_lhs (stmt);
1283 tree inner_rhs = get_base_address (rhs);
1284 tree inner_lhs = get_base_address (lhs);
1285 bool rhs_free = false;
1286 bool lhs_free = false;
1287
1288 if (!inner_rhs)
1289 inner_rhs = rhs;
1290 if (!inner_lhs)
1291 inner_lhs = lhs;
1292
1293 if (unmodified_parm (stmt, inner_rhs))
1294 rhs_free = true;
1295 if (rhs_free && is_gimple_reg (lhs))
1296 lhs_free = true;
1297 if (((TREE_CODE (inner_lhs) == PARM_DECL
1298 || (TREE_CODE (inner_lhs) == SSA_NAME
1299 && SSA_NAME_IS_DEFAULT_DEF (inner_lhs)
1300 && TREE_CODE (SSA_NAME_VAR (inner_lhs)) == PARM_DECL))
1301 && inner_lhs != lhs)
1302 || TREE_CODE (inner_lhs) == RESULT_DECL
1303 || (TREE_CODE (inner_lhs) == SSA_NAME
1304 && TREE_CODE (SSA_NAME_VAR (inner_lhs)) == RESULT_DECL))
1305 lhs_free = true;
1306 if (lhs_free
1307 && (is_gimple_reg (rhs) || is_gimple_min_invariant (rhs)))
1308 rhs_free = true;
1309 if (lhs_free && rhs_free)
1310 return 1;
1311 }
1312 return 0;
1313 default:
1314 return 0;
1315 }
1316 }
1317
1318
1319 /* If BB ends by a conditional we can turn into predicates, attach corresponding
1320 predicates to the CFG edges. */
1321
1322 static void
1323 set_cond_stmt_execution_predicate (struct ipa_node_params *info,
1324 struct inline_summary *summary,
1325 basic_block bb)
1326 {
1327 gimple last;
1328 tree op;
1329 int index;
1330 enum tree_code code, inverted_code;
1331 edge e;
1332 edge_iterator ei;
1333 gimple set_stmt;
1334 tree op2;
1335 tree parm;
1336 tree base;
1337
1338 last = last_stmt (bb);
1339 if (!last
1340 || gimple_code (last) != GIMPLE_COND)
1341 return;
1342 if (!is_gimple_ip_invariant (gimple_cond_rhs (last)))
1343 return;
1344 op = gimple_cond_lhs (last);
1345 /* TODO: handle conditionals like
1346 var = op0 < 4;
1347 if (var != 0). */
1348 parm = unmodified_parm (last, op);
1349 if (parm)
1350 {
1351 index = ipa_get_param_decl_index (info, parm);
1352 if (index == -1)
1353 return;
1354 code = gimple_cond_code (last);
1355 inverted_code
1356 = invert_tree_comparison (code,
1357 HONOR_NANS (TYPE_MODE (TREE_TYPE (op))));
1358
1359 FOR_EACH_EDGE (e, ei, bb->succs)
1360 {
1361 struct predicate p = add_condition (summary,
1362 index,
1363 e->flags & EDGE_TRUE_VALUE
1364 ? code : inverted_code,
1365 gimple_cond_rhs (last));
1366 e->aux = pool_alloc (edge_predicate_pool);
1367 *(struct predicate *)e->aux = p;
1368 }
1369 }
1370
1371 if (TREE_CODE (op) != SSA_NAME)
1372 return;
1373 /* Special case
1374 if (builtin_constant_p (op))
1375 constant_code
1376 else
1377 nonconstant_code.
1378 Here we can predicate nonconstant_code. We can't
1379 really handle constant_code since we have no predicate
1380 for this and also the constant code is not known to be
1381 optimized away when inliner doen't see operand is constant.
1382 Other optimizers might think otherwise. */
1383 set_stmt = SSA_NAME_DEF_STMT (op);
1384 if (!gimple_call_builtin_p (set_stmt, BUILT_IN_CONSTANT_P)
1385 || gimple_call_num_args (set_stmt) != 1)
1386 return;
1387 op2 = gimple_call_arg (set_stmt, 0);
1388 base = get_base_address (op2);
1389 parm = unmodified_parm (set_stmt, base ? base : op2);
1390 if (!parm)
1391 return;
1392 index = ipa_get_param_decl_index (info, parm);
1393 if (index == -1)
1394 return;
1395 if (gimple_cond_code (last) != NE_EXPR
1396 || !integer_zerop (gimple_cond_rhs (last)))
1397 return;
1398 FOR_EACH_EDGE (e, ei, bb->succs)
1399 if (e->flags & EDGE_FALSE_VALUE)
1400 {
1401 struct predicate p = add_condition (summary,
1402 index,
1403 IS_NOT_CONSTANT,
1404 NULL);
1405 e->aux = pool_alloc (edge_predicate_pool);
1406 *(struct predicate *)e->aux = p;
1407 }
1408 }
1409
1410
1411 /* If BB ends by a switch we can turn into predicates, attach corresponding
1412 predicates to the CFG edges. */
1413
1414 static void
1415 set_switch_stmt_execution_predicate (struct ipa_node_params *info,
1416 struct inline_summary *summary,
1417 basic_block bb)
1418 {
1419 gimple last;
1420 tree op;
1421 int index;
1422 edge e;
1423 edge_iterator ei;
1424 size_t n;
1425 size_t case_idx;
1426 tree parm;
1427
1428 last = last_stmt (bb);
1429 if (!last
1430 || gimple_code (last) != GIMPLE_SWITCH)
1431 return;
1432 op = gimple_switch_index (last);
1433 parm = unmodified_parm (last, op);
1434 if (!parm)
1435 return;
1436 index = ipa_get_param_decl_index (info, parm);
1437 if (index == -1)
1438 return;
1439
1440 FOR_EACH_EDGE (e, ei, bb->succs)
1441 {
1442 e->aux = pool_alloc (edge_predicate_pool);
1443 *(struct predicate *)e->aux = false_predicate ();
1444 }
1445 n = gimple_switch_num_labels(last);
1446 for (case_idx = 0; case_idx < n; ++case_idx)
1447 {
1448 tree cl = gimple_switch_label (last, case_idx);
1449 tree min, max;
1450 struct predicate p;
1451
1452 e = find_edge (bb, label_to_block (CASE_LABEL (cl)));
1453 min = CASE_LOW (cl);
1454 max = CASE_HIGH (cl);
1455
1456 /* For default we might want to construct predicate that none
1457 of cases is met, but it is bit hard to do not having negations
1458 of conditionals handy. */
1459 if (!min && !max)
1460 p = true_predicate ();
1461 else if (!max)
1462 p = add_condition (summary, index,
1463 EQ_EXPR,
1464 min);
1465 else
1466 {
1467 struct predicate p1, p2;
1468 p1 = add_condition (summary, index,
1469 GE_EXPR,
1470 min);
1471 p2 = add_condition (summary, index,
1472 LE_EXPR,
1473 max);
1474 p = and_predicates (summary->conds, &p1, &p2);
1475 }
1476 *(struct predicate *)e->aux
1477 = or_predicates (summary->conds, &p, (struct predicate *)e->aux);
1478 }
1479 }
1480
1481
1482 /* For each BB in NODE attach to its AUX pointer predicate under
1483 which it is executable. */
1484
1485 static void
1486 compute_bb_predicates (struct cgraph_node *node,
1487 struct ipa_node_params *parms_info,
1488 struct inline_summary *summary)
1489 {
1490 struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
1491 bool done = false;
1492 basic_block bb;
1493
1494 FOR_EACH_BB_FN (bb, my_function)
1495 {
1496 set_cond_stmt_execution_predicate (parms_info, summary, bb);
1497 set_switch_stmt_execution_predicate (parms_info, summary, bb);
1498 }
1499
1500 /* Entry block is always executable. */
1501 ENTRY_BLOCK_PTR_FOR_FUNCTION (my_function)->aux
1502 = pool_alloc (edge_predicate_pool);
1503 *(struct predicate *)ENTRY_BLOCK_PTR_FOR_FUNCTION (my_function)->aux
1504 = true_predicate ();
1505
1506 /* A simple dataflow propagation of predicates forward in the CFG.
1507 TODO: work in reverse postorder. */
1508 while (!done)
1509 {
1510 done = true;
1511 FOR_EACH_BB_FN (bb, my_function)
1512 {
1513 struct predicate p = false_predicate ();
1514 edge e;
1515 edge_iterator ei;
1516 FOR_EACH_EDGE (e, ei, bb->preds)
1517 {
1518 if (e->src->aux)
1519 {
1520 struct predicate this_bb_predicate
1521 = *(struct predicate *)e->src->aux;
1522 if (e->aux)
1523 this_bb_predicate
1524 = and_predicates (summary->conds, &this_bb_predicate,
1525 (struct predicate *)e->aux);
1526 p = or_predicates (summary->conds, &p, &this_bb_predicate);
1527 if (true_predicate_p (&p))
1528 break;
1529 }
1530 }
1531 if (false_predicate_p (&p))
1532 gcc_assert (!bb->aux);
1533 else
1534 {
1535 if (!bb->aux)
1536 {
1537 done = false;
1538 bb->aux = pool_alloc (edge_predicate_pool);
1539 *((struct predicate *)bb->aux) = p;
1540 }
1541 else if (!predicates_equal_p (&p, (struct predicate *)bb->aux))
1542 {
1543 done = false;
1544 *((struct predicate *)bb->aux) = p;
1545 }
1546 }
1547 }
1548 }
1549 }
1550
1551
1552 /* We keep info about constantness of SSA names. */
1553
1554 typedef struct predicate predicate_t;
1555 DEF_VEC_O (predicate_t);
1556 DEF_VEC_ALLOC_O (predicate_t, heap);
1557
1558
1559 /* Return predicate specifying when the STMT might have result that is not
1560 a compile time constant. */
1561
1562 static struct predicate
1563 will_be_nonconstant_predicate (struct ipa_node_params *info,
1564 struct inline_summary *summary,
1565 gimple stmt,
1566 VEC (predicate_t, heap) *nonconstant_names)
1567
1568 {
1569 struct predicate p = true_predicate ();
1570 ssa_op_iter iter;
1571 tree use;
1572 struct predicate op_non_const;
1573 bool is_load;
1574
1575 /* What statments might be optimized away
1576 when their arguments are constant
1577 TODO: also trivial builtins.
1578 builtin_constant_p is already handled later. */
1579 if (gimple_code (stmt) != GIMPLE_ASSIGN
1580 && gimple_code (stmt) != GIMPLE_COND
1581 && gimple_code (stmt) != GIMPLE_SWITCH)
1582 return p;
1583
1584 /* Stores will stay anyway. */
1585 if (gimple_vdef (stmt))
1586 return p;
1587
1588 is_load = gimple_vuse (stmt) != NULL;
1589
1590 /* Loads can be optimized when the value is known. */
1591 if (is_load)
1592 {
1593 tree op = gimple_assign_rhs1 (stmt);
1594 tree base = get_base_address (op);
1595 tree parm;
1596
1597 gcc_assert (gimple_assign_single_p (stmt));
1598 if (!base)
1599 return p;
1600 parm = unmodified_parm (stmt, base);
1601 if (!parm )
1602 return p;
1603 if (ipa_get_param_decl_index (info, parm) < 0)
1604 return p;
1605 }
1606
1607 /* See if we understand all operands before we start
1608 adding conditionals. */
1609 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1610 {
1611 tree parm = unmodified_parm (stmt, use);
1612 /* For arguments we can build a condition. */
1613 if (parm && ipa_get_param_decl_index (info, parm) >= 0)
1614 continue;
1615 if (TREE_CODE (use) != SSA_NAME)
1616 return p;
1617 /* If we know when operand is constant,
1618 we still can say something useful. */
1619 if (!true_predicate_p (VEC_index (predicate_t, nonconstant_names,
1620 SSA_NAME_VERSION (use))))
1621 continue;
1622 return p;
1623 }
1624 op_non_const = false_predicate ();
1625 if (is_load)
1626 {
1627 tree parm = unmodified_parm
1628 (stmt, get_base_address (gimple_assign_rhs1 (stmt)));
1629 p = add_condition (summary,
1630 ipa_get_param_decl_index (info, parm),
1631 CHANGED, NULL);
1632 op_non_const = or_predicates (summary->conds, &p, &op_non_const);
1633 }
1634 FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1635 {
1636 tree parm = unmodified_parm (stmt, use);
1637 if (parm && ipa_get_param_decl_index (info, parm) >= 0)
1638 p = add_condition (summary,
1639 ipa_get_param_decl_index (info, parm),
1640 CHANGED, NULL);
1641 else
1642 p = *VEC_index (predicate_t, nonconstant_names,
1643 SSA_NAME_VERSION (use));
1644 op_non_const = or_predicates (summary->conds, &p, &op_non_const);
1645 }
1646 if (gimple_code (stmt) == GIMPLE_ASSIGN
1647 && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME)
1648 VEC_replace (predicate_t, nonconstant_names,
1649 SSA_NAME_VERSION (gimple_assign_lhs (stmt)), &op_non_const);
1650 return op_non_const;
1651 }
1652
1653 struct record_modified_bb_info
1654 {
1655 bitmap bb_set;
1656 gimple stmt;
1657 };
1658
1659 /* Callback of walk_aliased_vdefs. Records basic blocks where the value may be
1660 set except for info->stmt. */
1661
1662 static bool
1663 record_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef,
1664 void *data)
1665 {
1666 struct record_modified_bb_info *info = (struct record_modified_bb_info *) data;
1667 if (SSA_NAME_DEF_STMT (vdef) == info->stmt)
1668 return false;
1669 bitmap_set_bit (info->bb_set,
1670 SSA_NAME_IS_DEFAULT_DEF (vdef)
1671 ? ENTRY_BLOCK_PTR->index : gimple_bb (SSA_NAME_DEF_STMT (vdef))->index);
1672 return false;
1673 }
1674
1675 /* Return probability (based on REG_BR_PROB_BASE) that I-th parameter of STMT
1676 will change since last invocation of STMT.
1677
1678 Value 0 is reserved for compile time invariants.
1679 For common parameters it is REG_BR_PROB_BASE. For loop invariants it
1680 ought to be REG_BR_PROB_BASE / estimated_iters. */
1681
1682 static int
1683 param_change_prob (gimple stmt, int i)
1684 {
1685 tree op = gimple_call_arg (stmt, i);
1686 basic_block bb = gimple_bb (stmt);
1687 tree base;
1688
1689 if (is_gimple_min_invariant (op))
1690 return 0;
1691 /* We would have to do non-trivial analysis to really work out what
1692 is the probability of value to change (i.e. when init statement
1693 is in a sibling loop of the call).
1694
1695 We do an conservative estimate: when call is executed N times more often
1696 than the statement defining value, we take the frequency 1/N. */
1697 if (TREE_CODE (op) == SSA_NAME)
1698 {
1699 int init_freq;
1700
1701 if (!bb->frequency)
1702 return REG_BR_PROB_BASE;
1703
1704 if (SSA_NAME_IS_DEFAULT_DEF (op))
1705 init_freq = ENTRY_BLOCK_PTR->frequency;
1706 else
1707 init_freq = gimple_bb (SSA_NAME_DEF_STMT (op))->frequency;
1708
1709 if (!init_freq)
1710 init_freq = 1;
1711 if (init_freq < bb->frequency)
1712 return MAX ((init_freq * REG_BR_PROB_BASE +
1713 bb->frequency / 2) / bb->frequency, 1);
1714 else
1715 return REG_BR_PROB_BASE;
1716 }
1717
1718 base = get_base_address (op);
1719 if (base)
1720 {
1721 ao_ref refd;
1722 int max;
1723 struct record_modified_bb_info info;
1724 bitmap_iterator bi;
1725 unsigned index;
1726
1727 if (const_value_known_p (base))
1728 return 0;
1729 if (!bb->frequency)
1730 return REG_BR_PROB_BASE;
1731 ao_ref_init (&refd, op);
1732 info.stmt = stmt;
1733 info.bb_set = BITMAP_ALLOC (NULL);
1734 walk_aliased_vdefs (&refd, gimple_vuse (stmt), record_modified, &info,
1735 NULL);
1736 if (bitmap_bit_p (info.bb_set, bb->index))
1737 {
1738 BITMAP_FREE (info.bb_set);
1739 return REG_BR_PROB_BASE;
1740 }
1741
1742 /* Assume that every memory is initialized at entry.
1743 TODO: Can we easilly determine if value is always defined
1744 and thus we may skip entry block? */
1745 if (ENTRY_BLOCK_PTR->frequency)
1746 max = ENTRY_BLOCK_PTR->frequency;
1747 else
1748 max = 1;
1749
1750 EXECUTE_IF_SET_IN_BITMAP (info.bb_set, 0, index, bi)
1751 max = MIN (max, BASIC_BLOCK (index)->frequency);
1752
1753 BITMAP_FREE (info.bb_set);
1754 if (max < bb->frequency)
1755 return MAX ((max * REG_BR_PROB_BASE +
1756 bb->frequency / 2) / bb->frequency, 1);
1757 else
1758 return REG_BR_PROB_BASE;
1759 }
1760 return REG_BR_PROB_BASE;
1761 }
1762
1763
1764 /* Compute function body size parameters for NODE.
1765 When EARLY is true, we compute only simple summaries without
1766 non-trivial predicates to drive the early inliner. */
1767
1768 static void
1769 estimate_function_body_sizes (struct cgraph_node *node, bool early)
1770 {
1771 gcov_type time = 0;
1772 /* Estimate static overhead for function prologue/epilogue and alignment. */
1773 int size = 2;
1774 /* Benefits are scaled by probability of elimination that is in range
1775 <0,2>. */
1776 basic_block bb;
1777 gimple_stmt_iterator bsi;
1778 struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
1779 int freq;
1780 struct inline_summary *info = inline_summary (node);
1781 struct predicate bb_predicate;
1782 struct ipa_node_params *parms_info = NULL;
1783 VEC (predicate_t, heap) *nonconstant_names = NULL;
1784
1785 if (ipa_node_params_vector && !early && optimize)
1786 {
1787 parms_info = IPA_NODE_REF (node);
1788 VEC_safe_grow_cleared (predicate_t, heap, nonconstant_names,
1789 VEC_length (tree, SSANAMES (my_function)));
1790 }
1791
1792 info->conds = 0;
1793 info->entry = 0;
1794
1795
1796 if (dump_file)
1797 fprintf (dump_file, "\nAnalyzing function body size: %s\n",
1798 cgraph_node_name (node));
1799
1800 /* When we run into maximal number of entries, we assign everything to the
1801 constant truth case. Be sure to have it in list. */
1802 bb_predicate = true_predicate ();
1803 account_size_time (info, 0, 0, &bb_predicate);
1804
1805 bb_predicate = not_inlined_predicate ();
1806 account_size_time (info, 2 * INLINE_SIZE_SCALE, 0, &bb_predicate);
1807
1808 gcc_assert (my_function && my_function->cfg);
1809 if (parms_info)
1810 compute_bb_predicates (node, parms_info, info);
1811 FOR_EACH_BB_FN (bb, my_function)
1812 {
1813 freq = compute_call_stmt_bb_frequency (node->decl, bb);
1814
1815 /* TODO: Obviously predicates can be propagated down across CFG. */
1816 if (parms_info)
1817 {
1818 if (bb->aux)
1819 bb_predicate = *(struct predicate *)bb->aux;
1820 else
1821 bb_predicate = false_predicate ();
1822 }
1823 else
1824 bb_predicate = true_predicate ();
1825
1826 if (dump_file && (dump_flags & TDF_DETAILS))
1827 {
1828 fprintf (dump_file, "\n BB %i predicate:", bb->index);
1829 dump_predicate (dump_file, info->conds, &bb_predicate);
1830 }
1831
1832 for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1833 {
1834 gimple stmt = gsi_stmt (bsi);
1835 int this_size = estimate_num_insns (stmt, &eni_size_weights);
1836 int this_time = estimate_num_insns (stmt, &eni_time_weights);
1837 int prob;
1838 struct predicate will_be_nonconstant;
1839
1840 if (dump_file && (dump_flags & TDF_DETAILS))
1841 {
1842 fprintf (dump_file, " ");
1843 print_gimple_stmt (dump_file, stmt, 0, 0);
1844 fprintf (dump_file, "\t\tfreq:%3.2f size:%3i time:%3i\n",
1845 ((double)freq)/CGRAPH_FREQ_BASE, this_size, this_time);
1846 }
1847
1848 if (is_gimple_call (stmt))
1849 {
1850 struct cgraph_edge *edge = cgraph_edge (node, stmt);
1851 struct inline_edge_summary *es = inline_edge_summary (edge);
1852
1853 /* Special case: results of BUILT_IN_CONSTANT_P will be always
1854 resolved as constant. We however don't want to optimize
1855 out the cgraph edges. */
1856 if (nonconstant_names
1857 && gimple_call_builtin_p (stmt, BUILT_IN_CONSTANT_P)
1858 && gimple_call_lhs (stmt)
1859 && TREE_CODE (gimple_call_lhs (stmt)) == SSA_NAME)
1860 {
1861 struct predicate false_p = false_predicate ();
1862 VEC_replace (predicate_t, nonconstant_names,
1863 SSA_NAME_VERSION (gimple_call_lhs (stmt)),
1864 &false_p);
1865 }
1866 if (ipa_node_params_vector)
1867 {
1868 int count = gimple_call_num_args (stmt);
1869 int i;
1870
1871 if (count)
1872 VEC_safe_grow_cleared (inline_param_summary_t, heap,
1873 es->param, count);
1874 for (i = 0; i < count; i++)
1875 {
1876 int prob = param_change_prob (stmt, i);
1877 gcc_assert (prob >= 0 && prob <= REG_BR_PROB_BASE);
1878 VEC_index (inline_param_summary_t,
1879 es->param, i)->change_prob = prob;
1880 }
1881 }
1882
1883 es->call_stmt_size = this_size;
1884 es->call_stmt_time = this_time;
1885 es->loop_depth = bb->loop_depth;
1886 edge_set_predicate (edge, &bb_predicate);
1887
1888 /* Do not inline calls where we cannot triviall work around
1889 mismatches in argument or return types. */
1890 if (edge->callee
1891 && cgraph_function_or_thunk_node (edge->callee, NULL)
1892 && !gimple_check_call_matching_types
1893 (stmt, cgraph_function_or_thunk_node (edge->callee,
1894 NULL)->decl))
1895 {
1896 edge->call_stmt_cannot_inline_p = true;
1897 gimple_call_set_cannot_inline (stmt, true);
1898 }
1899 else
1900 gcc_assert (!gimple_call_cannot_inline_p (stmt));
1901 }
1902
1903 /* TODO: When conditional jump or swithc is known to be constant, but
1904 we did not translate it into the predicates, we really can account
1905 just maximum of the possible paths. */
1906 if (parms_info)
1907 will_be_nonconstant
1908 = will_be_nonconstant_predicate (parms_info, info,
1909 stmt, nonconstant_names);
1910 if (this_time || this_size)
1911 {
1912 struct predicate p;
1913
1914 this_time *= freq;
1915 time += this_time;
1916 size += this_size;
1917
1918 prob = eliminated_by_inlining_prob (stmt);
1919 if (prob == 1 && dump_file && (dump_flags & TDF_DETAILS))
1920 fprintf (dump_file, "\t\t50%% will be eliminated by inlining\n");
1921 if (prob == 2 && dump_file && (dump_flags & TDF_DETAILS))
1922 fprintf (dump_file, "\t\twill eliminated by inlining\n");
1923
1924 if (parms_info)
1925 p = and_predicates (info->conds, &bb_predicate,
1926 &will_be_nonconstant);
1927 else
1928 p = true_predicate ();
1929
1930 /* We account everything but the calls. Calls have their own
1931 size/time info attached to cgraph edges. This is neccesary
1932 in order to make the cost disappear after inlining. */
1933 if (!is_gimple_call (stmt))
1934 {
1935 if (prob)
1936 {
1937 struct predicate ip = not_inlined_predicate ();
1938 ip = and_predicates (info->conds, &ip, &p);
1939 account_size_time (info, this_size * prob,
1940 this_time * prob, &ip);
1941 }
1942 if (prob != 2)
1943 account_size_time (info, this_size * (2 - prob),
1944 this_time * (2 - prob), &p);
1945 }
1946
1947 gcc_assert (time >= 0);
1948 gcc_assert (size >= 0);
1949 }
1950 }
1951 }
1952 FOR_ALL_BB_FN (bb, my_function)
1953 {
1954 edge e;
1955 edge_iterator ei;
1956
1957 if (bb->aux)
1958 pool_free (edge_predicate_pool, bb->aux);
1959 bb->aux = NULL;
1960 FOR_EACH_EDGE (e, ei, bb->succs)
1961 {
1962 if (e->aux)
1963 pool_free (edge_predicate_pool, e->aux);
1964 e->aux = NULL;
1965 }
1966 }
1967 time = (time + CGRAPH_FREQ_BASE / 2) / CGRAPH_FREQ_BASE;
1968 if (time > MAX_TIME)
1969 time = MAX_TIME;
1970 inline_summary (node)->self_time = time;
1971 inline_summary (node)->self_size = size;
1972 VEC_free (predicate_t, heap, nonconstant_names);
1973 if (dump_file)
1974 {
1975 fprintf (dump_file, "\n");
1976 dump_inline_summary (dump_file, node);
1977 }
1978 }
1979
1980
1981 /* Compute parameters of functions used by inliner.
1982 EARLY is true when we compute parameters for the early inliner */
1983
1984 void
1985 compute_inline_parameters (struct cgraph_node *node, bool early)
1986 {
1987 HOST_WIDE_INT self_stack_size;
1988 struct cgraph_edge *e;
1989 struct inline_summary *info;
1990 tree old_decl = current_function_decl;
1991
1992 gcc_assert (!node->global.inlined_to);
1993
1994 inline_summary_alloc ();
1995
1996 info = inline_summary (node);
1997
1998 /* FIXME: Thunks are inlinable, but tree-inline don't know how to do that.
1999 Once this happen, we will need to more curefully predict call
2000 statement size. */
2001 if (node->thunk.thunk_p)
2002 {
2003 struct inline_edge_summary *es = inline_edge_summary (node->callees);
2004 struct predicate t = true_predicate ();
2005
2006 info->inlinable = 0;
2007 node->callees->call_stmt_cannot_inline_p = true;
2008 node->local.can_change_signature = false;
2009 es->call_stmt_time = 1;
2010 es->call_stmt_size = 1;
2011 account_size_time (info, 0, 0, &t);
2012 return;
2013 }
2014
2015 /* Even is_gimple_min_invariant rely on current_function_decl. */
2016 current_function_decl = node->decl;
2017 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2018
2019 /* Estimate the stack size for the function if we're optimizing. */
2020 self_stack_size = optimize ? estimated_stack_frame_size (node) : 0;
2021 info->estimated_self_stack_size = self_stack_size;
2022 info->estimated_stack_size = self_stack_size;
2023 info->stack_frame_offset = 0;
2024
2025 /* Can this function be inlined at all? */
2026 info->inlinable = tree_inlinable_function_p (node->decl);
2027
2028 /* Type attributes can use parameter indices to describe them. */
2029 if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl)))
2030 node->local.can_change_signature = false;
2031 else
2032 {
2033 /* Otherwise, inlinable functions always can change signature. */
2034 if (info->inlinable)
2035 node->local.can_change_signature = true;
2036 else
2037 {
2038 /* Functions calling builtin_apply can not change signature. */
2039 for (e = node->callees; e; e = e->next_callee)
2040 {
2041 tree cdecl = e->callee->decl;
2042 if (DECL_BUILT_IN (cdecl)
2043 && DECL_BUILT_IN_CLASS (cdecl) == BUILT_IN_NORMAL
2044 && (DECL_FUNCTION_CODE (cdecl) == BUILT_IN_APPLY_ARGS
2045 || DECL_FUNCTION_CODE (cdecl) == BUILT_IN_VA_START))
2046 break;
2047 }
2048 node->local.can_change_signature = !e;
2049 }
2050 }
2051 estimate_function_body_sizes (node, early);
2052
2053 /* Inlining characteristics are maintained by the cgraph_mark_inline. */
2054 info->time = info->self_time;
2055 info->size = info->self_size;
2056 info->stack_frame_offset = 0;
2057 info->estimated_stack_size = info->estimated_self_stack_size;
2058 current_function_decl = old_decl;
2059 pop_cfun ();
2060 }
2061
2062
2063 /* Compute parameters of functions used by inliner using
2064 current_function_decl. */
2065
2066 static unsigned int
2067 compute_inline_parameters_for_current (void)
2068 {
2069 compute_inline_parameters (cgraph_get_node (current_function_decl), true);
2070 return 0;
2071 }
2072
2073 struct gimple_opt_pass pass_inline_parameters =
2074 {
2075 {
2076 GIMPLE_PASS,
2077 "inline_param", /* name */
2078 NULL, /* gate */
2079 compute_inline_parameters_for_current,/* execute */
2080 NULL, /* sub */
2081 NULL, /* next */
2082 0, /* static_pass_number */
2083 TV_INLINE_HEURISTICS, /* tv_id */
2084 0, /* properties_required */
2085 0, /* properties_provided */
2086 0, /* properties_destroyed */
2087 0, /* todo_flags_start */
2088 0 /* todo_flags_finish */
2089 }
2090 };
2091
2092
2093 /* Increase SIZE and TIME for size and time needed to handle edge E. */
2094
2095 static void
2096 estimate_edge_size_and_time (struct cgraph_edge *e, int *size, int *time,
2097 int prob)
2098 {
2099 struct inline_edge_summary *es = inline_edge_summary (e);
2100 *size += es->call_stmt_size * INLINE_SIZE_SCALE;
2101 *time += (es->call_stmt_time * prob / REG_BR_PROB_BASE
2102 * e->frequency * (INLINE_TIME_SCALE / CGRAPH_FREQ_BASE));
2103 if (*time > MAX_TIME * INLINE_TIME_SCALE)
2104 *time = MAX_TIME * INLINE_TIME_SCALE;
2105 }
2106
2107
2108 /* Increase SIZE and TIME for size and time needed to handle all calls in NODE. */
2109
2110 static void
2111 estimate_calls_size_and_time (struct cgraph_node *node, int *size, int *time,
2112 clause_t possible_truths)
2113 {
2114 struct cgraph_edge *e;
2115 for (e = node->callees; e; e = e->next_callee)
2116 {
2117 struct inline_edge_summary *es = inline_edge_summary (e);
2118 if (!es->predicate || evaluate_predicate (es->predicate, possible_truths))
2119 {
2120 if (e->inline_failed)
2121 {
2122 /* Predicates of calls shall not use NOT_CHANGED codes,
2123 sowe do not need to compute probabilities. */
2124 estimate_edge_size_and_time (e, size, time, REG_BR_PROB_BASE);
2125 }
2126 else
2127 estimate_calls_size_and_time (e->callee, size, time,
2128 possible_truths);
2129 }
2130 }
2131 /* TODO: look for devirtualizing oppurtunities. */
2132 for (e = node->indirect_calls; e; e = e->next_callee)
2133 {
2134 struct inline_edge_summary *es = inline_edge_summary (e);
2135 if (!es->predicate || evaluate_predicate (es->predicate, possible_truths))
2136 estimate_edge_size_and_time (e, size, time, REG_BR_PROB_BASE);
2137 }
2138 }
2139
2140
2141 /* Estimate size and time needed to execute NODE assuming
2142 POSSIBLE_TRUTHS clause. */
2143
2144 static void
2145 estimate_node_size_and_time (struct cgraph_node *node,
2146 clause_t possible_truths,
2147 int *ret_size, int *ret_time,
2148 VEC (inline_param_summary_t, heap)
2149 *inline_param_summary)
2150 {
2151 struct inline_summary *info = inline_summary (node);
2152 size_time_entry *e;
2153 int size = 0, time = 0;
2154 int i;
2155
2156 if (dump_file
2157 && (dump_flags & TDF_DETAILS))
2158 {
2159 bool found = false;
2160 fprintf (dump_file, " Estimating body: %s/%i\n"
2161 " Known to be false: ",
2162 cgraph_node_name (node),
2163 node->uid);
2164
2165 for (i = predicate_not_inlined_condition;
2166 i < (predicate_first_dynamic_condition
2167 + (int)VEC_length (condition, info->conds)); i++)
2168 if (!(possible_truths & (1 << i)))
2169 {
2170 if (found)
2171 fprintf (dump_file, ", ");
2172 found = true;
2173 dump_condition (dump_file, info->conds, i);
2174 }
2175 }
2176
2177 for (i = 0; VEC_iterate (size_time_entry, info->entry, i, e); i++)
2178 if (evaluate_predicate (&e->predicate, possible_truths))
2179 {
2180 size += e->size;
2181 if (!inline_param_summary)
2182 time += e->time;
2183 else
2184 {
2185 int prob = predicate_probability (info->conds,
2186 &e->predicate,
2187 possible_truths,
2188 inline_param_summary);
2189 time += e->time * prob / REG_BR_PROB_BASE;
2190 }
2191
2192 }
2193
2194 if (time > MAX_TIME * INLINE_TIME_SCALE)
2195 time = MAX_TIME * INLINE_TIME_SCALE;
2196
2197 estimate_calls_size_and_time (node, &size, &time, possible_truths);
2198 time = (time + INLINE_TIME_SCALE / 2) / INLINE_TIME_SCALE;
2199 size = (size + INLINE_SIZE_SCALE / 2) / INLINE_SIZE_SCALE;
2200
2201
2202 if (dump_file
2203 && (dump_flags & TDF_DETAILS))
2204 fprintf (dump_file, "\n size:%i time:%i\n", size, time);
2205 if (ret_time)
2206 *ret_time = time;
2207 if (ret_size)
2208 *ret_size = size;
2209 return;
2210 }
2211
2212
2213 /* Estimate size and time needed to execute callee of EDGE assuming that
2214 parameters known to be constant at caller of EDGE are propagated.
2215 KNOWN_VALs is a vector of assumed known constant values for parameters. */
2216
2217 void
2218 estimate_ipcp_clone_size_and_time (struct cgraph_node *node,
2219 VEC (tree, heap) *known_vals,
2220 int *ret_size, int *ret_time)
2221 {
2222 clause_t clause;
2223
2224 clause = evaluate_conditions_for_known_args (node, false, known_vals);
2225 estimate_node_size_and_time (node, clause, ret_size, ret_time,
2226 NULL);
2227 }
2228
2229
2230 /* Translate all conditions from callee representation into caller
2231 representation and symbolically evaluate predicate P into new predicate.
2232
2233 INFO is inline_summary of function we are adding predicate into,
2234 CALLEE_INFO is summary of function predicate P is from. OPERAND_MAP is
2235 array giving callee formal IDs the caller formal IDs. POSSSIBLE_TRUTHS is
2236 clausule of all callee conditions that may be true in caller context.
2237 TOPLEV_PREDICATE is predicate under which callee is executed. */
2238
2239 static struct predicate
2240 remap_predicate (struct inline_summary *info,
2241 struct inline_summary *callee_info,
2242 struct predicate *p,
2243 VEC (int, heap) *operand_map,
2244 clause_t possible_truths,
2245 struct predicate *toplev_predicate)
2246 {
2247 int i;
2248 struct predicate out = true_predicate ();
2249
2250 /* True predicate is easy. */
2251 if (true_predicate_p (p))
2252 return *toplev_predicate;
2253 for (i = 0; p->clause[i]; i++)
2254 {
2255 clause_t clause = p->clause[i];
2256 int cond;
2257 struct predicate clause_predicate = false_predicate ();
2258
2259 gcc_assert (i < MAX_CLAUSES);
2260
2261 for (cond = 0; cond < NUM_CONDITIONS; cond ++)
2262 /* Do we have condition we can't disprove? */
2263 if (clause & possible_truths & (1 << cond))
2264 {
2265 struct predicate cond_predicate;
2266 /* Work out if the condition can translate to predicate in the
2267 inlined function. */
2268 if (cond >= predicate_first_dynamic_condition)
2269 {
2270 struct condition *c;
2271
2272 c = VEC_index (condition, callee_info->conds,
2273 cond - predicate_first_dynamic_condition);
2274 /* See if we can remap condition operand to caller's operand.
2275 Otherwise give up. */
2276 if (!operand_map
2277 || (int)VEC_length (int, operand_map) <= c->operand_num
2278 || VEC_index (int, operand_map, c->operand_num) == -1)
2279 cond_predicate = true_predicate ();
2280 else
2281 cond_predicate = add_condition (info,
2282 VEC_index (int, operand_map,
2283 c->operand_num),
2284 c->code, c->val);
2285 }
2286 /* Fixed conditions remains same, construct single
2287 condition predicate. */
2288 else
2289 {
2290 cond_predicate.clause[0] = 1 << cond;
2291 cond_predicate.clause[1] = 0;
2292 }
2293 clause_predicate = or_predicates (info->conds, &clause_predicate,
2294 &cond_predicate);
2295 }
2296 out = and_predicates (info->conds, &out, &clause_predicate);
2297 }
2298 return and_predicates (info->conds, &out, toplev_predicate);
2299 }
2300
2301
2302 /* Update summary information of inline clones after inlining.
2303 Compute peak stack usage. */
2304
2305 static void
2306 inline_update_callee_summaries (struct cgraph_node *node,
2307 int depth)
2308 {
2309 struct cgraph_edge *e;
2310 struct inline_summary *callee_info = inline_summary (node);
2311 struct inline_summary *caller_info = inline_summary (node->callers->caller);
2312 HOST_WIDE_INT peak;
2313
2314 callee_info->stack_frame_offset
2315 = caller_info->stack_frame_offset
2316 + caller_info->estimated_self_stack_size;
2317 peak = callee_info->stack_frame_offset
2318 + callee_info->estimated_self_stack_size;
2319 if (inline_summary (node->global.inlined_to)->estimated_stack_size
2320 < peak)
2321 inline_summary (node->global.inlined_to)->estimated_stack_size = peak;
2322 cgraph_propagate_frequency (node);
2323 for (e = node->callees; e; e = e->next_callee)
2324 {
2325 if (!e->inline_failed)
2326 inline_update_callee_summaries (e->callee, depth);
2327 inline_edge_summary (e)->loop_depth += depth;
2328 }
2329 for (e = node->indirect_calls; e; e = e->next_callee)
2330 inline_edge_summary (e)->loop_depth += depth;
2331 }
2332
2333 /* Update change_prob of EDGE after INLINED_EDGE has been inlined.
2334 When functoin A is inlined in B and A calls C with parameter that
2335 changes with probability PROB1 and C is known to be passthroug
2336 of argument if B that change with probability PROB2, the probability
2337 of change is now PROB1*PROB2. */
2338
2339 static void
2340 remap_edge_change_prob (struct cgraph_edge *inlined_edge,
2341 struct cgraph_edge *edge)
2342 {
2343 if (ipa_node_params_vector)
2344 {
2345 int i;
2346 struct ipa_edge_args *args = IPA_EDGE_REF (edge);
2347 struct inline_edge_summary *es = inline_edge_summary (edge);
2348 struct inline_edge_summary *inlined_es
2349 = inline_edge_summary (inlined_edge);
2350
2351 for (i = 0; i < ipa_get_cs_argument_count (args); i++)
2352 {
2353 struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, i);
2354 if (jfunc->type == IPA_JF_PASS_THROUGH
2355 && (jfunc->value.pass_through.formal_id
2356 < VEC_length (inline_param_summary_t,
2357 inlined_es->param)))
2358 {
2359 int prob1 = VEC_index (inline_param_summary_t,
2360 es->param, i)->change_prob;
2361 int prob2 = VEC_index
2362 (inline_param_summary_t,
2363 inlined_es->param,
2364 jfunc->value.pass_through.formal_id)->change_prob;
2365 int prob = ((prob1 * prob2 + REG_BR_PROB_BASE / 2)
2366 / REG_BR_PROB_BASE);
2367
2368 if (prob1 && prob2 && !prob)
2369 prob = 1;
2370
2371 VEC_index (inline_param_summary_t,
2372 es->param, i)->change_prob = prob;
2373 }
2374 }
2375 }
2376 }
2377
2378 /* Update edge summaries of NODE after INLINED_EDGE has been inlined.
2379
2380 Remap predicates of callees of NODE. Rest of arguments match
2381 remap_predicate.
2382
2383 Also update change probabilities. */
2384
2385 static void
2386 remap_edge_summaries (struct cgraph_edge *inlined_edge,
2387 struct cgraph_node *node,
2388 struct inline_summary *info,
2389 struct inline_summary *callee_info,
2390 VEC (int, heap) *operand_map,
2391 clause_t possible_truths,
2392 struct predicate *toplev_predicate)
2393 {
2394 struct cgraph_edge *e;
2395 for (e = node->callees; e; e = e->next_callee)
2396 {
2397 struct inline_edge_summary *es = inline_edge_summary (e);
2398 struct predicate p;
2399
2400 if (e->inline_failed)
2401 {
2402 remap_edge_change_prob (inlined_edge, e);
2403
2404 if (es->predicate)
2405 {
2406 p = remap_predicate (info, callee_info,
2407 es->predicate, operand_map, possible_truths,
2408 toplev_predicate);
2409 edge_set_predicate (e, &p);
2410 /* TODO: We should remove the edge for code that will be
2411 optimized out, but we need to keep verifiers and tree-inline
2412 happy. Make it cold for now. */
2413 if (false_predicate_p (&p))
2414 {
2415 e->count = 0;
2416 e->frequency = 0;
2417 }
2418 }
2419 else
2420 edge_set_predicate (e, toplev_predicate);
2421 }
2422 else
2423 remap_edge_summaries (inlined_edge, e->callee, info, callee_info,
2424 operand_map, possible_truths, toplev_predicate);
2425 }
2426 for (e = node->indirect_calls; e; e = e->next_callee)
2427 {
2428 struct inline_edge_summary *es = inline_edge_summary (e);
2429 struct predicate p;
2430
2431 remap_edge_change_prob (inlined_edge, e);
2432 if (es->predicate)
2433 {
2434 p = remap_predicate (info, callee_info,
2435 es->predicate, operand_map, possible_truths,
2436 toplev_predicate);
2437 edge_set_predicate (e, &p);
2438 /* TODO: We should remove the edge for code that will be optimized
2439 out, but we need to keep verifiers and tree-inline happy.
2440 Make it cold for now. */
2441 if (false_predicate_p (&p))
2442 {
2443 e->count = 0;
2444 e->frequency = 0;
2445 }
2446 }
2447 else
2448 edge_set_predicate (e, toplev_predicate);
2449 }
2450 }
2451
2452
2453 /* We inlined EDGE. Update summary of the function we inlined into. */
2454
2455 void
2456 inline_merge_summary (struct cgraph_edge *edge)
2457 {
2458 struct inline_summary *callee_info = inline_summary (edge->callee);
2459 struct cgraph_node *to = (edge->caller->global.inlined_to
2460 ? edge->caller->global.inlined_to : edge->caller);
2461 struct inline_summary *info = inline_summary (to);
2462 clause_t clause = 0; /* not_inline is known to be false. */
2463 size_time_entry *e;
2464 VEC (int, heap) *operand_map = NULL;
2465 int i;
2466 struct predicate toplev_predicate;
2467 struct predicate true_p = true_predicate ();
2468 struct inline_edge_summary *es = inline_edge_summary (edge);
2469
2470 if (es->predicate)
2471 toplev_predicate = *es->predicate;
2472 else
2473 toplev_predicate = true_predicate ();
2474
2475 if (ipa_node_params_vector && callee_info->conds)
2476 {
2477 struct ipa_edge_args *args = IPA_EDGE_REF (edge);
2478 int count = ipa_get_cs_argument_count (args);
2479 int i;
2480
2481 clause = evaluate_conditions_for_edge (edge, true);
2482 if (count)
2483 VEC_safe_grow_cleared (int, heap, operand_map, count);
2484 for (i = 0; i < count; i++)
2485 {
2486 struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, i);
2487 int map = -1;
2488 /* TODO: handle non-NOPs when merging. */
2489 if (jfunc->type == IPA_JF_PASS_THROUGH
2490 && jfunc->value.pass_through.operation == NOP_EXPR)
2491 map = jfunc->value.pass_through.formal_id;
2492 VEC_replace (int, operand_map, i, map);
2493 gcc_assert (map < ipa_get_param_count (IPA_NODE_REF (to)));
2494 }
2495 }
2496 for (i = 0; VEC_iterate (size_time_entry, callee_info->entry, i, e); i++)
2497 {
2498 struct predicate p = remap_predicate (info, callee_info,
2499 &e->predicate, operand_map, clause,
2500 &toplev_predicate);
2501 if (!false_predicate_p (&p))
2502 {
2503 gcov_type add_time = ((gcov_type)e->time * edge->frequency
2504 + CGRAPH_FREQ_BASE / 2) / CGRAPH_FREQ_BASE;
2505 int prob = predicate_probability (callee_info->conds,
2506 &e->predicate,
2507 clause, es->param);
2508 add_time = add_time * prob / REG_BR_PROB_BASE;
2509 if (add_time > MAX_TIME * INLINE_TIME_SCALE)
2510 add_time = MAX_TIME * INLINE_TIME_SCALE;
2511 if (prob != REG_BR_PROB_BASE
2512 && dump_file && (dump_flags & TDF_DETAILS))
2513 {
2514 fprintf (dump_file, "\t\tScaling time by probability:%f\n",
2515 (double)prob / REG_BR_PROB_BASE);
2516 }
2517 account_size_time (info, e->size, add_time, &p);
2518 }
2519 }
2520 remap_edge_summaries (edge, edge->callee, info, callee_info, operand_map,
2521 clause, &toplev_predicate);
2522 info->size = 0;
2523 info->time = 0;
2524 for (i = 0; VEC_iterate (size_time_entry, info->entry, i, e); i++)
2525 info->size += e->size, info->time += e->time;
2526 estimate_calls_size_and_time (to, &info->size, &info->time,
2527 ~(clause_t)(1 << predicate_false_condition));
2528
2529 inline_update_callee_summaries (edge->callee,
2530 inline_edge_summary (edge)->loop_depth);
2531
2532 /* We do not maintain predicates of inlined edges, free it. */
2533 edge_set_predicate (edge, &true_p);
2534 /* Similarly remove param summaries. */
2535 VEC_free (inline_param_summary_t, heap, es->param);
2536
2537 info->time = (info->time + INLINE_TIME_SCALE / 2) / INLINE_TIME_SCALE;
2538 info->size = (info->size + INLINE_SIZE_SCALE / 2) / INLINE_SIZE_SCALE;
2539 }
2540
2541
2542 /* Estimate the time cost for the caller when inlining EDGE.
2543 Only to be called via estimate_edge_time, that handles the
2544 caching mechanism.
2545
2546 When caching, also update the cache entry. Compute both time and
2547 size, since we always need both metrics eventually. */
2548
2549 int
2550 do_estimate_edge_time (struct cgraph_edge *edge)
2551 {
2552 int time;
2553 int size;
2554 gcov_type ret;
2555 struct inline_edge_summary *es = inline_edge_summary (edge);
2556
2557 gcc_checking_assert (edge->inline_failed);
2558 estimate_node_size_and_time (cgraph_function_or_thunk_node (edge->callee,
2559 NULL),
2560 evaluate_conditions_for_edge (edge, true),
2561 &size, &time, es->param);
2562
2563 ret = (((gcov_type)time
2564 - es->call_stmt_time) * edge->frequency
2565 + CGRAPH_FREQ_BASE / 2) / CGRAPH_FREQ_BASE;
2566
2567 /* When caching, update the cache entry. */
2568 if (edge_growth_cache)
2569 {
2570 int ret_size;
2571 if ((int)VEC_length (edge_growth_cache_entry, edge_growth_cache)
2572 <= edge->uid)
2573 VEC_safe_grow_cleared (edge_growth_cache_entry, heap, edge_growth_cache,
2574 cgraph_edge_max_uid);
2575 VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid)->time
2576 = ret + (ret >= 0);
2577
2578 ret_size = size - es->call_stmt_size;
2579 gcc_checking_assert (es->call_stmt_size);
2580 VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid)->size
2581 = ret_size + (ret_size >= 0);
2582 }
2583 return ret;
2584 }
2585
2586
2587 /* Estimate the growth of the caller when inlining EDGE.
2588 Only to be called via estimate_edge_size. */
2589
2590 int
2591 do_estimate_edge_growth (struct cgraph_edge *edge)
2592 {
2593 int size;
2594 struct cgraph_node *callee;
2595
2596 /* When we do caching, use do_estimate_edge_time to populate the entry. */
2597
2598 if (edge_growth_cache)
2599 {
2600 do_estimate_edge_time (edge);
2601 size = VEC_index (edge_growth_cache_entry,
2602 edge_growth_cache,
2603 edge->uid)->size;
2604 gcc_checking_assert (size);
2605 return size - (size > 0);
2606 }
2607 callee = cgraph_function_or_thunk_node (edge->callee, NULL);
2608
2609 /* Early inliner runs without caching, go ahead and do the dirty work. */
2610 gcc_checking_assert (edge->inline_failed);
2611 estimate_node_size_and_time (callee,
2612 evaluate_conditions_for_edge (edge, true),
2613 &size, NULL, NULL);
2614 gcc_checking_assert (inline_edge_summary (edge)->call_stmt_size);
2615 return size - inline_edge_summary (edge)->call_stmt_size;
2616 }
2617
2618
2619 /* Estimate self time of the function NODE after inlining EDGE. */
2620
2621 int
2622 estimate_time_after_inlining (struct cgraph_node *node,
2623 struct cgraph_edge *edge)
2624 {
2625 struct inline_edge_summary *es = inline_edge_summary (edge);
2626 if (!es->predicate || !false_predicate_p (es->predicate))
2627 {
2628 gcov_type time = inline_summary (node)->time + estimate_edge_time (edge);
2629 if (time < 0)
2630 time = 0;
2631 if (time > MAX_TIME)
2632 time = MAX_TIME;
2633 return time;
2634 }
2635 return inline_summary (node)->time;
2636 }
2637
2638
2639 /* Estimate the size of NODE after inlining EDGE which should be an
2640 edge to either NODE or a call inlined into NODE. */
2641
2642 int
2643 estimate_size_after_inlining (struct cgraph_node *node,
2644 struct cgraph_edge *edge)
2645 {
2646 struct inline_edge_summary *es = inline_edge_summary (edge);
2647 if (!es->predicate || !false_predicate_p (es->predicate))
2648 {
2649 int size = inline_summary (node)->size + estimate_edge_growth (edge);
2650 gcc_assert (size >= 0);
2651 return size;
2652 }
2653 return inline_summary (node)->size;
2654 }
2655
2656
2657 struct growth_data
2658 {
2659 bool self_recursive;
2660 int growth;
2661 };
2662
2663
2664 /* Worker for do_estimate_growth. Collect growth for all callers. */
2665
2666 static bool
2667 do_estimate_growth_1 (struct cgraph_node *node, void *data)
2668 {
2669 struct cgraph_edge *e;
2670 struct growth_data *d = (struct growth_data *) data;
2671
2672 for (e = node->callers; e; e = e->next_caller)
2673 {
2674 gcc_checking_assert (e->inline_failed);
2675
2676 if (e->caller == node
2677 || (e->caller->global.inlined_to
2678 && e->caller->global.inlined_to == node))
2679 d->self_recursive = true;
2680 d->growth += estimate_edge_growth (e);
2681 }
2682 return false;
2683 }
2684
2685
2686 /* Estimate the growth caused by inlining NODE into all callees. */
2687
2688 int
2689 do_estimate_growth (struct cgraph_node *node)
2690 {
2691 struct growth_data d = {0, false};
2692 struct inline_summary *info = inline_summary (node);
2693
2694 cgraph_for_node_and_aliases (node, do_estimate_growth_1, &d, true);
2695
2696 /* For self recursive functions the growth estimation really should be
2697 infinity. We don't want to return very large values because the growth
2698 plays various roles in badness computation fractions. Be sure to not
2699 return zero or negative growths. */
2700 if (d.self_recursive)
2701 d.growth = d.growth < info->size ? info->size : d.growth;
2702 else
2703 {
2704 if (!DECL_EXTERNAL (node->decl)
2705 && cgraph_will_be_removed_from_program_if_no_direct_calls (node))
2706 d.growth -= info->size;
2707 /* COMDAT functions are very often not shared across multiple units
2708 since they come from various template instantiations.
2709 Take this into account. */
2710 else if (DECL_COMDAT (node->decl)
2711 && cgraph_can_remove_if_no_direct_calls_p (node))
2712 d.growth -= (info->size
2713 * (100 - PARAM_VALUE (PARAM_COMDAT_SHARING_PROBABILITY))
2714 + 50) / 100;
2715 }
2716
2717 if (node_growth_cache)
2718 {
2719 if ((int)VEC_length (int, node_growth_cache) <= node->uid)
2720 VEC_safe_grow_cleared (int, heap, node_growth_cache, cgraph_max_uid);
2721 VEC_replace (int, node_growth_cache, node->uid,
2722 d.growth + (d.growth >= 0));
2723 }
2724 return d.growth;
2725 }
2726
2727
2728 /* This function performs intraprocedural analysis in NODE that is required to
2729 inline indirect calls. */
2730
2731 static void
2732 inline_indirect_intraprocedural_analysis (struct cgraph_node *node)
2733 {
2734 ipa_analyze_node (node);
2735 if (dump_file && (dump_flags & TDF_DETAILS))
2736 {
2737 ipa_print_node_params (dump_file, node);
2738 ipa_print_node_jump_functions (dump_file, node);
2739 }
2740 }
2741
2742
2743 /* Note function body size. */
2744
2745 static void
2746 inline_analyze_function (struct cgraph_node *node)
2747 {
2748 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2749 current_function_decl = node->decl;
2750
2751 if (dump_file)
2752 fprintf (dump_file, "\nAnalyzing function: %s/%u\n",
2753 cgraph_node_name (node), node->uid);
2754 if (optimize && !node->thunk.thunk_p)
2755 inline_indirect_intraprocedural_analysis (node);
2756 compute_inline_parameters (node, false);
2757
2758 current_function_decl = NULL;
2759 pop_cfun ();
2760 }
2761
2762
2763 /* Called when new function is inserted to callgraph late. */
2764
2765 static void
2766 add_new_function (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
2767 {
2768 inline_analyze_function (node);
2769 }
2770
2771
2772 /* Note function body size. */
2773
2774 void
2775 inline_generate_summary (void)
2776 {
2777 struct cgraph_node *node;
2778
2779 function_insertion_hook_holder =
2780 cgraph_add_function_insertion_hook (&add_new_function, NULL);
2781
2782 ipa_register_cgraph_hooks ();
2783
2784 FOR_EACH_DEFINED_FUNCTION (node)
2785 if (!node->alias)
2786 inline_analyze_function (node);
2787 }
2788
2789
2790 /* Read predicate from IB. */
2791
2792 static struct predicate
2793 read_predicate (struct lto_input_block *ib)
2794 {
2795 struct predicate out;
2796 clause_t clause;
2797 int k = 0;
2798
2799 do
2800 {
2801 gcc_assert (k <= MAX_CLAUSES);
2802 clause = out.clause[k++] = streamer_read_uhwi (ib);
2803 }
2804 while (clause);
2805
2806 /* Zero-initialize the remaining clauses in OUT. */
2807 while (k <= MAX_CLAUSES)
2808 out.clause[k++] = 0;
2809
2810 return out;
2811 }
2812
2813
2814 /* Write inline summary for edge E to OB. */
2815
2816 static void
2817 read_inline_edge_summary (struct lto_input_block *ib, struct cgraph_edge *e)
2818 {
2819 struct inline_edge_summary *es = inline_edge_summary (e);
2820 struct predicate p;
2821 int length, i;
2822
2823 es->call_stmt_size = streamer_read_uhwi (ib);
2824 es->call_stmt_time = streamer_read_uhwi (ib);
2825 es->loop_depth = streamer_read_uhwi (ib);
2826 p = read_predicate (ib);
2827 edge_set_predicate (e, &p);
2828 length = streamer_read_uhwi (ib);
2829 if (length)
2830 {
2831 VEC_safe_grow_cleared (inline_param_summary_t, heap, es->param, length);
2832 for (i = 0; i < length; i++)
2833 VEC_index (inline_param_summary_t, es->param, i)->change_prob
2834 = streamer_read_uhwi (ib);
2835 }
2836 }
2837
2838
2839 /* Stream in inline summaries from the section. */
2840
2841 static void
2842 inline_read_section (struct lto_file_decl_data *file_data, const char *data,
2843 size_t len)
2844 {
2845 const struct lto_function_header *header =
2846 (const struct lto_function_header *) data;
2847 const int32_t cfg_offset = sizeof (struct lto_function_header);
2848 const int32_t main_offset = cfg_offset + header->cfg_size;
2849 const int32_t string_offset = main_offset + header->main_size;
2850 struct data_in *data_in;
2851 struct lto_input_block ib;
2852 unsigned int i, count2, j;
2853 unsigned int f_count;
2854
2855 LTO_INIT_INPUT_BLOCK (ib, (const char *) data + main_offset, 0,
2856 header->main_size);
2857
2858 data_in =
2859 lto_data_in_create (file_data, (const char *) data + string_offset,
2860 header->string_size, NULL);
2861 f_count = streamer_read_uhwi (&ib);
2862 for (i = 0; i < f_count; i++)
2863 {
2864 unsigned int index;
2865 struct cgraph_node *node;
2866 struct inline_summary *info;
2867 lto_cgraph_encoder_t encoder;
2868 struct bitpack_d bp;
2869 struct cgraph_edge *e;
2870
2871 index = streamer_read_uhwi (&ib);
2872 encoder = file_data->cgraph_node_encoder;
2873 node = lto_cgraph_encoder_deref (encoder, index);
2874 info = inline_summary (node);
2875
2876 info->estimated_stack_size
2877 = info->estimated_self_stack_size = streamer_read_uhwi (&ib);
2878 info->size = info->self_size = streamer_read_uhwi (&ib);
2879 info->time = info->self_time = streamer_read_uhwi (&ib);
2880
2881 bp = streamer_read_bitpack (&ib);
2882 info->inlinable = bp_unpack_value (&bp, 1);
2883
2884 count2 = streamer_read_uhwi (&ib);
2885 gcc_assert (!info->conds);
2886 for (j = 0; j < count2; j++)
2887 {
2888 struct condition c;
2889 c.operand_num = streamer_read_uhwi (&ib);
2890 c.code = (enum tree_code) streamer_read_uhwi (&ib);
2891 c.val = stream_read_tree (&ib, data_in);
2892 VEC_safe_push (condition, gc, info->conds, &c);
2893 }
2894 count2 = streamer_read_uhwi (&ib);
2895 gcc_assert (!info->entry);
2896 for (j = 0; j < count2; j++)
2897 {
2898 struct size_time_entry e;
2899
2900 e.size = streamer_read_uhwi (&ib);
2901 e.time = streamer_read_uhwi (&ib);
2902 e.predicate = read_predicate (&ib);
2903
2904 VEC_safe_push (size_time_entry, gc, info->entry, &e);
2905 }
2906 for (e = node->callees; e; e = e->next_callee)
2907 read_inline_edge_summary (&ib, e);
2908 for (e = node->indirect_calls; e; e = e->next_callee)
2909 read_inline_edge_summary (&ib, e);
2910 }
2911
2912 lto_free_section_data (file_data, LTO_section_inline_summary, NULL, data,
2913 len);
2914 lto_data_in_delete (data_in);
2915 }
2916
2917
2918 /* Read inline summary. Jump functions are shared among ipa-cp
2919 and inliner, so when ipa-cp is active, we don't need to write them
2920 twice. */
2921
2922 void
2923 inline_read_summary (void)
2924 {
2925 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2926 struct lto_file_decl_data *file_data;
2927 unsigned int j = 0;
2928
2929 inline_summary_alloc ();
2930
2931 while ((file_data = file_data_vec[j++]))
2932 {
2933 size_t len;
2934 const char *data = lto_get_section_data (file_data,
2935 LTO_section_inline_summary,
2936 NULL, &len);
2937 if (data)
2938 inline_read_section (file_data, data, len);
2939 else
2940 /* Fatal error here. We do not want to support compiling ltrans units
2941 with different version of compiler or different flags than the WPA
2942 unit, so this should never happen. */
2943 fatal_error ("ipa inline summary is missing in input file");
2944 }
2945 if (optimize)
2946 {
2947 ipa_register_cgraph_hooks ();
2948 if (!flag_ipa_cp)
2949 ipa_prop_read_jump_functions ();
2950 }
2951 function_insertion_hook_holder =
2952 cgraph_add_function_insertion_hook (&add_new_function, NULL);
2953 }
2954
2955
2956 /* Write predicate P to OB. */
2957
2958 static void
2959 write_predicate (struct output_block *ob, struct predicate *p)
2960 {
2961 int j;
2962 if (p)
2963 for (j = 0; p->clause[j]; j++)
2964 {
2965 gcc_assert (j < MAX_CLAUSES);
2966 streamer_write_uhwi (ob, p->clause[j]);
2967 }
2968 streamer_write_uhwi (ob, 0);
2969 }
2970
2971
2972 /* Write inline summary for edge E to OB. */
2973
2974 static void
2975 write_inline_edge_summary (struct output_block *ob, struct cgraph_edge *e)
2976 {
2977 struct inline_edge_summary *es = inline_edge_summary (e);
2978 int i;
2979
2980 streamer_write_uhwi (ob, es->call_stmt_size);
2981 streamer_write_uhwi (ob, es->call_stmt_time);
2982 streamer_write_uhwi (ob, es->loop_depth);
2983 write_predicate (ob, es->predicate);
2984 streamer_write_uhwi (ob, VEC_length (inline_param_summary_t, es->param));
2985 for (i = 0; i < (int)VEC_length (inline_param_summary_t, es->param); i++)
2986 streamer_write_uhwi (ob, VEC_index (inline_param_summary_t,
2987 es->param, i)->change_prob);
2988 }
2989
2990
2991 /* Write inline summary for node in SET.
2992 Jump functions are shared among ipa-cp and inliner, so when ipa-cp is
2993 active, we don't need to write them twice. */
2994
2995 void
2996 inline_write_summary (cgraph_node_set set,
2997 varpool_node_set vset ATTRIBUTE_UNUSED)
2998 {
2999 struct cgraph_node *node;
3000 struct output_block *ob = create_output_block (LTO_section_inline_summary);
3001 lto_cgraph_encoder_t encoder = ob->decl_state->cgraph_node_encoder;
3002 unsigned int count = 0;
3003 int i;
3004
3005 for (i = 0; i < lto_cgraph_encoder_size (encoder); i++)
3006 if (lto_cgraph_encoder_deref (encoder, i)->analyzed)
3007 count++;
3008 streamer_write_uhwi (ob, count);
3009
3010 for (i = 0; i < lto_cgraph_encoder_size (encoder); i++)
3011 {
3012 node = lto_cgraph_encoder_deref (encoder, i);
3013 if (node->analyzed)
3014 {
3015 struct inline_summary *info = inline_summary (node);
3016 struct bitpack_d bp;
3017 struct cgraph_edge *edge;
3018 int i;
3019 size_time_entry *e;
3020 struct condition *c;
3021
3022 streamer_write_uhwi (ob, lto_cgraph_encoder_encode (encoder, node));
3023 streamer_write_hwi (ob, info->estimated_self_stack_size);
3024 streamer_write_hwi (ob, info->self_size);
3025 streamer_write_hwi (ob, info->self_time);
3026 bp = bitpack_create (ob->main_stream);
3027 bp_pack_value (&bp, info->inlinable, 1);
3028 streamer_write_bitpack (&bp);
3029 streamer_write_uhwi (ob, VEC_length (condition, info->conds));
3030 for (i = 0; VEC_iterate (condition, info->conds, i, c); i++)
3031 {
3032 streamer_write_uhwi (ob, c->operand_num);
3033 streamer_write_uhwi (ob, c->code);
3034 stream_write_tree (ob, c->val, true);
3035 }
3036 streamer_write_uhwi (ob, VEC_length (size_time_entry, info->entry));
3037 for (i = 0;
3038 VEC_iterate (size_time_entry, info->entry, i, e);
3039 i++)
3040 {
3041 streamer_write_uhwi (ob, e->size);
3042 streamer_write_uhwi (ob, e->time);
3043 write_predicate (ob, &e->predicate);
3044 }
3045 for (edge = node->callees; edge; edge = edge->next_callee)
3046 write_inline_edge_summary (ob, edge);
3047 for (edge = node->indirect_calls; edge; edge = edge->next_callee)
3048 write_inline_edge_summary (ob, edge);
3049 }
3050 }
3051 streamer_write_char_stream (ob->main_stream, 0);
3052 produce_asm (ob, NULL);
3053 destroy_output_block (ob);
3054
3055 if (optimize && !flag_ipa_cp)
3056 ipa_prop_write_jump_functions (set);
3057 }
3058
3059
3060 /* Release inline summary. */
3061
3062 void
3063 inline_free_summary (void)
3064 {
3065 if (function_insertion_hook_holder)
3066 cgraph_remove_function_insertion_hook (function_insertion_hook_holder);
3067 function_insertion_hook_holder = NULL;
3068 if (node_removal_hook_holder)
3069 cgraph_remove_node_removal_hook (node_removal_hook_holder);
3070 if (edge_removal_hook_holder)
3071 cgraph_remove_edge_removal_hook (edge_removal_hook_holder);
3072 node_removal_hook_holder = NULL;
3073 if (node_duplication_hook_holder)
3074 cgraph_remove_node_duplication_hook (node_duplication_hook_holder);
3075 if (edge_duplication_hook_holder)
3076 cgraph_remove_edge_duplication_hook (edge_duplication_hook_holder);
3077 node_duplication_hook_holder = NULL;
3078 VEC_free (inline_summary_t, gc, inline_summary_vec);
3079 inline_summary_vec = NULL;
3080 VEC_free (inline_edge_summary_t, heap, inline_edge_summary_vec);
3081 inline_edge_summary_vec = NULL;
3082 if (edge_predicate_pool)
3083 free_alloc_pool (edge_predicate_pool);
3084 edge_predicate_pool = 0;
3085 }