OSDN Git Service

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