OSDN Git Service

* cgraph.c (dump_cgraph_node): Do not dump inline summaries.
[pf3gnuchains/gcc-fork.git] / gcc / ipa-cp.c
1 /* Interprocedural constant propagation
2    Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011
3    Free Software Foundation, Inc.
4    Contributed by Razya Ladelsky <RAZYA@il.ibm.com>
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 /* Interprocedural constant propagation.  The aim of interprocedural constant
23    propagation (IPCP) is to find which function's argument has the same
24    constant value in each invocation throughout the whole program. For example,
25    consider the following program:
26
27    int g (int y)
28    {
29      printf ("value is %d",y);
30    }
31
32    int f (int x)
33    {
34      g (x);
35    }
36
37    int h (int y)
38    {
39      g (y);
40    }
41
42    void main (void)
43    {
44      f (3);
45      h (3);
46    }
47
48
49    The IPCP algorithm will find that g's formal argument y is always called
50    with the value 3.
51
52    The algorithm used is based on "Interprocedural Constant Propagation", by
53    David Callahan, Keith D Cooper, Ken Kennedy, Linda Torczon, Comp86, pg
54    152-161
55
56    The optimization is divided into three stages:
57
58    First stage - intraprocedural analysis
59    =======================================
60    This phase computes jump_function and modification flags.
61
62    A jump function for a callsite represents the values passed as an actual
63    arguments of a given callsite. There are three types of values:
64    Pass through - the caller's formal parameter is passed as an actual argument.
65    Constant - a constant is passed as an actual argument.
66    Unknown - neither of the above.
67
68    The jump function info, ipa_jump_func, is stored in ipa_edge_args
69    structure (defined in ipa_prop.h and pointed to by cgraph_node->aux)
70    modified_flags are defined in ipa_node_params structure
71    (defined in ipa_prop.h and pointed to by cgraph_edge->aux).
72
73    -ipcp_generate_summary() is the first stage driver.
74
75    Second stage - interprocedural analysis
76    ========================================
77    This phase does the interprocedural constant propagation.
78    It computes lattices for all formal parameters in the program
79    and their value that may be:
80    TOP - unknown.
81    BOTTOM - non constant.
82    CONSTANT - constant value.
83
84    Lattice describing a formal parameter p will have a constant value if all
85    callsites invoking this function have the same constant value passed to p.
86
87    The lattices are stored in ipcp_lattice which is itself in ipa_node_params
88    structure (defined in ipa_prop.h and pointed to by cgraph_edge->aux).
89
90    -ipcp_iterate_stage() is the second stage driver.
91
92    Third phase - transformation of function code
93    ============================================
94    Propagates the constant-valued formals into the function.
95    For each function whose parameters are constants, we create its clone.
96
97    Then we process the clone in two ways:
98    1. We insert an assignment statement 'parameter = const' at the beginning
99       of the cloned function.
100    2. For read-only parameters that do not live in memory, we replace all their
101       uses with the constant.
102
103    We also need to modify some callsites to call the cloned functions instead
104    of the original ones.  For a callsite passing an argument found to be a
105    constant by IPCP, there are two different cases to handle:
106    1. A constant is passed as an argument.  In this case the callsite in the
107       should be redirected to call the cloned callee.
108    2. A parameter (of the caller) passed as an argument (pass through
109       argument).  In such cases both the caller and the callee have clones and
110       only the callsite in the cloned caller is redirected to call to the
111       cloned callee.
112
113    This update is done in two steps: First all cloned functions are created
114    during a traversal of the call graph, during which all callsites are
115    redirected to call the cloned function.  Then the callsites are traversed
116    and many calls redirected back to fit the description above.
117
118    -ipcp_insert_stage() is the third phase driver.
119
120
121    This pass also performs devirtualization - turns virtual calls into direct
122    ones if it can prove that all invocations of the function call the same
123    callee.  This is achieved by building a list of all base types (actually,
124    their BINFOs) that individual parameters can have in an iterative matter
125    just like propagating scalar constants and then examining whether virtual
126    calls which take a parameter as their object fold to the same target for all
127    these types.  If we cannot enumerate all types or there is a type which does
128    not have any BINFO associated with it, cannot_devirtualize of the associated
129    parameter descriptor is set which is an equivalent of BOTTOM lattice value
130    in standard IPA constant propagation.
131 */
132
133 #include "config.h"
134 #include "system.h"
135 #include "coretypes.h"
136 #include "tree.h"
137 #include "target.h"
138 #include "gimple.h"
139 #include "cgraph.h"
140 #include "ipa-prop.h"
141 #include "tree-flow.h"
142 #include "tree-pass.h"
143 #include "flags.h"
144 #include "timevar.h"
145 #include "diagnostic.h"
146 #include "tree-pretty-print.h"
147 #include "tree-dump.h"
148 #include "tree-inline.h"
149 #include "fibheap.h"
150 #include "params.h"
151 #include "ipa-inline.h"
152
153 /* Number of functions identified as candidates for cloning. When not cloning
154    we can simplify iterate stage not forcing it to go through the decision
155    on what is profitable and what not.  */
156 static int n_cloning_candidates;
157
158 /* Maximal count found in program.  */
159 static gcov_type max_count;
160
161 /* Cgraph nodes that has been completely replaced by cloning during iterate
162  * stage and will be removed after ipcp is finished.  */
163 static bitmap dead_nodes;
164
165 static void ipcp_print_profile_data (FILE *);
166 static void ipcp_function_scale_print (FILE *);
167
168 /* Get the original node field of ipa_node_params associated with node NODE.  */
169 static inline struct cgraph_node *
170 ipcp_get_orig_node (struct cgraph_node *node)
171 {
172   return IPA_NODE_REF (node)->ipcp_orig_node;
173 }
174
175 /* Return true if NODE describes a cloned/versioned function.  */
176 static inline bool
177 ipcp_node_is_clone (struct cgraph_node *node)
178 {
179   return (ipcp_get_orig_node (node) != NULL);
180 }
181
182 /* Create ipa_node_params and its data structures for NEW_NODE.  Set ORIG_NODE
183    as the ipcp_orig_node field in ipa_node_params.  */
184 static void
185 ipcp_init_cloned_node (struct cgraph_node *orig_node,
186                        struct cgraph_node *new_node)
187 {
188   gcc_checking_assert (ipa_node_params_vector
189                        && (VEC_length (ipa_node_params_t,
190                                        ipa_node_params_vector)
191                            > (unsigned) cgraph_max_uid));
192   gcc_checking_assert (IPA_NODE_REF (new_node)->params);
193   IPA_NODE_REF (new_node)->ipcp_orig_node = orig_node;
194 }
195
196 /* Return scale for NODE.  */
197 static inline gcov_type
198 ipcp_get_node_scale (struct cgraph_node *node)
199 {
200   return IPA_NODE_REF (node)->count_scale;
201 }
202
203 /* Set COUNT as scale for NODE.  */
204 static inline void
205 ipcp_set_node_scale (struct cgraph_node *node, gcov_type count)
206 {
207   IPA_NODE_REF (node)->count_scale = count;
208 }
209
210 /* Return whether LAT is a constant lattice.  */
211 static inline bool
212 ipcp_lat_is_const (struct ipcp_lattice *lat)
213 {
214   if (lat->type == IPA_CONST_VALUE)
215     return true;
216   else
217     return false;
218 }
219
220 /* Return whether LAT is a constant lattice that ipa-cp can actually insert
221    into the code (i.e. constants excluding member pointers and pointers).  */
222 static inline bool
223 ipcp_lat_is_insertable (struct ipcp_lattice *lat)
224 {
225   return lat->type == IPA_CONST_VALUE;
226 }
227
228 /* Return true if LAT1 and LAT2 are equal.  */
229 static inline bool
230 ipcp_lats_are_equal (struct ipcp_lattice *lat1, struct ipcp_lattice *lat2)
231 {
232   gcc_assert (ipcp_lat_is_const (lat1) && ipcp_lat_is_const (lat2));
233   if (lat1->type != lat2->type)
234     return false;
235
236   if (TREE_CODE (lat1->constant) ==  ADDR_EXPR
237       && TREE_CODE (lat2->constant) ==  ADDR_EXPR
238       && TREE_CODE (TREE_OPERAND (lat1->constant, 0)) == CONST_DECL
239       && TREE_CODE (TREE_OPERAND (lat2->constant, 0)) == CONST_DECL)
240     return operand_equal_p (DECL_INITIAL (TREE_OPERAND (lat1->constant, 0)),
241                             DECL_INITIAL (TREE_OPERAND (lat2->constant, 0)), 0);
242   else
243     return operand_equal_p (lat1->constant, lat2->constant, 0);
244 }
245
246 /* Compute Meet arithmetics:
247    Meet (IPA_BOTTOM, x) = IPA_BOTTOM
248    Meet (IPA_TOP,x) = x
249    Meet (const_a,const_b) = IPA_BOTTOM,  if const_a != const_b.
250    MEET (const_a,const_b) = const_a, if const_a == const_b.*/
251 static void
252 ipa_lattice_meet (struct ipcp_lattice *res, struct ipcp_lattice *lat1,
253                   struct ipcp_lattice *lat2)
254 {
255   if (lat1->type == IPA_BOTTOM || lat2->type == IPA_BOTTOM)
256     {
257       res->type = IPA_BOTTOM;
258       return;
259     }
260   if (lat1->type == IPA_TOP)
261     {
262       res->type = lat2->type;
263       res->constant = lat2->constant;
264       return;
265     }
266   if (lat2->type == IPA_TOP)
267     {
268       res->type = lat1->type;
269       res->constant = lat1->constant;
270       return;
271     }
272   if (!ipcp_lats_are_equal (lat1, lat2))
273     {
274       res->type = IPA_BOTTOM;
275       return;
276     }
277   res->type = lat1->type;
278   res->constant = lat1->constant;
279 }
280
281 /* Return the lattice corresponding to the Ith formal parameter of the function
282    described by INFO.  */
283 static inline struct ipcp_lattice *
284 ipcp_get_lattice (struct ipa_node_params *info, int i)
285 {
286   return &(info->params[i].ipcp_lattice);
287 }
288
289 /* Given the jump function JFUNC, compute the lattice LAT that describes the
290    value coming down the callsite. INFO describes the caller node so that
291    pass-through jump functions can be evaluated.  */
292 static void
293 ipcp_lattice_from_jfunc (struct ipa_node_params *info, struct ipcp_lattice *lat,
294                          struct ipa_jump_func *jfunc)
295 {
296   if (jfunc->type == IPA_JF_CONST)
297     {
298       lat->type = IPA_CONST_VALUE;
299       lat->constant = jfunc->value.constant;
300     }
301   else if (jfunc->type == IPA_JF_PASS_THROUGH)
302     {
303       struct ipcp_lattice *caller_lat;
304       tree cst;
305
306       caller_lat = ipcp_get_lattice (info, jfunc->value.pass_through.formal_id);
307       lat->type = caller_lat->type;
308       if (caller_lat->type != IPA_CONST_VALUE)
309         return;
310       cst = caller_lat->constant;
311
312       if (jfunc->value.pass_through.operation != NOP_EXPR)
313         {
314           tree restype;
315           if (TREE_CODE_CLASS (jfunc->value.pass_through.operation)
316               == tcc_comparison)
317             restype = boolean_type_node;
318           else
319             restype = TREE_TYPE (cst);
320           cst = fold_binary (jfunc->value.pass_through.operation,
321                              restype, cst, jfunc->value.pass_through.operand);
322         }
323       if (!cst || !is_gimple_ip_invariant (cst))
324         lat->type = IPA_BOTTOM;
325       lat->constant = cst;
326     }
327   else if (jfunc->type == IPA_JF_ANCESTOR)
328     {
329       struct ipcp_lattice *caller_lat;
330       tree t;
331
332       caller_lat = ipcp_get_lattice (info, jfunc->value.ancestor.formal_id);
333       lat->type = caller_lat->type;
334       if (caller_lat->type != IPA_CONST_VALUE)
335         return;
336       if (TREE_CODE (caller_lat->constant) != ADDR_EXPR)
337         {
338           /* This can happen when the constant is a NULL pointer.  */
339           lat->type = IPA_BOTTOM;
340           return;
341         }
342       t = TREE_OPERAND (caller_lat->constant, 0);
343       t = build_ref_for_offset (EXPR_LOCATION (t), t,
344                                 jfunc->value.ancestor.offset,
345                                 jfunc->value.ancestor.type, NULL, false);
346       lat->constant = build_fold_addr_expr (t);
347     }
348   else
349     lat->type = IPA_BOTTOM;
350 }
351
352 /* True when OLD_LAT and NEW_LAT values are not the same.  */
353
354 static bool
355 ipcp_lattice_changed (struct ipcp_lattice *old_lat,
356                       struct ipcp_lattice *new_lat)
357 {
358   if (old_lat->type == new_lat->type)
359     {
360       if (!ipcp_lat_is_const (old_lat))
361         return false;
362       if (ipcp_lats_are_equal (old_lat, new_lat))
363         return false;
364     }
365   return true;
366 }
367
368 /* Print all ipcp_lattices of all functions to F.  */
369 static void
370 ipcp_print_all_lattices (FILE * f)
371 {
372   struct cgraph_node *node;
373   int i, count;
374
375   fprintf (f, "\nLattice:\n");
376   for (node = cgraph_nodes; node; node = node->next)
377     {
378       struct ipa_node_params *info;
379
380       if (!node->analyzed)
381         continue;
382       info = IPA_NODE_REF (node);
383       fprintf (f, "  Node: %s:\n", cgraph_node_name (node));
384       count = ipa_get_param_count (info);
385       for (i = 0; i < count; i++)
386         {
387           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
388
389           fprintf (f, "    param [%d]: ", i);
390           if (lat->type == IPA_CONST_VALUE)
391             {
392               tree cst = lat->constant;
393               fprintf (f, "type is CONST ");
394               print_generic_expr (f, cst, 0);
395               if (TREE_CODE (cst) == ADDR_EXPR
396                   && TREE_CODE (TREE_OPERAND (cst, 0)) == CONST_DECL)
397                 {
398                   fprintf (f, " -> ");
399                   print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (cst, 0)),
400                                                        0);
401                 }
402             }
403           else if (lat->type == IPA_TOP)
404             fprintf (f, "type is TOP");
405           else
406             fprintf (f, "type is BOTTOM");
407           if (ipa_param_cannot_devirtualize_p (info, i))
408             fprintf (f, " - cannot_devirtualize set\n");
409           else if (ipa_param_types_vec_empty (info, i))
410             fprintf (f, " - type list empty\n");
411           else
412             fprintf (f, "\n");
413         }
414     }
415 }
416
417 /* Return true if ipcp algorithms would allow cloning NODE.  */
418
419 static bool
420 ipcp_versionable_function_p (struct cgraph_node *node)
421 {
422   struct cgraph_edge *edge;
423
424   /* There are a number of generic reasons functions cannot be versioned.  We
425      also cannot remove parameters if there are type attributes such as fnspec
426      present.  */
427   if (!node->local.versionable
428       || TYPE_ATTRIBUTES (TREE_TYPE (node->decl)))
429     return false;
430
431   /* Removing arguments doesn't work if the function takes varargs
432      or use __builtin_apply_args. */
433   for (edge = node->callees; edge; edge = edge->next_callee)
434     {
435       tree t = edge->callee->decl;
436       if (DECL_BUILT_IN_CLASS (t) == BUILT_IN_NORMAL
437           && (DECL_FUNCTION_CODE (t) == BUILT_IN_APPLY_ARGS
438              || DECL_FUNCTION_CODE (t) == BUILT_IN_VA_START))
439         return false;
440     }
441
442   return true;
443 }
444
445 /* Return true if this NODE is viable candidate for cloning.  */
446 static bool
447 ipcp_cloning_candidate_p (struct cgraph_node *node)
448 {
449   int n_calls = 0;
450   int n_hot_calls = 0;
451   gcov_type direct_call_sum = 0;
452   struct cgraph_edge *e;
453
454   /* We never clone functions that are not visible from outside.
455      FIXME: in future we should clone such functions when they are called with
456      different constants, but current ipcp implementation is not good on this.
457      */
458   if (cgraph_only_called_directly_p (node) || !node->analyzed)
459     return false;
460
461   /* When function address is taken, we are pretty sure it will be called in hidden way.  */
462   if (node->address_taken)
463     {
464       if (dump_file)
465         fprintf (dump_file, "Not considering %s for cloning; address is taken.\n",
466                  cgraph_node_name (node));
467       return false;
468     }
469
470   if (cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE)
471     {
472       if (dump_file)
473         fprintf (dump_file, "Not considering %s for cloning; body is overwritable.\n",
474                  cgraph_node_name (node));
475       return false;
476     }
477   if (!ipcp_versionable_function_p (node))
478     {
479       if (dump_file)
480         fprintf (dump_file, "Not considering %s for cloning; body is not versionable.\n",
481                  cgraph_node_name (node));
482       return false;
483     }
484   for (e = node->callers; e; e = e->next_caller)
485     {
486       direct_call_sum += e->count;
487       n_calls ++;
488       if (cgraph_maybe_hot_edge_p (e))
489         n_hot_calls ++;
490     }
491
492   if (!n_calls)
493     {
494       if (dump_file)
495         fprintf (dump_file, "Not considering %s for cloning; no direct calls.\n",
496                  cgraph_node_name (node));
497       return false;
498     }
499   if (inline_summary (node)->self_size < n_calls)
500     {
501       if (dump_file)
502         fprintf (dump_file, "Considering %s for cloning; code would shrink.\n",
503                  cgraph_node_name (node));
504       return true;
505     }
506
507   if (!flag_ipa_cp_clone)
508     {
509       if (dump_file)
510         fprintf (dump_file, "Not considering %s for cloning; -fipa-cp-clone disabled.\n",
511                  cgraph_node_name (node));
512       return false;
513     }
514
515   if (!optimize_function_for_speed_p (DECL_STRUCT_FUNCTION (node->decl)))
516     {
517       if (dump_file)
518         fprintf (dump_file, "Not considering %s for cloning; optimizing it for size.\n",
519                  cgraph_node_name (node));
520       return false;
521     }
522
523   /* When profile is available and function is hot, propagate into it even if
524      calls seems cold; constant propagation can improve function's speed
525      significantly.  */
526   if (max_count)
527     {
528       if (direct_call_sum > node->count * 90 / 100)
529         {
530           if (dump_file)
531             fprintf (dump_file, "Considering %s for cloning; usually called directly.\n",
532                      cgraph_node_name (node));
533           return true;
534         }
535     }
536   if (!n_hot_calls)
537     {
538       if (dump_file)
539         fprintf (dump_file, "Not considering %s for cloning; no hot calls.\n",
540                  cgraph_node_name (node));
541       return false;
542     }
543   if (dump_file)
544     fprintf (dump_file, "Considering %s for cloning.\n",
545              cgraph_node_name (node));
546   return true;
547 }
548
549 /* Mark parameter with index I of function described by INFO as unsuitable for
550    devirtualization.  Return true if it has already been marked so.  */
551
552 static bool
553 ipa_set_param_cannot_devirtualize (struct ipa_node_params *info, int i)
554 {
555   bool ret = info->params[i].cannot_devirtualize;
556   info->params[i].cannot_devirtualize = true;
557   if (info->params[i].types)
558     VEC_free (tree, heap, info->params[i].types);
559   return ret;
560 }
561
562 /* Initialize ipcp_lattices array.  The lattices corresponding to supported
563    types (integers, real types and Fortran constants defined as const_decls)
564    are initialized to IPA_TOP, the rest of them to IPA_BOTTOM.  */
565 static void
566 ipcp_initialize_node_lattices (struct cgraph_node *node)
567 {
568   int i;
569   struct ipa_node_params *info = IPA_NODE_REF (node);
570   enum ipa_lattice_type type;
571
572   if (ipa_is_called_with_var_arguments (info))
573     type = IPA_BOTTOM;
574   else if (node->local.local)
575     type = IPA_TOP;
576   /* When cloning is allowed, we can assume that externally visible functions
577      are not called.  We will compensate this by cloning later.  */
578   else if (ipcp_cloning_candidate_p (node))
579     type = IPA_TOP, n_cloning_candidates ++;
580   else
581     type = IPA_BOTTOM;
582
583   for (i = 0; i < ipa_get_param_count (info) ; i++)
584     {
585       ipcp_get_lattice (info, i)->type = type;
586       if (type == IPA_BOTTOM)
587         ipa_set_param_cannot_devirtualize (info, i);
588     }
589 }
590
591 /* Build a constant tree with type TREE_TYPE and value according to LAT.
592    Return the tree, or, if it is not possible to convert such value
593    to TREE_TYPE, NULL.  */
594 static tree
595 build_const_val (struct ipcp_lattice *lat, tree tree_type)
596 {
597   tree val;
598
599   gcc_assert (ipcp_lat_is_const (lat));
600   val = lat->constant;
601
602   if (!useless_type_conversion_p (tree_type, TREE_TYPE (val)))
603     {
604       if (fold_convertible_p (tree_type, val))
605         return fold_build1 (NOP_EXPR, tree_type, val);
606       else if (TYPE_SIZE (tree_type) == TYPE_SIZE (TREE_TYPE (val)))
607         return fold_build1 (VIEW_CONVERT_EXPR, tree_type, val);
608       else
609         return NULL;
610     }
611   return val;
612 }
613
614 /* Compute the proper scale for NODE.  It is the ratio between the number of
615    direct calls (represented on the incoming cgraph_edges) and sum of all
616    invocations of NODE (represented as count in cgraph_node).
617
618    FIXME: This code is wrong.  Since the callers can be also clones and
619    the clones are not scaled yet, the sums gets unrealistically high.
620    To properly compute the counts, we would need to do propagation across
621    callgraph (as external call to A might imply call to non-cloned B
622    if A's clone calls cloned B).  */
623 static void
624 ipcp_compute_node_scale (struct cgraph_node *node)
625 {
626   gcov_type sum;
627   struct cgraph_edge *cs;
628
629   sum = 0;
630   /* Compute sum of all counts of callers. */
631   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
632     sum += cs->count;
633   /* Work around the unrealistically high sum problem.  We just don't want
634      the non-cloned body to have negative or very low frequency.  Since
635      majority of execution time will be spent in clones anyway, this should
636      give good enough profile.  */
637   if (sum > node->count * 9 / 10)
638     sum = node->count * 9 / 10;
639   if (node->count == 0)
640     ipcp_set_node_scale (node, 0);
641   else
642     ipcp_set_node_scale (node, sum * REG_BR_PROB_BASE / node->count);
643 }
644
645 /* Return true if there are some formal parameters whose value is IPA_TOP (in
646    the whole compilation unit).  Change their values to IPA_BOTTOM, since they
647    most probably get their values from outside of this compilation unit.  */
648 static bool
649 ipcp_change_tops_to_bottom (void)
650 {
651   int i, count;
652   struct cgraph_node *node;
653   bool prop_again;
654
655   prop_again = false;
656   for (node = cgraph_nodes; node; node = node->next)
657     {
658       struct ipa_node_params *info = IPA_NODE_REF (node);
659       count = ipa_get_param_count (info);
660       for (i = 0; i < count; i++)
661         {
662           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
663           if (lat->type == IPA_TOP)
664             {
665               prop_again = true;
666               if (dump_file)
667                 {
668                   fprintf (dump_file, "Forcing param ");
669                   print_generic_expr (dump_file, ipa_get_param (info, i), 0);
670                   fprintf (dump_file, " of node %s to bottom.\n",
671                            cgraph_node_name (node));
672                 }
673               lat->type = IPA_BOTTOM;
674             }
675           if (!ipa_param_cannot_devirtualize_p (info, i)
676               && ipa_param_types_vec_empty (info, i))
677             {
678               prop_again = true;
679               ipa_set_param_cannot_devirtualize (info, i);
680               if (dump_file)
681                 {
682                   fprintf (dump_file, "Marking param ");
683                   print_generic_expr (dump_file, ipa_get_param (info, i), 0);
684                   fprintf (dump_file, " of node %s as unusable for "
685                            "devirtualization.\n",
686                            cgraph_node_name (node));
687                 }
688             }
689         }
690     }
691   return prop_again;
692 }
693
694 /* Insert BINFO to the list of known types of parameter number I of the
695    function described by CALLEE_INFO.  Return true iff the type information
696    associated with the callee parameter changed in any way.  */
697
698 static bool
699 ipcp_add_param_type (struct ipa_node_params *callee_info, int i, tree binfo)
700 {
701   int j, count;
702
703   if (ipa_param_cannot_devirtualize_p (callee_info, i))
704     return false;
705
706   if (callee_info->params[i].types)
707     {
708       count = VEC_length (tree, callee_info->params[i].types);
709       for (j = 0; j < count; j++)
710         if (VEC_index (tree, callee_info->params[i].types, j) == binfo)
711           return false;
712     }
713
714   if (VEC_length (tree, callee_info->params[i].types)
715       == (unsigned) PARAM_VALUE (PARAM_DEVIRT_TYPE_LIST_SIZE))
716     return !ipa_set_param_cannot_devirtualize (callee_info, i);
717
718   VEC_safe_push (tree, heap, callee_info->params[i].types, binfo);
719   return true;
720 }
721
722 /* Copy known types information for parameter number CALLEE_IDX of CALLEE_INFO
723    from a parameter of CALLER_INFO as described by JF.  Return true iff the
724    type information changed in any way.  JF must be a pass-through or an
725    ancestor jump function.  */
726
727 static bool
728 ipcp_copy_types (struct ipa_node_params *caller_info,
729                  struct ipa_node_params *callee_info,
730                  int callee_idx, struct ipa_jump_func *jf)
731 {
732   int caller_idx, j, count;
733   bool res;
734
735   if (ipa_param_cannot_devirtualize_p (callee_info, callee_idx))
736     return false;
737
738   if (jf->type == IPA_JF_PASS_THROUGH)
739     {
740       if (jf->value.pass_through.operation != NOP_EXPR)
741         {
742           ipa_set_param_cannot_devirtualize (callee_info, callee_idx);
743           return true;
744         }
745       caller_idx = jf->value.pass_through.formal_id;
746     }
747   else
748     caller_idx = jf->value.ancestor.formal_id;
749
750   if (ipa_param_cannot_devirtualize_p (caller_info, caller_idx))
751     {
752       ipa_set_param_cannot_devirtualize (callee_info, callee_idx);
753       return true;
754     }
755
756   if (!caller_info->params[caller_idx].types)
757     return false;
758
759   res = false;
760   count = VEC_length (tree, caller_info->params[caller_idx].types);
761   for (j = 0; j < count; j++)
762     {
763       tree binfo = VEC_index (tree, caller_info->params[caller_idx].types, j);
764       if (jf->type == IPA_JF_ANCESTOR)
765         {
766           binfo = get_binfo_at_offset (binfo, jf->value.ancestor.offset,
767                                        jf->value.ancestor.type);
768           if (!binfo)
769             {
770               ipa_set_param_cannot_devirtualize (callee_info, callee_idx);
771               return true;
772             }
773         }
774       res |= ipcp_add_param_type (callee_info, callee_idx, binfo);
775     }
776   return res;
777 }
778
779 /* Propagate type information for parameter of CALLEE_INFO number I as
780    described by JF.  CALLER_INFO describes the caller.  Return true iff the
781    type information changed in any way.  */
782
783 static bool
784 ipcp_propagate_types (struct ipa_node_params *caller_info,
785                       struct ipa_node_params *callee_info,
786                       struct ipa_jump_func *jf, int i)
787 {
788   switch (jf->type)
789     {
790     case IPA_JF_UNKNOWN:
791     case IPA_JF_CONST_MEMBER_PTR:
792     case IPA_JF_CONST:
793       break;
794
795     case IPA_JF_KNOWN_TYPE:
796       return ipcp_add_param_type (callee_info, i, jf->value.base_binfo);
797
798     case IPA_JF_PASS_THROUGH:
799     case IPA_JF_ANCESTOR:
800       return ipcp_copy_types (caller_info, callee_info, i, jf);
801     }
802
803   /* If we reach this we cannot use this parameter for devirtualization.  */
804   return !ipa_set_param_cannot_devirtualize (callee_info, i);
805 }
806
807 /* Interprocedural analysis. The algorithm propagates constants from the
808    caller's parameters to the callee's arguments.  */
809 static void
810 ipcp_propagate_stage (void)
811 {
812   int i;
813   struct ipcp_lattice inc_lat = { IPA_BOTTOM, NULL };
814   struct ipcp_lattice new_lat = { IPA_BOTTOM, NULL };
815   struct ipcp_lattice *dest_lat;
816   struct cgraph_edge *cs;
817   struct ipa_jump_func *jump_func;
818   struct ipa_func_list *wl;
819   int count;
820
821   ipa_check_create_node_params ();
822   ipa_check_create_edge_args ();
823
824   /* Initialize worklist to contain all functions.  */
825   wl = ipa_init_func_list ();
826   while (wl)
827     {
828       struct cgraph_node *node = ipa_pop_func_from_list (&wl);
829       struct ipa_node_params *info = IPA_NODE_REF (node);
830
831       for (cs = node->callees; cs; cs = cs->next_callee)
832         {
833           struct ipa_node_params *callee_info = IPA_NODE_REF (cs->callee);
834           struct ipa_edge_args *args = IPA_EDGE_REF (cs);
835
836           if (ipa_is_called_with_var_arguments (callee_info)
837               || !cs->callee->analyzed
838               || ipa_is_called_with_var_arguments (callee_info))
839             continue;
840
841           count = ipa_get_cs_argument_count (args);
842           for (i = 0; i < count; i++)
843             {
844               jump_func = ipa_get_ith_jump_func (args, i);
845               ipcp_lattice_from_jfunc (info, &inc_lat, jump_func);
846               dest_lat = ipcp_get_lattice (callee_info, i);
847               ipa_lattice_meet (&new_lat, &inc_lat, dest_lat);
848               if (ipcp_lattice_changed (&new_lat, dest_lat))
849                 {
850                   dest_lat->type = new_lat.type;
851                   dest_lat->constant = new_lat.constant;
852                   ipa_push_func_to_list (&wl, cs->callee);
853                 }
854
855               if (ipcp_propagate_types (info, callee_info, jump_func, i))
856                 ipa_push_func_to_list (&wl, cs->callee);
857             }
858         }
859     }
860 }
861
862 /* Call the constant propagation algorithm and re-call it if necessary
863    (if there are undetermined values left).  */
864 static void
865 ipcp_iterate_stage (void)
866 {
867   struct cgraph_node *node;
868   n_cloning_candidates = 0;
869
870   if (dump_file)
871     fprintf (dump_file, "\nIPA iterate stage:\n\n");
872
873   if (in_lto_p)
874     ipa_update_after_lto_read ();
875
876   for (node = cgraph_nodes; node; node = node->next)
877     {
878       ipcp_initialize_node_lattices (node);
879       ipcp_compute_node_scale (node);
880     }
881   if (dump_file && (dump_flags & TDF_DETAILS))
882     {
883       ipcp_print_all_lattices (dump_file);
884       ipcp_function_scale_print (dump_file);
885     }
886
887   ipcp_propagate_stage ();
888   if (ipcp_change_tops_to_bottom ())
889     /* Some lattices have changed from IPA_TOP to IPA_BOTTOM.
890        This change should be propagated.  */
891     {
892       gcc_assert (n_cloning_candidates);
893       ipcp_propagate_stage ();
894     }
895   if (dump_file)
896     {
897       fprintf (dump_file, "\nIPA lattices after propagation:\n");
898       ipcp_print_all_lattices (dump_file);
899       if (dump_flags & TDF_DETAILS)
900         ipcp_print_profile_data (dump_file);
901     }
902 }
903
904 /* Check conditions to forbid constant insertion to function described by
905    NODE.  */
906 static inline bool
907 ipcp_node_modifiable_p (struct cgraph_node *node)
908 {
909   /* Once we will be able to do in-place replacement, we can be more
910      lax here.  */
911   return ipcp_versionable_function_p (node);
912 }
913
914 /* Print count scale data structures.  */
915 static void
916 ipcp_function_scale_print (FILE * f)
917 {
918   struct cgraph_node *node;
919
920   for (node = cgraph_nodes; node; node = node->next)
921     {
922       if (!node->analyzed)
923         continue;
924       fprintf (f, "printing scale for %s: ", cgraph_node_name (node));
925       fprintf (f, "value is  " HOST_WIDE_INT_PRINT_DEC
926                "  \n", (HOST_WIDE_INT) ipcp_get_node_scale (node));
927     }
928 }
929
930 /* Print counts of all cgraph nodes.  */
931 static void
932 ipcp_print_func_profile_counts (FILE * f)
933 {
934   struct cgraph_node *node;
935
936   for (node = cgraph_nodes; node; node = node->next)
937     {
938       fprintf (f, "function %s: ", cgraph_node_name (node));
939       fprintf (f, "count is  " HOST_WIDE_INT_PRINT_DEC
940                "  \n", (HOST_WIDE_INT) node->count);
941     }
942 }
943
944 /* Print counts of all cgraph edges.  */
945 static void
946 ipcp_print_call_profile_counts (FILE * f)
947 {
948   struct cgraph_node *node;
949   struct cgraph_edge *cs;
950
951   for (node = cgraph_nodes; node; node = node->next)
952     {
953       for (cs = node->callees; cs; cs = cs->next_callee)
954         {
955           fprintf (f, "%s -> %s ", cgraph_node_name (cs->caller),
956                    cgraph_node_name (cs->callee));
957           fprintf (f, "count is  " HOST_WIDE_INT_PRINT_DEC "  \n",
958                    (HOST_WIDE_INT) cs->count);
959         }
960     }
961 }
962
963 /* Print profile info for all functions.  */
964 static void
965 ipcp_print_profile_data (FILE * f)
966 {
967   fprintf (f, "\nNODE COUNTS :\n");
968   ipcp_print_func_profile_counts (f);
969   fprintf (f, "\nCS COUNTS stage:\n");
970   ipcp_print_call_profile_counts (f);
971 }
972
973 /* Build and initialize ipa_replace_map struct according to LAT. This struct is
974    processed by versioning, which operates according to the flags set.
975    PARM_TREE is the formal parameter found to be constant.  LAT represents the
976    constant.  */
977 static struct ipa_replace_map *
978 ipcp_create_replace_map (tree parm_tree, struct ipcp_lattice *lat)
979 {
980   struct ipa_replace_map *replace_map;
981   tree const_val;
982
983   const_val = build_const_val (lat, TREE_TYPE (parm_tree));
984   if (const_val == NULL_TREE)
985     {
986       if (dump_file)
987         {
988           fprintf (dump_file, "  const ");
989           print_generic_expr (dump_file, lat->constant, 0);
990           fprintf (dump_file, "  can't be converted to param ");
991           print_generic_expr (dump_file, parm_tree, 0);
992           fprintf (dump_file, "\n");
993         }
994       return NULL;
995     }
996   replace_map = ggc_alloc_ipa_replace_map ();
997   if (dump_file)
998     {
999       fprintf (dump_file, "  replacing param ");
1000       print_generic_expr (dump_file, parm_tree, 0);
1001       fprintf (dump_file, " with const ");
1002       print_generic_expr (dump_file, const_val, 0);
1003       fprintf (dump_file, "\n");
1004     }
1005   replace_map->old_tree = parm_tree;
1006   replace_map->new_tree = const_val;
1007   replace_map->replace_p = true;
1008   replace_map->ref_p = false;
1009
1010   return replace_map;
1011 }
1012
1013 /* Return true if this callsite should be redirected to the original callee
1014    (instead of the cloned one).  */
1015 static bool
1016 ipcp_need_redirect_p (struct cgraph_edge *cs)
1017 {
1018   struct ipa_node_params *orig_callee_info;
1019   int i, count;
1020   struct cgraph_node *node = cs->callee, *orig;
1021
1022   if (!n_cloning_candidates)
1023     return false;
1024
1025   if ((orig = ipcp_get_orig_node (node)) != NULL)
1026     node = orig;
1027   if (ipcp_get_orig_node (cs->caller))
1028     return false;
1029
1030   orig_callee_info = IPA_NODE_REF (node);
1031   count = ipa_get_param_count (orig_callee_info);
1032   for (i = 0; i < count; i++)
1033     {
1034       struct ipcp_lattice *lat = ipcp_get_lattice (orig_callee_info, i);
1035       struct ipa_jump_func *jump_func;
1036
1037       jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
1038       if ((ipcp_lat_is_const (lat)
1039            && jump_func->type != IPA_JF_CONST)
1040           || (!ipa_param_cannot_devirtualize_p (orig_callee_info, i)
1041               && !ipa_param_types_vec_empty (orig_callee_info, i)
1042               && jump_func->type != IPA_JF_CONST
1043               && jump_func->type != IPA_JF_KNOWN_TYPE))
1044         return true;
1045     }
1046
1047   return false;
1048 }
1049
1050 /* Fix the callsites and the call graph after function cloning was done.  */
1051 static void
1052 ipcp_update_callgraph (void)
1053 {
1054   struct cgraph_node *node;
1055
1056   for (node = cgraph_nodes; node; node = node->next)
1057     if (node->analyzed && ipcp_node_is_clone (node))
1058       {
1059         bitmap args_to_skip = NULL;
1060         struct cgraph_node *orig_node = ipcp_get_orig_node (node);
1061         struct ipa_node_params *info = IPA_NODE_REF (orig_node);
1062         int i, count = ipa_get_param_count (info);
1063         struct cgraph_edge *cs, *next;
1064
1065         if (node->local.can_change_signature)
1066           {
1067             args_to_skip = BITMAP_ALLOC (NULL);
1068             for (i = 0; i < count; i++)
1069               {
1070                 struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1071
1072                 /* We can proactively remove obviously unused arguments.  */
1073                 if (!ipa_is_param_used (info, i))
1074                   {
1075                     bitmap_set_bit (args_to_skip, i);
1076                     continue;
1077                   }
1078
1079                 if (lat->type == IPA_CONST_VALUE)
1080                   bitmap_set_bit (args_to_skip, i);
1081               }
1082           }
1083         for (cs = node->callers; cs; cs = next)
1084           {
1085             next = cs->next_caller;
1086             if (!ipcp_node_is_clone (cs->caller) && ipcp_need_redirect_p (cs))
1087               {
1088                 if (dump_file)
1089                   fprintf (dump_file, "Redirecting edge %s/%i -> %s/%i "
1090                            "back to %s/%i.",
1091                            cgraph_node_name (cs->caller), cs->caller->uid,
1092                            cgraph_node_name (cs->callee), cs->callee->uid,
1093                            cgraph_node_name (orig_node), orig_node->uid);
1094                 cgraph_redirect_edge_callee (cs, orig_node);
1095               }
1096           }
1097       }
1098 }
1099
1100 /* Update profiling info for versioned functions and the functions they were
1101    versioned from.  */
1102 static void
1103 ipcp_update_profiling (void)
1104 {
1105   struct cgraph_node *node, *orig_node;
1106   gcov_type scale, scale_complement;
1107   struct cgraph_edge *cs;
1108
1109   for (node = cgraph_nodes; node; node = node->next)
1110     {
1111       if (ipcp_node_is_clone (node))
1112         {
1113           orig_node = ipcp_get_orig_node (node);
1114           scale = ipcp_get_node_scale (orig_node);
1115           node->count = orig_node->count * scale / REG_BR_PROB_BASE;
1116           scale_complement = REG_BR_PROB_BASE - scale;
1117
1118           /* Negative scale complement can result from insane profile data
1119              in which the total incoming edge counts in this module is
1120              larger than the callee's entry count. The insane profile data
1121              usually gets generated due to the following reasons:
1122
1123              1) in multithreaded programs, when profile data is dumped
1124              to gcda files in gcov_exit, some other threads are still running.
1125              The profile counters are dumped in bottom up order (call graph).
1126              The caller's BB counters may still be updated while the callee's
1127              counter data is already saved to disk.
1128
1129              2) Comdat functions: comdat functions' profile data are not
1130              allocated in comdat. When a comdat callee function gets inlined
1131              at some callsites after instrumentation, and the remaining calls
1132              to this function resolves to a comdat copy in another module,
1133              the profile counters for this function are split. This can
1134              result in sum of incoming edge counts from this module being
1135              larger than callee instance's entry count.  */
1136
1137           if (scale_complement < 0 && flag_profile_correction)
1138             scale_complement = 0;
1139
1140           orig_node->count =
1141             orig_node->count * scale_complement / REG_BR_PROB_BASE;
1142           for (cs = node->callees; cs; cs = cs->next_callee)
1143             cs->count = cs->count * scale / REG_BR_PROB_BASE;
1144           for (cs = orig_node->callees; cs; cs = cs->next_callee)
1145             cs->count = cs->count * scale_complement / REG_BR_PROB_BASE;
1146         }
1147     }
1148 }
1149
1150 /* If NODE was cloned, how much would program grow? */
1151 static long
1152 ipcp_estimate_growth (struct cgraph_node *node)
1153 {
1154   struct cgraph_edge *cs;
1155   int redirectable_node_callers = 0;
1156   int removable_args = 0;
1157   bool need_original
1158      = !cgraph_will_be_removed_from_program_if_no_direct_calls (node);
1159   struct ipa_node_params *info;
1160   int i, count;
1161   int growth;
1162
1163   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1164     if (cs->caller == node || !ipcp_need_redirect_p (cs))
1165       redirectable_node_callers++;
1166     else
1167       need_original = true;
1168
1169   /* If we will be able to fully replace original node, we never increase
1170      program size.  */
1171   if (!need_original)
1172     return 0;
1173
1174   info = IPA_NODE_REF (node);
1175   count = ipa_get_param_count (info);
1176   if (node->local.can_change_signature)
1177     for (i = 0; i < count; i++)
1178       {
1179         struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1180
1181         /* We can proactively remove obviously unused arguments.  */
1182         if (!ipa_is_param_used (info, i))
1183           removable_args++;
1184
1185         if (lat->type == IPA_CONST_VALUE)
1186           removable_args++;
1187       }
1188
1189   /* We make just very simple estimate of savings for removal of operand from
1190      call site.  Precise cost is difficult to get, as our size metric counts
1191      constants and moves as free.  Generally we are looking for cases that
1192      small function is called very many times.  */
1193   growth = inline_summary (node)->self_size
1194            - removable_args * redirectable_node_callers;
1195   if (growth < 0)
1196     return 0;
1197   return growth;
1198 }
1199
1200
1201 /* Estimate cost of cloning NODE.  */
1202 static long
1203 ipcp_estimate_cloning_cost (struct cgraph_node *node)
1204 {
1205   int freq_sum = 1;
1206   gcov_type count_sum = 1;
1207   struct cgraph_edge *e;
1208   int cost;
1209
1210   cost = ipcp_estimate_growth (node) * 1000;
1211   if (!cost)
1212     {
1213       if (dump_file)
1214         fprintf (dump_file, "Versioning of %s will save code size\n",
1215                  cgraph_node_name (node));
1216       return 0;
1217     }
1218
1219   for (e = node->callers; e; e = e->next_caller)
1220     if (!bitmap_bit_p (dead_nodes, e->caller->uid)
1221         && !ipcp_need_redirect_p (e))
1222       {
1223         count_sum += e->count;
1224         freq_sum += e->frequency + 1;
1225       }
1226
1227   if (max_count)
1228     cost /= count_sum * 1000 / max_count + 1;
1229   else
1230     cost /= freq_sum * 1000 / REG_BR_PROB_BASE + 1;
1231   if (dump_file)
1232     fprintf (dump_file, "Cost of versioning %s is %i, (size: %i, freq: %i)\n",
1233              cgraph_node_name (node), cost, inline_summary (node)->self_size,
1234              freq_sum);
1235   return cost + 1;
1236 }
1237
1238 /* Walk indirect calls of NODE and if any polymorphic can be turned into a
1239    direct one now, do so.  */
1240
1241 static void
1242 ipcp_process_devirtualization_opportunities (struct cgraph_node *node)
1243 {
1244   struct ipa_node_params *info = IPA_NODE_REF (node);
1245   struct cgraph_edge *ie, *next_ie;
1246
1247   for (ie = node->indirect_calls; ie; ie = next_ie)
1248     {
1249       int param_index, types_count, j;
1250       HOST_WIDE_INT token;
1251       tree target, delta;
1252
1253       next_ie = ie->next_callee;
1254       if (!ie->indirect_info->polymorphic)
1255         continue;
1256       param_index = ie->indirect_info->param_index;
1257       if (param_index == -1
1258           || ipa_param_cannot_devirtualize_p (info, param_index)
1259           || ipa_param_types_vec_empty (info, param_index))
1260         continue;
1261
1262       token = ie->indirect_info->otr_token;
1263       target = NULL_TREE;
1264       types_count = VEC_length (tree, info->params[param_index].types);
1265       for (j = 0; j < types_count; j++)
1266         {
1267           tree binfo = VEC_index (tree, info->params[param_index].types, j);
1268           tree d;
1269           tree t = gimple_get_virt_mehtod_for_binfo (token, binfo, &d, true);
1270
1271           if (!t)
1272             {
1273               target = NULL_TREE;
1274               break;
1275             }
1276           else if (!target)
1277             {
1278               target = t;
1279               delta = d;
1280             }
1281           else if (target != t || !tree_int_cst_equal (delta, d))
1282             {
1283               target = NULL_TREE;
1284               break;
1285             }
1286         }
1287
1288       if (target)
1289         ipa_make_edge_direct_to_target (ie, target, delta);
1290     }
1291 }
1292
1293 /* Return number of live constant parameters.  */
1294 static int
1295 ipcp_const_param_count (struct cgraph_node *node)
1296 {
1297   int const_param = 0;
1298   struct ipa_node_params *info = IPA_NODE_REF (node);
1299   int count = ipa_get_param_count (info);
1300   int i;
1301
1302   for (i = 0; i < count; i++)
1303     {
1304       struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1305       if ((ipcp_lat_is_insertable (lat)
1306           /* Do not count obviously unused arguments.  */
1307            && ipa_is_param_used (info, i))
1308           || (!ipa_param_cannot_devirtualize_p (info, i)
1309               && !ipa_param_types_vec_empty (info, i)))
1310         const_param++;
1311     }
1312   return const_param;
1313 }
1314
1315 /* Given that a formal parameter of NODE given by INDEX is known to be constant
1316    CST, try to find any indirect edges that can be made direct and make them
1317    so.  Note that INDEX is the number the parameter at the time of analyzing
1318    parameter uses and parameter removals should not be considered for it.  (In
1319    fact, the parameter itself has just been removed.)  */
1320
1321 static void
1322 ipcp_discover_new_direct_edges (struct cgraph_node *node, int index, tree cst)
1323 {
1324   struct cgraph_edge *ie, *next_ie;
1325
1326   for (ie = node->indirect_calls; ie; ie = next_ie)
1327     {
1328       struct cgraph_indirect_call_info *ici = ie->indirect_info;
1329
1330       next_ie = ie->next_callee;
1331       if (ici->param_index != index
1332           || ici->polymorphic)
1333         continue;
1334
1335       ipa_make_edge_direct_to_target (ie, cst, NULL_TREE);
1336     }
1337 }
1338
1339
1340 /* Propagate the constant parameters found by ipcp_iterate_stage()
1341    to the function's code.  */
1342 static void
1343 ipcp_insert_stage (void)
1344 {
1345   struct cgraph_node *node, *node1 = NULL;
1346   int i;
1347   VEC (cgraph_edge_p, heap) * redirect_callers;
1348   VEC (ipa_replace_map_p,gc)* replace_trees;
1349   int node_callers, count;
1350   tree parm_tree;
1351   struct ipa_replace_map *replace_param;
1352   fibheap_t heap;
1353   long overall_size = 0, new_size = 0;
1354   long max_new_size;
1355
1356   ipa_check_create_node_params ();
1357   ipa_check_create_edge_args ();
1358   if (dump_file)
1359     fprintf (dump_file, "\nIPA insert stage:\n\n");
1360
1361   dead_nodes = BITMAP_ALLOC (NULL);
1362
1363   for (node = cgraph_nodes; node; node = node->next)
1364     if (node->analyzed)
1365       {
1366         if (node->count > max_count)
1367           max_count = node->count;
1368         overall_size += inline_summary (node)->self_size;
1369       }
1370
1371   max_new_size = overall_size;
1372   if (max_new_size < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS))
1373     max_new_size = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS);
1374   max_new_size = max_new_size * PARAM_VALUE (PARAM_IPCP_UNIT_GROWTH) / 100 + 1;
1375
1376   /* First collect all functions we proved to have constant arguments to
1377      heap.  */
1378   heap = fibheap_new ();
1379   for (node = cgraph_nodes; node; node = node->next)
1380     {
1381       struct ipa_node_params *info;
1382       /* Propagation of the constant is forbidden in certain conditions.  */
1383       if (!node->analyzed || !ipcp_node_modifiable_p (node))
1384           continue;
1385       info = IPA_NODE_REF (node);
1386       if (ipa_is_called_with_var_arguments (info))
1387         continue;
1388       if (ipcp_const_param_count (node))
1389         node->aux = fibheap_insert (heap, ipcp_estimate_cloning_cost (node),
1390                                     node);
1391      }
1392
1393   /* Now clone in priority order until code size growth limits are met or
1394      heap is emptied.  */
1395   while (!fibheap_empty (heap))
1396     {
1397       struct ipa_node_params *info;
1398       int growth = 0;
1399       bitmap args_to_skip;
1400       struct cgraph_edge *cs;
1401
1402       node = (struct cgraph_node *)fibheap_extract_min (heap);
1403       node->aux = NULL;
1404       if (dump_file)
1405         fprintf (dump_file, "considering function %s\n",
1406                  cgraph_node_name (node));
1407
1408       growth = ipcp_estimate_growth (node);
1409
1410       if (new_size + growth > max_new_size)
1411         break;
1412       if (growth
1413           && optimize_function_for_size_p (DECL_STRUCT_FUNCTION (node->decl)))
1414         {
1415           if (dump_file)
1416             fprintf (dump_file, "Not versioning, cold code would grow");
1417           continue;
1418         }
1419
1420       info = IPA_NODE_REF (node);
1421       count = ipa_get_param_count (info);
1422
1423       replace_trees = VEC_alloc (ipa_replace_map_p, gc, 1);
1424
1425       if (node->local.can_change_signature)
1426         args_to_skip = BITMAP_GGC_ALLOC ();
1427       else
1428         args_to_skip = NULL;
1429       for (i = 0; i < count; i++)
1430         {
1431           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1432           parm_tree = ipa_get_param (info, i);
1433
1434           /* We can proactively remove obviously unused arguments.  */
1435           if (!ipa_is_param_used (info, i))
1436             {
1437               if (args_to_skip)
1438                 bitmap_set_bit (args_to_skip, i);
1439               continue;
1440             }
1441
1442           if (lat->type == IPA_CONST_VALUE)
1443             {
1444               replace_param =
1445                 ipcp_create_replace_map (parm_tree, lat);
1446               if (replace_param == NULL)
1447                 break;
1448               VEC_safe_push (ipa_replace_map_p, gc, replace_trees, replace_param);
1449               if (args_to_skip)
1450                 bitmap_set_bit (args_to_skip, i);
1451             }
1452         }
1453       if (i < count)
1454         {
1455           if (dump_file)
1456             fprintf (dump_file, "Not versioning, some parameters couldn't be replaced");
1457           continue;
1458         }
1459
1460       new_size += growth;
1461
1462       /* Look if original function becomes dead after cloning.  */
1463       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1464         if (cs->caller == node || ipcp_need_redirect_p (cs))
1465           break;
1466       if (!cs && cgraph_will_be_removed_from_program_if_no_direct_calls (node))
1467         bitmap_set_bit (dead_nodes, node->uid);
1468
1469       /* Compute how many callers node has.  */
1470       node_callers = 0;
1471       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1472         node_callers++;
1473       redirect_callers = VEC_alloc (cgraph_edge_p, heap, node_callers);
1474       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1475         if (!cs->indirect_inlining_edge)
1476           VEC_quick_push (cgraph_edge_p, redirect_callers, cs);
1477
1478       /* Redirecting all the callers of the node to the
1479          new versioned node.  */
1480       node1 =
1481         cgraph_create_virtual_clone (node, redirect_callers, replace_trees,
1482                                      args_to_skip, "constprop");
1483       args_to_skip = NULL;
1484       VEC_free (cgraph_edge_p, heap, redirect_callers);
1485       replace_trees = NULL;
1486
1487       if (node1 == NULL)
1488         continue;
1489       ipcp_process_devirtualization_opportunities (node1);
1490
1491       if (dump_file)
1492         fprintf (dump_file, "versioned function %s with growth %i, overall %i\n",
1493                  cgraph_node_name (node), (int)growth, (int)new_size);
1494       ipcp_init_cloned_node (node, node1);
1495
1496       info = IPA_NODE_REF (node);
1497       for (i = 0; i < count; i++)
1498         {
1499           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1500           if (lat->type == IPA_CONST_VALUE)
1501             ipcp_discover_new_direct_edges (node1, i, lat->constant);
1502         }
1503
1504       if (dump_file)
1505         dump_function_to_file (node1->decl, dump_file, dump_flags);
1506
1507       for (cs = node->callees; cs; cs = cs->next_callee)
1508         if (cs->callee->aux)
1509           {
1510             fibheap_delete_node (heap, (fibnode_t) cs->callee->aux);
1511             cs->callee->aux = fibheap_insert (heap,
1512                                               ipcp_estimate_cloning_cost (cs->callee),
1513                                               cs->callee);
1514           }
1515     }
1516
1517   while (!fibheap_empty (heap))
1518     {
1519       if (dump_file)
1520         fprintf (dump_file, "skipping function %s\n",
1521                  cgraph_node_name (node));
1522       node = (struct cgraph_node *) fibheap_extract_min (heap);
1523       node->aux = NULL;
1524     }
1525   fibheap_delete (heap);
1526   BITMAP_FREE (dead_nodes);
1527   ipcp_update_callgraph ();
1528   ipcp_update_profiling ();
1529 }
1530
1531 /* The IPCP driver.  */
1532 static unsigned int
1533 ipcp_driver (void)
1534 {
1535   cgraph_remove_unreachable_nodes (true,dump_file);
1536   if (dump_file)
1537     {
1538       fprintf (dump_file, "\nIPA structures before propagation:\n");
1539       if (dump_flags & TDF_DETAILS)
1540         ipa_print_all_params (dump_file);
1541       ipa_print_all_jump_functions (dump_file);
1542     }
1543   ipa_check_create_node_params ();
1544   ipa_check_create_edge_args ();
1545   /* 2. Do the interprocedural propagation.  */
1546   ipcp_iterate_stage ();
1547   /* 3. Insert the constants found to the functions.  */
1548   ipcp_insert_stage ();
1549   if (dump_file && (dump_flags & TDF_DETAILS))
1550     {
1551       fprintf (dump_file, "\nProfiling info after insert stage:\n");
1552       ipcp_print_profile_data (dump_file);
1553     }
1554   /* Free all IPCP structures.  */
1555   ipa_free_all_structures_after_ipa_cp ();
1556   if (dump_file)
1557     fprintf (dump_file, "\nIPA constant propagation end\n");
1558   return 0;
1559 }
1560
1561 /* Initialization and computation of IPCP data structures.  This is the initial
1562    intraprocedural analysis of functions, which gathers information to be
1563    propagated later on.  */
1564
1565 static void
1566 ipcp_generate_summary (void)
1567 {
1568   struct cgraph_node *node;
1569
1570   if (dump_file)
1571     fprintf (dump_file, "\nIPA constant propagation start:\n");
1572   ipa_register_cgraph_hooks ();
1573
1574   for (node = cgraph_nodes; node; node = node->next)
1575     if (node->analyzed)
1576       {
1577         /* Unreachable nodes should have been eliminated before ipcp.  */
1578         gcc_assert (node->needed || node->reachable);
1579
1580         node->local.versionable = tree_versionable_function_p (node->decl);
1581         ipa_analyze_node (node);
1582       }
1583 }
1584
1585 /* Write ipcp summary for nodes in SET.  */
1586 static void
1587 ipcp_write_summary (cgraph_node_set set,
1588                     varpool_node_set vset ATTRIBUTE_UNUSED)
1589 {
1590   ipa_prop_write_jump_functions (set);
1591 }
1592
1593 /* Read ipcp summary.  */
1594 static void
1595 ipcp_read_summary (void)
1596 {
1597   ipa_prop_read_jump_functions ();
1598 }
1599
1600 /* Gate for IPCP optimization.  */
1601 static bool
1602 cgraph_gate_cp (void)
1603 {
1604   /* FIXME: We should remove the optimize check after we ensure we never run
1605      IPA passes when not optimizing.  */
1606   return flag_ipa_cp && optimize;
1607 }
1608
1609 struct ipa_opt_pass_d pass_ipa_cp =
1610 {
1611  {
1612   IPA_PASS,
1613   "cp",                         /* name */
1614   cgraph_gate_cp,               /* gate */
1615   ipcp_driver,                  /* execute */
1616   NULL,                         /* sub */
1617   NULL,                         /* next */
1618   0,                            /* static_pass_number */
1619   TV_IPA_CONSTANT_PROP,         /* tv_id */
1620   0,                            /* properties_required */
1621   0,                            /* properties_provided */
1622   0,                            /* properties_destroyed */
1623   0,                            /* todo_flags_start */
1624   TODO_dump_cgraph | TODO_dump_func |
1625   TODO_remove_functions | TODO_ggc_collect /* todo_flags_finish */
1626  },
1627  ipcp_generate_summary,                 /* generate_summary */
1628  ipcp_write_summary,                    /* write_summary */
1629  ipcp_read_summary,                     /* read_summary */
1630  NULL,                                  /* write_optimization_summary */
1631  NULL,                                  /* read_optimization_summary */
1632  NULL,                                  /* stmt_fixup */
1633  0,                                     /* TODOs */
1634  NULL,                                  /* function_transform */
1635  NULL,                                  /* variable_transform */
1636 };