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