OSDN Git Service

* trans.h (struct gfc_ss): New field nested_ss.
[pf3gnuchains/gcc-fork.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 * 2 in an
94    integer.  For anything larger we use gcov_type.  */
95 #define MAX_TIME 500000
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                             < (int) 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 /* We are called multiple time for given function; clear
793    data from previous run so they are not cumulated.  */
794
795 static void
796 reset_inline_edge_summary (struct cgraph_edge *e)
797 {
798   if (e->uid
799       < (int)VEC_length (inline_edge_summary_t, inline_edge_summary_vec))
800     {
801       struct inline_edge_summary *es = inline_edge_summary (e);
802
803       es->call_stmt_size = es->call_stmt_time =0;
804       if (es->predicate)
805         pool_free (edge_predicate_pool, es->predicate);
806       es->predicate = NULL;
807       VEC_free (inline_param_summary_t, heap, es->param);
808     }
809 }
810
811 /* We are called multiple time for given function; clear
812    data from previous run so they are not cumulated.  */
813
814 static void
815 reset_inline_summary (struct cgraph_node *node)
816 {
817   struct inline_summary *info = inline_summary (node);
818   struct cgraph_edge *e;
819
820   info->self_size = info->self_time = 0;
821   info->estimated_stack_size = 0;
822   info->estimated_self_stack_size = 0;
823   info->stack_frame_offset = 0;
824   info->size = 0;
825   info->time = 0;
826   VEC_free (condition, gc, info->conds);
827   VEC_free (size_time_entry,gc, info->entry);
828   for (e = node->callees; e; e = e->next_callee)
829     reset_inline_edge_summary (e);
830   for (e = node->indirect_calls; e; e = e->next_callee)
831     reset_inline_edge_summary (e);
832 }
833
834 /* Hook that is called by cgraph.c when a node is removed.  */
835
836 static void
837 inline_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
838 {
839   struct inline_summary *info;
840   if (VEC_length (inline_summary_t, inline_summary_vec)
841       <= (unsigned)node->uid)
842     return;
843   info = inline_summary (node);
844   reset_inline_summary (node);
845   memset (info, 0, sizeof (inline_summary_t));
846 }
847
848
849 /* Hook that is called by cgraph.c when a node is duplicated.  */
850
851 static void
852 inline_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
853                               ATTRIBUTE_UNUSED void *data)
854 {
855   struct inline_summary *info;
856   inline_summary_alloc ();
857   info = inline_summary (dst);
858   memcpy (info, inline_summary (src),
859           sizeof (struct inline_summary));
860   /* TODO: as an optimization, we may avoid copying conditions
861      that are known to be false or true.  */
862   info->conds = VEC_copy (condition, gc, info->conds);
863
864   /* When there are any replacements in the function body, see if we can figure
865      out that something was optimized out.  */
866   if (ipa_node_params_vector && dst->clone.tree_map)
867     {
868       VEC(size_time_entry,gc) *entry = info->entry;
869       /* Use SRC parm info since it may not be copied yet.  */
870       struct ipa_node_params *parms_info = IPA_NODE_REF (src);
871       VEC (tree, heap) *known_vals = NULL;
872       int count = ipa_get_param_count (parms_info);
873       int i,j;
874       clause_t possible_truths;
875       struct predicate true_pred = true_predicate ();
876       size_time_entry *e;
877       int optimized_out_size = 0;
878       gcov_type optimized_out_time = 0;
879       bool inlined_to_p = false;
880       struct cgraph_edge *edge;
881
882       info->entry = 0;
883       VEC_safe_grow_cleared (tree, heap, known_vals, count);
884       for (i = 0; i < count; i++)
885         {
886           tree t = ipa_get_param (parms_info, i);
887           struct ipa_replace_map *r;
888
889           for (j = 0;
890                VEC_iterate (ipa_replace_map_p, dst->clone.tree_map, j, r);
891                j++)
892             {
893               if (r->old_tree == t
894                   && r->replace_p
895                   && !r->ref_p)
896                 {
897                   VEC_replace (tree, known_vals, i, r->new_tree);
898                   break;
899                 }
900             }
901         }
902       possible_truths = evaluate_conditions_for_known_args (dst,
903                                                             false, known_vals);
904       VEC_free (tree, heap, known_vals);
905
906       account_size_time (info, 0, 0, &true_pred);
907
908       /* Remap size_time vectors.
909          Simplify the predicate by prunning out alternatives that are known
910          to be false.
911          TODO: as on optimization, we can also eliminate conditions known
912          to be true.  */
913       for (i = 0; VEC_iterate (size_time_entry, entry, i, e); i++)
914         {
915           struct predicate new_predicate = true_predicate ();
916           for (j = 0; e->predicate.clause[j]; j++)
917             if (!(possible_truths & e->predicate.clause[j]))
918               {
919                 new_predicate = false_predicate ();
920                 break;
921               }
922             else
923               add_clause (info->conds, &new_predicate,
924                           possible_truths & e->predicate.clause[j]);
925           if (false_predicate_p (&new_predicate))
926             {
927               optimized_out_size += e->size;
928               optimized_out_time += e->time;
929             }
930           else
931             account_size_time (info, e->size, e->time, &new_predicate);
932         }
933
934       /* Remap edge predicates with the same simplification as above.
935          Also copy constantness arrays.   */
936       for (edge = dst->callees; edge; edge = edge->next_callee)
937         {
938           struct predicate new_predicate = true_predicate ();
939           struct inline_edge_summary *es = inline_edge_summary (edge);
940
941           if (!edge->inline_failed)
942             inlined_to_p = true;
943           if (!es->predicate)
944             continue;
945           for (j = 0; es->predicate->clause[j]; j++)
946             if (!(possible_truths & es->predicate->clause[j]))
947               {
948                 new_predicate = false_predicate ();
949                 break;
950               }
951             else
952               add_clause (info->conds, &new_predicate,
953                           possible_truths & es->predicate->clause[j]);
954           if (false_predicate_p (&new_predicate)
955               && !false_predicate_p (es->predicate))
956             {
957               optimized_out_size += es->call_stmt_size * INLINE_SIZE_SCALE;
958               optimized_out_time += (es->call_stmt_time
959                                      * (INLINE_TIME_SCALE / CGRAPH_FREQ_BASE)
960                                      * edge->frequency);
961               edge->frequency = 0;
962             }
963           *es->predicate = new_predicate;
964         }
965
966       /* Remap indirect edge predicates with the same simplificaiton as above. 
967          Also copy constantness arrays.   */
968       for (edge = dst->indirect_calls; edge; edge = edge->next_callee)
969         {
970           struct predicate new_predicate = true_predicate ();
971           struct inline_edge_summary *es = inline_edge_summary (edge);
972
973           if (!edge->inline_failed)
974             inlined_to_p = true;
975           if (!es->predicate)
976             continue;
977           for (j = 0; es->predicate->clause[j]; j++)
978             if (!(possible_truths & es->predicate->clause[j]))
979               {
980                 new_predicate = false_predicate ();
981                 break;
982               }
983             else
984               add_clause (info->conds, &new_predicate,
985                           possible_truths & es->predicate->clause[j]);
986           if (false_predicate_p (&new_predicate)
987               && !false_predicate_p (es->predicate))
988             {
989               optimized_out_size += es->call_stmt_size * INLINE_SIZE_SCALE;
990               optimized_out_time += (es->call_stmt_time
991                                      * (INLINE_TIME_SCALE / CGRAPH_FREQ_BASE)
992                                      * edge->frequency);
993               edge->frequency = 0;
994             }
995           *es->predicate = new_predicate;
996         }
997
998       /* If inliner or someone after inliner will ever start producing
999          non-trivial clones, we will get trouble with lack of information
1000          about updating self sizes, because size vectors already contains
1001          sizes of the calees.  */
1002       gcc_assert (!inlined_to_p 
1003                   || (!optimized_out_size && !optimized_out_time));
1004
1005       info->size -= optimized_out_size / INLINE_SIZE_SCALE;
1006       info->self_size -= optimized_out_size / INLINE_SIZE_SCALE;
1007       gcc_assert (info->size > 0);
1008       gcc_assert (info->self_size > 0);
1009
1010       optimized_out_time /= INLINE_TIME_SCALE;
1011       if (optimized_out_time > MAX_TIME)
1012         optimized_out_time = MAX_TIME;
1013       info->time -= optimized_out_time;
1014       info->self_time -= optimized_out_time;
1015       if (info->time < 0)
1016         info->time = 0;
1017       if (info->self_time < 0)
1018         info->self_time = 0;
1019     }
1020   else
1021     info->entry = VEC_copy (size_time_entry, gc, info->entry);
1022 }
1023
1024
1025 /* Hook that is called by cgraph.c when a node is duplicated.  */
1026
1027 static void
1028 inline_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
1029                               ATTRIBUTE_UNUSED void *data)
1030 {
1031   struct inline_edge_summary *info;
1032   struct inline_edge_summary *srcinfo;
1033   inline_summary_alloc ();
1034   info = inline_edge_summary (dst);
1035   srcinfo = inline_edge_summary (src);
1036   memcpy (info, srcinfo,
1037           sizeof (struct inline_edge_summary));
1038   info->predicate = NULL;
1039   edge_set_predicate (dst, srcinfo->predicate);
1040   info->param = VEC_copy (inline_param_summary_t, heap, srcinfo->param);
1041 }
1042
1043
1044 /* Keep edge cache consistent across edge removal.  */
1045
1046 static void
1047 inline_edge_removal_hook (struct cgraph_edge *edge, void *data ATTRIBUTE_UNUSED)
1048 {
1049   if (edge_growth_cache)
1050     reset_edge_growth_cache (edge);
1051   reset_inline_edge_summary (edge);
1052 }
1053
1054
1055 /* Initialize growth caches.  */
1056
1057 void
1058 initialize_growth_caches (void)
1059 {
1060   if (cgraph_edge_max_uid)
1061     VEC_safe_grow_cleared (edge_growth_cache_entry, heap, edge_growth_cache,
1062                            cgraph_edge_max_uid);
1063   if (cgraph_max_uid)
1064     VEC_safe_grow_cleared (int, heap, node_growth_cache, cgraph_max_uid);
1065 }
1066
1067
1068 /* Free growth caches.  */
1069
1070 void
1071 free_growth_caches (void)
1072 {
1073   VEC_free (edge_growth_cache_entry, heap, edge_growth_cache);
1074   edge_growth_cache = 0;
1075   VEC_free (int, heap, node_growth_cache);
1076   node_growth_cache = 0;
1077 }
1078
1079
1080 /* Dump edge summaries associated to NODE and recursively to all clones.
1081    Indent by INDENT.  */
1082
1083 static void
1084 dump_inline_edge_summary (FILE * f, int indent, struct cgraph_node *node,
1085                           struct inline_summary *info)
1086 {
1087   struct cgraph_edge *edge;
1088   for (edge = node->callees; edge; edge = edge->next_callee)
1089     {
1090       struct inline_edge_summary *es = inline_edge_summary (edge);
1091       struct cgraph_node *callee = cgraph_function_or_thunk_node (edge->callee, NULL);
1092       int i;
1093
1094       fprintf (f, "%*s%s/%i %s\n%*s  loop depth:%2i freq:%4i size:%2i time: %2i callee size:%2i stack:%2i",
1095                indent, "", cgraph_node_name (callee),
1096                callee->uid, 
1097                !edge->inline_failed ? "inlined"
1098                : cgraph_inline_failed_string (edge->inline_failed),
1099                indent, "",
1100                es->loop_depth,  
1101                edge->frequency,
1102                es->call_stmt_size,
1103                es->call_stmt_time,
1104                (int)inline_summary (callee)->size / INLINE_SIZE_SCALE,
1105                (int)inline_summary (callee)->estimated_stack_size);
1106
1107       if (es->predicate)
1108         {
1109           fprintf (f, " predicate: ");
1110           dump_predicate (f, info->conds, es->predicate);
1111         }
1112       else
1113           fprintf (f, "\n");
1114       if (es->param)
1115         for (i = 0; i < (int)VEC_length (inline_param_summary_t, es->param);
1116              i++)
1117           {
1118             int prob = VEC_index (inline_param_summary_t,
1119                                   es->param, i)->change_prob;
1120
1121             if (!prob)
1122               fprintf (f, "%*s op%i is compile time invariant\n",
1123                        indent + 2, "", i);
1124             else if (prob != REG_BR_PROB_BASE)
1125               fprintf (f, "%*s op%i change %f%% of time\n", indent + 2, "", i,
1126                        prob * 100.0 / REG_BR_PROB_BASE);
1127           }
1128       if (!edge->inline_failed)
1129         {
1130           fprintf (f, "%*sStack frame offset %i, callee self size %i,"
1131                    " callee size %i\n",
1132                    indent+2, "",
1133                    (int)inline_summary (callee)->stack_frame_offset,
1134                    (int)inline_summary (callee)->estimated_self_stack_size,
1135                    (int)inline_summary (callee)->estimated_stack_size);
1136           dump_inline_edge_summary (f, indent+2, callee, info);
1137         }
1138     }
1139   for (edge = node->indirect_calls; edge; edge = edge->next_callee)
1140     {
1141       struct inline_edge_summary *es = inline_edge_summary (edge);
1142       fprintf (f, "%*sindirect call loop depth:%2i freq:%4i size:%2i"
1143                " time: %2i",
1144                indent, "",
1145                es->loop_depth,  
1146                edge->frequency,
1147                es->call_stmt_size,
1148                es->call_stmt_time);
1149       if (es->predicate)
1150         {
1151           fprintf (f, "predicate: ");
1152           dump_predicate (f, info->conds, es->predicate);
1153         }
1154       else
1155         fprintf (f, "\n");
1156     }
1157 }
1158
1159
1160 void
1161 dump_inline_summary (FILE * f, struct cgraph_node *node)
1162 {
1163   if (node->analyzed)
1164     {
1165       struct inline_summary *s = inline_summary (node);
1166       size_time_entry *e;
1167       int i;
1168       fprintf (f, "Inline summary for %s/%i", cgraph_node_name (node),
1169                node->uid);
1170       if (DECL_DISREGARD_INLINE_LIMITS (node->decl))
1171         fprintf (f, " always_inline");
1172       if (s->inlinable)
1173         fprintf (f, " inlinable");
1174       fprintf (f, "\n  self time:       %i\n",
1175                s->self_time);
1176       fprintf (f, "  global time:     %i\n", s->time);
1177       fprintf (f, "  self size:       %i\n",
1178                s->self_size);
1179       fprintf (f, "  global size:     %i\n", s->size);
1180       fprintf (f, "  self stack:      %i\n",
1181                (int) s->estimated_self_stack_size);
1182       fprintf (f, "  global stack:    %i\n",
1183                (int) s->estimated_stack_size);
1184       for (i = 0;
1185            VEC_iterate (size_time_entry, s->entry, i, e);
1186            i++)
1187         {
1188           fprintf (f, "    size:%f, time:%f, predicate:",
1189                    (double) e->size / INLINE_SIZE_SCALE,
1190                    (double) e->time / INLINE_TIME_SCALE);
1191           dump_predicate (f, s->conds, &e->predicate);
1192         }
1193       fprintf (f, "  calls:\n");
1194       dump_inline_edge_summary (f, 4, node, s);
1195       fprintf (f, "\n");
1196     }
1197 }
1198
1199 DEBUG_FUNCTION void
1200 debug_inline_summary (struct cgraph_node *node)
1201 {
1202   dump_inline_summary (stderr, node);
1203 }
1204
1205 void
1206 dump_inline_summaries (FILE *f)
1207 {
1208   struct cgraph_node *node;
1209
1210   for (node = cgraph_nodes; node; node = node->next)
1211     if (node->analyzed && !node->global.inlined_to)
1212       dump_inline_summary (f, node);
1213 }
1214
1215 /* Give initial reasons why inlining would fail on EDGE.  This gets either
1216    nullified or usually overwritten by more precise reasons later.  */
1217
1218 void
1219 initialize_inline_failed (struct cgraph_edge *e)
1220 {
1221   struct cgraph_node *callee = e->callee;
1222
1223   if (e->indirect_unknown_callee)
1224     e->inline_failed = CIF_INDIRECT_UNKNOWN_CALL;
1225   else if (!callee->analyzed)
1226     e->inline_failed = CIF_BODY_NOT_AVAILABLE;
1227   else if (callee->local.redefined_extern_inline)
1228     e->inline_failed = CIF_REDEFINED_EXTERN_INLINE;
1229   else if (e->call_stmt && gimple_call_cannot_inline_p (e->call_stmt))
1230     e->inline_failed = CIF_MISMATCHED_ARGUMENTS;
1231   else
1232     e->inline_failed = CIF_FUNCTION_NOT_CONSIDERED;
1233 }
1234
1235 /* Callback of walk_aliased_vdefs.  Flags that it has been invoked to the
1236    boolean variable pointed to by DATA.  */
1237
1238 static bool
1239 mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
1240                      void *data)
1241 {
1242   bool *b = (bool *) data;
1243   *b = true;
1244   return true;
1245 }
1246
1247 /* If OP reffers to value of function parameter, return 
1248    the corresponding parameter.  */
1249
1250 static tree
1251 unmodified_parm (gimple stmt, tree op)
1252 {
1253   /* SSA_NAME referring to parm default def?  */
1254   if (TREE_CODE (op) == SSA_NAME
1255       && SSA_NAME_IS_DEFAULT_DEF (op)
1256       && TREE_CODE (SSA_NAME_VAR (op)) == PARM_DECL)
1257     return SSA_NAME_VAR (op);
1258   /* Non-SSA parm reference?  */
1259   if (TREE_CODE (op) == PARM_DECL)
1260     {
1261       bool modified = false;
1262
1263       ao_ref refd;
1264       ao_ref_init (&refd, op);
1265       walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified, &modified,
1266                           NULL);
1267       if (!modified)
1268         return op;
1269     }
1270   /* Assignment from a parameter?  */
1271   if (TREE_CODE (op) == SSA_NAME
1272       && !SSA_NAME_IS_DEFAULT_DEF (op)
1273       && gimple_assign_single_p (SSA_NAME_DEF_STMT (op)))
1274     return unmodified_parm (SSA_NAME_DEF_STMT (op),
1275                             gimple_assign_rhs1 (SSA_NAME_DEF_STMT (op)));
1276   return NULL;
1277 }
1278
1279 /* See if statement might disappear after inlining.
1280    0 - means not eliminated
1281    1 - half of statements goes away
1282    2 - for sure it is eliminated.
1283    We are not terribly sophisticated, basically looking for simple abstraction
1284    penalty wrappers.  */
1285
1286 static int
1287 eliminated_by_inlining_prob (gimple stmt)
1288 {
1289   enum gimple_code code = gimple_code (stmt);
1290
1291   if (!optimize)
1292     return 0;
1293
1294   switch (code)
1295     {
1296       case GIMPLE_RETURN:
1297         return 2;
1298       case GIMPLE_ASSIGN:
1299         if (gimple_num_ops (stmt) != 2)
1300           return 0;
1301
1302         /* Casts of parameters, loads from parameters passed by reference
1303            and stores to return value or parameters are often free after
1304            inlining dua to SRA and further combining.
1305            Assume that half of statements goes away.  */
1306         if (gimple_assign_rhs_code (stmt) == CONVERT_EXPR
1307             || gimple_assign_rhs_code (stmt) == NOP_EXPR
1308             || gimple_assign_rhs_code (stmt) == VIEW_CONVERT_EXPR
1309             || gimple_assign_rhs_class (stmt) == GIMPLE_SINGLE_RHS)
1310           {
1311             tree rhs = gimple_assign_rhs1 (stmt);
1312             tree lhs = gimple_assign_lhs (stmt);
1313             tree inner_rhs = get_base_address (rhs);
1314             tree inner_lhs = get_base_address (lhs);
1315             bool rhs_free = false;
1316             bool lhs_free = false;
1317
1318             if (!inner_rhs)
1319               inner_rhs = rhs;
1320             if (!inner_lhs)
1321               inner_lhs = lhs;
1322
1323             /* Reads of parameter are expected to be free.  */
1324             if (unmodified_parm (stmt, inner_rhs))
1325               rhs_free = true;
1326
1327             /* When parameter is not SSA register because its address is taken
1328                and it is just copied into one, the statement will be completely
1329                free after inlining (we will copy propagate backward).   */
1330             if (rhs_free && is_gimple_reg (lhs))
1331               return 2;
1332
1333             /* Reads of parameters passed by reference
1334                expected to be free (i.e. optimized out after inlining).  */
1335             if (TREE_CODE(inner_rhs) == MEM_REF
1336                 && unmodified_parm (stmt, TREE_OPERAND (inner_rhs, 0)))
1337               rhs_free = true;
1338
1339             /* Copying parameter passed by reference into gimple register is
1340                probably also going to copy propagate, but we can't be quite
1341                sure.  */
1342             if (rhs_free && is_gimple_reg (lhs))
1343               lhs_free = true;
1344            
1345             /* Writes to parameters, parameters passed by value and return value
1346                (either dirrectly or passed via invisible reference) are free.  
1347
1348                TODO: We ought to handle testcase like
1349                struct a {int a,b;};
1350                struct a
1351                retrurnsturct (void)
1352                  {
1353                    struct a a ={1,2};
1354                    return a;
1355                  }
1356
1357                This translate into:
1358
1359                retrurnsturct ()
1360                  {
1361                    int a$b;
1362                    int a$a;
1363                    struct a a;
1364                    struct a D.2739;
1365
1366                  <bb 2>:
1367                    D.2739.a = 1;
1368                    D.2739.b = 2;
1369                    return D.2739;
1370
1371                  }
1372                For that we either need to copy ipa-split logic detecting writes
1373                to return value.  */
1374             if (TREE_CODE (inner_lhs) == PARM_DECL
1375                 || TREE_CODE (inner_lhs) == RESULT_DECL
1376                 || (TREE_CODE(inner_lhs) == MEM_REF
1377                      && (unmodified_parm (stmt, TREE_OPERAND (inner_lhs, 0))
1378                          || (TREE_CODE (TREE_OPERAND (inner_lhs, 0)) == SSA_NAME
1379                              && TREE_CODE (SSA_NAME_VAR
1380                                             (TREE_OPERAND (inner_lhs, 0)))
1381                              == RESULT_DECL))))
1382               lhs_free = true;
1383             if (lhs_free
1384                 && (is_gimple_reg (rhs) || is_gimple_min_invariant (rhs)))
1385               rhs_free = true;
1386             if (lhs_free && rhs_free)
1387               return 1;
1388           }
1389         return 0;
1390       default:
1391         return 0;
1392     }
1393 }
1394
1395
1396 /* If BB ends by a conditional we can turn into predicates, attach corresponding
1397    predicates to the CFG edges.   */
1398
1399 static void
1400 set_cond_stmt_execution_predicate (struct ipa_node_params *info,
1401                                    struct inline_summary *summary,
1402                                    basic_block bb)
1403 {
1404   gimple last;
1405   tree op;
1406   int index;
1407   enum tree_code code, inverted_code;
1408   edge e;
1409   edge_iterator ei;
1410   gimple set_stmt;
1411   tree op2;
1412   tree parm;
1413   tree base;
1414
1415   last = last_stmt (bb);
1416   if (!last
1417       || gimple_code (last) != GIMPLE_COND)
1418     return;
1419   if (!is_gimple_ip_invariant (gimple_cond_rhs (last)))
1420     return;
1421   op = gimple_cond_lhs (last);
1422   /* TODO: handle conditionals like
1423      var = op0 < 4;
1424      if (var != 0).  */
1425   parm = unmodified_parm (last, op);
1426   if (parm)
1427     {
1428       index = ipa_get_param_decl_index (info, parm);
1429       if (index == -1)
1430         return;
1431       code = gimple_cond_code (last);
1432       inverted_code
1433          = invert_tree_comparison (code,
1434                                    HONOR_NANS (TYPE_MODE (TREE_TYPE (op))));
1435
1436       FOR_EACH_EDGE (e, ei, bb->succs)
1437         {
1438           struct predicate p = add_condition (summary,
1439                                               index,
1440                                               e->flags & EDGE_TRUE_VALUE
1441                                               ? code : inverted_code,
1442                                               gimple_cond_rhs (last));
1443           e->aux = pool_alloc (edge_predicate_pool);
1444           *(struct predicate *)e->aux = p;
1445         }
1446     }
1447
1448   if (TREE_CODE (op) != SSA_NAME)
1449     return;
1450   /* Special case
1451      if (builtin_constant_p (op))
1452        constant_code
1453      else
1454        nonconstant_code.
1455      Here we can predicate nonconstant_code.  We can't
1456      really handle constant_code since we have no predicate
1457      for this and also the constant code is not known to be
1458      optimized away when inliner doen't see operand is constant.
1459      Other optimizers might think otherwise.  */
1460   set_stmt = SSA_NAME_DEF_STMT (op);
1461   if (!gimple_call_builtin_p (set_stmt, BUILT_IN_CONSTANT_P)
1462       || gimple_call_num_args (set_stmt) != 1)
1463     return;
1464   op2 = gimple_call_arg (set_stmt, 0);
1465   base = get_base_address (op2);
1466   parm = unmodified_parm (set_stmt, base ? base : op2);
1467   if (!parm)
1468     return;
1469   index = ipa_get_param_decl_index (info, parm);
1470   if (index == -1)
1471     return;
1472   if (gimple_cond_code (last) != NE_EXPR
1473       || !integer_zerop (gimple_cond_rhs (last)))
1474     return;
1475   FOR_EACH_EDGE (e, ei, bb->succs)
1476     if (e->flags & EDGE_FALSE_VALUE)
1477       {
1478         struct predicate p = add_condition (summary,
1479                                             index,
1480                                             IS_NOT_CONSTANT,
1481                                             NULL);
1482         e->aux = pool_alloc (edge_predicate_pool);
1483         *(struct predicate *)e->aux = p;
1484       }
1485 }
1486
1487
1488 /* If BB ends by a switch we can turn into predicates, attach corresponding
1489    predicates to the CFG edges.   */
1490
1491 static void
1492 set_switch_stmt_execution_predicate (struct ipa_node_params *info,
1493                                    struct inline_summary *summary,
1494                                    basic_block bb)
1495 {
1496   gimple last;
1497   tree op;
1498   int index;
1499   edge e;
1500   edge_iterator ei;
1501   size_t n;
1502   size_t case_idx;
1503   tree parm;
1504
1505   last = last_stmt (bb);
1506   if (!last
1507       || gimple_code (last) != GIMPLE_SWITCH)
1508     return;
1509   op = gimple_switch_index (last);
1510   parm = unmodified_parm (last, op);
1511   if (!parm)
1512     return;
1513   index = ipa_get_param_decl_index (info, parm);
1514   if (index == -1)
1515     return;
1516
1517   FOR_EACH_EDGE (e, ei, bb->succs)
1518     {
1519       e->aux = pool_alloc (edge_predicate_pool);
1520       *(struct predicate *)e->aux = false_predicate ();
1521     }
1522   n = gimple_switch_num_labels(last);
1523   for (case_idx = 0; case_idx < n; ++case_idx)
1524     {
1525       tree cl = gimple_switch_label (last, case_idx);
1526       tree min, max;
1527       struct predicate p;
1528
1529       e = find_edge (bb, label_to_block (CASE_LABEL (cl)));
1530       min = CASE_LOW (cl);
1531       max = CASE_HIGH (cl);
1532
1533       /* For default we might want to construct predicate that none
1534          of cases is met, but it is bit hard to do not having negations
1535          of conditionals handy.  */
1536       if (!min && !max)
1537         p = true_predicate ();
1538       else if (!max)
1539         p = add_condition (summary, index,
1540                            EQ_EXPR,
1541                            min);
1542       else
1543         {
1544           struct predicate p1, p2;
1545           p1 = add_condition (summary, index,
1546                               GE_EXPR,
1547                               min);
1548           p2 = add_condition (summary, index,
1549                               LE_EXPR,
1550                               max);
1551           p = and_predicates (summary->conds, &p1, &p2);
1552         }
1553       *(struct predicate *)e->aux
1554         = or_predicates (summary->conds, &p, (struct predicate *)e->aux);
1555     }
1556 }
1557
1558
1559 /* For each BB in NODE attach to its AUX pointer predicate under
1560    which it is executable.  */
1561
1562 static void
1563 compute_bb_predicates (struct cgraph_node *node,
1564                        struct ipa_node_params *parms_info,
1565                        struct inline_summary *summary)
1566 {
1567   struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
1568   bool done = false;
1569   basic_block bb;
1570
1571   FOR_EACH_BB_FN (bb, my_function)
1572     {
1573       set_cond_stmt_execution_predicate (parms_info, summary, bb);
1574       set_switch_stmt_execution_predicate (parms_info, summary, bb);
1575     }
1576
1577   /* Entry block is always executable.  */
1578   ENTRY_BLOCK_PTR_FOR_FUNCTION (my_function)->aux
1579     = pool_alloc (edge_predicate_pool);
1580   *(struct predicate *)ENTRY_BLOCK_PTR_FOR_FUNCTION (my_function)->aux
1581     = true_predicate ();
1582
1583   /* A simple dataflow propagation of predicates forward in the CFG.
1584      TODO: work in reverse postorder.  */
1585   while (!done)
1586     {
1587       done = true;
1588       FOR_EACH_BB_FN (bb, my_function)
1589         {
1590           struct predicate p = false_predicate ();
1591           edge e;
1592           edge_iterator ei;
1593           FOR_EACH_EDGE (e, ei, bb->preds)
1594             {
1595               if (e->src->aux)
1596                 {
1597                   struct predicate this_bb_predicate
1598                      = *(struct predicate *)e->src->aux;
1599                   if (e->aux)
1600                     this_bb_predicate
1601                        = and_predicates (summary->conds, &this_bb_predicate,
1602                                          (struct predicate *)e->aux);
1603                   p = or_predicates (summary->conds, &p, &this_bb_predicate);
1604                   if (true_predicate_p (&p))
1605                     break;
1606                 }
1607             }
1608           if (false_predicate_p (&p))
1609             gcc_assert (!bb->aux);
1610           else
1611             {
1612               if (!bb->aux)
1613                 {
1614                   done = false;
1615                   bb->aux = pool_alloc (edge_predicate_pool);
1616                   *((struct predicate *)bb->aux) = p;
1617                 }
1618               else if (!predicates_equal_p (&p, (struct predicate *)bb->aux))
1619                 {
1620                   done = false;
1621                   *((struct predicate *)bb->aux) = p;
1622                 }
1623             }
1624         }
1625     }
1626 }
1627
1628
1629 /* We keep info about constantness of SSA names.  */
1630
1631 typedef struct predicate predicate_t;
1632 DEF_VEC_O (predicate_t);
1633 DEF_VEC_ALLOC_O (predicate_t, heap);
1634
1635
1636 /* Return predicate specifying when the STMT might have result that is not
1637    a compile time constant.  */
1638
1639 static struct predicate
1640 will_be_nonconstant_predicate (struct ipa_node_params *info,
1641                                struct inline_summary *summary,
1642                                gimple stmt,
1643                                VEC (predicate_t, heap) *nonconstant_names)
1644                               
1645 {
1646   struct predicate p = true_predicate ();
1647   ssa_op_iter iter;
1648   tree use;
1649   struct predicate op_non_const;
1650   bool is_load;
1651
1652   /* What statments might be optimized away
1653      when their arguments are constant
1654      TODO: also trivial builtins.
1655      builtin_constant_p is already handled later.  */
1656   if (gimple_code (stmt) != GIMPLE_ASSIGN
1657       && gimple_code (stmt) != GIMPLE_COND
1658       && gimple_code (stmt) != GIMPLE_SWITCH)
1659     return p;
1660
1661   /* Stores will stay anyway.  */
1662   if (gimple_vdef (stmt))
1663     return p;
1664
1665   is_load = gimple_vuse (stmt) != NULL;
1666
1667   /* Loads can be optimized when the value is known.  */
1668   if (is_load)
1669     {
1670       tree op = gimple_assign_rhs1 (stmt);
1671       tree base = get_base_address (op);
1672       tree parm;
1673
1674       gcc_assert (gimple_assign_single_p (stmt));
1675       if (!base)
1676         return p;
1677       parm = unmodified_parm (stmt, base);
1678       if (!parm )
1679         return p;
1680       if (ipa_get_param_decl_index (info, parm) < 0)
1681         return p;
1682     }
1683
1684   /* See if we understand all operands before we start
1685      adding conditionals.  */
1686   FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1687     {
1688       tree parm = unmodified_parm (stmt, use);
1689       /* For arguments we can build a condition.  */
1690       if (parm && ipa_get_param_decl_index (info, parm) >= 0)
1691         continue;
1692       if (TREE_CODE (use) != SSA_NAME)
1693         return p;
1694       /* If we know when operand is constant,
1695          we still can say something useful.  */
1696       if (!true_predicate_p (VEC_index (predicate_t, nonconstant_names,
1697                                         SSA_NAME_VERSION (use))))
1698         continue;
1699       return p;
1700     }
1701   op_non_const = false_predicate ();
1702   if (is_load)
1703     {
1704       tree parm = unmodified_parm
1705                     (stmt, get_base_address (gimple_assign_rhs1 (stmt)));
1706       p = add_condition (summary,
1707                          ipa_get_param_decl_index (info, parm),
1708                          CHANGED, NULL);
1709       op_non_const = or_predicates (summary->conds, &p, &op_non_const);
1710     }
1711   FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
1712     {
1713       tree parm = unmodified_parm (stmt, use);
1714       if (parm && ipa_get_param_decl_index (info, parm) >= 0)
1715         p = add_condition (summary,
1716                            ipa_get_param_decl_index (info, parm),
1717                            CHANGED, NULL);
1718       else
1719         p = *VEC_index (predicate_t, nonconstant_names,
1720                         SSA_NAME_VERSION (use));
1721       op_non_const = or_predicates (summary->conds, &p, &op_non_const);
1722     }
1723   if (gimple_code (stmt) == GIMPLE_ASSIGN
1724       && TREE_CODE (gimple_assign_lhs (stmt)) == SSA_NAME)
1725     VEC_replace (predicate_t, nonconstant_names,
1726                  SSA_NAME_VERSION (gimple_assign_lhs (stmt)), &op_non_const);
1727   return op_non_const;
1728 }
1729
1730 struct record_modified_bb_info
1731 {
1732   bitmap bb_set;
1733   gimple stmt;
1734 };
1735
1736 /* Callback of walk_aliased_vdefs.  Records basic blocks where the value may be
1737    set except for info->stmt.  */
1738
1739 static bool
1740 record_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef,
1741                  void *data)
1742 {
1743   struct record_modified_bb_info *info = (struct record_modified_bb_info *) data;
1744   if (SSA_NAME_DEF_STMT (vdef) == info->stmt)
1745     return false;
1746   bitmap_set_bit (info->bb_set,
1747                   SSA_NAME_IS_DEFAULT_DEF (vdef)
1748                   ? ENTRY_BLOCK_PTR->index : gimple_bb (SSA_NAME_DEF_STMT (vdef))->index);
1749   return false;
1750 }
1751
1752 /* Return probability (based on REG_BR_PROB_BASE) that I-th parameter of STMT
1753    will change since last invocation of STMT. 
1754
1755    Value 0 is reserved for compile time invariants.
1756    For common parameters it is REG_BR_PROB_BASE.  For loop invariants it
1757    ought to be REG_BR_PROB_BASE / estimated_iters.  */
1758
1759 static int
1760 param_change_prob (gimple stmt, int i)
1761 {
1762   tree op = gimple_call_arg (stmt, i);
1763   basic_block bb = gimple_bb (stmt);
1764   tree base;
1765
1766   if (is_gimple_min_invariant (op))
1767     return 0;
1768   /* We would have to do non-trivial analysis to really work out what
1769      is the probability of value to change (i.e. when init statement
1770      is in a sibling loop of the call). 
1771
1772      We do an conservative estimate: when call is executed N times more often
1773      than the statement defining value, we take the frequency 1/N.  */
1774   if (TREE_CODE (op) == SSA_NAME)
1775     {
1776       int init_freq;
1777
1778       if (!bb->frequency)
1779         return REG_BR_PROB_BASE;
1780
1781       if (SSA_NAME_IS_DEFAULT_DEF (op))
1782         init_freq = ENTRY_BLOCK_PTR->frequency;
1783       else
1784         init_freq = gimple_bb (SSA_NAME_DEF_STMT (op))->frequency;
1785
1786       if (!init_freq)
1787         init_freq = 1;
1788       if (init_freq < bb->frequency)
1789         return MAX ((init_freq * REG_BR_PROB_BASE +
1790                     bb->frequency / 2) / bb->frequency, 1);
1791       else
1792         return REG_BR_PROB_BASE;
1793     }
1794
1795   base = get_base_address (op);
1796   if (base)
1797     {
1798       ao_ref refd;
1799       int max;
1800       struct record_modified_bb_info info;
1801       bitmap_iterator bi;
1802       unsigned index;
1803
1804       if (const_value_known_p (base))
1805         return 0;
1806       if (!bb->frequency)
1807         return REG_BR_PROB_BASE;
1808       ao_ref_init (&refd, op);
1809       info.stmt = stmt;
1810       info.bb_set = BITMAP_ALLOC (NULL);
1811       walk_aliased_vdefs (&refd, gimple_vuse (stmt), record_modified, &info,
1812                           NULL);
1813       if (bitmap_bit_p (info.bb_set, bb->index))
1814         {
1815           BITMAP_FREE (info.bb_set);
1816           return REG_BR_PROB_BASE;
1817         }
1818
1819       /* Assume that every memory is initialized at entry.
1820          TODO: Can we easilly determine if value is always defined
1821          and thus we may skip entry block?  */
1822       if (ENTRY_BLOCK_PTR->frequency)
1823         max = ENTRY_BLOCK_PTR->frequency;
1824       else
1825         max = 1;
1826
1827       EXECUTE_IF_SET_IN_BITMAP (info.bb_set, 0, index, bi)
1828         max = MIN (max, BASIC_BLOCK (index)->frequency);
1829       
1830       BITMAP_FREE (info.bb_set);
1831       if (max < bb->frequency)
1832         return MAX ((max * REG_BR_PROB_BASE +
1833                      bb->frequency / 2) / bb->frequency, 1);
1834       else
1835         return REG_BR_PROB_BASE;
1836     }
1837   return REG_BR_PROB_BASE;
1838 }
1839
1840
1841 /* Compute function body size parameters for NODE.
1842    When EARLY is true, we compute only simple summaries without
1843    non-trivial predicates to drive the early inliner.  */
1844
1845 static void
1846 estimate_function_body_sizes (struct cgraph_node *node, bool early)
1847 {
1848   gcov_type time = 0;
1849   /* Estimate static overhead for function prologue/epilogue and alignment. */
1850   int size = 2;
1851   /* Benefits are scaled by probability of elimination that is in range
1852      <0,2>.  */
1853   basic_block bb;
1854   gimple_stmt_iterator bsi;
1855   struct function *my_function = DECL_STRUCT_FUNCTION (node->decl);
1856   int freq;
1857   struct inline_summary *info = inline_summary (node);
1858   struct predicate bb_predicate;
1859   struct ipa_node_params *parms_info = NULL;
1860   VEC (predicate_t, heap) *nonconstant_names = NULL;
1861
1862   if (ipa_node_params_vector && !early && optimize)
1863     {
1864       parms_info = IPA_NODE_REF (node);
1865       VEC_safe_grow_cleared (predicate_t, heap, nonconstant_names,
1866                              VEC_length (tree, SSANAMES (my_function)));
1867     }
1868
1869   info->conds = 0;
1870   info->entry = 0;
1871
1872
1873   if (dump_file)
1874     fprintf (dump_file, "\nAnalyzing function body size: %s\n",
1875              cgraph_node_name (node));
1876
1877   /* When we run into maximal number of entries, we assign everything to the
1878      constant truth case.  Be sure to have it in list. */
1879   bb_predicate = true_predicate ();
1880   account_size_time (info, 0, 0, &bb_predicate);
1881
1882   bb_predicate = not_inlined_predicate ();
1883   account_size_time (info, 2 * INLINE_SIZE_SCALE, 0, &bb_predicate);
1884
1885   gcc_assert (my_function && my_function->cfg);
1886   if (parms_info)
1887     compute_bb_predicates (node, parms_info, info);
1888   FOR_EACH_BB_FN (bb, my_function)
1889     {
1890       freq = compute_call_stmt_bb_frequency (node->decl, bb);
1891
1892       /* TODO: Obviously predicates can be propagated down across CFG.  */
1893       if (parms_info)
1894         {
1895           if (bb->aux)
1896             bb_predicate = *(struct predicate *)bb->aux;
1897           else
1898             bb_predicate = false_predicate ();
1899         }
1900       else
1901         bb_predicate = true_predicate ();
1902
1903       if (dump_file && (dump_flags & TDF_DETAILS))
1904         {
1905           fprintf (dump_file, "\n BB %i predicate:", bb->index);
1906           dump_predicate (dump_file, info->conds, &bb_predicate);
1907         }
1908       
1909       for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))
1910         {
1911           gimple stmt = gsi_stmt (bsi);
1912           int this_size = estimate_num_insns (stmt, &eni_size_weights);
1913           int this_time = estimate_num_insns (stmt, &eni_time_weights);
1914           int prob;
1915           struct predicate will_be_nonconstant;
1916
1917           if (dump_file && (dump_flags & TDF_DETAILS))
1918             {
1919               fprintf (dump_file, "  ");
1920               print_gimple_stmt (dump_file, stmt, 0, 0);
1921               fprintf (dump_file, "\t\tfreq:%3.2f size:%3i time:%3i\n",
1922                        ((double)freq)/CGRAPH_FREQ_BASE, this_size, this_time);
1923             }
1924
1925           if (is_gimple_call (stmt))
1926             {
1927               struct cgraph_edge *edge = cgraph_edge (node, stmt);
1928               struct inline_edge_summary *es = inline_edge_summary (edge);
1929
1930               /* Special case: results of BUILT_IN_CONSTANT_P will be always
1931                  resolved as constant.  We however don't want to optimize
1932                  out the cgraph edges.  */
1933               if (nonconstant_names
1934                   && gimple_call_builtin_p (stmt, BUILT_IN_CONSTANT_P)
1935                   && gimple_call_lhs (stmt)
1936                   && TREE_CODE (gimple_call_lhs (stmt)) == SSA_NAME)
1937                 {
1938                   struct predicate false_p = false_predicate ();
1939                   VEC_replace (predicate_t, nonconstant_names,
1940                                SSA_NAME_VERSION (gimple_call_lhs (stmt)),
1941                                &false_p);
1942                 }
1943               if (ipa_node_params_vector)
1944                 {
1945                   int count = gimple_call_num_args (stmt);
1946                   int i;
1947
1948                   if (count)
1949                     VEC_safe_grow_cleared (inline_param_summary_t, heap,
1950                                            es->param, count);
1951                   for (i = 0; i < count; i++)
1952                     {
1953                       int prob = param_change_prob (stmt, i);
1954                       gcc_assert (prob >= 0 && prob <= REG_BR_PROB_BASE);
1955                       VEC_index (inline_param_summary_t,
1956                                  es->param, i)->change_prob = prob;
1957                     }
1958                 }
1959
1960               es->call_stmt_size = this_size;
1961               es->call_stmt_time = this_time;
1962               es->loop_depth = bb->loop_depth;
1963               edge_set_predicate (edge, &bb_predicate);
1964
1965               /* Do not inline calls where we cannot triviall work around
1966                  mismatches in argument or return types.  */
1967               if (edge->callee
1968                   && cgraph_function_or_thunk_node (edge->callee, NULL)
1969                   && !gimple_check_call_matching_types
1970                        (stmt, cgraph_function_or_thunk_node (edge->callee,
1971                         NULL)->decl))
1972                 {
1973                   edge->call_stmt_cannot_inline_p = true;
1974                   gimple_call_set_cannot_inline (stmt, true);
1975                 }
1976               else
1977                 gcc_assert (!gimple_call_cannot_inline_p (stmt));
1978             }
1979
1980           /* TODO: When conditional jump or swithc is known to be constant, but
1981              we did not translate it into the predicates, we really can account
1982              just maximum of the possible paths.  */
1983           if (parms_info)
1984             will_be_nonconstant
1985                = will_be_nonconstant_predicate (parms_info, info,
1986                                                 stmt, nonconstant_names);
1987           if (this_time || this_size)
1988             {
1989               struct predicate p;
1990
1991               this_time *= freq;
1992               time += this_time;
1993               size += this_size;
1994
1995               prob = eliminated_by_inlining_prob (stmt);
1996               if (prob == 1 && dump_file && (dump_flags & TDF_DETAILS))
1997                 fprintf (dump_file, "\t\t50%% will be eliminated by inlining\n");
1998               if (prob == 2 && dump_file && (dump_flags & TDF_DETAILS))
1999                 fprintf (dump_file, "\t\tWill be eliminated by inlining\n");
2000
2001               if (parms_info)
2002                 p = and_predicates (info->conds, &bb_predicate,
2003                                     &will_be_nonconstant);
2004               else
2005                 p = true_predicate ();
2006
2007               /* We account everything but the calls.  Calls have their own
2008                  size/time info attached to cgraph edges.  This is neccesary
2009                  in order to make the cost disappear after inlining.  */
2010               if (!is_gimple_call (stmt))
2011                 {
2012                   if (prob)
2013                     {
2014                       struct predicate ip = not_inlined_predicate ();
2015                       ip = and_predicates (info->conds, &ip, &p);
2016                       account_size_time (info, this_size * prob,
2017                                          this_time * prob, &ip);
2018                     }
2019                   if (prob != 2)
2020                     account_size_time (info, this_size * (2 - prob),
2021                                        this_time * (2 - prob), &p);
2022                 }
2023
2024               gcc_assert (time >= 0);
2025               gcc_assert (size >= 0);
2026             }
2027         }
2028     }
2029   FOR_ALL_BB_FN (bb, my_function)
2030     {
2031       edge e;
2032       edge_iterator ei;
2033
2034       if (bb->aux)
2035         pool_free (edge_predicate_pool, bb->aux);
2036       bb->aux = NULL;
2037       FOR_EACH_EDGE (e, ei, bb->succs)
2038         {
2039           if (e->aux)
2040             pool_free (edge_predicate_pool, e->aux);
2041           e->aux = NULL;
2042         }
2043     }
2044   time = (time + CGRAPH_FREQ_BASE / 2) / CGRAPH_FREQ_BASE;
2045   if (time > MAX_TIME)
2046     time = MAX_TIME;
2047   inline_summary (node)->self_time = time;
2048   inline_summary (node)->self_size = size;
2049   VEC_free (predicate_t, heap, nonconstant_names);
2050   if (dump_file)
2051     {
2052       fprintf (dump_file, "\n");
2053       dump_inline_summary (dump_file, node);
2054     }
2055 }
2056
2057
2058 /* Compute parameters of functions used by inliner.
2059    EARLY is true when we compute parameters for the early inliner  */
2060
2061 void
2062 compute_inline_parameters (struct cgraph_node *node, bool early)
2063 {
2064   HOST_WIDE_INT self_stack_size;
2065   struct cgraph_edge *e;
2066   struct inline_summary *info;
2067   tree old_decl = current_function_decl;
2068
2069   gcc_assert (!node->global.inlined_to);
2070
2071   inline_summary_alloc ();
2072
2073   info = inline_summary (node);
2074   reset_inline_summary (node);
2075
2076   /* FIXME: Thunks are inlinable, but tree-inline don't know how to do that.
2077      Once this happen, we will need to more curefully predict call
2078      statement size.  */
2079   if (node->thunk.thunk_p)
2080     {
2081       struct inline_edge_summary *es = inline_edge_summary (node->callees);
2082       struct predicate t = true_predicate ();
2083
2084       info->inlinable = 0;
2085       node->callees->call_stmt_cannot_inline_p = true;
2086       node->local.can_change_signature = false;
2087       es->call_stmt_time = 1;
2088       es->call_stmt_size = 1;
2089       account_size_time (info, 0, 0, &t);
2090       return;
2091     }
2092
2093   /* Even is_gimple_min_invariant rely on current_function_decl.  */
2094   current_function_decl = node->decl;
2095   push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2096
2097   /* Estimate the stack size for the function if we're optimizing.  */
2098   self_stack_size = optimize ? estimated_stack_frame_size (node) : 0;
2099   info->estimated_self_stack_size = self_stack_size;
2100   info->estimated_stack_size = self_stack_size;
2101   info->stack_frame_offset = 0;
2102
2103   /* Can this function be inlined at all?  */
2104   info->inlinable = tree_inlinable_function_p (node->decl);
2105
2106   /* Type attributes can use parameter indices to describe them.  */
2107   if (TYPE_ATTRIBUTES (TREE_TYPE (node->decl)))
2108     node->local.can_change_signature = false;
2109   else
2110     {
2111       /* Otherwise, inlinable functions always can change signature.  */
2112       if (info->inlinable)
2113         node->local.can_change_signature = true;
2114       else
2115         {
2116           /* Functions calling builtin_apply can not change signature.  */
2117           for (e = node->callees; e; e = e->next_callee)
2118             {
2119               tree cdecl = e->callee->decl;
2120               if (DECL_BUILT_IN (cdecl)
2121                   && DECL_BUILT_IN_CLASS (cdecl) == BUILT_IN_NORMAL
2122                   && (DECL_FUNCTION_CODE (cdecl) == BUILT_IN_APPLY_ARGS
2123                       || DECL_FUNCTION_CODE (cdecl) == BUILT_IN_VA_START))
2124                 break;
2125             }
2126           node->local.can_change_signature = !e;
2127         }
2128     }
2129   estimate_function_body_sizes (node, early);
2130
2131   /* Inlining characteristics are maintained by the cgraph_mark_inline.  */
2132   info->time = info->self_time;
2133   info->size = info->self_size;
2134   info->stack_frame_offset = 0;
2135   info->estimated_stack_size = info->estimated_self_stack_size;
2136   current_function_decl = old_decl;
2137   pop_cfun ();
2138 }
2139
2140
2141 /* Compute parameters of functions used by inliner using
2142    current_function_decl.  */
2143
2144 static unsigned int
2145 compute_inline_parameters_for_current (void)
2146 {
2147   compute_inline_parameters (cgraph_get_node (current_function_decl), true);
2148   return 0;
2149 }
2150
2151 struct gimple_opt_pass pass_inline_parameters =
2152 {
2153  {
2154   GIMPLE_PASS,
2155   "inline_param",                       /* name */
2156   NULL,                                 /* gate */
2157   compute_inline_parameters_for_current,/* execute */
2158   NULL,                                 /* sub */
2159   NULL,                                 /* next */
2160   0,                                    /* static_pass_number */
2161   TV_INLINE_HEURISTICS,                 /* tv_id */
2162   0,                                    /* properties_required */
2163   0,                                    /* properties_provided */
2164   0,                                    /* properties_destroyed */
2165   0,                                    /* todo_flags_start */
2166   0                                     /* todo_flags_finish */
2167  }
2168 };
2169
2170
2171 /* Increase SIZE and TIME for size and time needed to handle edge E.  */
2172
2173 static void
2174 estimate_edge_size_and_time (struct cgraph_edge *e, int *size, int *time,
2175                              int prob)
2176 {
2177   struct inline_edge_summary *es = inline_edge_summary (e);
2178   *size += es->call_stmt_size * INLINE_SIZE_SCALE;
2179   *time += (es->call_stmt_time * prob / REG_BR_PROB_BASE
2180             * e->frequency * (INLINE_TIME_SCALE / CGRAPH_FREQ_BASE));
2181   if (*time > MAX_TIME * INLINE_TIME_SCALE)
2182     *time = MAX_TIME * INLINE_TIME_SCALE;
2183 }
2184
2185
2186 /* Increase SIZE and TIME for size and time needed to handle all calls in NODE.  */
2187
2188 static void
2189 estimate_calls_size_and_time (struct cgraph_node *node, int *size, int *time,
2190                               clause_t possible_truths)
2191 {
2192   struct cgraph_edge *e;
2193   for (e = node->callees; e; e = e->next_callee)
2194     {
2195       struct inline_edge_summary *es = inline_edge_summary (e);
2196       if (!es->predicate || evaluate_predicate (es->predicate, possible_truths))
2197         {
2198           if (e->inline_failed)
2199             {
2200               /* Predicates of calls shall not use NOT_CHANGED codes,
2201                  sowe do not need to compute probabilities.  */
2202               estimate_edge_size_and_time (e, size, time, REG_BR_PROB_BASE);
2203             }
2204           else
2205             estimate_calls_size_and_time (e->callee, size, time,
2206                                           possible_truths);
2207         }
2208     }
2209   /* TODO: look for devirtualizing oppurtunities.  */
2210   for (e = node->indirect_calls; e; e = e->next_callee)
2211     {
2212       struct inline_edge_summary *es = inline_edge_summary (e);
2213       if (!es->predicate || evaluate_predicate (es->predicate, possible_truths))
2214         estimate_edge_size_and_time (e, size, time, REG_BR_PROB_BASE);
2215     }
2216 }
2217
2218
2219 /* Estimate size and time needed to execute NODE assuming
2220    POSSIBLE_TRUTHS clause. */
2221
2222 static void
2223 estimate_node_size_and_time (struct cgraph_node *node,
2224                              clause_t possible_truths,
2225                              int *ret_size, int *ret_time,
2226                              VEC (inline_param_summary_t, heap)
2227                                *inline_param_summary)
2228 {
2229   struct inline_summary *info = inline_summary (node);
2230   size_time_entry *e;
2231   int size = 0, time = 0;
2232   int i;
2233
2234   if (dump_file
2235       && (dump_flags & TDF_DETAILS))
2236     {
2237       bool found = false;
2238       fprintf (dump_file, "   Estimating body: %s/%i\n"
2239                           "   Known to be false: ",
2240                cgraph_node_name (node),
2241                node->uid);
2242
2243       for (i = predicate_not_inlined_condition;
2244            i < (predicate_first_dynamic_condition
2245                 + (int)VEC_length (condition, info->conds)); i++)
2246         if (!(possible_truths & (1 << i)))
2247           {
2248             if (found)
2249               fprintf (dump_file, ", ");
2250             found = true;
2251             dump_condition (dump_file, info->conds, i);
2252           }
2253     }
2254
2255   for (i = 0; VEC_iterate (size_time_entry, info->entry, i, e); i++)
2256     if (evaluate_predicate (&e->predicate, possible_truths))
2257       {
2258         size += e->size;
2259         if (!inline_param_summary)
2260           time += e->time;
2261         else
2262           {
2263             int prob = predicate_probability (info->conds,
2264                                               &e->predicate,
2265                                               possible_truths,
2266                                               inline_param_summary);
2267             time += e->time * prob / REG_BR_PROB_BASE;
2268           }
2269                                                  
2270       }
2271
2272   if (time > MAX_TIME * INLINE_TIME_SCALE)
2273     time = MAX_TIME * INLINE_TIME_SCALE;
2274
2275   estimate_calls_size_and_time (node, &size, &time, possible_truths);
2276   time = (time + INLINE_TIME_SCALE / 2) / INLINE_TIME_SCALE;
2277   size = (size + INLINE_SIZE_SCALE / 2) / INLINE_SIZE_SCALE;
2278
2279
2280   if (dump_file
2281       && (dump_flags & TDF_DETAILS))
2282     fprintf (dump_file, "\n   size:%i time:%i\n", size, time);
2283   if (ret_time)
2284     *ret_time = time;
2285   if (ret_size)
2286     *ret_size = size;
2287   return;
2288 }
2289
2290
2291 /* Estimate size and time needed to execute callee of EDGE assuming that
2292    parameters known to be constant at caller of EDGE are propagated.
2293    KNOWN_VALs is a vector of assumed known constant values for parameters.  */
2294
2295 void
2296 estimate_ipcp_clone_size_and_time (struct cgraph_node *node,
2297                                    VEC (tree, heap) *known_vals,
2298                                    int *ret_size, int *ret_time)
2299 {
2300   clause_t clause;
2301
2302   clause = evaluate_conditions_for_known_args (node, false, known_vals);
2303   estimate_node_size_and_time (node, clause, ret_size, ret_time,
2304                                NULL);
2305 }
2306
2307
2308 /* Translate all conditions from callee representation into caller
2309    representation and symbolically evaluate predicate P into new predicate.
2310
2311    INFO is inline_summary of function we are adding predicate into,
2312    CALLEE_INFO is summary of function predicate P is from. OPERAND_MAP is
2313    array giving callee formal IDs the caller formal IDs. POSSSIBLE_TRUTHS is
2314    clausule of all callee conditions that may be true in caller context.
2315    TOPLEV_PREDICATE is predicate under which callee is executed.  */
2316
2317 static struct predicate
2318 remap_predicate (struct inline_summary *info,
2319                  struct inline_summary *callee_info,
2320                  struct predicate *p,
2321                  VEC (int, heap) *operand_map,
2322                  clause_t possible_truths,
2323                  struct predicate *toplev_predicate)
2324 {
2325   int i;
2326   struct predicate out = true_predicate ();
2327
2328   /* True predicate is easy.  */
2329   if (true_predicate_p (p))
2330     return *toplev_predicate;
2331   for (i = 0; p->clause[i]; i++)
2332     {
2333       clause_t clause = p->clause[i];
2334       int cond;
2335       struct predicate clause_predicate = false_predicate ();
2336
2337       gcc_assert (i < MAX_CLAUSES);
2338
2339       for (cond = 0; cond < NUM_CONDITIONS; cond ++)
2340         /* Do we have condition we can't disprove?   */
2341         if (clause & possible_truths & (1 << cond))
2342           {
2343             struct predicate cond_predicate;
2344             /* Work out if the condition can translate to predicate in the
2345                inlined function.  */
2346             if (cond >= predicate_first_dynamic_condition)
2347               {
2348                  struct condition *c;
2349
2350                  c = VEC_index (condition, callee_info->conds,
2351                                 cond - predicate_first_dynamic_condition);
2352                  /* See if we can remap condition operand to caller's operand.
2353                     Otherwise give up.  */
2354                  if (!operand_map
2355                      || (int)VEC_length (int, operand_map) <= c->operand_num
2356                      || VEC_index (int, operand_map, c->operand_num) == -1)
2357                    cond_predicate = true_predicate ();
2358                  else
2359                    cond_predicate = add_condition (info,
2360                                                    VEC_index (int, operand_map,
2361                                                               c->operand_num),
2362                                                    c->code, c->val);
2363               }
2364             /* Fixed conditions remains same, construct single
2365                condition predicate.  */
2366             else
2367               {
2368                 cond_predicate.clause[0] = 1 << cond;
2369                 cond_predicate.clause[1] = 0;
2370               }
2371             clause_predicate = or_predicates (info->conds, &clause_predicate,
2372                                               &cond_predicate);
2373           }
2374       out = and_predicates (info->conds, &out, &clause_predicate);
2375     }
2376   return and_predicates (info->conds, &out, toplev_predicate);
2377 }
2378
2379
2380 /* Update summary information of inline clones after inlining.
2381    Compute peak stack usage.  */
2382
2383 static void
2384 inline_update_callee_summaries (struct cgraph_node *node,
2385                                 int depth)
2386 {
2387   struct cgraph_edge *e;
2388   struct inline_summary *callee_info = inline_summary (node);
2389   struct inline_summary *caller_info = inline_summary (node->callers->caller);
2390   HOST_WIDE_INT peak;
2391
2392   callee_info->stack_frame_offset
2393     = caller_info->stack_frame_offset
2394       + caller_info->estimated_self_stack_size;
2395   peak = callee_info->stack_frame_offset
2396       + callee_info->estimated_self_stack_size;
2397   if (inline_summary (node->global.inlined_to)->estimated_stack_size
2398       < peak)
2399     inline_summary (node->global.inlined_to)->estimated_stack_size = peak;
2400   cgraph_propagate_frequency (node);
2401   for (e = node->callees; e; e = e->next_callee)
2402     {
2403       if (!e->inline_failed)
2404         inline_update_callee_summaries (e->callee, depth);
2405       inline_edge_summary (e)->loop_depth += depth;
2406     }
2407   for (e = node->indirect_calls; e; e = e->next_callee)
2408     inline_edge_summary (e)->loop_depth += depth;
2409 }
2410
2411 /* Update change_prob of EDGE after INLINED_EDGE has been inlined.
2412    When functoin A is inlined in B and A calls C with parameter that
2413    changes with probability PROB1 and C is known to be passthroug
2414    of argument if B that change with probability PROB2, the probability
2415    of change is now PROB1*PROB2.  */
2416
2417 static void
2418 remap_edge_change_prob (struct cgraph_edge *inlined_edge,
2419                         struct cgraph_edge *edge)
2420 {
2421   if (ipa_node_params_vector)
2422     {
2423       int i;
2424       struct ipa_edge_args *args = IPA_EDGE_REF (edge);
2425       struct inline_edge_summary *es = inline_edge_summary (edge);
2426       struct inline_edge_summary *inlined_es
2427                                     = inline_edge_summary (inlined_edge);
2428
2429       for (i = 0; i < ipa_get_cs_argument_count (args); i++)
2430         {
2431           struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, i);
2432           if (jfunc->type == IPA_JF_PASS_THROUGH
2433               && (jfunc->value.pass_through.formal_id
2434                   < (int) VEC_length (inline_param_summary_t,
2435                                       inlined_es->param)))
2436             {
2437               int prob1 = VEC_index (inline_param_summary_t,
2438                                      es->param, i)->change_prob;
2439               int prob2 = VEC_index
2440                              (inline_param_summary_t,
2441                              inlined_es->param,
2442                              jfunc->value.pass_through.formal_id)->change_prob;
2443               int prob = ((prob1 * prob2 + REG_BR_PROB_BASE / 2)
2444                           / REG_BR_PROB_BASE);
2445
2446               if (prob1 && prob2 && !prob)
2447                 prob = 1;
2448
2449               VEC_index (inline_param_summary_t,
2450                          es->param, i)->change_prob = prob;
2451             }
2452         }
2453   }
2454 }
2455
2456 /* Update edge summaries of NODE after INLINED_EDGE has been inlined.
2457
2458    Remap predicates of callees of NODE.  Rest of arguments match
2459    remap_predicate.
2460
2461    Also update change probabilities.  */
2462
2463 static void
2464 remap_edge_summaries  (struct cgraph_edge *inlined_edge,
2465                        struct cgraph_node *node,
2466                        struct inline_summary *info,
2467                        struct inline_summary *callee_info,
2468                        VEC (int, heap) *operand_map,
2469                        clause_t possible_truths,
2470                        struct predicate *toplev_predicate)
2471 {
2472   struct cgraph_edge *e;
2473   for (e = node->callees; e; e = e->next_callee)
2474     {
2475       struct inline_edge_summary *es = inline_edge_summary (e);
2476       struct predicate p;
2477
2478       if (e->inline_failed)
2479         {
2480           remap_edge_change_prob (inlined_edge, e);
2481
2482           if (es->predicate)
2483             {
2484               p = remap_predicate (info, callee_info,
2485                                    es->predicate, operand_map, possible_truths,
2486                                    toplev_predicate);
2487               edge_set_predicate (e, &p);
2488               /* TODO: We should remove the edge for code that will be
2489                  optimized out, but we need to keep verifiers and tree-inline
2490                  happy.  Make it cold for now.  */
2491               if (false_predicate_p (&p))
2492                 {
2493                   e->count = 0;
2494                   e->frequency = 0;
2495                 }
2496             }
2497           else
2498             edge_set_predicate (e, toplev_predicate);
2499         }
2500       else
2501         remap_edge_summaries (inlined_edge, e->callee, info, callee_info,
2502                               operand_map, possible_truths, toplev_predicate);
2503     }
2504   for (e = node->indirect_calls; e; e = e->next_callee)
2505     {
2506       struct inline_edge_summary *es = inline_edge_summary (e);
2507       struct predicate p;
2508
2509       remap_edge_change_prob (inlined_edge, e);
2510       if (es->predicate)
2511         {
2512           p = remap_predicate (info, callee_info,
2513                                es->predicate, operand_map, possible_truths,
2514                                toplev_predicate);
2515           edge_set_predicate (e, &p);
2516           /* TODO: We should remove the edge for code that will be optimized
2517              out, but we need to keep verifiers and tree-inline happy.
2518              Make it cold for now.  */
2519           if (false_predicate_p (&p))
2520             {
2521               e->count = 0;
2522               e->frequency = 0;
2523             }
2524         }
2525       else
2526         edge_set_predicate (e, toplev_predicate);
2527     }
2528 }
2529
2530
2531 /* We inlined EDGE.  Update summary of the function we inlined into.  */
2532
2533 void
2534 inline_merge_summary (struct cgraph_edge *edge)
2535 {
2536   struct inline_summary *callee_info = inline_summary (edge->callee);
2537   struct cgraph_node *to = (edge->caller->global.inlined_to
2538                             ? edge->caller->global.inlined_to : edge->caller);
2539   struct inline_summary *info = inline_summary (to);
2540   clause_t clause = 0;          /* not_inline is known to be false.  */
2541   size_time_entry *e;
2542   VEC (int, heap) *operand_map = NULL;
2543   int i;
2544   struct predicate toplev_predicate;
2545   struct predicate true_p = true_predicate ();
2546   struct inline_edge_summary *es = inline_edge_summary (edge);
2547
2548   if (es->predicate)
2549     toplev_predicate = *es->predicate;
2550   else
2551     toplev_predicate = true_predicate ();
2552
2553   if (ipa_node_params_vector && callee_info->conds)
2554     {
2555       struct ipa_edge_args *args = IPA_EDGE_REF (edge);
2556       int count = ipa_get_cs_argument_count (args);
2557       int i;
2558
2559       clause = evaluate_conditions_for_edge (edge, true);
2560       if (count)
2561         VEC_safe_grow_cleared (int, heap, operand_map, count);
2562       for (i = 0; i < count; i++)
2563         {
2564           struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, i);
2565           int map = -1;
2566           /* TODO: handle non-NOPs when merging.  */
2567           if (jfunc->type == IPA_JF_PASS_THROUGH
2568               && jfunc->value.pass_through.operation == NOP_EXPR)
2569             map = jfunc->value.pass_through.formal_id;
2570           VEC_replace (int, operand_map, i, map);
2571           gcc_assert (map < ipa_get_param_count (IPA_NODE_REF (to)));
2572         }
2573     }
2574   for (i = 0; VEC_iterate (size_time_entry, callee_info->entry, i, e); i++)
2575     {
2576       struct predicate p = remap_predicate (info, callee_info,
2577                                             &e->predicate, operand_map, clause,
2578                                             &toplev_predicate);
2579       if (!false_predicate_p (&p))
2580         {
2581           gcov_type add_time = ((gcov_type)e->time * edge->frequency
2582                                 + CGRAPH_FREQ_BASE / 2) / CGRAPH_FREQ_BASE;
2583           int prob = predicate_probability (callee_info->conds,
2584                                             &e->predicate,
2585                                             clause, es->param);
2586           add_time = add_time * prob / REG_BR_PROB_BASE;
2587           if (add_time > MAX_TIME * INLINE_TIME_SCALE)
2588             add_time = MAX_TIME * INLINE_TIME_SCALE;
2589           if (prob != REG_BR_PROB_BASE
2590               && dump_file && (dump_flags & TDF_DETAILS))
2591             {
2592               fprintf (dump_file, "\t\tScaling time by probability:%f\n",
2593                        (double)prob / REG_BR_PROB_BASE);
2594             }
2595           account_size_time (info, e->size, add_time, &p);
2596         }
2597     }
2598   remap_edge_summaries (edge, edge->callee, info, callee_info, operand_map,
2599                         clause, &toplev_predicate);
2600   info->size = 0;
2601   info->time = 0;
2602   for (i = 0; VEC_iterate (size_time_entry, info->entry, i, e); i++)
2603     info->size += e->size, info->time += e->time;
2604   estimate_calls_size_and_time (to, &info->size, &info->time,
2605                                 ~(clause_t)(1 << predicate_false_condition));
2606
2607   inline_update_callee_summaries (edge->callee,
2608                                   inline_edge_summary (edge)->loop_depth);
2609
2610   /* We do not maintain predicates of inlined edges, free it.  */
2611   edge_set_predicate (edge, &true_p);
2612   /* Similarly remove param summaries.  */
2613   VEC_free (inline_param_summary_t, heap, es->param);
2614
2615   info->time = (info->time + INLINE_TIME_SCALE / 2) / INLINE_TIME_SCALE;
2616   info->size = (info->size + INLINE_SIZE_SCALE / 2) / INLINE_SIZE_SCALE;
2617 }
2618
2619
2620 /* Estimate the time cost for the caller when inlining EDGE.
2621    Only to be called via estimate_edge_time, that handles the
2622    caching mechanism.
2623
2624    When caching, also update the cache entry.  Compute both time and
2625    size, since we always need both metrics eventually.  */
2626
2627 int
2628 do_estimate_edge_time (struct cgraph_edge *edge)
2629 {
2630   int time;
2631   int size;
2632   gcov_type ret;
2633   struct inline_edge_summary *es = inline_edge_summary (edge);
2634
2635   gcc_checking_assert (edge->inline_failed);
2636   estimate_node_size_and_time (cgraph_function_or_thunk_node (edge->callee,
2637                                                               NULL),
2638                                evaluate_conditions_for_edge (edge, true),
2639                                &size, &time, es->param);
2640
2641   ret = (((gcov_type)time
2642            - es->call_stmt_time) * edge->frequency
2643          + CGRAPH_FREQ_BASE / 2) / CGRAPH_FREQ_BASE;
2644
2645   /* When caching, update the cache entry.  */
2646   if (edge_growth_cache)
2647     {
2648       int ret_size;
2649       if ((int)VEC_length (edge_growth_cache_entry, edge_growth_cache)
2650           <= edge->uid)
2651         VEC_safe_grow_cleared (edge_growth_cache_entry, heap, edge_growth_cache,
2652                                cgraph_edge_max_uid);
2653       VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid)->time
2654         = ret + (ret >= 0);
2655
2656       ret_size = size - es->call_stmt_size;
2657       gcc_checking_assert (es->call_stmt_size);
2658       VEC_index (edge_growth_cache_entry, edge_growth_cache, edge->uid)->size
2659         = ret_size + (ret_size >= 0);
2660     }
2661   return ret;
2662 }
2663
2664
2665 /* Estimate the growth of the caller when inlining EDGE.
2666    Only to be called via estimate_edge_size.  */
2667
2668 int
2669 do_estimate_edge_growth (struct cgraph_edge *edge)
2670 {
2671   int size;
2672   struct cgraph_node *callee;
2673
2674   /* When we do caching, use do_estimate_edge_time to populate the entry.  */
2675
2676   if (edge_growth_cache)
2677     {
2678       do_estimate_edge_time (edge);
2679       size = VEC_index (edge_growth_cache_entry,
2680                         edge_growth_cache,
2681                         edge->uid)->size;
2682       gcc_checking_assert (size);
2683       return size - (size > 0);
2684     }
2685   callee = cgraph_function_or_thunk_node (edge->callee, NULL);
2686
2687   /* Early inliner runs without caching, go ahead and do the dirty work.  */
2688   gcc_checking_assert (edge->inline_failed);
2689   estimate_node_size_and_time (callee,
2690                                evaluate_conditions_for_edge (edge, true),
2691                                &size, NULL, NULL);
2692   gcc_checking_assert (inline_edge_summary (edge)->call_stmt_size);
2693   return size - inline_edge_summary (edge)->call_stmt_size;
2694 }
2695
2696
2697 /* Estimate self time of the function NODE after inlining EDGE.  */
2698
2699 int
2700 estimate_time_after_inlining (struct cgraph_node *node,
2701                               struct cgraph_edge *edge)
2702 {
2703   struct inline_edge_summary *es = inline_edge_summary (edge);
2704   if (!es->predicate || !false_predicate_p (es->predicate))
2705     {
2706       gcov_type time = inline_summary (node)->time + estimate_edge_time (edge);
2707       if (time < 0)
2708         time = 0;
2709       if (time > MAX_TIME)
2710         time = MAX_TIME;
2711       return time;
2712     }
2713   return inline_summary (node)->time;
2714 }
2715
2716
2717 /* Estimate the size of NODE after inlining EDGE which should be an
2718    edge to either NODE or a call inlined into NODE.  */
2719
2720 int
2721 estimate_size_after_inlining (struct cgraph_node *node,
2722                               struct cgraph_edge *edge)
2723 {
2724   struct inline_edge_summary *es = inline_edge_summary (edge);
2725   if (!es->predicate || !false_predicate_p (es->predicate))
2726     {
2727       int size = inline_summary (node)->size + estimate_edge_growth (edge);
2728       gcc_assert (size >= 0);
2729       return size;
2730     }
2731   return inline_summary (node)->size;
2732 }
2733
2734
2735 struct growth_data
2736 {
2737   bool self_recursive;
2738   int growth;
2739 };
2740
2741
2742 /* Worker for do_estimate_growth.  Collect growth for all callers.  */
2743
2744 static bool
2745 do_estimate_growth_1 (struct cgraph_node *node, void *data)
2746 {
2747   struct cgraph_edge *e;
2748   struct growth_data *d = (struct growth_data *) data;
2749
2750   for (e = node->callers; e; e = e->next_caller)
2751     {
2752       gcc_checking_assert (e->inline_failed);
2753
2754       if (e->caller == node
2755           || (e->caller->global.inlined_to
2756               && e->caller->global.inlined_to == node))
2757         d->self_recursive = true;
2758       d->growth += estimate_edge_growth (e);
2759     }
2760   return false;
2761 }
2762
2763
2764 /* Estimate the growth caused by inlining NODE into all callees.  */
2765
2766 int
2767 do_estimate_growth (struct cgraph_node *node)
2768 {
2769   struct growth_data d = {0, false};
2770   struct inline_summary *info = inline_summary (node);
2771
2772   cgraph_for_node_and_aliases (node, do_estimate_growth_1, &d, true);
2773
2774   /* For self recursive functions the growth estimation really should be
2775      infinity.  We don't want to return very large values because the growth
2776      plays various roles in badness computation fractions.  Be sure to not
2777      return zero or negative growths. */
2778   if (d.self_recursive)
2779     d.growth = d.growth < info->size ? info->size : d.growth;
2780   else
2781     {
2782       if (!DECL_EXTERNAL (node->decl)
2783           && cgraph_will_be_removed_from_program_if_no_direct_calls (node))
2784         d.growth -= info->size;
2785       /* COMDAT functions are very often not shared across multiple units
2786          since they come from various template instantiations.
2787          Take this into account.  */
2788       else  if (DECL_COMDAT (node->decl)
2789                 && cgraph_can_remove_if_no_direct_calls_p (node))
2790         d.growth -= (info->size
2791                      * (100 - PARAM_VALUE (PARAM_COMDAT_SHARING_PROBABILITY))
2792                      + 50) / 100;
2793     }
2794
2795   if (node_growth_cache)
2796     {
2797       if ((int)VEC_length (int, node_growth_cache) <= node->uid)
2798         VEC_safe_grow_cleared (int, heap, node_growth_cache, cgraph_max_uid);
2799       VEC_replace (int, node_growth_cache, node->uid,
2800                    d.growth + (d.growth >= 0));
2801     }
2802   return d.growth;
2803 }
2804
2805
2806 /* This function performs intraprocedural analysis in NODE that is required to
2807    inline indirect calls.  */
2808
2809 static void
2810 inline_indirect_intraprocedural_analysis (struct cgraph_node *node)
2811 {
2812   ipa_analyze_node (node);
2813   if (dump_file && (dump_flags & TDF_DETAILS))
2814     {
2815       ipa_print_node_params (dump_file, node);
2816       ipa_print_node_jump_functions (dump_file, node);
2817     }
2818 }
2819
2820
2821 /* Note function body size.  */
2822
2823 static void
2824 inline_analyze_function (struct cgraph_node *node)
2825 {
2826   push_cfun (DECL_STRUCT_FUNCTION (node->decl));
2827   current_function_decl = node->decl;
2828
2829   if (dump_file)
2830     fprintf (dump_file, "\nAnalyzing function: %s/%u\n",
2831              cgraph_node_name (node), node->uid);
2832   if (optimize && !node->thunk.thunk_p)
2833     inline_indirect_intraprocedural_analysis (node);
2834   compute_inline_parameters (node, false);
2835
2836   current_function_decl = NULL;
2837   pop_cfun ();
2838 }
2839
2840
2841 /* Called when new function is inserted to callgraph late.  */
2842
2843 static void
2844 add_new_function (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
2845 {
2846   inline_analyze_function (node);
2847 }
2848
2849
2850 /* Note function body size.  */
2851
2852 void
2853 inline_generate_summary (void)
2854 {
2855   struct cgraph_node *node;
2856
2857   function_insertion_hook_holder =
2858       cgraph_add_function_insertion_hook (&add_new_function, NULL);
2859
2860   ipa_register_cgraph_hooks ();
2861   inline_free_summary ();
2862
2863   FOR_EACH_DEFINED_FUNCTION (node)
2864     if (!node->alias)
2865       inline_analyze_function (node);
2866 }
2867
2868
2869 /* Read predicate from IB.  */
2870
2871 static struct predicate
2872 read_predicate (struct lto_input_block *ib)
2873 {
2874   struct predicate out;
2875   clause_t clause;
2876   int k = 0;
2877
2878   do 
2879     {
2880       gcc_assert (k <= MAX_CLAUSES);
2881       clause = out.clause[k++] = streamer_read_uhwi (ib);
2882     }
2883   while (clause);
2884
2885   /* Zero-initialize the remaining clauses in OUT.  */
2886   while (k <= MAX_CLAUSES)
2887     out.clause[k++] = 0;
2888
2889   return out;
2890 }
2891
2892
2893 /* Write inline summary for edge E to OB.  */
2894
2895 static void
2896 read_inline_edge_summary (struct lto_input_block *ib, struct cgraph_edge *e)
2897 {
2898   struct inline_edge_summary *es = inline_edge_summary (e);
2899   struct predicate p;
2900   int length, i;
2901
2902   es->call_stmt_size = streamer_read_uhwi (ib);
2903   es->call_stmt_time = streamer_read_uhwi (ib);
2904   es->loop_depth = streamer_read_uhwi (ib);
2905   p = read_predicate (ib);
2906   edge_set_predicate (e, &p);
2907   length = streamer_read_uhwi (ib);
2908   if (length)
2909     {
2910       VEC_safe_grow_cleared (inline_param_summary_t, heap, es->param, length);
2911       for (i = 0; i < length; i++)
2912         VEC_index (inline_param_summary_t, es->param, i)->change_prob
2913           = streamer_read_uhwi (ib);
2914     }
2915 }
2916
2917
2918 /* Stream in inline summaries from the section.  */
2919
2920 static void
2921 inline_read_section (struct lto_file_decl_data *file_data, const char *data,
2922                      size_t len)
2923 {
2924   const struct lto_function_header *header =
2925     (const struct lto_function_header *) data;
2926   const int32_t cfg_offset = sizeof (struct lto_function_header);
2927   const int32_t main_offset = cfg_offset + header->cfg_size;
2928   const int32_t string_offset = main_offset + header->main_size;
2929   struct data_in *data_in;
2930   struct lto_input_block ib;
2931   unsigned int i, count2, j;
2932   unsigned int f_count;
2933
2934   LTO_INIT_INPUT_BLOCK (ib, (const char *) data + main_offset, 0,
2935                         header->main_size);
2936
2937   data_in =
2938     lto_data_in_create (file_data, (const char *) data + string_offset,
2939                         header->string_size, NULL);
2940   f_count = streamer_read_uhwi (&ib);
2941   for (i = 0; i < f_count; i++)
2942     {
2943       unsigned int index;
2944       struct cgraph_node *node;
2945       struct inline_summary *info;
2946       lto_cgraph_encoder_t encoder;
2947       struct bitpack_d bp;
2948       struct cgraph_edge *e;
2949
2950       index = streamer_read_uhwi (&ib);
2951       encoder = file_data->cgraph_node_encoder;
2952       node = lto_cgraph_encoder_deref (encoder, index);
2953       info = inline_summary (node);
2954
2955       info->estimated_stack_size
2956         = info->estimated_self_stack_size = streamer_read_uhwi (&ib);
2957       info->size = info->self_size = streamer_read_uhwi (&ib);
2958       info->time = info->self_time = streamer_read_uhwi (&ib);
2959
2960       bp = streamer_read_bitpack (&ib);
2961       info->inlinable = bp_unpack_value (&bp, 1);
2962
2963       count2 = streamer_read_uhwi (&ib);
2964       gcc_assert (!info->conds);
2965       for (j = 0; j < count2; j++)
2966         {
2967           struct condition c;
2968           c.operand_num = streamer_read_uhwi (&ib);
2969           c.code = (enum tree_code) streamer_read_uhwi (&ib);
2970           c.val = stream_read_tree (&ib, data_in);
2971           VEC_safe_push (condition, gc, info->conds, &c);
2972         }
2973       count2 = streamer_read_uhwi (&ib);
2974       gcc_assert (!info->entry);
2975       for (j = 0; j < count2; j++)
2976         {
2977           struct size_time_entry e;
2978
2979           e.size = streamer_read_uhwi (&ib);
2980           e.time = streamer_read_uhwi (&ib);
2981           e.predicate = read_predicate (&ib);
2982
2983           VEC_safe_push (size_time_entry, gc, info->entry, &e);
2984         }
2985       for (e = node->callees; e; e = e->next_callee)
2986         read_inline_edge_summary (&ib, e);
2987       for (e = node->indirect_calls; e; e = e->next_callee)
2988         read_inline_edge_summary (&ib, e);
2989     }
2990
2991   lto_free_section_data (file_data, LTO_section_inline_summary, NULL, data,
2992                          len);
2993   lto_data_in_delete (data_in);
2994 }
2995
2996
2997 /* Read inline summary.  Jump functions are shared among ipa-cp
2998    and inliner, so when ipa-cp is active, we don't need to write them
2999    twice.  */
3000
3001 void
3002 inline_read_summary (void)
3003 {
3004   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
3005   struct lto_file_decl_data *file_data;
3006   unsigned int j = 0;
3007
3008   inline_summary_alloc ();
3009
3010   while ((file_data = file_data_vec[j++]))
3011     {
3012       size_t len;
3013       const char *data = lto_get_section_data (file_data,
3014                                                LTO_section_inline_summary,
3015                                                NULL, &len);
3016       if (data)
3017         inline_read_section (file_data, data, len);
3018       else
3019         /* Fatal error here.  We do not want to support compiling ltrans units
3020            with different version of compiler or different flags than the WPA
3021            unit, so this should never happen.  */
3022         fatal_error ("ipa inline summary is missing in input file");
3023     }
3024   if (optimize)
3025     {
3026       ipa_register_cgraph_hooks ();
3027       if (!flag_ipa_cp)
3028         ipa_prop_read_jump_functions ();
3029     }
3030   function_insertion_hook_holder =
3031       cgraph_add_function_insertion_hook (&add_new_function, NULL);
3032 }
3033
3034
3035 /* Write predicate P to OB.  */
3036
3037 static void
3038 write_predicate (struct output_block *ob, struct predicate *p)
3039 {
3040   int j;
3041   if (p)
3042     for (j = 0; p->clause[j]; j++)
3043       {
3044          gcc_assert (j < MAX_CLAUSES);
3045          streamer_write_uhwi (ob, p->clause[j]);
3046       }
3047   streamer_write_uhwi (ob, 0);
3048 }
3049
3050
3051 /* Write inline summary for edge E to OB.  */
3052
3053 static void
3054 write_inline_edge_summary (struct output_block *ob, struct cgraph_edge *e)
3055 {
3056   struct inline_edge_summary *es = inline_edge_summary (e);
3057   int i;
3058
3059   streamer_write_uhwi (ob, es->call_stmt_size);
3060   streamer_write_uhwi (ob, es->call_stmt_time);
3061   streamer_write_uhwi (ob, es->loop_depth);
3062   write_predicate (ob, es->predicate);
3063   streamer_write_uhwi (ob, VEC_length (inline_param_summary_t, es->param));
3064   for (i = 0; i < (int)VEC_length (inline_param_summary_t, es->param); i++)
3065     streamer_write_uhwi (ob, VEC_index (inline_param_summary_t,
3066                                         es->param, i)->change_prob);
3067 }
3068
3069
3070 /* Write inline summary for node in SET.
3071    Jump functions are shared among ipa-cp and inliner, so when ipa-cp is
3072    active, we don't need to write them twice.  */
3073
3074 void
3075 inline_write_summary (cgraph_node_set set,
3076                       varpool_node_set vset ATTRIBUTE_UNUSED)
3077 {
3078   struct cgraph_node *node;
3079   struct output_block *ob = create_output_block (LTO_section_inline_summary);
3080   lto_cgraph_encoder_t encoder = ob->decl_state->cgraph_node_encoder;
3081   unsigned int count = 0;
3082   int i;
3083
3084   for (i = 0; i < lto_cgraph_encoder_size (encoder); i++)
3085     if (lto_cgraph_encoder_deref (encoder, i)->analyzed)
3086       count++;
3087   streamer_write_uhwi (ob, count);
3088
3089   for (i = 0; i < lto_cgraph_encoder_size (encoder); i++)
3090     {
3091       node = lto_cgraph_encoder_deref (encoder, i);
3092       if (node->analyzed)
3093         {
3094           struct inline_summary *info = inline_summary (node);
3095           struct bitpack_d bp;
3096           struct cgraph_edge *edge;
3097           int i;
3098           size_time_entry *e;
3099           struct condition *c;
3100
3101           streamer_write_uhwi (ob, lto_cgraph_encoder_encode (encoder, node));
3102           streamer_write_hwi (ob, info->estimated_self_stack_size);
3103           streamer_write_hwi (ob, info->self_size);
3104           streamer_write_hwi (ob, info->self_time);
3105           bp = bitpack_create (ob->main_stream);
3106           bp_pack_value (&bp, info->inlinable, 1);
3107           streamer_write_bitpack (&bp);
3108           streamer_write_uhwi (ob, VEC_length (condition, info->conds));
3109           for (i = 0; VEC_iterate (condition, info->conds, i, c); i++)
3110             {
3111               streamer_write_uhwi (ob, c->operand_num);
3112               streamer_write_uhwi (ob, c->code);
3113               stream_write_tree (ob, c->val, true);
3114             }
3115           streamer_write_uhwi (ob, VEC_length (size_time_entry, info->entry));
3116           for (i = 0;
3117                VEC_iterate (size_time_entry, info->entry, i, e);
3118                i++)
3119             {
3120               streamer_write_uhwi (ob, e->size);
3121               streamer_write_uhwi (ob, e->time);
3122               write_predicate (ob, &e->predicate);
3123             }
3124           for (edge = node->callees; edge; edge = edge->next_callee)
3125             write_inline_edge_summary (ob, edge);
3126           for (edge = node->indirect_calls; edge; edge = edge->next_callee)
3127             write_inline_edge_summary (ob, edge);
3128         }
3129     }
3130   streamer_write_char_stream (ob->main_stream, 0);
3131   produce_asm (ob, NULL);
3132   destroy_output_block (ob);
3133
3134   if (optimize && !flag_ipa_cp)
3135     ipa_prop_write_jump_functions (set);
3136 }
3137
3138
3139 /* Release inline summary.  */
3140
3141 void
3142 inline_free_summary (void)
3143 {
3144   struct cgraph_node *node;
3145   FOR_EACH_DEFINED_FUNCTION (node)
3146     reset_inline_summary (node);
3147   if (function_insertion_hook_holder)
3148     cgraph_remove_function_insertion_hook (function_insertion_hook_holder);
3149   function_insertion_hook_holder = NULL;
3150   if (node_removal_hook_holder)
3151     cgraph_remove_node_removal_hook (node_removal_hook_holder);
3152   node_removal_hook_holder = NULL;
3153   if (edge_removal_hook_holder)
3154     cgraph_remove_edge_removal_hook (edge_removal_hook_holder);
3155   edge_removal_hook_holder = NULL;
3156   if (node_duplication_hook_holder)
3157     cgraph_remove_node_duplication_hook (node_duplication_hook_holder);
3158   node_duplication_hook_holder = NULL;
3159   if (edge_duplication_hook_holder)
3160     cgraph_remove_edge_duplication_hook (edge_duplication_hook_holder);
3161   edge_duplication_hook_holder = NULL;
3162   VEC_free (inline_summary_t, gc, inline_summary_vec);
3163   inline_summary_vec = NULL;
3164   VEC_free (inline_edge_summary_t, heap, inline_edge_summary_vec);
3165   inline_edge_summary_vec = NULL;
3166   if (edge_predicate_pool)
3167     free_alloc_pool (edge_predicate_pool);
3168   edge_predicate_pool = 0;
3169 }