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