OSDN Git Service

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