OSDN Git Service

PR middle-end/43125
[pf3gnuchains/gcc-fork.git] / gcc / ipa-cp.c
1 /* Interprocedural constant propagation
2    Copyright (C) 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
3    Contributed by Razya Ladelsky <RAZYA@il.ibm.com>
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 /* Interprocedural constant propagation.  The aim of interprocedural constant
22    propagation (IPCP) is to find which function's argument has the same
23    constant value in each invocation throughout the whole program. For example,
24    consider the following program:
25
26    int g (int y)
27    {
28      printf ("value is %d",y);
29    }
30
31    int f (int x)
32    {
33      g (x);
34    }
35
36    int h (int y)
37    {
38      g (y);
39    }
40
41    void main (void)
42    {
43      f (3);
44      h (3);
45    }
46
47
48    The IPCP algorithm will find that g's formal argument y is always called
49    with the value 3.
50
51    The algorithm used is based on "Interprocedural Constant Propagation", by
52    Challahan David, Keith D Cooper, Ken Kennedy, Linda Torczon, Comp86, pg
53    152-161
54
55    The optimization is divided into three stages:
56
57    First stage - intraprocedural analysis
58    =======================================
59    This phase computes jump_function and modification flags.
60
61    A jump function for a callsite represents the values passed as an actual
62    arguments of a given callsite. There are three types of values:
63    Pass through - the caller's formal parameter is passed as an actual argument.
64    Constant - a constant is passed as an actual argument.
65    Unknown - neither of the above.
66
67    The jump function info, ipa_jump_func, is stored in ipa_edge_args
68    structure (defined in ipa_prop.h and pointed to by cgraph_node->aux)
69    modified_flags are defined in ipa_node_params structure
70    (defined in ipa_prop.h and pointed to by cgraph_edge->aux).
71
72    -ipcp_init_stage() is the first stage driver.
73
74    Second stage - interprocedural analysis
75    ========================================
76    This phase does the interprocedural constant propagation.
77    It computes lattices for all formal parameters in the program
78    and their value that may be:
79    TOP - unknown.
80    BOTTOM - non constant.
81    CONSTANT - constant value.
82
83    Lattice describing a formal parameter p will have a constant value if all
84    callsites invoking this function have the same constant value passed to p.
85
86    The lattices are stored in ipcp_lattice which is itself in ipa_node_params
87    structure (defined in ipa_prop.h and pointed to by cgraph_edge->aux).
88
89    -ipcp_iterate_stage() is the second stage driver.
90
91    Third phase - transformation of function code
92    ============================================
93    Propagates the constant-valued formals into the function.
94    For each function whose parameters are constants, we create its clone.
95
96    Then we process the clone in two ways:
97    1. We insert an assignment statement 'parameter = const' at the beginning
98       of the cloned function.
99    2. For read-only parameters that do not live in memory, we replace all their
100       uses with the constant.
101
102    We also need to modify some callsites to call the cloned functions instead
103    of the original ones.  For a callsite passing an argument found to be a
104    constant by IPCP, there are two different cases to handle:
105    1. A constant is passed as an argument.  In this case the callsite in the
106       should be redirected to call the cloned callee.
107    2. A parameter (of the caller) passed as an argument (pass through
108       argument).  In such cases both the caller and the callee have clones and
109       only the callsite in the cloned caller is redirected to call to the
110       cloned callee.
111
112    This update is done in two steps: First all cloned functions are created
113    during a traversal of the call graph, during which all callsites are
114    redirected to call the cloned function.  Then the callsites are traversed
115    and many calls redirected back to fit the description above.
116
117    -ipcp_insert_stage() is the third phase driver.
118
119 */
120
121 #include "config.h"
122 #include "system.h"
123 #include "coretypes.h"
124 #include "tree.h"
125 #include "target.h"
126 #include "cgraph.h"
127 #include "ipa-prop.h"
128 #include "tree-flow.h"
129 #include "tree-pass.h"
130 #include "flags.h"
131 #include "timevar.h"
132 #include "diagnostic.h"
133 #include "tree-dump.h"
134 #include "tree-inline.h"
135 #include "fibheap.h"
136 #include "params.h"
137
138 /* Number of functions identified as candidates for cloning. When not cloning
139    we can simplify iterate stage not forcing it to go through the decision
140    on what is profitable and what not.  */
141 static int n_cloning_candidates;
142
143 /* Maximal count found in program.  */
144 static gcov_type max_count;
145
146 /* Cgraph nodes that has been completely replaced by cloning during iterate
147  * stage and will be removed after ipcp is finished.  */
148 static bitmap dead_nodes;
149
150 static void ipcp_print_profile_data (FILE *);
151 static void ipcp_function_scale_print (FILE *);
152
153 /* Get the original node field of ipa_node_params associated with node NODE.  */
154 static inline struct cgraph_node *
155 ipcp_get_orig_node (struct cgraph_node *node)
156 {
157   return IPA_NODE_REF (node)->ipcp_orig_node;
158 }
159
160 /* Return true if NODE describes a cloned/versioned function.  */
161 static inline bool
162 ipcp_node_is_clone (struct cgraph_node *node)
163 {
164   return (ipcp_get_orig_node (node) != NULL);
165 }
166
167 /* Create ipa_node_params and its data structures for NEW_NODE.  Set ORIG_NODE
168    as the ipcp_orig_node field in ipa_node_params.  */
169 static void
170 ipcp_init_cloned_node (struct cgraph_node *orig_node,
171                        struct cgraph_node *new_node)
172 {
173   ipa_check_create_node_params ();
174   ipa_initialize_node_params (new_node);
175   IPA_NODE_REF (new_node)->ipcp_orig_node = orig_node;
176 }
177
178 /* Perform intraprocedrual analysis needed for ipcp.  */
179 static void
180 ipcp_analyze_node (struct cgraph_node *node)
181 {
182   /* Unreachable nodes should have been eliminated before ipcp.  */
183   gcc_assert (node->needed || node->reachable);
184
185   ipa_initialize_node_params (node);
186   ipa_detect_param_modifications (node);
187 }
188
189 /* Return scale for NODE.  */
190 static inline gcov_type
191 ipcp_get_node_scale (struct cgraph_node *node)
192 {
193   return IPA_NODE_REF (node)->count_scale;
194 }
195
196 /* Set COUNT as scale for NODE.  */
197 static inline void
198 ipcp_set_node_scale (struct cgraph_node *node, gcov_type count)
199 {
200   IPA_NODE_REF (node)->count_scale = count;
201 }
202
203 /* Return whether LAT is a constant lattice.  */
204 static inline bool
205 ipcp_lat_is_const (struct ipcp_lattice *lat)
206 {
207   if (lat->type == IPA_CONST_VALUE)
208     return true;
209   else
210     return false;
211 }
212
213 /* Return whether LAT is a constant lattice that ipa-cp can actually insert
214    into the code (i.e. constants excluding member pointers and pointers).  */
215 static inline bool
216 ipcp_lat_is_insertable (struct ipcp_lattice *lat)
217 {
218   return lat->type == IPA_CONST_VALUE;
219 }
220
221 /* Return true if LAT1 and LAT2 are equal.  */
222 static inline bool
223 ipcp_lats_are_equal (struct ipcp_lattice *lat1, struct ipcp_lattice *lat2)
224 {
225   gcc_assert (ipcp_lat_is_const (lat1) && ipcp_lat_is_const (lat2));
226   if (lat1->type != lat2->type)
227     return false;
228
229   if (operand_equal_p (lat1->constant, lat2->constant, 0))
230     return true;
231
232   return false;
233 }
234
235 /* Compute Meet arithmetics:
236    Meet (IPA_BOTTOM, x) = IPA_BOTTOM
237    Meet (IPA_TOP,x) = x
238    Meet (const_a,const_b) = IPA_BOTTOM,  if const_a != const_b.
239    MEET (const_a,const_b) = const_a, if const_a == const_b.*/
240 static void
241 ipa_lattice_meet (struct ipcp_lattice *res, struct ipcp_lattice *lat1,
242                   struct ipcp_lattice *lat2)
243 {
244   if (lat1->type == IPA_BOTTOM || lat2->type == IPA_BOTTOM)
245     {
246       res->type = IPA_BOTTOM;
247       return;
248     }
249   if (lat1->type == IPA_TOP)
250     {
251       res->type = lat2->type;
252       res->constant = lat2->constant;
253       return;
254     }
255   if (lat2->type == IPA_TOP)
256     {
257       res->type = lat1->type;
258       res->constant = lat1->constant;
259       return;
260     }
261   if (!ipcp_lats_are_equal (lat1, lat2))
262     {
263       res->type = IPA_BOTTOM;
264       return;
265     }
266   res->type = lat1->type;
267   res->constant = lat1->constant;
268 }
269
270 /* Return the lattice corresponding to the Ith formal parameter of the function
271    described by INFO.  */
272 static inline struct ipcp_lattice *
273 ipcp_get_lattice (struct ipa_node_params *info, int i)
274 {
275   return &(info->params[i].ipcp_lattice);
276 }
277
278 /* Given the jump function JFUNC, compute the lattice LAT that describes the
279    value coming down the callsite. INFO describes the caller node so that
280    pass-through jump functions can be evaluated.  */
281 static void
282 ipcp_lattice_from_jfunc (struct ipa_node_params *info, struct ipcp_lattice *lat,
283                          struct ipa_jump_func *jfunc)
284 {
285   if (jfunc->type == IPA_JF_CONST)
286     {
287       lat->type = IPA_CONST_VALUE;
288       lat->constant = jfunc->value.constant;
289     }
290   else if (jfunc->type == IPA_JF_PASS_THROUGH)
291     {
292       struct ipcp_lattice *caller_lat;
293       tree cst;
294
295       caller_lat = ipcp_get_lattice (info, jfunc->value.pass_through.formal_id);
296       lat->type = caller_lat->type;
297       if (caller_lat->type != IPA_CONST_VALUE)
298         return;
299       cst = caller_lat->constant;
300
301       if (jfunc->value.pass_through.operation != NOP_EXPR)
302         {
303           tree restype;
304           if (TREE_CODE_CLASS (jfunc->value.pass_through.operation)
305               == tcc_comparison)
306             restype = boolean_type_node;
307           else
308             restype = TREE_TYPE (cst);
309           cst = fold_binary (jfunc->value.pass_through.operation,
310                              restype, cst, jfunc->value.pass_through.operand);
311         }
312       if (!cst || !is_gimple_ip_invariant (cst))
313         lat->type = IPA_BOTTOM;
314       lat->constant = cst;
315     }
316   else if (jfunc->type == IPA_JF_ANCESTOR)
317     {
318       struct ipcp_lattice *caller_lat;
319       tree t;
320       bool ok;
321
322       caller_lat = ipcp_get_lattice (info, jfunc->value.ancestor.formal_id);
323       lat->type = caller_lat->type;
324       if (caller_lat->type != IPA_CONST_VALUE)
325         return;
326       if (TREE_CODE (caller_lat->constant) != ADDR_EXPR)
327         {
328           /* This can happen when the constant is a NULL pointer.  */
329           lat->type = IPA_BOTTOM;
330           return;
331         }
332       t = TREE_OPERAND (caller_lat->constant, 0);
333       ok = build_ref_for_offset (&t, TREE_TYPE (t),
334                                  jfunc->value.ancestor.offset,
335                                  jfunc->value.ancestor.type, false);
336       if (!ok)
337         {
338           lat->type = IPA_BOTTOM;
339           lat->constant = NULL_TREE;
340         }
341       else
342         lat->constant = build_fold_addr_expr (t);
343     }
344   else
345     lat->type = IPA_BOTTOM;
346 }
347
348 /* True when OLD_LAT and NEW_LAT values are not the same.  */
349
350 static bool
351 ipcp_lattice_changed (struct ipcp_lattice *old_lat,
352                       struct ipcp_lattice *new_lat)
353 {
354   if (old_lat->type == new_lat->type)
355     {
356       if (!ipcp_lat_is_const (old_lat))
357         return false;
358       if (ipcp_lats_are_equal (old_lat, new_lat))
359         return false;
360     }
361   return true;
362 }
363
364 /* Print all ipcp_lattices of all functions to F.  */
365 static void
366 ipcp_print_all_lattices (FILE * f)
367 {
368   struct cgraph_node *node;
369   int i, count;
370
371   fprintf (f, "\nLattice:\n");
372   for (node = cgraph_nodes; node; node = node->next)
373     {
374       struct ipa_node_params *info;
375
376       if (!node->analyzed)
377         continue;
378       info = IPA_NODE_REF (node);
379       fprintf (f, "  Node: %s:\n", cgraph_node_name (node));
380       count = ipa_get_param_count (info);
381       for (i = 0; i < count; i++)
382         {
383           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
384
385           fprintf (f, "    param [%d]: ", i);
386           if (lat->type == IPA_CONST_VALUE)
387             {
388               fprintf (f, "type is CONST ");
389               print_generic_expr (f, lat->constant, 0);
390               fprintf (f, "\n");
391             }
392           else if (lat->type == IPA_TOP)
393             fprintf (f, "type is TOP\n");
394           else
395             fprintf (f, "type is BOTTOM\n");
396         }
397     }
398 }
399
400 /* Return true if ipcp algorithms would allow cloning NODE.  */
401
402 static bool
403 ipcp_versionable_function_p (struct cgraph_node *node)
404 {
405   tree decl = node->decl;
406   basic_block bb;
407
408   /* There are a number of generic reasons functions cannot be versioned.  */
409   if (!tree_versionable_function_p (decl))
410     return false;
411
412   /* Removing arguments doesn't work if the function takes varargs.  */
413   if (DECL_STRUCT_FUNCTION (decl)->stdarg)
414     return false;
415
416   /* Removing arguments doesn't work if we use __builtin_apply_args.  */
417   FOR_EACH_BB_FN (bb, DECL_STRUCT_FUNCTION (decl))
418     {
419       gimple_stmt_iterator gsi;
420       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
421         {
422           const_gimple stmt = gsi_stmt (gsi);
423           tree t;
424
425           if (!is_gimple_call (stmt))
426             continue;
427           t = gimple_call_fndecl (stmt);
428           if (t == NULL_TREE)
429             continue;
430           if (DECL_BUILT_IN_CLASS (t) == BUILT_IN_NORMAL
431               && DECL_FUNCTION_CODE (t) == BUILT_IN_APPLY_ARGS)
432             return false;
433         }
434     }
435
436   return true;
437 }
438
439 /* Return true if this NODE is viable candidate for cloning.  */
440 static bool
441 ipcp_cloning_candidate_p (struct cgraph_node *node)
442 {
443   int n_calls = 0;
444   int n_hot_calls = 0;
445   gcov_type direct_call_sum = 0;
446   struct cgraph_edge *e;
447
448   /* We never clone functions that are not visible from outside.
449      FIXME: in future we should clone such functions when they are called with
450      different constants, but current ipcp implementation is not good on this.
451      */
452   if (cgraph_only_called_directly_p (node) || !node->analyzed)
453     return false;
454
455   if (cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE)
456     {
457       if (dump_file)
458         fprintf (dump_file, "Not considering %s for cloning; body is overwrittable.\n",
459                  cgraph_node_name (node));
460       return false;
461     }
462   if (!ipcp_versionable_function_p (node))
463     {
464       if (dump_file)
465         fprintf (dump_file, "Not considering %s for cloning; body is not versionable.\n",
466                  cgraph_node_name (node));
467       return false;
468     }
469   for (e = node->callers; e; e = e->next_caller)
470     {
471       direct_call_sum += e->count;
472       n_calls ++;
473       if (cgraph_maybe_hot_edge_p (e))
474         n_hot_calls ++;
475     }
476
477   if (!n_calls)
478     {
479       if (dump_file)
480         fprintf (dump_file, "Not considering %s for cloning; no direct calls.\n",
481                  cgraph_node_name (node));
482       return false;
483     }
484   if (node->local.inline_summary.self_size < n_calls)
485     {
486       if (dump_file)
487         fprintf (dump_file, "Considering %s for cloning; code would shrink.\n",
488                  cgraph_node_name (node));
489       return true;
490     }
491
492   if (!flag_ipa_cp_clone)
493     {
494       if (dump_file)
495         fprintf (dump_file, "Not considering %s for cloning; -fipa-cp-clone disabled.\n",
496                  cgraph_node_name (node));
497       return false;
498     }
499
500   if (!optimize_function_for_speed_p (DECL_STRUCT_FUNCTION (node->decl)))
501     {
502       if (dump_file)
503         fprintf (dump_file, "Not considering %s for cloning; optimizing it for size.\n",
504                  cgraph_node_name (node));
505       return false;
506     }
507
508   /* When profile is available and function is hot, propagate into it even if
509      calls seems cold; constant propagation can improve function's speed
510      significandly.  */
511   if (max_count)
512     {
513       if (direct_call_sum > node->count * 90 / 100)
514         {
515           if (dump_file)
516             fprintf (dump_file, "Considering %s for cloning; usually called directly.\n",
517                      cgraph_node_name (node));
518           return true;
519         }
520     }
521   if (!n_hot_calls)
522     {
523       if (dump_file)
524         fprintf (dump_file, "Not considering %s for cloning; no hot calls.\n",
525                  cgraph_node_name (node));
526       return false;
527     }
528   if (dump_file)
529     fprintf (dump_file, "Considering %s for cloning.\n",
530              cgraph_node_name (node));
531   return true;
532 }
533
534 /* Initialize ipcp_lattices array.  The lattices corresponding to supported
535    types (integers, real types and Fortran constants defined as const_decls)
536    are initialized to IPA_TOP, the rest of them to IPA_BOTTOM.  */
537 static void
538 ipcp_initialize_node_lattices (struct cgraph_node *node)
539 {
540   int i;
541   struct ipa_node_params *info = IPA_NODE_REF (node);
542   enum ipa_lattice_type type;
543
544   if (ipa_is_called_with_var_arguments (info))
545     type = IPA_BOTTOM;
546   else if (cgraph_only_called_directly_p (node))
547     type = IPA_TOP;
548   /* When cloning is allowed, we can assume that externally visible functions
549      are not called.  We will compensate this by cloning later.  */
550   else if (ipcp_cloning_candidate_p (node))
551     type = IPA_TOP, n_cloning_candidates ++;
552   else
553     type = IPA_BOTTOM;
554
555   for (i = 0; i < ipa_get_param_count (info) ; i++)
556     ipcp_get_lattice (info, i)->type = type;
557 }
558
559 /* build INTEGER_CST tree with type TREE_TYPE and value according to LAT.
560    Return the tree.  */
561 static tree
562 build_const_val (struct ipcp_lattice *lat, tree tree_type)
563 {
564   tree val;
565
566   gcc_assert (ipcp_lat_is_const (lat));
567   val = lat->constant;
568
569   if (!useless_type_conversion_p (tree_type, TREE_TYPE (val)))
570     {
571       if (fold_convertible_p (tree_type, val))
572         return fold_build1 (NOP_EXPR, tree_type, val);
573       else
574         return fold_build1 (VIEW_CONVERT_EXPR, tree_type, val);
575     }
576   return val;
577 }
578
579 /* Compute the proper scale for NODE.  It is the ratio between the number of
580    direct calls (represented on the incoming cgraph_edges) and sum of all
581    invocations of NODE (represented as count in cgraph_node).
582
583    FIXME: This code is wrong.  Since the callers can be also clones and
584    the clones are not scaled yet, the sums gets unrealistically high.
585    To properly compute the counts, we would need to do propagation across
586    callgraph (as external call to A might imply call to non-clonned B
587    if A's clone calls clonned B).  */
588 static void
589 ipcp_compute_node_scale (struct cgraph_node *node)
590 {
591   gcov_type sum;
592   struct cgraph_edge *cs;
593
594   sum = 0;
595   /* Compute sum of all counts of callers. */
596   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
597     sum += cs->count;
598   /* Work around the unrealistically high sum problem.  We just don't want
599      the non-cloned body to have negative or very low frequency.  Since
600      majority of execution time will be spent in clones anyway, this should
601      give good enough profile.  */
602   if (sum > node->count * 9 / 10)
603     sum = node->count * 9 / 10;
604   if (node->count == 0)
605     ipcp_set_node_scale (node, 0);
606   else
607     ipcp_set_node_scale (node, sum * REG_BR_PROB_BASE / node->count);
608 }
609
610 /* Initialization and computation of IPCP data structures.  This is the initial
611    intraprocedural analysis of functions, which gathers information to be
612    propagated later on.  */
613 static void
614 ipcp_init_stage (void)
615 {
616   struct cgraph_node *node;
617   struct cgraph_edge *cs;
618
619   for (node = cgraph_nodes; node; node = node->next)
620     if (node->analyzed)
621       ipcp_analyze_node (node);
622   for (node = cgraph_nodes; node; node = node->next)
623     {
624       if (!node->analyzed)
625         continue;
626       /* building jump functions  */
627       for (cs = node->callees; cs; cs = cs->next_callee)
628         {
629           /* We do not need to bother analyzing calls to unknown
630              functions unless they may become known during lto/whopr.  */
631           if (!cs->callee->analyzed && !flag_lto && !flag_whopr)
632             continue;
633           ipa_count_arguments (cs);
634           if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
635               != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
636             ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));
637           ipa_compute_jump_functions (cs);
638         }
639     }
640 }
641
642 /* Return true if there are some formal parameters whose value is IPA_TOP (in
643    the whole compilation unit).  Change their values to IPA_BOTTOM, since they
644    most probably get their values from outside of this compilation unit.  */
645 static bool
646 ipcp_change_tops_to_bottom (void)
647 {
648   int i, count;
649   struct cgraph_node *node;
650   bool prop_again;
651
652   prop_again = false;
653   for (node = cgraph_nodes; node; node = node->next)
654     {
655       struct ipa_node_params *info = IPA_NODE_REF (node);
656       count = ipa_get_param_count (info);
657       for (i = 0; i < count; i++)
658         {
659           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
660           if (lat->type == IPA_TOP)
661             {
662               prop_again = true;
663               if (dump_file)
664                 {
665                   fprintf (dump_file, "Forcing param ");
666                   print_generic_expr (dump_file, ipa_get_param (info, i), 0);
667                   fprintf (dump_file, " of node %s to bottom.\n",
668                            cgraph_node_name (node));
669                 }
670               lat->type = IPA_BOTTOM;
671             }
672         }
673     }
674   return prop_again;
675 }
676
677 /* Interprocedural analysis. The algorithm propagates constants from the
678    caller's parameters to the callee's arguments.  */
679 static void
680 ipcp_propagate_stage (void)
681 {
682   int i;
683   struct ipcp_lattice inc_lat = { IPA_BOTTOM, NULL };
684   struct ipcp_lattice new_lat = { IPA_BOTTOM, NULL };
685   struct ipcp_lattice *dest_lat;
686   struct cgraph_edge *cs;
687   struct ipa_jump_func *jump_func;
688   struct ipa_func_list *wl;
689   int count;
690
691   ipa_check_create_node_params ();
692   ipa_check_create_edge_args ();
693
694   /* Initialize worklist to contain all functions.  */
695   wl = ipa_init_func_list ();
696   while (wl)
697     {
698       struct cgraph_node *node = ipa_pop_func_from_list (&wl);
699       struct ipa_node_params *info = IPA_NODE_REF (node);
700
701       for (cs = node->callees; cs; cs = cs->next_callee)
702         {
703           struct ipa_node_params *callee_info = IPA_NODE_REF (cs->callee);
704           struct ipa_edge_args *args = IPA_EDGE_REF (cs);
705
706           if (ipa_is_called_with_var_arguments (callee_info)
707               || !cs->callee->analyzed
708               || ipa_is_called_with_var_arguments (callee_info))
709             continue;
710
711           count = ipa_get_cs_argument_count (args);
712           for (i = 0; i < count; i++)
713             {
714               jump_func = ipa_get_ith_jump_func (args, i);
715               ipcp_lattice_from_jfunc (info, &inc_lat, jump_func);
716               dest_lat = ipcp_get_lattice (callee_info, i);
717               ipa_lattice_meet (&new_lat, &inc_lat, dest_lat);
718               if (ipcp_lattice_changed (&new_lat, dest_lat))
719                 {
720                   dest_lat->type = new_lat.type;
721                   dest_lat->constant = new_lat.constant;
722                   ipa_push_func_to_list (&wl, cs->callee);
723                 }
724             }
725         }
726     }
727 }
728
729 /* Call the constant propagation algorithm and re-call it if necessary
730    (if there are undetermined values left).  */
731 static void
732 ipcp_iterate_stage (void)
733 {
734   struct cgraph_node *node;
735   n_cloning_candidates = 0;
736
737   if (dump_file)
738     fprintf (dump_file, "\nIPA iterate stage:\n\n");
739
740   if (in_lto_p)
741     ipa_update_after_lto_read ();
742
743   for (node = cgraph_nodes; node; node = node->next)
744     {
745       ipcp_initialize_node_lattices (node);
746       ipcp_compute_node_scale (node);
747     }
748   if (dump_file && (dump_flags & TDF_DETAILS))
749     {
750       ipcp_print_all_lattices (dump_file);
751       ipcp_function_scale_print (dump_file);
752     }
753
754   ipcp_propagate_stage ();
755   if (ipcp_change_tops_to_bottom ())
756     /* Some lattices have changed from IPA_TOP to IPA_BOTTOM.
757        This change should be propagated.  */
758     {
759       gcc_assert (n_cloning_candidates);
760       ipcp_propagate_stage ();
761     }
762   if (dump_file)
763     {
764       fprintf (dump_file, "\nIPA lattices after propagation:\n");
765       ipcp_print_all_lattices (dump_file);
766       if (dump_flags & TDF_DETAILS)
767         ipcp_print_profile_data (dump_file);
768     }
769 }
770
771 /* Check conditions to forbid constant insertion to function described by
772    NODE.  */
773 static inline bool
774 ipcp_node_modifiable_p (struct cgraph_node *node)
775 {
776   /* Once we will be able to do in-place replacement, we can be more
777      lax here.  */
778   return ipcp_versionable_function_p (node);
779 }
780
781 /* Print count scale data structures.  */
782 static void
783 ipcp_function_scale_print (FILE * f)
784 {
785   struct cgraph_node *node;
786
787   for (node = cgraph_nodes; node; node = node->next)
788     {
789       if (!node->analyzed)
790         continue;
791       fprintf (f, "printing scale for %s: ", cgraph_node_name (node));
792       fprintf (f, "value is  " HOST_WIDE_INT_PRINT_DEC
793                "  \n", (HOST_WIDE_INT) ipcp_get_node_scale (node));
794     }
795 }
796
797 /* Print counts of all cgraph nodes.  */
798 static void
799 ipcp_print_func_profile_counts (FILE * f)
800 {
801   struct cgraph_node *node;
802
803   for (node = cgraph_nodes; node; node = node->next)
804     {
805       fprintf (f, "function %s: ", cgraph_node_name (node));
806       fprintf (f, "count is  " HOST_WIDE_INT_PRINT_DEC
807                "  \n", (HOST_WIDE_INT) node->count);
808     }
809 }
810
811 /* Print counts of all cgraph edges.  */
812 static void
813 ipcp_print_call_profile_counts (FILE * f)
814 {
815   struct cgraph_node *node;
816   struct cgraph_edge *cs;
817
818   for (node = cgraph_nodes; node; node = node->next)
819     {
820       for (cs = node->callees; cs; cs = cs->next_callee)
821         {
822           fprintf (f, "%s -> %s ", cgraph_node_name (cs->caller),
823                    cgraph_node_name (cs->callee));
824           fprintf (f, "count is  " HOST_WIDE_INT_PRINT_DEC "  \n",
825                    (HOST_WIDE_INT) cs->count);
826         }
827     }
828 }
829
830 /* Print profile info for all functions.  */
831 static void
832 ipcp_print_profile_data (FILE * f)
833 {
834   fprintf (f, "\nNODE COUNTS :\n");
835   ipcp_print_func_profile_counts (f);
836   fprintf (f, "\nCS COUNTS stage:\n");
837   ipcp_print_call_profile_counts (f);
838 }
839
840 /* Build and initialize ipa_replace_map struct according to LAT. This struct is
841    processed by versioning, which operates according to the flags set.
842    PARM_TREE is the formal parameter found to be constant.  LAT represents the
843    constant.  */
844 static struct ipa_replace_map *
845 ipcp_create_replace_map (tree parm_tree, struct ipcp_lattice *lat)
846 {
847   struct ipa_replace_map *replace_map;
848   tree const_val;
849
850   replace_map = GGC_NEW (struct ipa_replace_map);
851   const_val = build_const_val (lat, TREE_TYPE (parm_tree));
852   if (dump_file)
853     {
854       fprintf (dump_file, "  replacing param ");
855       print_generic_expr (dump_file, parm_tree, 0);
856       fprintf (dump_file, " with const ");
857       print_generic_expr (dump_file, const_val, 0);
858       fprintf (dump_file, "\n");
859     }
860   replace_map->old_tree = parm_tree;
861   replace_map->new_tree = const_val;
862   replace_map->replace_p = true;
863   replace_map->ref_p = false;
864
865   return replace_map;
866 }
867
868 /* Return true if this callsite should be redirected to the original callee
869    (instead of the cloned one).  */
870 static bool
871 ipcp_need_redirect_p (struct cgraph_edge *cs)
872 {
873   struct ipa_node_params *orig_callee_info;
874   int i, count;
875   struct ipa_jump_func *jump_func;
876   struct cgraph_node *node = cs->callee, *orig;
877
878   if (!n_cloning_candidates)
879     return false;
880
881   if ((orig = ipcp_get_orig_node (node)) != NULL)
882     node = orig;
883   if (ipcp_get_orig_node (cs->caller))
884     return false;
885
886   orig_callee_info = IPA_NODE_REF (node);
887   count = ipa_get_param_count (orig_callee_info);
888   for (i = 0; i < count; i++)
889     {
890       struct ipcp_lattice *lat = ipcp_get_lattice (orig_callee_info, i);
891       if (ipcp_lat_is_const (lat))
892         {
893           jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
894           if (jump_func->type != IPA_JF_CONST)
895             return true;
896         }
897     }
898
899   return false;
900 }
901
902 /* Fix the callsites and the call graph after function cloning was done.  */
903 static void
904 ipcp_update_callgraph (void)
905 {
906   struct cgraph_node *node;
907
908   for (node = cgraph_nodes; node; node = node->next)
909     if (node->analyzed && ipcp_node_is_clone (node))
910       {
911         bitmap args_to_skip = BITMAP_ALLOC (NULL);
912         struct cgraph_node *orig_node = ipcp_get_orig_node (node);
913         struct ipa_node_params *info = IPA_NODE_REF (orig_node);
914         int i, count = ipa_get_param_count (info);
915         struct cgraph_edge *cs, *next;
916
917         for (i = 0; i < count; i++)
918           {
919             struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
920             tree parm_tree = ipa_get_param (info, i);
921
922             /* We can proactively remove obviously unused arguments.  */
923             if (is_gimple_reg (parm_tree)
924                 && !gimple_default_def (DECL_STRUCT_FUNCTION (orig_node->decl),
925                                         parm_tree))
926               {
927                 bitmap_set_bit (args_to_skip, i);
928                 continue;
929               }
930
931             if (lat->type == IPA_CONST_VALUE)
932               bitmap_set_bit (args_to_skip, i);
933           }
934         for (cs = node->callers; cs; cs = next)
935           {
936             next = cs->next_caller;
937             if (!ipcp_node_is_clone (cs->caller) && ipcp_need_redirect_p (cs))
938               cgraph_redirect_edge_callee (cs, orig_node);
939           }
940       }
941 }
942
943 /* Update profiling info for versioned functions and the functions they were
944    versioned from.  */
945 static void
946 ipcp_update_profiling (void)
947 {
948   struct cgraph_node *node, *orig_node;
949   gcov_type scale, scale_complement;
950   struct cgraph_edge *cs;
951
952   for (node = cgraph_nodes; node; node = node->next)
953     {
954       if (ipcp_node_is_clone (node))
955         {
956           orig_node = ipcp_get_orig_node (node);
957           scale = ipcp_get_node_scale (orig_node);
958           node->count = orig_node->count * scale / REG_BR_PROB_BASE;
959           scale_complement = REG_BR_PROB_BASE - scale;
960           orig_node->count =
961             orig_node->count * scale_complement / REG_BR_PROB_BASE;
962           for (cs = node->callees; cs; cs = cs->next_callee)
963             cs->count = cs->count * scale / REG_BR_PROB_BASE;
964           for (cs = orig_node->callees; cs; cs = cs->next_callee)
965             cs->count = cs->count * scale_complement / REG_BR_PROB_BASE;
966         }
967     }
968 }
969
970 /* If NODE was cloned, how much would program grow? */
971 static long
972 ipcp_estimate_growth (struct cgraph_node *node)
973 {
974   struct cgraph_edge *cs;
975   int redirectable_node_callers = 0;
976   int removable_args = 0;
977   bool need_original = !cgraph_only_called_directly_p (node);
978   struct ipa_node_params *info;
979   int i, count;
980   int growth;
981
982   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
983     if (cs->caller == node || !ipcp_need_redirect_p (cs))
984       redirectable_node_callers++;
985     else
986       need_original = true;
987
988   /* If we will be able to fully replace orignal node, we never increase
989      program size.  */
990   if (!need_original)
991     return 0;
992
993   info = IPA_NODE_REF (node);
994   count = ipa_get_param_count (info);
995   for (i = 0; i < count; i++)
996     {
997       struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
998       tree parm_tree = ipa_get_param (info, i);
999
1000       /* We can proactively remove obviously unused arguments.  */
1001       if (is_gimple_reg (parm_tree)
1002           && !gimple_default_def (DECL_STRUCT_FUNCTION (node->decl),
1003                                   parm_tree))
1004         removable_args++;
1005
1006       if (lat->type == IPA_CONST_VALUE)
1007         removable_args++;
1008     }
1009
1010   /* We make just very simple estimate of savings for removal of operand from
1011      call site.  Precise cost is dificult to get, as our size metric counts
1012      constants and moves as free.  Generally we are looking for cases that
1013      small function is called very many times.  */
1014   growth = node->local.inline_summary.self_size
1015            - removable_args * redirectable_node_callers;
1016   if (growth < 0)
1017     return 0;
1018   return growth;
1019 }
1020
1021
1022 /* Estimate cost of cloning NODE.  */
1023 static long
1024 ipcp_estimate_cloning_cost (struct cgraph_node *node)
1025 {
1026   int freq_sum = 1;
1027   gcov_type count_sum = 1;
1028   struct cgraph_edge *e;
1029   int cost;
1030
1031   cost = ipcp_estimate_growth (node) * 1000;
1032   if (!cost)
1033     {
1034       if (dump_file)
1035         fprintf (dump_file, "Versioning of %s will save code size\n",
1036                  cgraph_node_name (node));
1037       return 0;
1038     }
1039
1040   for (e = node->callers; e; e = e->next_caller)
1041     if (!bitmap_bit_p (dead_nodes, e->caller->uid)
1042         && !ipcp_need_redirect_p (e))
1043       {
1044         count_sum += e->count;
1045         freq_sum += e->frequency + 1;
1046       }
1047
1048   if (max_count)
1049     cost /= count_sum * 1000 / max_count + 1;
1050   else
1051     cost /= freq_sum * 1000 / REG_BR_PROB_BASE + 1;
1052   if (dump_file)
1053     fprintf (dump_file, "Cost of versioning %s is %i, (size: %i, freq: %i)\n",
1054              cgraph_node_name (node), cost, node->local.inline_summary.self_size,
1055              freq_sum);
1056   return cost + 1;
1057 }
1058
1059 /* Return number of live constant parameters.  */
1060 static int
1061 ipcp_const_param_count (struct cgraph_node *node)
1062 {
1063   int const_param = 0;
1064   struct ipa_node_params *info = IPA_NODE_REF (node);
1065   int count = ipa_get_param_count (info);
1066   int i;
1067
1068   for (i = 0; i < count; i++)
1069     {
1070       struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1071       tree parm_tree = ipa_get_param (info, i);
1072       if (ipcp_lat_is_insertable (lat)
1073           /* Do not count obviously unused arguments.  */
1074           && (!is_gimple_reg (parm_tree)
1075               || gimple_default_def (DECL_STRUCT_FUNCTION (node->decl),
1076                                      parm_tree)))
1077         const_param++;
1078     }
1079   return const_param;
1080 }
1081
1082 /* Propagate the constant parameters found by ipcp_iterate_stage()
1083    to the function's code.  */
1084 static void
1085 ipcp_insert_stage (void)
1086 {
1087   struct cgraph_node *node, *node1 = NULL;
1088   int i;
1089   VEC (cgraph_edge_p, heap) * redirect_callers;
1090   VEC (ipa_replace_map_p,gc)* replace_trees;
1091   int node_callers, count;
1092   tree parm_tree;
1093   struct ipa_replace_map *replace_param;
1094   fibheap_t heap;
1095   long overall_size = 0, new_size = 0;
1096   long max_new_size;
1097
1098   ipa_check_create_node_params ();
1099   ipa_check_create_edge_args ();
1100   if (dump_file)
1101     fprintf (dump_file, "\nIPA insert stage:\n\n");
1102
1103   dead_nodes = BITMAP_ALLOC (NULL);
1104
1105   for (node = cgraph_nodes; node; node = node->next)
1106     if (node->analyzed)
1107       {
1108         if (node->count > max_count)
1109           max_count = node->count;
1110         overall_size += node->local.inline_summary.self_size;
1111       }
1112
1113   max_new_size = overall_size;
1114   if (max_new_size < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS))
1115     max_new_size = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS);
1116   max_new_size = max_new_size * PARAM_VALUE (PARAM_IPCP_UNIT_GROWTH) / 100 + 1;
1117
1118   /* First collect all functions we proved to have constant arguments to heap.  */
1119   heap = fibheap_new ();
1120   for (node = cgraph_nodes; node; node = node->next)
1121     {
1122       struct ipa_node_params *info;
1123       /* Propagation of the constant is forbidden in certain conditions.  */
1124       if (!node->analyzed || !ipcp_node_modifiable_p (node))
1125           continue;
1126       info = IPA_NODE_REF (node);
1127       if (ipa_is_called_with_var_arguments (info))
1128         continue;
1129       if (ipcp_const_param_count (node))
1130         node->aux = fibheap_insert (heap, ipcp_estimate_cloning_cost (node), node);
1131      }
1132
1133   /* Now clone in priority order until code size growth limits are met or
1134      heap is emptied.  */
1135   while (!fibheap_empty (heap))
1136     {
1137       struct ipa_node_params *info;
1138       int growth = 0;
1139       bitmap args_to_skip;
1140       struct cgraph_edge *cs;
1141
1142       node = (struct cgraph_node *)fibheap_extract_min (heap);
1143       node->aux = NULL;
1144       if (dump_file)
1145         fprintf (dump_file, "considering function %s\n",
1146                  cgraph_node_name (node));
1147
1148       growth = ipcp_estimate_growth (node);
1149
1150       if (new_size + growth > max_new_size)
1151         break;
1152       if (growth
1153           && optimize_function_for_size_p (DECL_STRUCT_FUNCTION (node->decl)))
1154         {
1155           if (dump_file)
1156             fprintf (dump_file, "Not versioning, cold code would grow");
1157           continue;
1158         }
1159
1160       new_size += growth;
1161
1162       /* Look if original function becomes dead after clonning.  */
1163       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1164         if (cs->caller == node || ipcp_need_redirect_p (cs))
1165           break;
1166       if (!cs && cgraph_only_called_directly_p (node))
1167         bitmap_set_bit (dead_nodes, node->uid);
1168
1169       info = IPA_NODE_REF (node);
1170       count = ipa_get_param_count (info);
1171
1172       replace_trees = VEC_alloc (ipa_replace_map_p, gc, 1);
1173       args_to_skip = BITMAP_GGC_ALLOC ();
1174       for (i = 0; i < count; i++)
1175         {
1176           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1177           parm_tree = ipa_get_param (info, i);
1178
1179           /* We can proactively remove obviously unused arguments.  */
1180           if (is_gimple_reg (parm_tree)
1181               && !gimple_default_def (DECL_STRUCT_FUNCTION (node->decl),
1182                                       parm_tree))
1183             {
1184               bitmap_set_bit (args_to_skip, i);
1185               continue;
1186             }
1187
1188           if (lat->type == IPA_CONST_VALUE)
1189             {
1190               replace_param =
1191                 ipcp_create_replace_map (parm_tree, lat);
1192               VEC_safe_push (ipa_replace_map_p, gc, replace_trees, replace_param);
1193               bitmap_set_bit (args_to_skip, i);
1194             }
1195         }
1196
1197       /* Compute how many callers node has.  */
1198       node_callers = 0;
1199       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1200         node_callers++;
1201       redirect_callers = VEC_alloc (cgraph_edge_p, heap, node_callers);
1202       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1203         VEC_quick_push (cgraph_edge_p, redirect_callers, cs);
1204
1205       /* Redirecting all the callers of the node to the
1206          new versioned node.  */
1207       node1 =
1208         cgraph_create_virtual_clone (node, redirect_callers, replace_trees,
1209                                      args_to_skip);
1210       args_to_skip = NULL;
1211       VEC_free (cgraph_edge_p, heap, redirect_callers);
1212       replace_trees = NULL;
1213
1214       if (node1 == NULL)
1215         continue;
1216       if (dump_file)
1217         fprintf (dump_file, "versioned function %s with growth %i, overall %i\n",
1218                  cgraph_node_name (node), (int)growth, (int)new_size);
1219       ipcp_init_cloned_node (node, node1);
1220
1221       /* TODO: We can use indirect inlning info to produce new calls.  */
1222
1223       if (dump_file)
1224         dump_function_to_file (node1->decl, dump_file, dump_flags);
1225
1226       for (cs = node->callees; cs; cs = cs->next_callee)
1227         if (cs->callee->aux)
1228           {
1229             fibheap_delete_node (heap, (fibnode_t) cs->callee->aux);
1230             cs->callee->aux = fibheap_insert (heap,
1231                                               ipcp_estimate_cloning_cost (cs->callee),
1232                                               cs->callee);
1233           }
1234     }
1235
1236   while (!fibheap_empty (heap))
1237     {
1238       if (dump_file)
1239         fprintf (dump_file, "skipping function %s\n",
1240                  cgraph_node_name (node));
1241       node = (struct cgraph_node *) fibheap_extract_min (heap);
1242       node->aux = NULL;
1243     }
1244   fibheap_delete (heap);
1245   BITMAP_FREE (dead_nodes);
1246   ipcp_update_callgraph ();
1247   ipcp_update_profiling ();
1248 }
1249
1250 /* The IPCP driver.  */
1251 static unsigned int
1252 ipcp_driver (void)
1253 {
1254   cgraph_remove_unreachable_nodes (true,dump_file);
1255   if (dump_file)
1256     {
1257       fprintf (dump_file, "\nIPA structures before propagation:\n");
1258       if (dump_flags & TDF_DETAILS)
1259         ipa_print_all_params (dump_file);
1260       ipa_print_all_jump_functions (dump_file);
1261     }
1262   /* 2. Do the interprocedural propagation.  */
1263   ipcp_iterate_stage ();
1264   /* 3. Insert the constants found to the functions.  */
1265   ipcp_insert_stage ();
1266   if (dump_file && (dump_flags & TDF_DETAILS))
1267     {
1268       fprintf (dump_file, "\nProfiling info after insert stage:\n");
1269       ipcp_print_profile_data (dump_file);
1270     }
1271   /* Free all IPCP structures.  */
1272   free_all_ipa_structures_after_ipa_cp ();
1273   if (dump_file)
1274     fprintf (dump_file, "\nIPA constant propagation end\n");
1275   return 0;
1276 }
1277
1278 /* Note function body size.  */
1279 static void
1280 ipcp_generate_summary (void)
1281 {
1282   if (dump_file)
1283     fprintf (dump_file, "\nIPA constant propagation start:\n");
1284   ipa_check_create_node_params ();
1285   ipa_check_create_edge_args ();
1286   ipa_register_cgraph_hooks ();
1287   /* 1. Call the init stage to initialize
1288      the ipa_node_params and ipa_edge_args structures.  */
1289   ipcp_init_stage ();
1290 }
1291
1292 /* Write ipcp summary for nodes in SET.  */
1293 static void
1294 ipcp_write_summary (cgraph_node_set set)
1295 {
1296   ipa_prop_write_jump_functions (set);
1297 }
1298
1299 /* Read ipcp summary.  */
1300 static void
1301 ipcp_read_summary (void)
1302 {
1303   ipa_prop_read_jump_functions ();
1304 }
1305
1306 /* Gate for IPCP optimization.  */
1307 static bool
1308 cgraph_gate_cp (void)
1309 {
1310   return flag_ipa_cp;
1311 }
1312
1313 struct ipa_opt_pass_d pass_ipa_cp =
1314 {
1315  {
1316   IPA_PASS,
1317   "cp",                         /* name */
1318   cgraph_gate_cp,               /* gate */
1319   ipcp_driver,                  /* execute */
1320   NULL,                         /* sub */
1321   NULL,                         /* next */
1322   0,                            /* static_pass_number */
1323   TV_IPA_CONSTANT_PROP,         /* tv_id */
1324   0,                            /* properties_required */
1325   0,                            /* properties_provided */
1326   0,                            /* properties_destroyed */
1327   0,                            /* todo_flags_start */
1328   TODO_dump_cgraph | TODO_dump_func |
1329   TODO_remove_functions /* todo_flags_finish */
1330  },
1331  ipcp_generate_summary,                 /* generate_summary */
1332  ipcp_write_summary,                    /* write_summary */
1333  ipcp_read_summary,                     /* read_summary */
1334  NULL,                                  /* function_read_summary */
1335  lto_ipa_fixup_call_notes,              /* stmt_fixup */
1336  0,                                     /* TODOs */
1337  NULL,                                  /* function_transform */
1338  NULL,                                  /* variable_transform */
1339 };