OSDN Git Service

2009-05-12 Tobias Burnus <burnus@net-b.de>
[pf3gnuchains/gcc-fork.git] / gcc / ipa-cp.c
1 /* Interprocedural constant propagation
2    Copyright (C) 2005, 2006, 2007, 2008 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
294       caller_lat = ipcp_get_lattice (info, jfunc->value.formal_id);
295       lat->type = caller_lat->type;
296       lat->constant = caller_lat->constant;
297     }
298   else
299     lat->type = IPA_BOTTOM;
300 }
301
302 /* True when OLD_LAT and NEW_LAT values are not the same.  */
303
304 static bool
305 ipcp_lattice_changed (struct ipcp_lattice *old_lat,
306                       struct ipcp_lattice *new_lat)
307 {
308   if (old_lat->type == new_lat->type)
309     {
310       if (!ipcp_lat_is_const (old_lat))
311         return false;
312       if (ipcp_lats_are_equal (old_lat, new_lat))
313         return false;
314     }
315   return true;
316 }
317
318 /* Print all ipcp_lattices of all functions to F.  */
319 static void
320 ipcp_print_all_lattices (FILE * f)
321 {
322   struct cgraph_node *node;
323   int i, count;
324
325   fprintf (f, "\nLattice:\n");
326   for (node = cgraph_nodes; node; node = node->next)
327     {
328       struct ipa_node_params *info;
329
330       if (!node->analyzed)
331         continue;
332       info = IPA_NODE_REF (node);
333       fprintf (f, "  Node: %s:\n", cgraph_node_name (node));
334       count = ipa_get_param_count (info);
335       for (i = 0; i < count; i++)
336         {
337           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
338
339           fprintf (f, "    param [%d]: ", i);
340           if (lat->type == IPA_CONST_VALUE)
341             {
342               fprintf (f, "type is CONST ");
343               print_generic_expr (f, lat->constant, 0);
344               fprintf (f, "\n");
345             }
346           else if (lat->type == IPA_TOP)
347             fprintf (f, "type is TOP\n");
348           else
349             fprintf (f, "type is BOTTOM\n");
350         }
351     }
352 }
353
354 /* Return true if this NODE is viable candidate for cloning.  */
355 static bool
356 ipcp_cloning_candidate_p (struct cgraph_node *node)
357 {
358   int n_calls = 0;
359   int n_hot_calls = 0;
360   gcov_type direct_call_sum = 0;
361   struct cgraph_edge *e;
362
363   /* We never clone functions that are not visible from outside.
364      FIXME: in future we should clone such functions when they are called with
365      different constants, but current ipcp implementation is not good on this.
366      */
367   if (!node->needed || !node->analyzed)
368     return false;
369
370   if (cgraph_function_body_availability (node) <= AVAIL_OVERWRITABLE)
371     {
372       if (dump_file)
373         fprintf (dump_file, "Not considering %s for cloning; body is overwrittable.\n",
374                  cgraph_node_name (node));
375       return false;
376     }
377   if (!tree_versionable_function_p (node->decl))
378     {
379       if (dump_file)
380         fprintf (dump_file, "Not considering %s for cloning; body is not versionable.\n",
381                  cgraph_node_name (node));
382       return false;
383     }
384   for (e = node->callers; e; e = e->next_caller)
385     {
386       direct_call_sum += e->count;
387       n_calls ++;
388       if (cgraph_maybe_hot_edge_p (e))
389         n_hot_calls ++;
390     }
391   
392   if (!n_calls)
393     {
394       if (dump_file)
395         fprintf (dump_file, "Not considering %s for cloning; no direct calls.\n",
396                  cgraph_node_name (node));
397       return false;
398     }
399   if (node->local.inline_summary.self_insns < n_calls)
400     {
401       if (dump_file)
402         fprintf (dump_file, "Considering %s for cloning; code would shrink.\n",
403                  cgraph_node_name (node));
404       return true;
405     }  
406
407   if (!flag_ipa_cp_clone)
408     {
409       if (dump_file)
410         fprintf (dump_file, "Not considering %s for cloning; -fipa-cp-clone disabled.\n",
411                  cgraph_node_name (node));
412       return false;
413     }
414
415   if (!optimize_function_for_speed_p (DECL_STRUCT_FUNCTION (node->decl)))
416     {
417       if (dump_file)
418         fprintf (dump_file, "Not considering %s for cloning; optimizing it for size.\n",
419                  cgraph_node_name (node));
420       return false;
421     }
422
423   /* When profile is available and function is hot, propagate into it even if
424      calls seems cold; constant propagation can improve function's speed
425      significandly.  */
426   if (max_count)
427     {
428       if (direct_call_sum > node->count * 90 / 100)
429         {
430           if (dump_file)
431             fprintf (dump_file, "Considering %s for cloning; usually called directly.\n",
432                      cgraph_node_name (node));
433           return true;
434         }
435     }
436   if (!n_hot_calls)
437     {
438       if (dump_file)
439         fprintf (dump_file, "Not considering %s for cloning; no hot calls.\n",
440                  cgraph_node_name (node));
441       return false;
442     }
443   if (dump_file)
444     fprintf (dump_file, "Considering %s for cloning.\n",
445              cgraph_node_name (node));
446   return true;
447 }
448
449 /* Initialize ipcp_lattices array.  The lattices corresponding to supported
450    types (integers, real types and Fortran constants defined as const_decls)
451    are initialized to IPA_TOP, the rest of them to IPA_BOTTOM.  */
452 static void
453 ipcp_initialize_node_lattices (struct cgraph_node *node)
454 {
455   int i;
456   struct ipa_node_params *info = IPA_NODE_REF (node);
457   enum ipa_lattice_type type;
458
459   if (ipa_is_called_with_var_arguments (info))
460     type = IPA_BOTTOM;
461   else if (!node->needed)
462     type = IPA_TOP;
463   /* When cloning is allowed, we can assume that externally visible functions
464      are not called.  We will compensate this by cloning later.  */
465   else if (ipcp_cloning_candidate_p (node))
466     type = IPA_TOP, n_cloning_candidates ++;
467   else
468     type = IPA_BOTTOM;
469
470   for (i = 0; i < ipa_get_param_count (info) ; i++)
471     ipcp_get_lattice (info, i)->type = type;
472 }
473
474 /* build INTEGER_CST tree with type TREE_TYPE and value according to LAT.
475    Return the tree.  */
476 static tree
477 build_const_val (struct ipcp_lattice *lat, tree tree_type)
478 {
479   tree val;
480
481   gcc_assert (ipcp_lat_is_const (lat));
482   val = lat->constant;
483
484   if (!useless_type_conversion_p (tree_type, TREE_TYPE (val)))
485     {
486       if (fold_convertible_p (tree_type, val))
487         return fold_build1 (NOP_EXPR, tree_type, val);
488       else
489         return fold_build1 (VIEW_CONVERT_EXPR, tree_type, val);
490     }
491   return val;
492 }
493
494 /* Compute the proper scale for NODE.  It is the ratio between the number of
495    direct calls (represented on the incoming cgraph_edges) and sum of all
496    invocations of NODE (represented as count in cgraph_node).  */
497 static void
498 ipcp_compute_node_scale (struct cgraph_node *node)
499 {
500   gcov_type sum;
501   struct cgraph_edge *cs;
502
503   sum = 0;
504   /* Compute sum of all counts of callers. */
505   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
506     sum += cs->count;
507   if (node->count == 0)
508     ipcp_set_node_scale (node, 0);
509   else
510     ipcp_set_node_scale (node, sum * REG_BR_PROB_BASE / node->count);
511 }
512
513 /* Initialization and computation of IPCP data structures.  This is the initial
514    intraprocedural analysis of functions, which gathers information to be
515    propagated later on.  */
516 static void
517 ipcp_init_stage (void)
518 {
519   struct cgraph_node *node;
520   struct cgraph_edge *cs;
521
522   for (node = cgraph_nodes; node; node = node->next)
523     if (node->analyzed)
524       ipcp_analyze_node (node);
525   for (node = cgraph_nodes; node; node = node->next)
526     {
527       if (!node->analyzed)
528         continue;
529       /* building jump functions  */
530       for (cs = node->callees; cs; cs = cs->next_callee)
531         {
532           if (!cs->callee->analyzed)
533             continue;
534           ipa_count_arguments (cs);
535           if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
536               != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
537             {
538               /* Handle cases of functions with 
539                  a variable number of parameters.  */
540               ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));
541               if (flag_indirect_inlining)
542                 ipa_compute_jump_functions (cs);
543             }
544           else
545             ipa_compute_jump_functions (cs);
546         }
547     }
548 }
549
550 /* Return true if there are some formal parameters whose value is IPA_TOP (in
551    the whole compilation unit).  Change their values to IPA_BOTTOM, since they
552    most probably get their values from outside of this compilation unit.  */
553 static bool
554 ipcp_change_tops_to_bottom (void)
555 {
556   int i, count;
557   struct cgraph_node *node;
558   bool prop_again;
559
560   prop_again = false;
561   for (node = cgraph_nodes; node; node = node->next)
562     {
563       struct ipa_node_params *info = IPA_NODE_REF (node);
564       count = ipa_get_param_count (info);
565       for (i = 0; i < count; i++)
566         {
567           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
568           if (lat->type == IPA_TOP)
569             {
570               prop_again = true;
571               if (dump_file)
572                 {
573                   fprintf (dump_file, "Forcing param ");
574                   print_generic_expr (dump_file, ipa_get_param (info, i), 0);
575                   fprintf (dump_file, " of node %s to bottom.\n",
576                            cgraph_node_name (node));
577                 }
578               lat->type = IPA_BOTTOM;
579             }
580         }
581     }
582   return prop_again;
583 }
584
585 /* Interprocedural analysis. The algorithm propagates constants from the
586    caller's parameters to the callee's arguments.  */
587 static void
588 ipcp_propagate_stage (void)
589 {
590   int i;
591   struct ipcp_lattice inc_lat = { IPA_BOTTOM, NULL };
592   struct ipcp_lattice new_lat = { IPA_BOTTOM, NULL };
593   struct ipcp_lattice *dest_lat;
594   struct cgraph_edge *cs;
595   struct ipa_jump_func *jump_func;
596   struct ipa_func_list *wl;
597   int count;
598
599   ipa_check_create_node_params ();
600   ipa_check_create_edge_args ();
601
602   /* Initialize worklist to contain all functions.  */
603   wl = ipa_init_func_list ();
604   while (wl)
605     {
606       struct cgraph_node *node = ipa_pop_func_from_list (&wl);
607       struct ipa_node_params *info = IPA_NODE_REF (node);
608
609       for (cs = node->callees; cs; cs = cs->next_callee)
610         {
611           struct ipa_node_params *callee_info = IPA_NODE_REF (cs->callee);
612           struct ipa_edge_args *args = IPA_EDGE_REF (cs);
613
614           if (ipa_is_called_with_var_arguments (callee_info))
615             continue;
616
617           count = ipa_get_cs_argument_count (args);
618           for (i = 0; i < count; i++)
619             {
620               jump_func = ipa_get_ith_jump_func (args, i);
621               ipcp_lattice_from_jfunc (info, &inc_lat, jump_func);
622               dest_lat = ipcp_get_lattice (callee_info, i);
623               ipa_lattice_meet (&new_lat, &inc_lat, dest_lat);
624               if (ipcp_lattice_changed (&new_lat, dest_lat))
625                 {
626                   dest_lat->type = new_lat.type;
627                   dest_lat->constant = new_lat.constant;
628                   ipa_push_func_to_list (&wl, cs->callee);
629                 }
630             }
631         }
632     }
633 }
634
635 /* Call the constant propagation algorithm and re-call it if necessary
636    (if there are undetermined values left).  */
637 static void
638 ipcp_iterate_stage (void)
639 {
640   struct cgraph_node *node;
641   n_cloning_candidates = 0;
642
643   if (dump_file)
644     fprintf (dump_file, "\nIPA iterate stage:\n\n");
645   for (node = cgraph_nodes; node; node = node->next)
646     {
647       ipcp_initialize_node_lattices (node);
648       ipcp_compute_node_scale (node);
649     }
650   if (dump_file && (dump_flags & TDF_DETAILS))
651     {
652       ipcp_print_all_lattices (dump_file);
653       ipcp_function_scale_print (dump_file);
654     }
655
656   ipcp_propagate_stage ();
657   if (ipcp_change_tops_to_bottom ())
658     /* Some lattices have changed from IPA_TOP to IPA_BOTTOM.
659        This change should be propagated.  */
660     {
661       gcc_assert (n_cloning_candidates);
662       ipcp_propagate_stage ();
663     }
664   if (dump_file)
665     {
666       fprintf (dump_file, "\nIPA lattices after propagation:\n");
667       ipcp_print_all_lattices (dump_file);
668       if (dump_flags & TDF_DETAILS)
669         ipcp_print_profile_data (dump_file);
670     }
671 }
672
673 /* Check conditions to forbid constant insertion to function described by
674    NODE.  */
675 static inline bool
676 ipcp_node_modifiable_p (struct cgraph_node *node)
677 {
678   /* Once we will be able to do in-place replacement, we can be more
679      lax here.  */
680   return tree_versionable_function_p (node->decl);
681 }
682
683 /* Print count scale data structures.  */
684 static void
685 ipcp_function_scale_print (FILE * f)
686 {
687   struct cgraph_node *node;
688
689   for (node = cgraph_nodes; node; node = node->next)
690     {
691       if (!node->analyzed)
692         continue;
693       fprintf (f, "printing scale for %s: ", cgraph_node_name (node));
694       fprintf (f, "value is  " HOST_WIDE_INT_PRINT_DEC
695                "  \n", (HOST_WIDE_INT) ipcp_get_node_scale (node));
696     }
697 }
698
699 /* Print counts of all cgraph nodes.  */
700 static void
701 ipcp_print_func_profile_counts (FILE * f)
702 {
703   struct cgraph_node *node;
704
705   for (node = cgraph_nodes; node; node = node->next)
706     {
707       fprintf (f, "function %s: ", cgraph_node_name (node));
708       fprintf (f, "count is  " HOST_WIDE_INT_PRINT_DEC
709                "  \n", (HOST_WIDE_INT) node->count);
710     }
711 }
712
713 /* Print counts of all cgraph edges.  */
714 static void
715 ipcp_print_call_profile_counts (FILE * f)
716 {
717   struct cgraph_node *node;
718   struct cgraph_edge *cs;
719
720   for (node = cgraph_nodes; node; node = node->next)
721     {
722       for (cs = node->callees; cs; cs = cs->next_callee)
723         {
724           fprintf (f, "%s -> %s ", cgraph_node_name (cs->caller),
725                    cgraph_node_name (cs->callee));
726           fprintf (f, "count is  " HOST_WIDE_INT_PRINT_DEC "  \n",
727                    (HOST_WIDE_INT) cs->count);
728         }
729     }
730 }
731
732 /* Print profile info for all functions.  */
733 static void
734 ipcp_print_profile_data (FILE * f)
735 {
736   fprintf (f, "\nNODE COUNTS :\n");
737   ipcp_print_func_profile_counts (f);
738   fprintf (f, "\nCS COUNTS stage:\n");
739   ipcp_print_call_profile_counts (f);
740 }
741
742 /* Build and initialize ipa_replace_map struct according to LAT. This struct is
743    processed by versioning, which operates according to the flags set.
744    PARM_TREE is the formal parameter found to be constant.  LAT represents the
745    constant.  */
746 static struct ipa_replace_map *
747 ipcp_create_replace_map (tree parm_tree, struct ipcp_lattice *lat)
748 {
749   struct ipa_replace_map *replace_map;
750   tree const_val;
751
752   replace_map = GGC_NEW (struct ipa_replace_map);
753   const_val = build_const_val (lat, TREE_TYPE (parm_tree));
754   if (dump_file)
755     {
756       fprintf (dump_file, "  replacing param ");
757       print_generic_expr (dump_file, parm_tree, 0);
758       fprintf (dump_file, " with const ");
759       print_generic_expr (dump_file, const_val, 0);
760       fprintf (dump_file, "\n");
761     }
762   replace_map->old_tree = parm_tree;
763   replace_map->new_tree = const_val;
764   replace_map->replace_p = true;
765   replace_map->ref_p = false;
766
767   return replace_map;
768 }
769
770 /* Return true if this callsite should be redirected to the original callee
771    (instead of the cloned one).  */
772 static bool
773 ipcp_need_redirect_p (struct cgraph_edge *cs)
774 {
775   struct ipa_node_params *orig_callee_info;
776   int i, count;
777   struct ipa_jump_func *jump_func;
778   struct cgraph_node *node = cs->callee, *orig;
779
780   if (!n_cloning_candidates)
781     return false;
782
783   if ((orig = ipcp_get_orig_node (node)) != NULL)
784     node = orig;
785   if (ipcp_get_orig_node (cs->caller))
786     return false;
787
788   orig_callee_info = IPA_NODE_REF (node);
789   count = ipa_get_param_count (orig_callee_info);
790   for (i = 0; i < count; i++)
791     {
792       struct ipcp_lattice *lat = ipcp_get_lattice (orig_callee_info, i);
793       if (ipcp_lat_is_const (lat))
794         {
795           jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
796           if (jump_func->type != IPA_JF_CONST)
797             return true;
798         }
799     }
800
801   return false;
802 }
803
804 /* Fix the callsites and the call graph after function cloning was done.  */
805 static void
806 ipcp_update_callgraph (void)
807 {
808   struct cgraph_node *node;
809
810   for (node = cgraph_nodes; node; node = node->next)
811     if (node->analyzed && ipcp_node_is_clone (node))
812       {
813         bitmap args_to_skip = BITMAP_ALLOC (NULL);
814         struct cgraph_node *orig_node = ipcp_get_orig_node (node);
815         struct ipa_node_params *info = IPA_NODE_REF (orig_node);
816         int i, count = ipa_get_param_count (info);
817         struct cgraph_edge *cs, *next;
818
819         for (i = 0; i < count; i++)
820           {
821             struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
822             tree parm_tree = ipa_get_param (info, i);
823
824             /* We can proactively remove obviously unused arguments.  */
825             if (is_gimple_reg (parm_tree)
826                 && !gimple_default_def (DECL_STRUCT_FUNCTION (orig_node->decl),
827                                         parm_tree))
828               {
829                 bitmap_set_bit (args_to_skip, i);
830                 continue;
831               }
832
833             if (lat->type == IPA_CONST_VALUE)
834               bitmap_set_bit (args_to_skip, i);
835           }
836         for (cs = node->callers; cs; cs = next)
837           {
838             next = cs->next_caller;
839             if (!ipcp_node_is_clone (cs->caller) && ipcp_need_redirect_p (cs))
840               {
841                 cgraph_redirect_edge_callee (cs, orig_node);
842                 gimple_call_set_fndecl (cs->call_stmt, orig_node->decl);
843               }
844           }
845       }
846 }
847
848 /* Update profiling info for versioned functions and the functions they were
849    versioned from.  */
850 static void
851 ipcp_update_profiling (void)
852 {
853   struct cgraph_node *node, *orig_node;
854   gcov_type scale, scale_complement;
855   struct cgraph_edge *cs;
856
857   for (node = cgraph_nodes; node; node = node->next)
858     {
859       if (ipcp_node_is_clone (node))
860         {
861           orig_node = ipcp_get_orig_node (node);
862           scale = ipcp_get_node_scale (orig_node);
863           node->count = orig_node->count * scale / REG_BR_PROB_BASE;
864           scale_complement = REG_BR_PROB_BASE - scale;
865           orig_node->count =
866             orig_node->count * scale_complement / REG_BR_PROB_BASE;
867           for (cs = node->callees; cs; cs = cs->next_callee)
868             cs->count = cs->count * scale / REG_BR_PROB_BASE;
869           for (cs = orig_node->callees; cs; cs = cs->next_callee)
870             cs->count = cs->count * scale_complement / REG_BR_PROB_BASE;
871         }
872     }
873 }
874
875 /* If NODE was cloned, how much would program grow? */
876 static long
877 ipcp_estimate_growth (struct cgraph_node *node)
878 {
879   struct cgraph_edge *cs;
880   int redirectable_node_callers = 0;
881   int removable_args = 0;
882   bool need_original = node->needed;
883   struct ipa_node_params *info;
884   int i, count;
885   int growth;
886
887   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
888     if (cs->caller == node || !ipcp_need_redirect_p (cs))
889       redirectable_node_callers++;
890     else
891       need_original = true;
892
893   /* If we will be able to fully replace orignal node, we never increase
894      program size.  */
895   if (!need_original)
896     return 0;
897
898   info = IPA_NODE_REF (node);
899   count = ipa_get_param_count (info);
900   for (i = 0; i < count; i++)
901     {
902       struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
903       tree parm_tree = ipa_get_param (info, i);
904
905       /* We can proactively remove obviously unused arguments.  */
906       if (is_gimple_reg (parm_tree)
907           && !gimple_default_def (DECL_STRUCT_FUNCTION (node->decl),
908                                   parm_tree))
909         removable_args++;
910
911       if (lat->type == IPA_CONST_VALUE)
912         removable_args++;
913     }
914
915   /* We make just very simple estimate of savings for removal of operand from
916      call site.  Precise cost is dificult to get, as our size metric counts
917      constants and moves as free.  Generally we are looking for cases that
918      small function is called very many times.  */
919   growth = node->local.inline_summary.self_insns
920            - removable_args * redirectable_node_callers;
921   if (growth < 0)
922     return 0;
923   return growth;
924 }
925
926
927 /* Estimate cost of cloning NODE.  */
928 static long
929 ipcp_estimate_cloning_cost (struct cgraph_node *node)
930 {
931   int freq_sum = 1;
932   gcov_type count_sum = 1;
933   struct cgraph_edge *e;
934   int cost;
935
936   cost = ipcp_estimate_growth (node) * 1000;
937   if (!cost)
938     {
939       if (dump_file)
940         fprintf (dump_file, "Versioning of %s will save code size\n",
941                  cgraph_node_name (node));
942       return 0;
943     }
944
945   for (e = node->callers; e; e = e->next_caller)
946     if (!bitmap_bit_p (dead_nodes, e->caller->uid)
947         && !ipcp_need_redirect_p (e))
948       {
949         count_sum += e->count;
950         freq_sum += e->frequency + 1;
951       }
952
953   if (max_count)
954     cost /= count_sum * 1000 / max_count + 1;
955   else
956     cost /= freq_sum * 1000 / REG_BR_PROB_BASE + 1;
957   if (dump_file)
958     fprintf (dump_file, "Cost of versioning %s is %i, (size: %i, freq: %i)\n",
959              cgraph_node_name (node), cost, node->local.inline_summary.self_insns,
960              freq_sum);
961   return cost + 1;
962 }
963
964 /* Return number of live constant parameters.  */
965 static int
966 ipcp_const_param_count (struct cgraph_node *node)
967 {
968   int const_param = 0;
969   struct ipa_node_params *info = IPA_NODE_REF (node);
970   int count = ipa_get_param_count (info);
971   int i;
972
973   for (i = 0; i < count; i++)
974     {
975       struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
976       tree parm_tree = ipa_get_param (info, i);
977       if (ipcp_lat_is_insertable (lat)
978           /* Do not count obviously unused arguments.  */
979           && (!is_gimple_reg (parm_tree)
980               || gimple_default_def (DECL_STRUCT_FUNCTION (node->decl),
981                                      parm_tree)))
982         const_param++;
983     }
984   return const_param;
985 }
986
987 /* Propagate the constant parameters found by ipcp_iterate_stage()
988    to the function's code.  */
989 static void
990 ipcp_insert_stage (void)
991 {
992   struct cgraph_node *node, *node1 = NULL;
993   int i;
994   VEC (cgraph_edge_p, heap) * redirect_callers;
995   VEC (ipa_replace_map_p,gc)* replace_trees;
996   int node_callers, count;
997   tree parm_tree;
998   struct ipa_replace_map *replace_param;
999   fibheap_t heap;
1000   long overall_size = 0, new_size = 0;
1001   long max_new_size;
1002
1003   ipa_check_create_node_params ();
1004   ipa_check_create_edge_args ();
1005   if (dump_file)
1006     fprintf (dump_file, "\nIPA insert stage:\n\n");
1007
1008   dead_nodes = BITMAP_ALLOC (NULL);
1009
1010   for (node = cgraph_nodes; node; node = node->next)
1011     if (node->analyzed)
1012       {
1013         if (node->count > max_count)
1014           max_count = node->count;
1015         overall_size += node->local.inline_summary.self_insns;
1016       }
1017
1018   max_new_size = overall_size;
1019   if (max_new_size < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS))
1020     max_new_size = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS);
1021   max_new_size = max_new_size * PARAM_VALUE (PARAM_IPCP_UNIT_GROWTH) / 100 + 1;
1022
1023   /* First collect all functions we proved to have constant arguments to heap.  */
1024   heap = fibheap_new ();
1025   for (node = cgraph_nodes; node; node = node->next)
1026     {
1027       struct ipa_node_params *info;
1028       /* Propagation of the constant is forbidden in certain conditions.  */
1029       if (!node->analyzed || !ipcp_node_modifiable_p (node))
1030           continue;
1031       info = IPA_NODE_REF (node);
1032       if (ipa_is_called_with_var_arguments (info))
1033         continue;
1034       if (ipcp_const_param_count (node))
1035         node->aux = fibheap_insert (heap, ipcp_estimate_cloning_cost (node), node);
1036      }
1037
1038   /* Now clone in priority order until code size growth limits are met or
1039      heap is emptied.  */
1040   while (!fibheap_empty (heap))
1041     {
1042       struct ipa_node_params *info;
1043       int growth = 0;
1044       bitmap args_to_skip;
1045       struct cgraph_edge *cs;
1046
1047       node = (struct cgraph_node *)fibheap_extract_min (heap);
1048       node->aux = NULL;
1049       if (dump_file)
1050         fprintf (dump_file, "considering function %s\n",
1051                  cgraph_node_name (node));
1052
1053       growth = ipcp_estimate_growth (node);
1054
1055       if (new_size + growth > max_new_size)
1056         break;
1057       if (growth
1058           && optimize_function_for_size_p (DECL_STRUCT_FUNCTION (node->decl)))
1059         {
1060           if (dump_file)
1061             fprintf (dump_file, "Not versioning, cold code would grow");
1062           continue;
1063         }
1064
1065       new_size += growth;
1066
1067       /* Look if original function becomes dead after clonning.  */
1068       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1069         if (cs->caller == node || ipcp_need_redirect_p (cs))
1070           break;
1071       if (!cs && !node->needed)
1072         bitmap_set_bit (dead_nodes, node->uid);
1073
1074       info = IPA_NODE_REF (node);
1075       count = ipa_get_param_count (info);
1076
1077       replace_trees = VEC_alloc (ipa_replace_map_p, gc, 1);
1078       args_to_skip = BITMAP_GGC_ALLOC ();
1079       for (i = 0; i < count; i++)
1080         {
1081           struct ipcp_lattice *lat = ipcp_get_lattice (info, i);
1082           parm_tree = ipa_get_param (info, i);
1083
1084           /* We can proactively remove obviously unused arguments.  */
1085           if (is_gimple_reg (parm_tree)
1086               && !gimple_default_def (DECL_STRUCT_FUNCTION (node->decl),
1087                                       parm_tree))
1088             {
1089               bitmap_set_bit (args_to_skip, i);
1090               continue;
1091             }
1092
1093           if (lat->type == IPA_CONST_VALUE)
1094             {
1095               replace_param =
1096                 ipcp_create_replace_map (parm_tree, lat);
1097               VEC_safe_push (ipa_replace_map_p, gc, replace_trees, replace_param);
1098               bitmap_set_bit (args_to_skip, i);
1099             }
1100         }
1101
1102       /* Compute how many callers node has.  */
1103       node_callers = 0;
1104       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1105         node_callers++;
1106       redirect_callers = VEC_alloc (cgraph_edge_p, heap, node_callers);
1107       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
1108         VEC_quick_push (cgraph_edge_p, redirect_callers, cs);
1109
1110       /* Redirecting all the callers of the node to the
1111          new versioned node.  */
1112       node1 =
1113         cgraph_create_virtual_clone (node, redirect_callers, replace_trees,
1114                                      args_to_skip);
1115       args_to_skip = NULL;
1116       VEC_free (cgraph_edge_p, heap, redirect_callers);
1117       replace_trees = NULL;
1118
1119       if (node1 == NULL)
1120         continue;
1121       if (dump_file)
1122         fprintf (dump_file, "versioned function %s with growth %i, overall %i\n",
1123                  cgraph_node_name (node), (int)growth, (int)new_size);
1124       ipcp_init_cloned_node (node, node1);
1125
1126       /* TODO: We can use indirect inlning info to produce new calls.  */
1127
1128       if (dump_file)
1129         dump_function_to_file (node1->decl, dump_file, dump_flags);
1130
1131       for (cs = node->callees; cs; cs = cs->next_callee)
1132         if (cs->callee->aux)
1133           {
1134             fibheap_delete_node (heap, (fibnode_t) cs->callee->aux);
1135             cs->callee->aux = fibheap_insert (heap,
1136                                               ipcp_estimate_cloning_cost (cs->callee),
1137                                               cs->callee);
1138           }
1139     }
1140
1141   while (!fibheap_empty (heap))
1142     {
1143       if (dump_file)
1144         fprintf (dump_file, "skipping function %s\n",
1145                  cgraph_node_name (node));
1146       node = (struct cgraph_node *) fibheap_extract_min (heap);
1147       node->aux = NULL;
1148     }
1149   fibheap_delete (heap);
1150   BITMAP_FREE (dead_nodes);
1151   ipcp_update_callgraph ();
1152   ipcp_update_profiling ();
1153 }
1154
1155 /* The IPCP driver.  */
1156 static unsigned int
1157 ipcp_driver (void)
1158 {
1159   cgraph_remove_unreachable_nodes (true,dump_file);
1160   if (dump_file)
1161     {
1162       fprintf (dump_file, "\nIPA structures before propagation:\n");
1163       if (dump_flags & TDF_DETAILS)
1164         ipa_print_all_params (dump_file);
1165       ipa_print_all_jump_functions (dump_file);
1166     }
1167   /* 2. Do the interprocedural propagation.  */
1168   ipcp_iterate_stage ();
1169   /* 3. Insert the constants found to the functions.  */
1170   ipcp_insert_stage ();
1171   if (dump_file && (dump_flags & TDF_DETAILS))
1172     {
1173       fprintf (dump_file, "\nProfiling info after insert stage:\n");
1174       ipcp_print_profile_data (dump_file);
1175     }
1176   /* Free all IPCP structures.  */
1177   free_all_ipa_structures_after_ipa_cp ();
1178   if (dump_file)
1179     fprintf (dump_file, "\nIPA constant propagation end\n");
1180   return 0;
1181 }
1182
1183 /* Note function body size.  */
1184 static void
1185 ipcp_generate_summary (void)
1186 {
1187   if (dump_file)
1188     fprintf (dump_file, "\nIPA constant propagation start:\n");
1189   ipa_check_create_node_params ();
1190   ipa_check_create_edge_args ();
1191   ipa_register_cgraph_hooks ();
1192   /* 1. Call the init stage to initialize 
1193      the ipa_node_params and ipa_edge_args structures.  */
1194   ipcp_init_stage ();
1195 }
1196
1197 /* Gate for IPCP optimization.  */
1198 static bool
1199 cgraph_gate_cp (void)
1200 {
1201   return flag_ipa_cp;
1202 }
1203
1204 struct ipa_opt_pass pass_ipa_cp = 
1205 {
1206  {
1207   IPA_PASS,
1208   "cp",                         /* name */
1209   cgraph_gate_cp,               /* gate */
1210   ipcp_driver,                  /* execute */
1211   NULL,                         /* sub */
1212   NULL,                         /* next */
1213   0,                            /* static_pass_number */
1214   TV_IPA_CONSTANT_PROP,         /* tv_id */
1215   0,                            /* properties_required */
1216   0,                            /* properties_provided */
1217   0,                            /* properties_destroyed */
1218   0,                            /* todo_flags_start */
1219   TODO_dump_cgraph | TODO_dump_func |
1220   TODO_remove_functions /* todo_flags_finish */
1221  },
1222  ipcp_generate_summary,                 /* generate_summary */
1223  NULL,                                  /* write_summary */
1224  NULL,                                  /* read_summary */
1225  NULL,                                  /* function_read_summary */
1226  0,                                     /* TODOs */
1227  NULL,                                  /* function_transform */
1228  NULL,                                  /* variable_transform */
1229 };