OSDN Git Service

Add newlib-stdint.h to moxie-eld config.
[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
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 overwritable.\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      significantly.  */
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 a constant tree with type TREE_TYPE and value according to LAT.
591    Return the tree, or, if it is not possible to convert such value
592    to TREE_TYPE, NULL.  */
593 static tree
594 build_const_val (struct ipcp_lattice *lat, tree tree_type)
595 {
596   tree val;
597
598   gcc_assert (ipcp_lat_is_const (lat));
599   val = lat->constant;
600
601   if (!useless_type_conversion_p (tree_type, TREE_TYPE (val)))
602     {
603       if (fold_convertible_p (tree_type, val))
604         return fold_build1 (NOP_EXPR, tree_type, val);
605       else if (TYPE_SIZE (tree_type) == TYPE_SIZE (TREE_TYPE (val)))
606         return fold_build1 (VIEW_CONVERT_EXPR, tree_type, val);
607       else
608         return NULL;
609     }
610   return val;
611 }
612
613 /* Compute the proper scale for NODE.  It is the ratio between the number of
614    direct calls (represented on the incoming cgraph_edges) and sum of all
615    invocations of NODE (represented as count in cgraph_node).
616
617    FIXME: This code is wrong.  Since the callers can be also clones and
618    the clones are not scaled yet, the sums gets unrealistically high.
619    To properly compute the counts, we would need to do propagation across
620    callgraph (as external call to A might imply call to non-cloned B
621    if A's clone calls cloned B).  */
622 static void
623 ipcp_compute_node_scale (struct cgraph_node *node)
624 {
625   gcov_type sum;
626   struct cgraph_edge *cs;
627
628   sum = 0;
629   /* Compute sum of all counts of callers. */
630   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
631     sum += cs->count;
632   /* Work around the unrealistically high sum problem.  We just don't want
633      the non-cloned body to have negative or very low frequency.  Since
634      majority of execution time will be spent in clones anyway, this should
635      give good enough profile.  */
636   if (sum > node->count * 9 / 10)
637     sum = node->count * 9 / 10;
638   if (node->count == 0)
639     ipcp_set_node_scale (node, 0);
640   else
641     ipcp_set_node_scale (node, sum * REG_BR_PROB_BASE / node->count);
642 }
643
644 /* Return true if there are some formal parameters whose value is IPA_TOP (in
645    the whole compilation unit).  Change their values to IPA_BOTTOM, since they
646    most probably get their values from outside of this compilation unit.  */
647 static bool
648 ipcp_change_tops_to_bottom (void)
649 {
650   int i, count;
651   struct cgraph_node *node;
652   bool prop_again;
653
654   prop_again = false;
655   for (node = cgraph_nodes; node; node = node->next)
656     {
657       struct ipa_node_params *info = IPA_NODE_REF (node);
658       count = ipa_get_param_count (info);
659       for (i = 0; i < count; i++)
660         {
661           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
662           if (lat->type == IPA_TOP)
663             {
664               prop_again = true;
665               if (dump_file)
666                 {
667                   fprintf (dump_file, "Forcing param ");
668                   print_generic_expr (dump_file, ipa_get_param (info, i), 0);
669                   fprintf (dump_file, " of node %s to bottom.\n",
670                            cgraph_node_name (node));
671                 }
672               lat->type = IPA_BOTTOM;
673             }
674           if (!ipa_param_cannot_devirtualize_p (info, i)
675               && ipa_param_types_vec_empty (info, i))
676             {
677               prop_again = true;
678               ipa_set_param_cannot_devirtualize (info, i);
679               if (dump_file)
680                 {
681                   fprintf (dump_file, "Marking param ");
682                   print_generic_expr (dump_file, ipa_get_param (info, i), 0);
683                   fprintf (dump_file, " of node %s as unusable for "
684                            "devirtualization.\n",
685                            cgraph_node_name (node));
686                 }
687             }
688         }
689     }
690   return prop_again;
691 }
692
693 /* Insert BINFO to the list of known types of parameter number I of the
694    function described by CALLEE_INFO.  Return true iff the type information
695    associated with the callee parameter changed in any way.  */
696
697 static bool
698 ipcp_add_param_type (struct ipa_node_params *callee_info, int i, tree binfo)
699 {
700   int j, count;
701
702   if (ipa_param_cannot_devirtualize_p (callee_info, i))
703     return false;
704
705   if (callee_info->params[i].types)
706     {
707       count = VEC_length (tree, callee_info->params[i].types);
708       for (j = 0; j < count; j++)
709         if (VEC_index (tree, callee_info->params[i].types, j) == binfo)
710           return false;
711     }
712
713   if (VEC_length (tree, callee_info->params[i].types)
714       == (unsigned) PARAM_VALUE (PARAM_DEVIRT_TYPE_LIST_SIZE))
715     return !ipa_set_param_cannot_devirtualize (callee_info, i);
716
717   VEC_safe_push (tree, heap, callee_info->params[i].types, binfo);
718   return true;
719 }
720
721 /* Copy known types information for parameter number CALLEE_IDX of CALLEE_INFO
722    from a parameter of CALLER_INFO as described by JF.  Return true iff the
723    type information changed in any way.  JF must be a pass-through or an
724    ancestor jump function.  */
725
726 static bool
727 ipcp_copy_types (struct ipa_node_params *caller_info,
728                  struct ipa_node_params *callee_info,
729                  int callee_idx, struct ipa_jump_func *jf)
730 {
731   int caller_idx, j, count;
732   bool res;
733
734   if (ipa_param_cannot_devirtualize_p (callee_info, callee_idx))
735     return false;
736
737   if (jf->type == IPA_JF_PASS_THROUGH)
738     {
739       if (jf->value.pass_through.operation != NOP_EXPR)
740         {
741           ipa_set_param_cannot_devirtualize (callee_info, callee_idx);
742           return true;
743         }
744       caller_idx = jf->value.pass_through.formal_id;
745     }
746   else
747     caller_idx = jf->value.ancestor.formal_id;
748
749   if (ipa_param_cannot_devirtualize_p (caller_info, caller_idx))
750     {
751       ipa_set_param_cannot_devirtualize (callee_info, callee_idx);
752       return true;
753     }
754
755   if (!caller_info->params[caller_idx].types)
756     return false;
757
758   res = false;
759   count = VEC_length (tree, caller_info->params[caller_idx].types);
760   for (j = 0; j < count; j++)
761     {
762       tree binfo = VEC_index (tree, caller_info->params[caller_idx].types, j);
763       if (jf->type == IPA_JF_ANCESTOR)
764         {
765           binfo = get_binfo_at_offset (binfo, jf->value.ancestor.offset,
766                                        jf->value.ancestor.type);
767           if (!binfo)
768             {
769               ipa_set_param_cannot_devirtualize (callee_info, callee_idx);
770               return true;
771             }
772         }
773       res |= ipcp_add_param_type (callee_info, callee_idx, binfo);
774     }
775   return res;
776 }
777
778 /* Propagate type information for parameter of CALLEE_INFO number I as
779    described by JF.  CALLER_INFO describes the caller.  Return true iff the
780    type information changed in any way.  */
781
782 static bool
783 ipcp_propagate_types (struct ipa_node_params *caller_info,
784                       struct ipa_node_params *callee_info,
785                       struct ipa_jump_func *jf, int i)
786 {
787   switch (jf->type)
788     {
789     case IPA_JF_UNKNOWN:
790     case IPA_JF_CONST_MEMBER_PTR:
791     case IPA_JF_CONST:
792       break;
793
794     case IPA_JF_KNOWN_TYPE:
795       return ipcp_add_param_type (callee_info, i, jf->value.base_binfo);
796
797     case IPA_JF_PASS_THROUGH:
798     case IPA_JF_ANCESTOR:
799       return ipcp_copy_types (caller_info, callee_info, i, jf);
800     }
801
802   /* If we reach this we cannot use this parameter for devirtualization.  */
803   return !ipa_set_param_cannot_devirtualize (callee_info, i);
804 }
805
806 /* Interprocedural analysis. The algorithm propagates constants from the
807    caller's parameters to the callee's arguments.  */
808 static void
809 ipcp_propagate_stage (void)
810 {
811   int i;
812   struct ipcp_lattice inc_lat = { IPA_BOTTOM, NULL };
813   struct ipcp_lattice new_lat = { IPA_BOTTOM, NULL };
814   struct ipcp_lattice *dest_lat;
815   struct cgraph_edge *cs;
816   struct ipa_jump_func *jump_func;
817   struct ipa_func_list *wl;
818   int count;
819
820   ipa_check_create_node_params ();
821   ipa_check_create_edge_args ();
822
823   /* Initialize worklist to contain all functions.  */
824   wl = ipa_init_func_list ();
825   while (wl)
826     {
827       struct cgraph_node *node = ipa_pop_func_from_list (&wl);
828       struct ipa_node_params *info = IPA_NODE_REF (node);
829
830       for (cs = node->callees; cs; cs = cs->next_callee)
831         {
832           struct ipa_node_params *callee_info = IPA_NODE_REF (cs->callee);
833           struct ipa_edge_args *args = IPA_EDGE_REF (cs);
834
835           if (ipa_is_called_with_var_arguments (callee_info)
836               || !cs->callee->analyzed
837               || ipa_is_called_with_var_arguments (callee_info))
838             continue;
839
840           count = ipa_get_cs_argument_count (args);
841           for (i = 0; i < count; i++)
842             {
843               jump_func = ipa_get_ith_jump_func (args, i);
844               ipcp_lattice_from_jfunc (info, &inc_lat, jump_func);
845               dest_lat = ipcp_get_lattice (callee_info, i);
846               ipa_lattice_meet (&new_lat, &inc_lat, dest_lat);
847               if (ipcp_lattice_changed (&new_lat, dest_lat))
848                 {
849                   dest_lat->type = new_lat.type;
850                   dest_lat->constant = new_lat.constant;
851                   ipa_push_func_to_list (&wl, cs->callee);
852                 }
853
854               if (ipcp_propagate_types (info, callee_info, jump_func, i))
855                 ipa_push_func_to_list (&wl, cs->callee);
856             }
857         }
858     }
859 }
860
861 /* Call the constant propagation algorithm and re-call it if necessary
862    (if there are undetermined values left).  */
863 static void
864 ipcp_iterate_stage (void)
865 {
866   struct cgraph_node *node;
867   n_cloning_candidates = 0;
868
869   if (dump_file)
870     fprintf (dump_file, "\nIPA iterate stage:\n\n");
871
872   if (in_lto_p)
873     ipa_update_after_lto_read ();
874
875   for (node = cgraph_nodes; node; node = node->next)
876     {
877       ipcp_initialize_node_lattices (node);
878       ipcp_compute_node_scale (node);
879     }
880   if (dump_file && (dump_flags & TDF_DETAILS))
881     {
882       ipcp_print_all_lattices (dump_file);
883       ipcp_function_scale_print (dump_file);
884     }
885
886   ipcp_propagate_stage ();
887   if (ipcp_change_tops_to_bottom ())
888     /* Some lattices have changed from IPA_TOP to IPA_BOTTOM.
889        This change should be propagated.  */
890     {
891       gcc_assert (n_cloning_candidates);
892       ipcp_propagate_stage ();
893     }
894   if (dump_file)
895     {
896       fprintf (dump_file, "\nIPA lattices after propagation:\n");
897       ipcp_print_all_lattices (dump_file);
898       if (dump_flags & TDF_DETAILS)
899         ipcp_print_profile_data (dump_file);
900     }
901 }
902
903 /* Check conditions to forbid constant insertion to function described by
904    NODE.  */
905 static inline bool
906 ipcp_node_modifiable_p (struct cgraph_node *node)
907 {
908   /* Once we will be able to do in-place replacement, we can be more
909      lax here.  */
910   return ipcp_versionable_function_p (node);
911 }
912
913 /* Print count scale data structures.  */
914 static void
915 ipcp_function_scale_print (FILE * f)
916 {
917   struct cgraph_node *node;
918
919   for (node = cgraph_nodes; node; node = node->next)
920     {
921       if (!node->analyzed)
922         continue;
923       fprintf (f, "printing scale for %s: ", cgraph_node_name (node));
924       fprintf (f, "value is  " HOST_WIDE_INT_PRINT_DEC
925                "  \n", (HOST_WIDE_INT) ipcp_get_node_scale (node));
926     }
927 }
928
929 /* Print counts of all cgraph nodes.  */
930 static void
931 ipcp_print_func_profile_counts (FILE * f)
932 {
933   struct cgraph_node *node;
934
935   for (node = cgraph_nodes; node; node = node->next)
936     {
937       fprintf (f, "function %s: ", cgraph_node_name (node));
938       fprintf (f, "count is  " HOST_WIDE_INT_PRINT_DEC
939                "  \n", (HOST_WIDE_INT) node->count);
940     }
941 }
942
943 /* Print counts of all cgraph edges.  */
944 static void
945 ipcp_print_call_profile_counts (FILE * f)
946 {
947   struct cgraph_node *node;
948   struct cgraph_edge *cs;
949
950   for (node = cgraph_nodes; node; node = node->next)
951     {
952       for (cs = node->callees; cs; cs = cs->next_callee)
953         {
954           fprintf (f, "%s -> %s ", cgraph_node_name (cs->caller),
955                    cgraph_node_name (cs->callee));
956           fprintf (f, "count is  " HOST_WIDE_INT_PRINT_DEC "  \n",
957                    (HOST_WIDE_INT) cs->count);
958         }
959     }
960 }
961
962 /* Print profile info for all functions.  */
963 static void
964 ipcp_print_profile_data (FILE * f)
965 {
966   fprintf (f, "\nNODE COUNTS :\n");
967   ipcp_print_func_profile_counts (f);
968   fprintf (f, "\nCS COUNTS stage:\n");
969   ipcp_print_call_profile_counts (f);
970 }
971
972 /* Build and initialize ipa_replace_map struct according to LAT. This struct is
973    processed by versioning, which operates according to the flags set.
974    PARM_TREE is the formal parameter found to be constant.  LAT represents the
975    constant.  */
976 static struct ipa_replace_map *
977 ipcp_create_replace_map (tree parm_tree, struct ipcp_lattice *lat)
978 {
979   struct ipa_replace_map *replace_map;
980   tree const_val;
981
982   const_val = build_const_val (lat, TREE_TYPE (parm_tree));
983   if (const_val == NULL_TREE)
984     {
985       if (dump_file)
986         {
987           fprintf (dump_file, "  const ");
988           print_generic_expr (dump_file, lat->constant, 0);
989           fprintf (dump_file, "  can't be converted to param ");
990           print_generic_expr (dump_file, parm_tree, 0);
991           fprintf (dump_file, "\n");
992         }
993       return NULL;
994     }
995   replace_map = ggc_alloc_ipa_replace_map ();
996   if (dump_file)
997     {
998       fprintf (dump_file, "  replacing param ");
999       print_generic_expr (dump_file, parm_tree, 0);
1000       fprintf (dump_file, " with const ");
1001       print_generic_expr (dump_file, const_val, 0);
1002       fprintf (dump_file, "\n");
1003     }
1004   replace_map->old_tree = parm_tree;
1005   replace_map->new_tree = const_val;
1006   replace_map->replace_p = true;
1007   replace_map->ref_p = false;
1008
1009   return replace_map;
1010 }
1011
1012 /* Return true if this callsite should be redirected to the original callee
1013    (instead of the cloned one).  */
1014 static bool
1015 ipcp_need_redirect_p (struct cgraph_edge *cs)
1016 {
1017   struct ipa_node_params *orig_callee_info;
1018   int i, count;
1019   struct cgraph_node *node = cs->callee, *orig;
1020
1021   if (!n_cloning_candidates)
1022     return false;
1023
1024   if ((orig = ipcp_get_orig_node (node)) != NULL)
1025     node = orig;
1026   if (ipcp_get_orig_node (cs->caller))
1027     return false;
1028
1029   orig_callee_info = IPA_NODE_REF (node);
1030   count = ipa_get_param_count (orig_callee_info);
1031   for (i = 0; i < count; i++)
1032     {
1033       struct ipcp_lattice *lat = ipcp_get_lattice (orig_callee_info, i);
1034       struct ipa_jump_func *jump_func;
1035
1036       jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
1037       if ((ipcp_lat_is_const (lat)
1038            && jump_func->type != IPA_JF_CONST)
1039           || (!ipa_param_cannot_devirtualize_p (orig_callee_info, i)
1040               && !ipa_param_types_vec_empty (orig_callee_info, i)
1041               && jump_func->type != IPA_JF_CONST
1042               && jump_func->type != IPA_JF_KNOWN_TYPE))
1043         return true;
1044     }
1045
1046   return false;
1047 }
1048
1049 /* Fix the callsites and the call graph after function cloning was done.  */
1050 static void
1051 ipcp_update_callgraph (void)
1052 {
1053   struct cgraph_node *node;
1054
1055   for (node = cgraph_nodes; node; node = node->next)
1056     if (node->analyzed && ipcp_node_is_clone (node))
1057       {
1058         bitmap args_to_skip = NULL;
1059         struct cgraph_node *orig_node = ipcp_get_orig_node (node);
1060         struct ipa_node_params *info = IPA_NODE_REF (orig_node);
1061         int i, count = ipa_get_param_count (info);
1062         struct cgraph_edge *cs, *next;
1063
1064         if (node->local.can_change_signature)
1065           {
1066             args_to_skip = BITMAP_ALLOC (NULL);
1067             for (i = 0; i < count; i++)
1068               {
1069                 struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1070
1071                 /* We can proactively remove obviously unused arguments.  */
1072                 if (!ipa_is_param_used (info, i))
1073                   {
1074                     bitmap_set_bit (args_to_skip, i);
1075                     continue;
1076                   }
1077
1078                 if (lat->type == IPA_CONST_VALUE)
1079                   bitmap_set_bit (args_to_skip, i);
1080               }
1081           }
1082         for (cs = node->callers; cs; cs = next)
1083           {
1084             next = cs->next_caller;
1085             if (!ipcp_node_is_clone (cs->caller) && ipcp_need_redirect_p (cs))
1086               {
1087                 if (dump_file)
1088                   fprintf (dump_file, "Redirecting edge %s/%i -> %s/%i "
1089                            "back to %s/%i.",
1090                            cgraph_node_name (cs->caller), cs->caller->uid,
1091                            cgraph_node_name (cs->callee), cs->callee->uid,
1092                            cgraph_node_name (orig_node), orig_node->uid);
1093                 cgraph_redirect_edge_callee (cs, orig_node);
1094               }
1095           }
1096       }
1097 }
1098
1099 /* Update profiling info for versioned functions and the functions they were
1100    versioned from.  */
1101 static void
1102 ipcp_update_profiling (void)
1103 {
1104   struct cgraph_node *node, *orig_node;
1105   gcov_type scale, scale_complement;
1106   struct cgraph_edge *cs;
1107
1108   for (node = cgraph_nodes; node; node = node->next)
1109     {
1110       if (ipcp_node_is_clone (node))
1111         {
1112           orig_node = ipcp_get_orig_node (node);
1113           scale = ipcp_get_node_scale (orig_node);
1114           node->count = orig_node->count * scale / REG_BR_PROB_BASE;
1115           scale_complement = REG_BR_PROB_BASE - scale;
1116           orig_node->count =
1117             orig_node->count * scale_complement / REG_BR_PROB_BASE;
1118           for (cs = node->callees; cs; cs = cs->next_callee)
1119             cs->count = cs->count * scale / REG_BR_PROB_BASE;
1120           for (cs = orig_node->callees; cs; cs = cs->next_callee)
1121             cs->count = cs->count * scale_complement / REG_BR_PROB_BASE;
1122         }
1123     }
1124 }
1125
1126 /* If NODE was cloned, how much would program grow? */
1127 static long
1128 ipcp_estimate_growth (struct cgraph_node *node)
1129 {
1130   struct cgraph_edge *cs;
1131   int redirectable_node_callers = 0;
1132   int removable_args = 0;
1133   bool need_original
1134      = !cgraph_will_be_removed_from_program_if_no_direct_calls (node);
1135   struct ipa_node_params *info;
1136   int i, count;
1137   int growth;
1138
1139   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1140     if (cs->caller == node || !ipcp_need_redirect_p (cs))
1141       redirectable_node_callers++;
1142     else
1143       need_original = true;
1144
1145   /* If we will be able to fully replace original node, we never increase
1146      program size.  */
1147   if (!need_original)
1148     return 0;
1149
1150   info = IPA_NODE_REF (node);
1151   count = ipa_get_param_count (info);
1152   if (node->local.can_change_signature)
1153     for (i = 0; i < count; i++)
1154       {
1155         struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1156
1157         /* We can proactively remove obviously unused arguments.  */
1158         if (!ipa_is_param_used (info, i))
1159           removable_args++;
1160
1161         if (lat->type == IPA_CONST_VALUE)
1162           removable_args++;
1163       }
1164
1165   /* We make just very simple estimate of savings for removal of operand from
1166      call site.  Precise cost is difficult to get, as our size metric counts
1167      constants and moves as free.  Generally we are looking for cases that
1168      small function is called very many times.  */
1169   growth = node->local.inline_summary.self_size
1170            - removable_args * redirectable_node_callers;
1171   if (growth < 0)
1172     return 0;
1173   return growth;
1174 }
1175
1176
1177 /* Estimate cost of cloning NODE.  */
1178 static long
1179 ipcp_estimate_cloning_cost (struct cgraph_node *node)
1180 {
1181   int freq_sum = 1;
1182   gcov_type count_sum = 1;
1183   struct cgraph_edge *e;
1184   int cost;
1185
1186   cost = ipcp_estimate_growth (node) * 1000;
1187   if (!cost)
1188     {
1189       if (dump_file)
1190         fprintf (dump_file, "Versioning of %s will save code size\n",
1191                  cgraph_node_name (node));
1192       return 0;
1193     }
1194
1195   for (e = node->callers; e; e = e->next_caller)
1196     if (!bitmap_bit_p (dead_nodes, e->caller->uid)
1197         && !ipcp_need_redirect_p (e))
1198       {
1199         count_sum += e->count;
1200         freq_sum += e->frequency + 1;
1201       }
1202
1203   if (max_count)
1204     cost /= count_sum * 1000 / max_count + 1;
1205   else
1206     cost /= freq_sum * 1000 / REG_BR_PROB_BASE + 1;
1207   if (dump_file)
1208     fprintf (dump_file, "Cost of versioning %s is %i, (size: %i, freq: %i)\n",
1209              cgraph_node_name (node), cost, node->local.inline_summary.self_size,
1210              freq_sum);
1211   return cost + 1;
1212 }
1213
1214 /* Walk indirect calls of NODE and if any polymorphic can be turned into a
1215    direct one now, do so.  */
1216
1217 static void
1218 ipcp_process_devirtualization_opportunities (struct cgraph_node *node)
1219 {
1220   struct ipa_node_params *info = IPA_NODE_REF (node);
1221   struct cgraph_edge *ie, *next_ie;
1222
1223   for (ie = node->indirect_calls; ie; ie = next_ie)
1224     {
1225       int param_index, types_count, j;
1226       HOST_WIDE_INT token;
1227       tree target, delta;
1228
1229       next_ie = ie->next_callee;
1230       if (!ie->indirect_info->polymorphic)
1231         continue;
1232       param_index = ie->indirect_info->param_index;
1233       if (param_index == -1
1234           || ipa_param_cannot_devirtualize_p (info, param_index)
1235           || ipa_param_types_vec_empty (info, param_index))
1236         continue;
1237
1238       token = ie->indirect_info->otr_token;
1239       target = NULL_TREE;
1240       types_count = VEC_length (tree, info->params[param_index].types);
1241       for (j = 0; j < types_count; j++)
1242         {
1243           tree binfo = VEC_index (tree, info->params[param_index].types, j);
1244           tree d;
1245           tree t = gimple_get_virt_mehtod_for_binfo (token, binfo, &d, true);
1246
1247           if (!t)
1248             {
1249               target = NULL_TREE;
1250               break;
1251             }
1252           else if (!target)
1253             {
1254               target = t;
1255               delta = d;
1256             }
1257           else if (target != t || !tree_int_cst_equal (delta, d))
1258             {
1259               target = NULL_TREE;
1260               break;
1261             }
1262         }
1263
1264       if (target)
1265         ipa_make_edge_direct_to_target (ie, target, delta);
1266     }
1267 }
1268
1269 /* Return number of live constant parameters.  */
1270 static int
1271 ipcp_const_param_count (struct cgraph_node *node)
1272 {
1273   int const_param = 0;
1274   struct ipa_node_params *info = IPA_NODE_REF (node);
1275   int count = ipa_get_param_count (info);
1276   int i;
1277
1278   for (i = 0; i < count; i++)
1279     {
1280       struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1281       if ((ipcp_lat_is_insertable (lat)
1282           /* Do not count obviously unused arguments.  */
1283            && ipa_is_param_used (info, i))
1284           || (!ipa_param_cannot_devirtualize_p (info, i)
1285               && !ipa_param_types_vec_empty (info, i)))
1286         const_param++;
1287     }
1288   return const_param;
1289 }
1290
1291 /* Given that a formal parameter of NODE given by INDEX is known to be constant
1292    CST, try to find any indirect edges that can be made direct and make them
1293    so.  Note that INDEX is the number the parameter at the time of analyzing
1294    parameter uses and parameter removals should not be considered for it.  (In
1295    fact, the parameter itself has just been removed.)  */
1296
1297 static void
1298 ipcp_discover_new_direct_edges (struct cgraph_node *node, int index, tree cst)
1299 {
1300   struct cgraph_edge *ie, *next_ie;
1301
1302   for (ie = node->indirect_calls; ie; ie = next_ie)
1303     {
1304       struct cgraph_indirect_call_info *ici = ie->indirect_info;
1305
1306       next_ie = ie->next_callee;
1307       if (ici->param_index != index
1308           || ici->polymorphic)
1309         continue;
1310
1311       ipa_make_edge_direct_to_target (ie, cst, NULL_TREE);
1312     }
1313 }
1314
1315
1316 /* Propagate the constant parameters found by ipcp_iterate_stage()
1317    to the function's code.  */
1318 static void
1319 ipcp_insert_stage (void)
1320 {
1321   struct cgraph_node *node, *node1 = NULL;
1322   int i;
1323   VEC (cgraph_edge_p, heap) * redirect_callers;
1324   VEC (ipa_replace_map_p,gc)* replace_trees;
1325   int node_callers, count;
1326   tree parm_tree;
1327   struct ipa_replace_map *replace_param;
1328   fibheap_t heap;
1329   long overall_size = 0, new_size = 0;
1330   long max_new_size;
1331
1332   ipa_check_create_node_params ();
1333   ipa_check_create_edge_args ();
1334   if (dump_file)
1335     fprintf (dump_file, "\nIPA insert stage:\n\n");
1336
1337   dead_nodes = BITMAP_ALLOC (NULL);
1338
1339   for (node = cgraph_nodes; node; node = node->next)
1340     if (node->analyzed)
1341       {
1342         if (node->count > max_count)
1343           max_count = node->count;
1344         overall_size += node->local.inline_summary.self_size;
1345       }
1346
1347   max_new_size = overall_size;
1348   if (max_new_size < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS))
1349     max_new_size = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS);
1350   max_new_size = max_new_size * PARAM_VALUE (PARAM_IPCP_UNIT_GROWTH) / 100 + 1;
1351
1352   /* First collect all functions we proved to have constant arguments to
1353      heap.  */
1354   heap = fibheap_new ();
1355   for (node = cgraph_nodes; node; node = node->next)
1356     {
1357       struct ipa_node_params *info;
1358       /* Propagation of the constant is forbidden in certain conditions.  */
1359       if (!node->analyzed || !ipcp_node_modifiable_p (node))
1360           continue;
1361       info = IPA_NODE_REF (node);
1362       if (ipa_is_called_with_var_arguments (info))
1363         continue;
1364       if (ipcp_const_param_count (node))
1365         node->aux = fibheap_insert (heap, ipcp_estimate_cloning_cost (node),
1366                                     node);
1367      }
1368
1369   /* Now clone in priority order until code size growth limits are met or
1370      heap is emptied.  */
1371   while (!fibheap_empty (heap))
1372     {
1373       struct ipa_node_params *info;
1374       int growth = 0;
1375       bitmap args_to_skip;
1376       struct cgraph_edge *cs;
1377
1378       node = (struct cgraph_node *)fibheap_extract_min (heap);
1379       node->aux = NULL;
1380       if (dump_file)
1381         fprintf (dump_file, "considering function %s\n",
1382                  cgraph_node_name (node));
1383
1384       growth = ipcp_estimate_growth (node);
1385
1386       if (new_size + growth > max_new_size)
1387         break;
1388       if (growth
1389           && optimize_function_for_size_p (DECL_STRUCT_FUNCTION (node->decl)))
1390         {
1391           if (dump_file)
1392             fprintf (dump_file, "Not versioning, cold code would grow");
1393           continue;
1394         }
1395
1396       info = IPA_NODE_REF (node);
1397       count = ipa_get_param_count (info);
1398
1399       replace_trees = VEC_alloc (ipa_replace_map_p, gc, 1);
1400
1401       if (node->local.can_change_signature)
1402         args_to_skip = BITMAP_GGC_ALLOC ();
1403       else
1404         args_to_skip = NULL;
1405       for (i = 0; i < count; i++)
1406         {
1407           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1408           parm_tree = ipa_get_param (info, i);
1409
1410           /* We can proactively remove obviously unused arguments.  */
1411           if (!ipa_is_param_used (info, i))
1412             {
1413               if (args_to_skip)
1414                 bitmap_set_bit (args_to_skip, i);
1415               continue;
1416             }
1417
1418           if (lat->type == IPA_CONST_VALUE)
1419             {
1420               replace_param =
1421                 ipcp_create_replace_map (parm_tree, lat);
1422               if (replace_param == NULL)
1423                 break;
1424               VEC_safe_push (ipa_replace_map_p, gc, replace_trees, replace_param);
1425               if (args_to_skip)
1426                 bitmap_set_bit (args_to_skip, i);
1427             }
1428         }
1429       if (i < count)
1430         {
1431           if (dump_file)
1432             fprintf (dump_file, "Not versioning, some parameters couldn't be replaced");
1433           continue;
1434         }
1435
1436       new_size += growth;
1437
1438       /* Look if original function becomes dead after cloning.  */
1439       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1440         if (cs->caller == node || ipcp_need_redirect_p (cs))
1441           break;
1442       if (!cs && cgraph_will_be_removed_from_program_if_no_direct_calls (node))
1443         bitmap_set_bit (dead_nodes, node->uid);
1444
1445       /* Compute how many callers node has.  */
1446       node_callers = 0;
1447       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1448         node_callers++;
1449       redirect_callers = VEC_alloc (cgraph_edge_p, heap, node_callers);
1450       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1451         if (!cs->indirect_inlining_edge)
1452           VEC_quick_push (cgraph_edge_p, redirect_callers, cs);
1453
1454       /* Redirecting all the callers of the node to the
1455          new versioned node.  */
1456       node1 =
1457         cgraph_create_virtual_clone (node, redirect_callers, replace_trees,
1458                                      args_to_skip, "constprop");
1459       args_to_skip = NULL;
1460       VEC_free (cgraph_edge_p, heap, redirect_callers);
1461       replace_trees = NULL;
1462
1463       if (node1 == NULL)
1464         continue;
1465       ipcp_process_devirtualization_opportunities (node1);
1466
1467       if (dump_file)
1468         fprintf (dump_file, "versioned function %s with growth %i, overall %i\n",
1469                  cgraph_node_name (node), (int)growth, (int)new_size);
1470       ipcp_init_cloned_node (node, node1);
1471
1472       info = IPA_NODE_REF (node);
1473       for (i = 0; i < count; i++)
1474         {
1475           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1476           if (lat->type == IPA_CONST_VALUE)
1477             ipcp_discover_new_direct_edges (node1, i, lat->constant);
1478         }
1479
1480       if (dump_file)
1481         dump_function_to_file (node1->decl, dump_file, dump_flags);
1482
1483       for (cs = node->callees; cs; cs = cs->next_callee)
1484         if (cs->callee->aux)
1485           {
1486             fibheap_delete_node (heap, (fibnode_t) cs->callee->aux);
1487             cs->callee->aux = fibheap_insert (heap,
1488                                               ipcp_estimate_cloning_cost (cs->callee),
1489                                               cs->callee);
1490           }
1491     }
1492
1493   while (!fibheap_empty (heap))
1494     {
1495       if (dump_file)
1496         fprintf (dump_file, "skipping function %s\n",
1497                  cgraph_node_name (node));
1498       node = (struct cgraph_node *) fibheap_extract_min (heap);
1499       node->aux = NULL;
1500     }
1501   fibheap_delete (heap);
1502   BITMAP_FREE (dead_nodes);
1503   ipcp_update_callgraph ();
1504   ipcp_update_profiling ();
1505 }
1506
1507 /* The IPCP driver.  */
1508 static unsigned int
1509 ipcp_driver (void)
1510 {
1511   cgraph_remove_unreachable_nodes (true,dump_file);
1512   if (dump_file)
1513     {
1514       fprintf (dump_file, "\nIPA structures before propagation:\n");
1515       if (dump_flags & TDF_DETAILS)
1516         ipa_print_all_params (dump_file);
1517       ipa_print_all_jump_functions (dump_file);
1518     }
1519   /* 2. Do the interprocedural propagation.  */
1520   ipcp_iterate_stage ();
1521   /* 3. Insert the constants found to the functions.  */
1522   ipcp_insert_stage ();
1523   if (dump_file && (dump_flags & TDF_DETAILS))
1524     {
1525       fprintf (dump_file, "\nProfiling info after insert stage:\n");
1526       ipcp_print_profile_data (dump_file);
1527     }
1528   /* Free all IPCP structures.  */
1529   ipa_free_all_structures_after_ipa_cp ();
1530   if (dump_file)
1531     fprintf (dump_file, "\nIPA constant propagation end\n");
1532   return 0;
1533 }
1534
1535 /* Initialization and computation of IPCP data structures.  This is the initial
1536    intraprocedural analysis of functions, which gathers information to be
1537    propagated later on.  */
1538
1539 static void
1540 ipcp_generate_summary (void)
1541 {
1542   struct cgraph_node *node;
1543
1544   if (dump_file)
1545     fprintf (dump_file, "\nIPA constant propagation start:\n");
1546   ipa_check_create_node_params ();
1547   ipa_check_create_edge_args ();
1548   ipa_register_cgraph_hooks ();
1549
1550   for (node = cgraph_nodes; node; node = node->next)
1551     if (node->analyzed)
1552       {
1553         /* Unreachable nodes should have been eliminated before ipcp.  */
1554         gcc_assert (node->needed || node->reachable);
1555
1556         node->local.versionable = tree_versionable_function_p (node->decl);
1557         ipa_analyze_node (node);
1558       }
1559 }
1560
1561 /* Write ipcp summary for nodes in SET.  */
1562 static void
1563 ipcp_write_summary (cgraph_node_set set,
1564                     varpool_node_set vset ATTRIBUTE_UNUSED)
1565 {
1566   ipa_prop_write_jump_functions (set);
1567 }
1568
1569 /* Read ipcp summary.  */
1570 static void
1571 ipcp_read_summary (void)
1572 {
1573   ipa_prop_read_jump_functions ();
1574 }
1575
1576 /* Gate for IPCP optimization.  */
1577 static bool
1578 cgraph_gate_cp (void)
1579 {
1580   /* FIXME: We should remove the optimize check after we ensure we never run
1581      IPA passes when not optimizing.  */
1582   return flag_ipa_cp && optimize;
1583 }
1584
1585 struct ipa_opt_pass_d pass_ipa_cp =
1586 {
1587  {
1588   IPA_PASS,
1589   "cp",                         /* name */
1590   cgraph_gate_cp,               /* gate */
1591   ipcp_driver,                  /* execute */
1592   NULL,                         /* sub */
1593   NULL,                         /* next */
1594   0,                            /* static_pass_number */
1595   TV_IPA_CONSTANT_PROP,         /* tv_id */
1596   0,                            /* properties_required */
1597   0,                            /* properties_provided */
1598   0,                            /* properties_destroyed */
1599   0,                            /* todo_flags_start */
1600   TODO_dump_cgraph | TODO_dump_func |
1601   TODO_remove_functions | TODO_ggc_collect /* todo_flags_finish */
1602  },
1603  ipcp_generate_summary,                 /* generate_summary */
1604  ipcp_write_summary,                    /* write_summary */
1605  ipcp_read_summary,                     /* read_summary */
1606  NULL,                                  /* write_optimization_summary */
1607  NULL,                                  /* read_optimization_summary */
1608  NULL,                                  /* stmt_fixup */
1609  0,                                     /* TODOs */
1610  NULL,                                  /* function_transform */
1611  NULL,                                  /* variable_transform */
1612 };