OSDN Git Service

2008-07-23 Martin Jambor <mjambor@suse.cz>
[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
136 /* Get the original node field of ipa_node_params associated with node NODE.  */
137 static inline struct cgraph_node *
138 ipcp_get_orig_node (struct cgraph_node *node)
139 {
140   return IPA_NODE_REF (node)->ipcp_orig_node;
141 }
142
143 /* Return true if NODE describes a cloned/versioned function.  */
144 static inline bool
145 ipcp_node_is_clone (struct cgraph_node *node)
146 {
147   return (ipcp_get_orig_node (node) != NULL);
148 }
149
150 /* Create ipa_node_params and its data structures for NEW_NODE.  Set ORIG_NODE
151    as the ipcp_orig_node field in ipa_node_params.  */
152 static void
153 ipcp_init_cloned_node (struct cgraph_node *orig_node,
154                        struct cgraph_node *new_node)
155 {
156   ipa_check_create_node_params ();
157   IPA_NODE_REF (new_node)->ipcp_orig_node = orig_node;
158   ipa_count_formal_params (new_node);
159   ipa_create_param_decls_array (new_node);
160 }
161
162 /* Return scale for NODE.  */
163 static inline gcov_type
164 ipcp_get_node_scale (struct cgraph_node *node)
165 {
166   return IPA_NODE_REF (node)->count_scale;
167 }
168
169 /* Set COUNT as scale for NODE.  */
170 static inline void
171 ipcp_set_node_scale (struct cgraph_node *node, gcov_type count)
172 {
173   IPA_NODE_REF (node)->count_scale = count;
174 }
175
176 /* Return whether LAT is a constant lattice.  */
177 static inline bool
178 ipcp_lat_is_const (struct ipcp_lattice *lat)
179 {
180   if (lat->type == IPA_CONST_VALUE || lat->type == IPA_CONST_VALUE_REF)
181     return true;
182   else
183     return false;
184 }
185
186 /* Return whether LAT is a constant lattice that ipa-cp can actually insert
187    into the code (i.e. constants excluding member pointers and pointers).  */
188 static inline bool
189 ipcp_lat_is_insertable (struct ipcp_lattice *lat)
190 {
191   if ((lat->type == IPA_CONST_VALUE || lat->type == IPA_CONST_VALUE_REF)
192       && !POINTER_TYPE_P (TREE_TYPE (lat->constant)))
193     return true;
194   else
195     return false;
196 }
197
198 /* Return true if LAT1 and LAT2 are equal.  */
199 static inline bool
200 ipcp_lats_are_equal (struct ipcp_lattice *lat1, struct ipcp_lattice *lat2)
201 {
202   gcc_assert (ipcp_lat_is_const (lat1) && ipcp_lat_is_const (lat2));
203   if (lat1->type != lat2->type)
204     return false;
205
206   if (operand_equal_p (lat1->constant, lat2->constant, 0))
207     return true;
208
209   return false;
210 }
211
212 /* Compute Meet arithmetics:
213    Meet (IPA_BOTTOM, x) = IPA_BOTTOM
214    Meet (IPA_TOP,x) = x
215    Meet (const_a,const_b) = IPA_BOTTOM,  if const_a != const_b.
216    MEET (const_a,const_b) = const_a, if const_a == const_b.*/
217 static void
218 ipa_lattice_meet (struct ipcp_lattice *res, struct ipcp_lattice *lat1,
219                   struct ipcp_lattice *lat2)
220 {
221   if (lat1->type == IPA_BOTTOM || lat2->type == IPA_BOTTOM)
222     {
223       res->type = IPA_BOTTOM;
224       return;
225     }
226   if (lat1->type == IPA_TOP)
227     {
228       res->type = lat2->type;
229       res->constant = lat2->constant;
230       return;
231     }
232   if (lat2->type == IPA_TOP)
233     {
234       res->type = lat1->type;
235       res->constant = lat1->constant;
236       return;
237     }
238   if (!ipcp_lats_are_equal (lat1, lat2))
239     {
240       res->type = IPA_BOTTOM;
241       return;
242     }
243   res->type = lat1->type;
244   res->constant = lat1->constant;
245 }
246
247 /* Return the lattice corresponding to the Ith formal parameter of the function
248    described by INFO.  */
249 static inline struct ipcp_lattice *
250 ipcp_get_ith_lattice (struct ipa_node_params *info, int i)
251 {
252   return &(info->ipcp_lattices[i]);
253 }
254
255 /* Given the jump function JFUNC, compute the lattice LAT that describes the
256    value coming down the callsite. INFO describes the caller node so that
257    pass-through jump functions can be evaluated.  */
258 static void
259 ipcp_lattice_from_jfunc (struct ipa_node_params *info, struct ipcp_lattice *lat,
260                          struct ipa_jump_func *jfunc)
261 {
262   if (jfunc->type == IPA_CONST)
263     {
264       lat->type = IPA_CONST_VALUE;
265       lat->constant = jfunc->value.constant;
266     }
267   else if (jfunc->type == IPA_CONST_REF)
268     {
269       lat->type = IPA_CONST_VALUE_REF;
270       lat->constant = jfunc->value.constant;
271     }
272   else if (jfunc->type == IPA_PASS_THROUGH)
273     {
274       struct ipcp_lattice *caller_lat;
275
276       caller_lat = ipcp_get_ith_lattice (info, jfunc->value.formal_id);
277       lat->type = caller_lat->type;
278       lat->constant = caller_lat->constant;
279     }
280   else
281     lat->type = IPA_BOTTOM;
282 }
283
284 /* True when OLD and NEW values are not the same.  */
285 static bool
286 ipcp_lattice_changed (struct ipcp_lattice *old, struct ipcp_lattice *new)
287 {
288   if (old->type == new->type)
289     {
290       if (!ipcp_lat_is_const (old))
291         return false;
292       if (ipcp_lats_are_equal (old, new))
293         return false;
294     }
295   return true;
296 }
297
298 /* Print all ipcp_lattices of all functions to F.  */
299 static void
300 ipcp_print_all_lattices (FILE * f)
301 {
302   struct cgraph_node *node;
303   int i, count;
304
305   fprintf (f, "\nLATTICE PRINT\n");
306   for (node = cgraph_nodes; node; node = node->next)
307     {
308       struct ipa_node_params *info;
309
310       if (!node->analyzed)
311         continue;
312       info = IPA_NODE_REF (node);
313       fprintf (f, "Printing lattices %s:\n", cgraph_node_name (node));
314       count = ipa_get_param_count (info);
315       for (i = 0; i < count; i++)
316         {
317           struct ipcp_lattice *lat = ipcp_get_ith_lattice (info, i);
318
319           fprintf (f, " param [%d]: ", i);
320           if (lat->type == IPA_CONST_VALUE || lat->type == IPA_CONST_VALUE_REF)
321             {
322               fprintf (f, "type is CONST ");
323               print_generic_expr (f, lat->constant, 0);
324               fprintf (f, "\n");
325             }
326           else if (lat->type == IPA_TOP)
327             fprintf (f, "type is TOP\n");
328           else
329             fprintf (f, "type is BOTTOM\n");
330         }
331     }
332 }
333
334 /* Initialize ipcp_lattices array.  The lattices corresponding to supported
335    types (integers, real types and Fortran constants defined as const_decls)
336    are initialized to IPA_TOP, the rest of them to IPA_BOTTOM.  */
337 static void
338 ipcp_initialize_node_lattices (struct cgraph_node *node)
339 {
340   int i;
341   struct ipa_node_params *info = IPA_NODE_REF (node);
342
343   info->ipcp_lattices = XCNEWVEC (struct ipcp_lattice,
344                                   ipa_get_param_count (info));
345   for (i = 0; i < ipa_get_param_count (info) ; i++)
346     {
347       tree parm_tree = ipa_get_ith_param (info, i);
348       struct ipcp_lattice *lat = ipcp_get_ith_lattice (info, i);
349
350       if (INTEGRAL_TYPE_P (TREE_TYPE (parm_tree))
351           || SCALAR_FLOAT_TYPE_P (TREE_TYPE (parm_tree))
352           || POINTER_TYPE_P (TREE_TYPE (parm_tree)))
353         lat->type = IPA_TOP;
354       else
355         lat->type = IPA_BOTTOM;
356     }
357 }
358
359 /* Create a new assignment statement and make it the first statement in the
360    function.  PARM1 is the lhs of the assignment and VAL is the rhs. */
361 static void
362 constant_val_insert (tree parm1, tree val)
363 {
364   tree init_stmt = NULL;
365   edge e_step;
366
367   init_stmt = build_gimple_modify_stmt (parm1, val);
368
369   if (init_stmt)
370     {
371       e_step = single_succ_edge (ENTRY_BLOCK_PTR_FOR_FUNCTION (cfun));
372       bsi_insert_on_edge_immediate (e_step, init_stmt);
373     }
374 }
375
376 /* build INTEGER_CST tree with type TREE_TYPE and value according to LAT.
377    Return the tree.  */
378 static tree
379 build_const_val (struct ipcp_lattice *lat, tree tree_type)
380 {
381   tree const_val = NULL;
382
383   gcc_assert (ipcp_lat_is_const (lat));
384   const_val = fold_convert (tree_type, lat->constant);
385   return const_val;
386 }
387
388 /* Build the tree representing the constant and call constant_val_insert().  */
389 static void
390 ipcp_propagate_one_const (struct cgraph_node *node, int param,
391                           struct ipcp_lattice *lat)
392 {
393   tree const_val;
394   tree parm_tree;
395
396   if (dump_file)
397     fprintf (dump_file, "propagating const to %s\n", cgraph_node_name (node));
398   parm_tree = ipa_get_ith_param (IPA_NODE_REF (node), param);
399   const_val = build_const_val (lat, TREE_TYPE (parm_tree));
400   constant_val_insert (parm_tree, const_val);
401 }
402
403 /* Compute the proper scale for NODE.  It is the ratio between the number of
404    direct calls (represented on the incoming cgraph_edges) and sum of all
405    invocations of NODE (represented as count in cgraph_node).  */
406 static void
407 ipcp_compute_node_scale (struct cgraph_node *node)
408 {
409   gcov_type sum;
410   struct cgraph_edge *cs;
411
412   sum = 0;
413   /* Compute sum of all counts of callers. */
414   for (cs = node->callers; cs != NULL; cs = cs->next_caller)
415     sum += cs->count;
416   if (node->count == 0)
417     ipcp_set_node_scale (node, 0);
418   else
419     ipcp_set_node_scale (node, sum * REG_BR_PROB_BASE / node->count);
420 }
421
422 /* Initialization and computation of IPCP data structures.  This is the initial
423    intraprocedural analysis of functions, which gathers information to be
424    propagated later on.  */
425 static void
426 ipcp_init_stage (void)
427 {
428   struct cgraph_node *node;
429   struct cgraph_edge *cs;
430
431   for (node = cgraph_nodes; node; node = node->next)
432     {
433       if (!node->analyzed)
434         continue;
435       /* Unreachable nodes should have been eliminated before ipcp.  */
436       gcc_assert (node->needed || node->reachable);
437
438       ipa_count_formal_params (node);
439       ipa_create_param_decls_array (node);
440       ipcp_initialize_node_lattices (node);
441       ipa_detect_param_modifications (node);
442       ipcp_compute_node_scale (node);
443     }
444   for (node = cgraph_nodes; node; node = node->next)
445     {
446       if (!node->analyzed)
447         continue;
448       /* building jump functions  */
449       for (cs = node->callees; cs; cs = cs->next_callee)
450         {
451           if (!cs->callee->analyzed)
452             continue;
453           ipa_count_arguments (cs);
454           if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
455               != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
456             {
457               /* Handle cases of functions with 
458                  a variable number of parameters.  */
459               ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));
460             }
461           else
462             ipa_compute_jump_functions (cs);
463         }
464     }
465 }
466
467 /* Return true if there are some formal parameters whose value is IPA_TOP (in
468    the whole compilation unit).  Change their values to IPA_BOTTOM, since they
469    most probably get their values from outside of this compilation unit.  */
470 static bool
471 ipcp_change_tops_to_bottom (void)
472 {
473   int i, count;
474   struct cgraph_node *node;
475   bool prop_again;
476
477   prop_again = false;
478   for (node = cgraph_nodes; node; node = node->next)
479     {
480       struct ipa_node_params *info = IPA_NODE_REF (node);
481       count = ipa_get_param_count (info);
482       for (i = 0; i < count; i++)
483         {
484           struct ipcp_lattice *lat = ipcp_get_ith_lattice (info, i);
485           if (lat->type == IPA_TOP)
486             {
487               prop_again = true;
488               lat->type = IPA_BOTTOM;
489             }
490         }
491     }
492   return prop_again;
493 }
494
495 /* Interprocedural analysis. The algorithm propagates constants from the
496    caller's parameters to the callee's arguments.  */
497 static void
498 ipcp_propagate_stage (void)
499 {
500   int i;
501   struct ipcp_lattice inc_lat = { IPA_BOTTOM, NULL };
502   struct ipcp_lattice new_lat = { IPA_BOTTOM, NULL };
503   struct ipcp_lattice *dest_lat;
504   struct cgraph_edge *cs;
505   struct ipa_jump_func *jump_func;
506   struct ipa_func_list *wl;
507   int count;
508
509   ipa_check_create_node_params ();
510   ipa_check_create_edge_args ();
511   /* Initialize worklist to contain all functions.  */
512   wl = ipa_init_func_list ();
513   while (wl)
514     {
515       struct cgraph_node *node = ipa_pop_func_from_list (&wl);
516       struct ipa_node_params *info = IPA_NODE_REF (node);
517
518       for (cs = node->callees; cs; cs = cs->next_callee)
519         {
520           struct ipa_node_params *callee_info = IPA_NODE_REF (cs->callee);
521           struct ipa_edge_args *args = IPA_EDGE_REF (cs);
522
523           if (ipa_is_called_with_var_arguments (callee_info))
524             continue;
525
526           count = ipa_get_cs_argument_count (args);
527           for (i = 0; i < count; i++)
528             {
529               jump_func = ipa_get_ith_jump_func (args, i);
530               ipcp_lattice_from_jfunc (info, &inc_lat, jump_func);
531               dest_lat = ipcp_get_ith_lattice (callee_info, i);
532               ipa_lattice_meet (&new_lat, &inc_lat, dest_lat);
533               if (ipcp_lattice_changed (&new_lat, dest_lat))
534                 {
535                   dest_lat->type = new_lat.type;
536                   dest_lat->constant = new_lat.constant;
537                   ipa_push_func_to_list (&wl, cs->callee);
538                 }
539             }
540         }
541     }
542 }
543
544 /* Call the constant propagation algorithm and re-call it if necessary
545    (if there are undetermined values left).  */
546 static void
547 ipcp_iterate_stage (void)
548 {
549   ipcp_propagate_stage ();
550   if (ipcp_change_tops_to_bottom ())
551     /* Some lattices have changed from IPA_TOP to IPA_BOTTOM.
552        This change should be propagated.  */
553     ipcp_propagate_stage ();
554 }
555
556 /* Check conditions to forbid constant insertion to function described by
557    NODE.  */
558 static inline bool
559 ipcp_node_not_modifiable_p (struct cgraph_node *node)
560 {
561   /* ??? Handle pending sizes case.  */
562   if (DECL_UNINLINABLE (node->decl))
563     return true;
564   return false;
565 }
566
567 /* Print count scale data structures.  */
568 static void
569 ipcp_function_scale_print (FILE * f)
570 {
571   struct cgraph_node *node;
572
573   for (node = cgraph_nodes; node; node = node->next)
574     {
575       if (!node->analyzed)
576         continue;
577       fprintf (f, "printing scale for %s: ", cgraph_node_name (node));
578       fprintf (f, "value is  " HOST_WIDE_INT_PRINT_DEC
579                "  \n", (HOST_WIDE_INT) ipcp_get_node_scale (node));
580     }
581 }
582
583 /* Print counts of all cgraph nodes.  */
584 static void
585 ipcp_print_func_profile_counts (FILE * f)
586 {
587   struct cgraph_node *node;
588
589   for (node = cgraph_nodes; node; node = node->next)
590     {
591       fprintf (f, "function %s: ", cgraph_node_name (node));
592       fprintf (f, "count is  " HOST_WIDE_INT_PRINT_DEC
593                "  \n", (HOST_WIDE_INT) node->count);
594     }
595 }
596
597 /* Print counts of all cgraph edges.  */
598 static void
599 ipcp_print_call_profile_counts (FILE * f)
600 {
601   struct cgraph_node *node;
602   struct cgraph_edge *cs;
603
604   for (node = cgraph_nodes; node; node = node->next)
605     {
606       for (cs = node->callees; cs; cs = cs->next_callee)
607         {
608           fprintf (f, "%s -> %s ", cgraph_node_name (cs->caller),
609                    cgraph_node_name (cs->callee));
610           fprintf (f, "count is  " HOST_WIDE_INT_PRINT_DEC "  \n",
611                    (HOST_WIDE_INT) cs->count);
612         }
613     }
614 }
615
616 /* Print all counts and probabilities of cfg edges of all functions.  */
617 static void
618 ipcp_print_edge_profiles (FILE * f)
619 {
620   struct cgraph_node *node;
621   basic_block bb;
622   edge_iterator ei;
623   edge e;
624
625   for (node = cgraph_nodes; node; node = node->next)
626     {
627       fprintf (f, "function %s: \n", cgraph_node_name (node));
628       if (node->analyzed)
629         {
630           bb =
631             ENTRY_BLOCK_PTR_FOR_FUNCTION (DECL_STRUCT_FUNCTION (node->decl));
632           fprintf (f, "ENTRY: ");
633           fprintf (f, " " HOST_WIDE_INT_PRINT_DEC
634                    " %d\n", (HOST_WIDE_INT) bb->count, bb->frequency);
635
636           if (bb->succs)
637             FOR_EACH_EDGE (e, ei, bb->succs)
638             {
639               if (e->dest ==
640                   EXIT_BLOCK_PTR_FOR_FUNCTION (DECL_STRUCT_FUNCTION
641                                                (node->decl)))
642                 fprintf (f, "edge ENTRY -> EXIT,  Count");
643               else
644                 fprintf (f, "edge ENTRY -> %d,  Count", e->dest->index);
645               fprintf (f, " " HOST_WIDE_INT_PRINT_DEC
646                        " Prob %d\n", (HOST_WIDE_INT) e->count,
647                        e->probability);
648             }
649           FOR_EACH_BB_FN (bb, DECL_STRUCT_FUNCTION (node->decl))
650           {
651             fprintf (f, "bb[%d]: ", bb->index);
652             fprintf (f, " " HOST_WIDE_INT_PRINT_DEC
653                      " %d\n", (HOST_WIDE_INT) bb->count, bb->frequency);
654             FOR_EACH_EDGE (e, ei, bb->succs)
655             {
656               if (e->dest ==
657                   EXIT_BLOCK_PTR_FOR_FUNCTION (DECL_STRUCT_FUNCTION
658                                                (node->decl)))
659                 fprintf (f, "edge %d -> EXIT,  Count", e->src->index);
660               else
661                 fprintf (f, "edge %d -> %d,  Count", e->src->index,
662                          e->dest->index);
663               fprintf (f, " " HOST_WIDE_INT_PRINT_DEC " Prob %d\n",
664                        (HOST_WIDE_INT) e->count, e->probability);
665             }
666           }
667         }
668     }
669 }
670
671 /* Print counts and frequencies for all basic blocks of all functions.  */
672 static void
673 ipcp_print_bb_profiles (FILE * f)
674 {
675   basic_block bb;
676   struct cgraph_node *node;
677
678   for (node = cgraph_nodes; node; node = node->next)
679     {
680       fprintf (f, "function %s: \n", cgraph_node_name (node));
681       if (node->analyzed)
682         {
683           bb =
684             ENTRY_BLOCK_PTR_FOR_FUNCTION (DECL_STRUCT_FUNCTION (node->decl));
685           fprintf (f, "ENTRY: Count");
686           fprintf (f, " " HOST_WIDE_INT_PRINT_DEC
687                    " Frequency  %d\n", (HOST_WIDE_INT) bb->count,
688                    bb->frequency);
689
690           FOR_EACH_BB_FN (bb, DECL_STRUCT_FUNCTION (node->decl))
691           {
692             fprintf (f, "bb[%d]: Count", bb->index);
693             fprintf (f, " " HOST_WIDE_INT_PRINT_DEC
694                      " Frequency %d\n", (HOST_WIDE_INT) bb->count,
695                      bb->frequency);
696           }
697           bb =
698             EXIT_BLOCK_PTR_FOR_FUNCTION (DECL_STRUCT_FUNCTION (node->decl));
699           fprintf (f, "EXIT: Count");
700           fprintf (f, " " HOST_WIDE_INT_PRINT_DEC
701                    " Frequency %d\n", (HOST_WIDE_INT) bb->count,
702                    bb->frequency);
703
704         }
705     }
706 }
707
708 /* Print all IPCP data structures to F.  */
709 static void
710 ipcp_print_all_structures (FILE * f)
711 {
712   ipcp_print_all_lattices (f);
713   ipcp_function_scale_print (f);
714   ipa_print_all_tree_maps (f);
715   ipa_print_all_param_flags (f);
716   ipa_print_all_jump_functions (f);
717 }
718
719 /* Print profile info for all functions.  */
720 static void
721 ipcp_print_profile_data (FILE * f)
722 {
723   fprintf (f, "\nNODE COUNTS :\n");
724   ipcp_print_func_profile_counts (f);
725   fprintf (f, "\nCS COUNTS stage:\n");
726   ipcp_print_call_profile_counts (f);
727   fprintf (f, "\nBB COUNTS and FREQUENCIES :\n");
728   ipcp_print_bb_profiles (f);
729   fprintf (f, "\nCFG EDGES COUNTS and PROBABILITIES :\n");
730   ipcp_print_edge_profiles (f);
731 }
732
733 /* Build and initialize ipa_replace_map struct according to LAT. This struct is
734    processed by versioning, which operates according to the flags set.
735    PARM_TREE is the formal parameter found to be constant.  LAT represents the
736    constant.  */
737 static struct ipa_replace_map *
738 ipcp_create_replace_map (struct function *func, tree parm_tree,
739                          struct ipcp_lattice *lat)
740 {
741   struct ipa_replace_map *replace_map;
742   tree const_val;
743
744   replace_map = XCNEW (struct ipa_replace_map);
745   if (is_gimple_reg (parm_tree) && gimple_default_def (func, parm_tree)
746       && !SSA_NAME_OCCURS_IN_ABNORMAL_PHI (gimple_default_def (func,
747                                                                  parm_tree)))
748     {
749       if (dump_file)
750         fprintf (dump_file, "replacing param with const\n");
751       const_val = build_const_val (lat, TREE_TYPE (parm_tree));
752       replace_map->old_tree =gimple_default_def (func, parm_tree);
753       replace_map->new_tree = const_val;
754       replace_map->replace_p = true;
755       replace_map->ref_p = false;
756     }
757   else
758     {
759       replace_map->old_tree = NULL;
760       replace_map->new_tree = NULL;
761       replace_map->replace_p = false;
762       replace_map->ref_p = false;
763     }
764
765   return replace_map;
766 }
767
768 /* Return true if this callsite should be redirected to the original callee
769    (instead of the cloned one).  */
770 static bool
771 ipcp_need_redirect_p (struct cgraph_edge *cs)
772 {
773   struct ipa_node_params *orig_callee_info;
774   int i, count;
775   struct ipa_jump_func *jump_func;
776
777   orig_callee_info = IPA_NODE_REF (ipcp_get_orig_node (cs->callee));
778   count = ipa_get_param_count (orig_callee_info);
779   for (i = 0; i < count; i++)
780     {
781       struct ipcp_lattice *lat = ipcp_get_ith_lattice (orig_callee_info, i);
782       if (ipcp_lat_is_const (lat))
783         {
784           jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
785           if (!ipcp_lat_is_const (lat))
786             return true;
787         }
788     }
789
790   return false;
791 }
792
793 /* Fix the callsites and the call graph after function cloning was done.  */
794 static void
795 ipcp_update_callgraph (void)
796 {
797   struct cgraph_node *node, *orig_callee;
798   struct cgraph_edge *cs;
799
800   for (node = cgraph_nodes; node; node = node->next)
801     {
802       /* want to fix only original nodes  */
803       if (!node->analyzed || ipcp_node_is_clone (node))
804         continue;
805       for (cs = node->callees; cs; cs = cs->next_callee)
806         if (ipcp_node_is_clone (cs->callee))
807           {
808             /* Callee is a cloned node  */
809             orig_callee = ipcp_get_orig_node (cs->callee);
810             if (ipcp_need_redirect_p (cs))
811               {
812                 cgraph_redirect_edge_callee (cs, orig_callee);
813                 TREE_OPERAND (CALL_EXPR_FN (get_call_expr_in (cs->call_stmt)),
814                               0) =
815                   orig_callee->decl;
816               }
817           }
818     }
819 }
820
821 /* Update all cfg basic blocks in NODE according to SCALE.  */
822 static void
823 ipcp_update_bb_counts (struct cgraph_node *node, gcov_type scale)
824 {
825   basic_block bb;
826
827   FOR_ALL_BB_FN (bb, DECL_STRUCT_FUNCTION (node->decl))
828     bb->count = bb->count * scale / REG_BR_PROB_BASE;
829 }
830
831 /* Update all cfg edges in NODE according to SCALE.  */
832 static void
833 ipcp_update_edges_counts (struct cgraph_node *node, gcov_type scale)
834 {
835   basic_block bb;
836   edge_iterator ei;
837   edge e;
838
839   FOR_ALL_BB_FN (bb, DECL_STRUCT_FUNCTION (node->decl))
840     FOR_EACH_EDGE (e, ei, bb->succs)
841     e->count = e->count * scale / REG_BR_PROB_BASE;
842 }
843
844 /* Update profiling info for versioned functions and the functions they were
845    versioned from.  */
846 static void
847 ipcp_update_profiling (void)
848 {
849   struct cgraph_node *node, *orig_node;
850   gcov_type scale, scale_complement;
851   struct cgraph_edge *cs;
852
853   for (node = cgraph_nodes; node; node = node->next)
854     {
855       if (ipcp_node_is_clone (node))
856         {
857           orig_node = ipcp_get_orig_node (node);
858           scale = ipcp_get_node_scale (orig_node);
859           node->count = orig_node->count * scale / REG_BR_PROB_BASE;
860           scale_complement = REG_BR_PROB_BASE - scale;
861           orig_node->count =
862             orig_node->count * scale_complement / REG_BR_PROB_BASE;
863           for (cs = node->callees; cs; cs = cs->next_callee)
864             cs->count = cs->count * scale / REG_BR_PROB_BASE;
865           for (cs = orig_node->callees; cs; cs = cs->next_callee)
866             cs->count = cs->count * scale_complement / REG_BR_PROB_BASE;
867           ipcp_update_bb_counts (node, scale);
868           ipcp_update_bb_counts (orig_node, scale_complement);
869           ipcp_update_edges_counts (node, scale);
870           ipcp_update_edges_counts (orig_node, scale_complement);
871         }
872     }
873 }
874
875 /* Propagate the constant parameters found by ipcp_iterate_stage()
876    to the function's code.  */
877 static void
878 ipcp_insert_stage (void)
879 {
880   struct cgraph_node *node, *node1 = NULL;
881   int i, const_param;
882   VEC (cgraph_edge_p, heap) * redirect_callers;
883   varray_type replace_trees;
884   struct cgraph_edge *cs;
885   int node_callers, count;
886   tree parm_tree;
887   struct ipa_replace_map *replace_param;
888
889   ipa_check_create_node_params ();
890   ipa_check_create_edge_args ();
891
892   for (node = cgraph_nodes; node; node = node->next)
893     {
894       struct ipa_node_params *info;
895       /* Propagation of the constant is forbidden in certain conditions.  */
896       if (!node->analyzed || ipcp_node_not_modifiable_p (node))
897           continue;
898       info = IPA_NODE_REF (node);
899       if (ipa_is_called_with_var_arguments (info))
900         continue;
901       const_param = 0;
902       count = ipa_get_param_count (info);
903       for (i = 0; i < count; i++)
904         {
905           struct ipcp_lattice *lat = ipcp_get_ith_lattice (info, i);
906           if (ipcp_lat_is_insertable (lat))
907             const_param++;
908         }
909       if (const_param == 0)
910         continue;
911       VARRAY_GENERIC_PTR_INIT (replace_trees, const_param, "replace_trees");
912       for (i = 0; i < count; i++)
913         {
914           struct ipcp_lattice *lat = ipcp_get_ith_lattice (info, i);
915           if (lat->type == IPA_CONST_VALUE
916               && !POINTER_TYPE_P (TREE_TYPE (lat->constant)))
917             {
918               parm_tree = ipa_get_ith_param (info, i);
919               replace_param =
920                 ipcp_create_replace_map (DECL_STRUCT_FUNCTION (node->decl),
921                                          parm_tree, lat);
922               VARRAY_PUSH_GENERIC_PTR (replace_trees, replace_param);
923             }
924         }
925       /* Compute how many callers node has.  */
926       node_callers = 0;
927       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
928         node_callers++;
929       redirect_callers = VEC_alloc (cgraph_edge_p, heap, node_callers);
930       for (cs = node->callers; cs != NULL; cs = cs->next_caller)
931         VEC_quick_push (cgraph_edge_p, redirect_callers, cs);
932       /* Redirecting all the callers of the node to the
933          new versioned node.  */
934       node1 =
935         cgraph_function_versioning (node, redirect_callers, replace_trees);
936       VEC_free (cgraph_edge_p, heap, redirect_callers);
937       VARRAY_CLEAR (replace_trees);
938       if (node1 == NULL)
939         continue;
940       if (dump_file)
941         fprintf (dump_file, "versioned function %s\n",
942                  cgraph_node_name (node));
943       ipcp_init_cloned_node (node, node1);
944       if (const_param > 0)
945         {
946           push_cfun (DECL_STRUCT_FUNCTION (node1->decl));
947           tree_register_cfg_hooks ();
948           current_function_decl = node1->decl;
949
950           for (i = 0; i < count; i++)
951             {
952               struct ipcp_lattice *lat = ipcp_get_ith_lattice (info, i);
953               if (ipcp_lat_is_insertable (lat))
954                 {
955                   parm_tree = ipa_get_ith_param (info, i);
956                   if (lat->type != IPA_CONST_VALUE_REF
957                       && !is_gimple_reg (parm_tree))
958                     ipcp_propagate_one_const (node1, i, lat);
959                 }
960             }
961           if (gimple_in_ssa_p (cfun))
962             {
963               update_ssa (TODO_update_ssa);
964 #ifdef   ENABLE_CHECKING
965               verify_ssa (true);
966 #endif
967             }
968           free_dominance_info (CDI_DOMINATORS);
969           free_dominance_info (CDI_POST_DOMINATORS);
970           pop_cfun ();
971           current_function_decl = NULL;
972         }
973       if (dump_file)
974         dump_function_to_file (node1->decl, dump_file, dump_flags);
975     }
976   ipcp_update_callgraph ();
977   ipcp_update_profiling ();
978 }
979
980 /* The IPCP driver.  */
981 static unsigned int
982 ipcp_driver (void)
983 {
984   if (dump_file)
985     fprintf (dump_file, "\nIPA constant propagation start:\n");
986   ipa_check_create_node_params ();
987   ipa_check_create_edge_args ();
988   ipa_register_cgraph_hooks ();
989   /* 1. Call the init stage to initialize 
990      the ipa_node_params and ipa_edge_args structures.  */
991   ipcp_init_stage ();
992   if (dump_file)
993     {
994       fprintf (dump_file, "\nIPA structures before propagation:\n");
995       ipcp_print_all_structures (dump_file);
996     }
997   /* 2. Do the interprocedural propagation.  */
998   ipcp_iterate_stage ();
999   if (dump_file)
1000     {
1001       fprintf (dump_file, "\nIPA structures after propagation:\n");
1002       ipcp_print_all_structures (dump_file);
1003       fprintf (dump_file, "\nProfiling info before insert stage:\n");
1004       ipcp_print_profile_data (dump_file);
1005     }
1006   /* 3. Insert the constants found to the functions.  */
1007   ipcp_insert_stage ();
1008   if (dump_file)
1009     {
1010       fprintf (dump_file, "\nProfiling info after insert stage:\n");
1011       ipcp_print_profile_data (dump_file);
1012     }
1013   /* Free all IPCP structures.  */
1014   free_all_ipa_structures_after_ipa_cp ();
1015   if (dump_file)
1016     fprintf (dump_file, "\nIPA constant propagation end\n");
1017   cgraph_remove_unreachable_nodes (true, NULL);
1018   return 0;
1019 }
1020
1021 /* Gate for IPCP optimization.  */
1022 static bool
1023 cgraph_gate_cp (void)
1024 {
1025   return flag_ipa_cp;
1026 }
1027
1028 struct simple_ipa_opt_pass pass_ipa_cp = 
1029 {
1030  {
1031   SIMPLE_IPA_PASS,
1032   "cp",                         /* name */
1033   cgraph_gate_cp,               /* gate */
1034   ipcp_driver,                  /* execute */
1035   NULL,                         /* sub */
1036   NULL,                         /* next */
1037   0,                            /* static_pass_number */
1038   TV_IPA_CONSTANT_PROP,         /* tv_id */
1039   0,                            /* properties_required */
1040   PROP_trees,                   /* properties_provided */
1041   0,                            /* properties_destroyed */
1042   0,                            /* todo_flags_start */
1043   TODO_dump_cgraph | TODO_dump_func     /* todo_flags_finish */
1044  }
1045 };