OSDN Git Service

ABM intrinsics file.
[pf3gnuchains/gcc-fork.git] / gcc / ipa-prop.c
1 /* Interprocedural analyses.
2    Copyright (C) 2005, 2007, 2008, 2009 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tree.h"
24 #include "langhooks.h"
25 #include "ggc.h"
26 #include "target.h"
27 #include "cgraph.h"
28 #include "ipa-prop.h"
29 #include "tree-flow.h"
30 #include "tree-pass.h"
31 #include "tree-inline.h"
32 #include "flags.h"
33 #include "timevar.h"
34 #include "flags.h"
35 #include "diagnostic.h"
36 #include "lto-streamer.h"
37
38 /* Vector where the parameter infos are actually stored. */
39 VEC (ipa_node_params_t, heap) *ipa_node_params_vector;
40 /* Vector where the parameter infos are actually stored. */
41 VEC (ipa_edge_args_t, gc) *ipa_edge_args_vector;
42
43 /* Holders of ipa cgraph hooks: */
44 static struct cgraph_edge_hook_list *edge_removal_hook_holder;
45 static struct cgraph_node_hook_list *node_removal_hook_holder;
46 static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
47 static struct cgraph_2node_hook_list *node_duplication_hook_holder;
48
49 /* Add cgraph NODE described by INFO to the worklist WL regardless of whether
50    it is in one or not.  It should almost never be used directly, as opposed to
51    ipa_push_func_to_list.  */
52
53 void
54 ipa_push_func_to_list_1 (struct ipa_func_list **wl,
55                          struct cgraph_node *node,
56                          struct ipa_node_params *info)
57 {
58   struct ipa_func_list *temp;
59
60   info->node_enqueued = 1;
61   temp = XCNEW (struct ipa_func_list);
62   temp->node = node;
63   temp->next = *wl;
64   *wl = temp;
65 }
66
67 /* Initialize worklist to contain all functions.  */
68
69 struct ipa_func_list *
70 ipa_init_func_list (void)
71 {
72   struct cgraph_node *node;
73   struct ipa_func_list * wl;
74
75   wl = NULL;
76   for (node = cgraph_nodes; node; node = node->next)
77     if (node->analyzed)
78       {
79         struct ipa_node_params *info = IPA_NODE_REF (node);
80         /* Unreachable nodes should have been eliminated before ipcp and
81            inlining.  */
82         gcc_assert (node->needed || node->reachable);
83         ipa_push_func_to_list_1 (&wl, node, info);
84       }
85
86   return wl;
87 }
88
89 /* Remove a function from the worklist WL and return it.  */
90
91 struct cgraph_node *
92 ipa_pop_func_from_list (struct ipa_func_list **wl)
93 {
94   struct ipa_node_params *info;
95   struct ipa_func_list *first;
96   struct cgraph_node *node;
97
98   first = *wl;
99   *wl = (*wl)->next;
100   node = first->node;
101   free (first);
102
103   info = IPA_NODE_REF (node);
104   info->node_enqueued = 0;
105   return node;
106 }
107
108 /* Return index of the formal whose tree is PTREE in function which corresponds
109    to INFO.  */
110
111 static int
112 ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
113 {
114   int i, count;
115
116   count = ipa_get_param_count (info);
117   for (i = 0; i < count; i++)
118     if (ipa_get_param(info, i) == ptree)
119       return i;
120
121   return -1;
122 }
123
124 /* Populate the param_decl field in parameter descriptors of INFO that
125    corresponds to NODE.  */
126
127 static void
128 ipa_populate_param_decls (struct cgraph_node *node,
129                           struct ipa_node_params *info)
130 {
131   tree fndecl;
132   tree fnargs;
133   tree parm;
134   int param_num;
135
136   fndecl = node->decl;
137   fnargs = DECL_ARGUMENTS (fndecl);
138   param_num = 0;
139   for (parm = fnargs; parm; parm = TREE_CHAIN (parm))
140     {
141       info->params[param_num].decl = parm;
142       param_num++;
143     }
144 }
145
146 /* Return how many formal parameters FNDECL has.  */
147
148 static inline int
149 count_formal_params_1 (tree fndecl)
150 {
151   tree parm;
152   int count = 0;
153
154   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = TREE_CHAIN (parm))
155     count++;
156
157   return count;
158 }
159
160 /* Count number of formal parameters in NOTE. Store the result to the
161    appropriate field of INFO.  */
162
163 static void
164 ipa_count_formal_params (struct cgraph_node *node,
165                          struct ipa_node_params *info)
166 {
167   int param_num;
168
169   param_num = count_formal_params_1 (node->decl);
170   ipa_set_param_count (info, param_num);
171 }
172
173 /* Initialize the ipa_node_params structure associated with NODE by counting
174    the function parameters, creating the descriptors and populating their
175    param_decls.  */
176
177 void
178 ipa_initialize_node_params (struct cgraph_node *node)
179 {
180   struct ipa_node_params *info = IPA_NODE_REF (node);
181
182   if (!info->params)
183     {
184       ipa_count_formal_params (node, info);
185       info->params = XCNEWVEC (struct ipa_param_descriptor,
186                                     ipa_get_param_count (info));
187       ipa_populate_param_decls (node, info);
188     }
189 }
190
191 /* Callback of walk_stmt_load_store_addr_ops for the visit_store and visit_addr
192    parameters.  If OP is a parameter declaration, mark it as modified in the
193    info structure passed in DATA.  */
194
195 static bool
196 visit_store_addr_for_mod_analysis (gimple stmt ATTRIBUTE_UNUSED,
197                                    tree op, void *data)
198 {
199   struct ipa_node_params *info = (struct ipa_node_params *) data;
200
201   if (TREE_CODE (op) == PARM_DECL)
202     {
203       int index = ipa_get_param_decl_index (info, op);
204       gcc_assert (index >= 0);
205       info->params[index].modified = true;
206     }
207
208   return false;
209 }
210
211 /* Compute which formal parameters of function associated with NODE are locally
212    modified or their address is taken.  Note that this does not apply on
213    parameters with SSA names but those can and should be analyzed
214    differently.  */
215
216 void
217 ipa_detect_param_modifications (struct cgraph_node *node)
218 {
219   tree decl = node->decl;
220   basic_block bb;
221   struct function *func;
222   gimple_stmt_iterator gsi;
223   struct ipa_node_params *info = IPA_NODE_REF (node);
224
225   if (ipa_get_param_count (info) == 0 || info->modification_analysis_done)
226     return;
227
228   func = DECL_STRUCT_FUNCTION (decl);
229   FOR_EACH_BB_FN (bb, func)
230     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
231       walk_stmt_load_store_addr_ops (gsi_stmt (gsi), info, NULL,
232                                      visit_store_addr_for_mod_analysis,
233                                      visit_store_addr_for_mod_analysis);
234
235   info->modification_analysis_done = 1;
236 }
237
238 /* Count number of arguments callsite CS has and store it in
239    ipa_edge_args structure corresponding to this callsite.  */
240
241 void
242 ipa_count_arguments (struct cgraph_edge *cs)
243 {
244   gimple stmt;
245   int arg_num;
246
247   stmt = cs->call_stmt;
248   gcc_assert (is_gimple_call (stmt));
249   arg_num = gimple_call_num_args (stmt);
250   if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector)
251       <= (unsigned) cgraph_edge_max_uid)
252     VEC_safe_grow_cleared (ipa_edge_args_t, gc,
253                            ipa_edge_args_vector, cgraph_edge_max_uid + 1);
254   ipa_set_cs_argument_count (IPA_EDGE_REF (cs), arg_num);
255 }
256
257 /* Print the jump functions of all arguments on all call graph edges going from
258    NODE to file F.  */
259
260 void
261 ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
262 {
263   int i, count;
264   struct cgraph_edge *cs;
265   struct ipa_jump_func *jump_func;
266   enum jump_func_type type;
267
268   fprintf (f, "  Jump functions of caller  %s:\n", cgraph_node_name (node));
269   for (cs = node->callees; cs; cs = cs->next_callee)
270     {
271       if (!ipa_edge_args_info_available_for_edge_p (cs))
272         continue;
273
274       fprintf (f, "    callsite  %s ", cgraph_node_name (node));
275       fprintf (f, "-> %s :: \n", cgraph_node_name (cs->callee));
276
277       count = ipa_get_cs_argument_count (IPA_EDGE_REF (cs));
278       for (i = 0; i < count; i++)
279         {
280           jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
281           type = jump_func->type;
282
283           fprintf (f, "       param %d: ", i);
284           if (type == IPA_JF_UNKNOWN)
285             fprintf (f, "UNKNOWN\n");
286           else if (type == IPA_JF_CONST)
287             {
288               tree val = jump_func->value.constant;
289               fprintf (f, "CONST: ");
290               print_generic_expr (f, val, 0);
291               fprintf (f, "\n");
292             }
293           else if (type == IPA_JF_CONST_MEMBER_PTR)
294             {
295               fprintf (f, "CONST MEMBER PTR: ");
296               print_generic_expr (f, jump_func->value.member_cst.pfn, 0);
297               fprintf (f, ", ");
298               print_generic_expr (f, jump_func->value.member_cst.delta, 0);
299               fprintf (f, "\n");
300             }
301           else if (type == IPA_JF_PASS_THROUGH)
302             {
303               fprintf (f, "PASS THROUGH: ");
304               fprintf (f, "%d, op %s ",
305                        jump_func->value.pass_through.formal_id,
306                        tree_code_name[(int)
307                                       jump_func->value.pass_through.operation]);
308               if (jump_func->value.pass_through.operation != NOP_EXPR)
309                 print_generic_expr (dump_file,
310                                     jump_func->value.pass_through.operand, 0);
311               fprintf (dump_file, "\n");
312             }
313           else if (type == IPA_JF_ANCESTOR)
314             {
315               fprintf (f, "ANCESTOR: ");
316               fprintf (f, "%d, offset "HOST_WIDE_INT_PRINT_DEC"\n",
317                        jump_func->value.ancestor.formal_id,
318                        jump_func->value.ancestor.offset);
319             }
320         }
321     }
322 }
323
324 /* Print ipa_jump_func data structures of all nodes in the call graph to F.  */
325
326 void
327 ipa_print_all_jump_functions (FILE *f)
328 {
329   struct cgraph_node *node;
330
331   fprintf (f, "\nJump functions:\n");
332   for (node = cgraph_nodes; node; node = node->next)
333     {
334       ipa_print_node_jump_functions (f, node);
335     }
336 }
337
338 /* Determine whether passing ssa name NAME constitutes a polynomial
339    pass-through function or getting an address of an acestor and if so, write
340    such a jump function to JFUNC.  INFO describes the caller.  */
341
342 static void
343 compute_complex_pass_through (struct ipa_node_params *info,
344                               struct ipa_jump_func *jfunc,
345                               tree name)
346 {
347   HOST_WIDE_INT offset, size, max_size;
348   tree op1, op2, type;
349   int index;
350   gimple stmt = SSA_NAME_DEF_STMT (name);
351
352   if (!is_gimple_assign (stmt))
353     return;
354   op1 = gimple_assign_rhs1 (stmt);
355   op2 = gimple_assign_rhs2 (stmt);
356
357   if (op2)
358     {
359       if (TREE_CODE (op1) != SSA_NAME
360           || !SSA_NAME_IS_DEFAULT_DEF (op1)
361           || (TREE_CODE_CLASS (gimple_expr_code (stmt)) != tcc_comparison
362               && !useless_type_conversion_p (TREE_TYPE (name),
363                                              TREE_TYPE (op1)))
364           || !is_gimple_ip_invariant (op2))
365         return;
366
367       index = ipa_get_param_decl_index (info, SSA_NAME_VAR (op1));
368       if (index >= 0)
369         {
370           jfunc->type = IPA_JF_PASS_THROUGH;
371           jfunc->value.pass_through.formal_id = index;
372           jfunc->value.pass_through.operation = gimple_assign_rhs_code (stmt);
373           jfunc->value.pass_through.operand = op2;
374         }
375       return;
376     }
377
378   if (TREE_CODE (op1) != ADDR_EXPR)
379     return;
380   op1 = TREE_OPERAND (op1, 0);
381   type = TREE_TYPE (op1);
382
383   op1 = get_ref_base_and_extent (op1, &offset, &size, &max_size);
384   if (TREE_CODE (op1) != INDIRECT_REF
385       /* If this is a varying address, punt.  */
386       || max_size == -1
387       || max_size != size)
388     return;
389   op1 = TREE_OPERAND (op1, 0);
390   if (TREE_CODE (op1) != SSA_NAME
391       || !SSA_NAME_IS_DEFAULT_DEF (op1))
392     return;
393
394   index = ipa_get_param_decl_index (info, SSA_NAME_VAR (op1));
395   if (index >= 0)
396     {
397       jfunc->type = IPA_JF_ANCESTOR;
398       jfunc->value.ancestor.formal_id = index;
399       jfunc->value.ancestor.offset = offset;
400       jfunc->value.ancestor.type = type;
401     }
402 }
403
404
405 /* Determine the jump functions of scalar arguments.  Scalar means SSA names
406    and constants of a number of selected types.  INFO is the ipa_node_params
407    structure associated with the caller, FUNCTIONS is a pointer to an array of
408    jump function structures associated with CALL which is the call statement
409    being examined.*/
410
411 static void
412 compute_scalar_jump_functions (struct ipa_node_params *info,
413                                struct ipa_jump_func *functions,
414                                gimple call)
415 {
416   tree arg;
417   unsigned num = 0;
418
419   for (num = 0; num < gimple_call_num_args (call); num++)
420     {
421       arg = gimple_call_arg (call, num);
422
423       if (is_gimple_ip_invariant (arg))
424         {
425           functions[num].type = IPA_JF_CONST;
426           functions[num].value.constant = arg;
427         }
428       else if (TREE_CODE (arg) == SSA_NAME)
429         {
430           if (SSA_NAME_IS_DEFAULT_DEF (arg))
431             {
432               int index = ipa_get_param_decl_index (info, SSA_NAME_VAR (arg));
433
434               if (index >= 0)
435                 {
436                   functions[num].type = IPA_JF_PASS_THROUGH;
437                   functions[num].value.pass_through.formal_id = index;
438                   functions[num].value.pass_through.operation = NOP_EXPR;
439                 }
440             }
441           else
442             compute_complex_pass_through (info, &functions[num], arg);
443         }
444     }
445 }
446
447 /* Inspect the given TYPE and return true iff it has the same structure (the
448    same number of fields of the same types) as a C++ member pointer.  If
449    METHOD_PTR and DELTA are non-NULL, store the trees representing the
450    corresponding fields there.  */
451
452 static bool
453 type_like_member_ptr_p (tree type, tree *method_ptr, tree *delta)
454 {
455   tree fld;
456
457   if (TREE_CODE (type) != RECORD_TYPE)
458     return false;
459
460   fld = TYPE_FIELDS (type);
461   if (!fld || !POINTER_TYPE_P (TREE_TYPE (fld))
462       || TREE_CODE (TREE_TYPE (TREE_TYPE (fld))) != METHOD_TYPE)
463     return false;
464
465   if (method_ptr)
466     *method_ptr = fld;
467
468   fld = TREE_CHAIN (fld);
469   if (!fld || INTEGRAL_TYPE_P (fld))
470     return false;
471   if (delta)
472     *delta = fld;
473
474   if (TREE_CHAIN (fld))
475     return false;
476
477   return true;
478 }
479
480 /* Go through arguments of the CALL and for every one that looks like a member
481    pointer, check whether it can be safely declared pass-through and if so,
482    mark that to the corresponding item of jump FUNCTIONS.  Return true iff
483    there are non-pass-through member pointers within the arguments.  INFO
484    describes formal parameters of the caller.  */
485
486 static bool
487 compute_pass_through_member_ptrs (struct ipa_node_params *info,
488                                   struct ipa_jump_func *functions,
489                                   gimple call)
490 {
491   bool undecided_members = false;
492   unsigned num;
493   tree arg;
494
495   for (num = 0; num < gimple_call_num_args (call); num++)
496     {
497       arg = gimple_call_arg (call, num);
498
499       if (type_like_member_ptr_p (TREE_TYPE (arg), NULL, NULL))
500         {
501           if (TREE_CODE (arg) == PARM_DECL)
502             {
503               int index = ipa_get_param_decl_index (info, arg);
504
505               gcc_assert (index >=0);
506               if (!ipa_is_param_modified (info, index))
507                 {
508                   functions[num].type = IPA_JF_PASS_THROUGH;
509                   functions[num].value.pass_through.formal_id = index;
510                   functions[num].value.pass_through.operation = NOP_EXPR;
511                 }
512               else
513                 undecided_members = true;
514             }
515           else
516             undecided_members = true;
517         }
518     }
519
520   return undecided_members;
521 }
522
523 /* Simple function filling in a member pointer constant jump function (with PFN
524    and DELTA as the constant value) into JFUNC.  */
525
526 static void
527 fill_member_ptr_cst_jump_function (struct ipa_jump_func *jfunc,
528                                    tree pfn, tree delta)
529 {
530   jfunc->type = IPA_JF_CONST_MEMBER_PTR;
531   jfunc->value.member_cst.pfn = pfn;
532   jfunc->value.member_cst.delta = delta;
533 }
534
535 /* If RHS is an SSA_NAMe and it is defined by a simple copy assign statement,
536    return the rhs of its defining statement.  */
537
538 static inline tree
539 get_ssa_def_if_simple_copy (tree rhs)
540 {
541   while (TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_IS_DEFAULT_DEF (rhs))
542     {
543       gimple def_stmt = SSA_NAME_DEF_STMT (rhs);
544
545       if (gimple_assign_single_p (def_stmt))
546         rhs = gimple_assign_rhs1 (def_stmt);
547       else
548         break;
549     }
550   return rhs;
551 }
552
553 /* Traverse statements from CALL backwards, scanning whether the argument ARG
554    which is a member pointer is filled in with constant values.  If it is, fill
555    the jump function JFUNC in appropriately.  METHOD_FIELD and DELTA_FIELD are
556    fields of the record type of the member pointer.  To give an example, we
557    look for a pattern looking like the following:
558
559      D.2515.__pfn ={v} printStuff;
560      D.2515.__delta ={v} 0;
561      i_1 = doprinting (D.2515);  */
562
563 static void
564 determine_cst_member_ptr (gimple call, tree arg, tree method_field,
565                           tree delta_field, struct ipa_jump_func *jfunc)
566 {
567   gimple_stmt_iterator gsi;
568   tree method = NULL_TREE;
569   tree delta = NULL_TREE;
570
571   gsi = gsi_for_stmt (call);
572
573   gsi_prev (&gsi);
574   for (; !gsi_end_p (gsi); gsi_prev (&gsi))
575     {
576       gimple stmt = gsi_stmt (gsi);
577       tree lhs, rhs, fld;
578
579       if (!gimple_assign_single_p (stmt))
580         return;
581
582       lhs = gimple_assign_lhs (stmt);
583       rhs = gimple_assign_rhs1 (stmt);
584
585       if (TREE_CODE (lhs) != COMPONENT_REF
586           || TREE_OPERAND (lhs, 0) != arg)
587         continue;
588
589       fld = TREE_OPERAND (lhs, 1);
590       if (!method && fld == method_field)
591         {
592           rhs = get_ssa_def_if_simple_copy (rhs);
593           if (TREE_CODE (rhs) == ADDR_EXPR
594               && TREE_CODE (TREE_OPERAND (rhs, 0)) == FUNCTION_DECL
595               && TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 0))) == METHOD_TYPE)
596             {
597               method = TREE_OPERAND (rhs, 0);
598               if (delta)
599                 {
600                   fill_member_ptr_cst_jump_function (jfunc, rhs, delta);
601                   return;
602                 }
603             }
604           else
605             return;
606         }
607
608       if (!delta && fld == delta_field)
609         {
610           rhs = get_ssa_def_if_simple_copy (rhs);
611           if (TREE_CODE (rhs) == INTEGER_CST)
612             {
613               delta = rhs;
614               if (method)
615                 {
616                   fill_member_ptr_cst_jump_function (jfunc, rhs, delta);
617                   return;
618                 }
619             }
620           else
621             return;
622         }
623     }
624
625   return;
626 }
627
628 /* Go through the arguments of the CALL and for every member pointer within
629    tries determine whether it is a constant.  If it is, create a corresponding
630    constant jump function in FUNCTIONS which is an array of jump functions
631    associated with the call.  */
632
633 static void
634 compute_cst_member_ptr_arguments (struct ipa_jump_func *functions,
635                                   gimple call)
636 {
637   unsigned num;
638   tree arg, method_field, delta_field;
639
640   for (num = 0; num < gimple_call_num_args (call); num++)
641     {
642       arg = gimple_call_arg (call, num);
643
644       if (functions[num].type == IPA_JF_UNKNOWN
645           && type_like_member_ptr_p (TREE_TYPE (arg), &method_field,
646                                      &delta_field))
647         determine_cst_member_ptr (call, arg, method_field, delta_field,
648                                   &functions[num]);
649     }
650 }
651
652 /* Compute jump function for all arguments of callsite CS and insert the
653    information in the jump_functions array in the ipa_edge_args corresponding
654    to this callsite.  */
655
656 void
657 ipa_compute_jump_functions (struct cgraph_edge *cs)
658 {
659   struct ipa_node_params *info = IPA_NODE_REF (cs->caller);
660   struct ipa_edge_args *arguments = IPA_EDGE_REF (cs);
661   gimple call;
662
663   if (ipa_get_cs_argument_count (arguments) == 0 || arguments->jump_functions)
664     return;
665   arguments->jump_functions = GGC_CNEWVEC (struct ipa_jump_func,
666                                            ipa_get_cs_argument_count (arguments));
667
668   call = cs->call_stmt;
669   gcc_assert (is_gimple_call (call));
670
671   /* We will deal with constants and SSA scalars first:  */
672   compute_scalar_jump_functions (info, arguments->jump_functions, call);
673
674   /* Let's check whether there are any potential member pointers and if so,
675      whether we can determine their functions as pass_through.  */
676   if (!compute_pass_through_member_ptrs (info, arguments->jump_functions, call))
677     return;
678
679   /* Finally, let's check whether we actually pass a new constant member
680      pointer here...  */
681   compute_cst_member_ptr_arguments (arguments->jump_functions, call);
682 }
683
684 /* If RHS looks like a rhs of a statement loading pfn from a member
685    pointer formal parameter, return the parameter, otherwise return
686    NULL.  If USE_DELTA, then we look for a use of the delta field
687    rather than the pfn.  */
688
689 static tree
690 ipa_get_member_ptr_load_param (tree rhs, bool use_delta)
691 {
692   tree rec, fld;
693   tree ptr_field;
694   tree delta_field;
695
696   if (TREE_CODE (rhs) != COMPONENT_REF)
697     return NULL_TREE;
698
699   rec = TREE_OPERAND (rhs, 0);
700   if (TREE_CODE (rec) != PARM_DECL
701       || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, &delta_field))
702     return NULL_TREE;
703
704   fld = TREE_OPERAND (rhs, 1);
705   if (use_delta ? (fld == delta_field) : (fld == ptr_field))
706     return rec;
707   else
708     return NULL_TREE;
709 }
710
711 /* If STMT looks like a statement loading a value from a member pointer formal
712    parameter, this function returns that parameter.  */
713
714 static tree
715 ipa_get_stmt_member_ptr_load_param (gimple stmt, bool use_delta)
716 {
717   tree rhs;
718
719   if (!gimple_assign_single_p (stmt))
720     return NULL_TREE;
721
722   rhs = gimple_assign_rhs1 (stmt);
723   return ipa_get_member_ptr_load_param (rhs, use_delta);
724 }
725
726 /* Returns true iff T is an SSA_NAME defined by a statement.  */
727
728 static bool
729 ipa_is_ssa_with_stmt_def (tree t)
730 {
731   if (TREE_CODE (t) == SSA_NAME
732       && !SSA_NAME_IS_DEFAULT_DEF (t))
733     return true;
734   else
735     return false;
736 }
737
738 /* Creates a new note describing a call to a parameter number FORMAL_ID and
739    attaches it to the linked list of INFO.  It also sets the called flag of the
740    parameter.  STMT is the corresponding call statement.  */
741
742 static void
743 ipa_note_param_call (struct ipa_node_params *info, int formal_id,
744                      gimple stmt)
745 {
746   struct ipa_param_call_note *note;
747   basic_block bb = gimple_bb (stmt);
748
749   info->params[formal_id].called = 1;
750
751   note = XCNEW (struct ipa_param_call_note);
752   note->formal_id = formal_id;
753   note->stmt = stmt;
754   note->lto_stmt_uid = gimple_uid (stmt);
755   note->count = bb->count;
756   note->frequency = compute_call_stmt_bb_frequency (current_function_decl, bb);
757   note->loop_nest = bb->loop_depth;
758
759   note->next = info->param_calls;
760   info->param_calls = note;
761
762   return;
763 }
764
765 /* Analyze the CALL and examine uses of formal parameters of the caller
766    (described by INFO).  Currently it checks whether the call calls a pointer
767    that is a formal parameter and if so, the parameter is marked with the
768    called flag and a note describing the call is created.  This is very simple
769    for ordinary pointers represented in SSA but not-so-nice when it comes to
770    member pointers.  The ugly part of this function does nothing more than
771    tries to match the pattern of such a call.  An example of such a pattern is
772    the gimple dump below, the call is on the last line:
773
774      <bb 2>:
775        f$__delta_5 = f.__delta;
776        f$__pfn_24 = f.__pfn;
777        D.2496_3 = (int) f$__pfn_24;
778        D.2497_4 = D.2496_3 & 1;
779        if (D.2497_4 != 0)
780          goto <bb 3>;
781        else
782          goto <bb 4>;
783
784      <bb 3>:
785        D.2500_7 = (unsigned int) f$__delta_5;
786        D.2501_8 = &S + D.2500_7;
787        D.2502_9 = (int (*__vtbl_ptr_type) (void) * *) D.2501_8;
788        D.2503_10 = *D.2502_9;
789        D.2504_12 = f$__pfn_24 + -1;
790        D.2505_13 = (unsigned int) D.2504_12;
791        D.2506_14 = D.2503_10 + D.2505_13;
792        D.2507_15 = *D.2506_14;
793        iftmp.11_16 = (String:: *) D.2507_15;
794
795      <bb 4>:
796        # iftmp.11_1 = PHI <iftmp.11_16(3), f$__pfn_24(2)>
797        D.2500_19 = (unsigned int) f$__delta_5;
798        D.2508_20 = &S + D.2500_19;
799        D.2493_21 = iftmp.11_1 (D.2508_20, 4);
800
801    Such patterns are results of simple calls to a member pointer:
802
803      int doprinting (int (MyString::* f)(int) const)
804      {
805        MyString S ("somestring");
806
807        return (S.*f)(4);
808      }
809 */
810
811 static void
812 ipa_analyze_call_uses (struct ipa_node_params *info, gimple call)
813 {
814   tree target = gimple_call_fn (call);
815   gimple def;
816   tree var;
817   tree n1, n2;
818   gimple d1, d2;
819   tree rec, rec2, cond;
820   gimple branch;
821   int index;
822   basic_block bb, virt_bb, join;
823
824   if (TREE_CODE (target) != SSA_NAME)
825     return;
826
827   var = SSA_NAME_VAR (target);
828   if (SSA_NAME_IS_DEFAULT_DEF (target))
829     {
830       /* assuming TREE_CODE (var) == PARM_DECL */
831       index = ipa_get_param_decl_index (info, var);
832       if (index >= 0)
833         ipa_note_param_call (info, index, call);
834       return;
835     }
836
837   /* Now we need to try to match the complex pattern of calling a member
838      pointer. */
839
840   if (!POINTER_TYPE_P (TREE_TYPE (target))
841       || TREE_CODE (TREE_TYPE (TREE_TYPE (target))) != METHOD_TYPE)
842     return;
843
844   def = SSA_NAME_DEF_STMT (target);
845   if (gimple_code (def) != GIMPLE_PHI)
846     return;
847
848   if (gimple_phi_num_args (def) != 2)
849     return;
850
851   /* First, we need to check whether one of these is a load from a member
852      pointer that is a parameter to this function. */
853   n1 = PHI_ARG_DEF (def, 0);
854   n2 = PHI_ARG_DEF (def, 1);
855   if (!ipa_is_ssa_with_stmt_def (n1) || !ipa_is_ssa_with_stmt_def (n2))
856     return;
857   d1 = SSA_NAME_DEF_STMT (n1);
858   d2 = SSA_NAME_DEF_STMT (n2);
859
860   if ((rec = ipa_get_stmt_member_ptr_load_param (d1, false)))
861     {
862       if (ipa_get_stmt_member_ptr_load_param (d2, false))
863         return;
864
865       bb = gimple_bb (d1);
866       virt_bb = gimple_bb (d2);
867     }
868   else if ((rec = ipa_get_stmt_member_ptr_load_param (d2, false)))
869     {
870       bb = gimple_bb (d2);
871       virt_bb = gimple_bb (d1);
872     }
873   else
874     return;
875
876   /* Second, we need to check that the basic blocks are laid out in the way
877      corresponding to the pattern. */
878
879   join = gimple_bb (def);
880   if (!single_pred_p (virt_bb) || !single_succ_p (virt_bb)
881       || single_pred (virt_bb) != bb
882       || single_succ (virt_bb) != join)
883     return;
884
885   /* Third, let's see that the branching is done depending on the least
886      significant bit of the pfn. */
887
888   branch = last_stmt (bb);
889   if (gimple_code (branch) != GIMPLE_COND)
890     return;
891
892   if (gimple_cond_code (branch) != NE_EXPR
893       || !integer_zerop (gimple_cond_rhs (branch)))
894     return;
895
896   cond = gimple_cond_lhs (branch);
897   if (!ipa_is_ssa_with_stmt_def (cond))
898     return;
899
900   def = SSA_NAME_DEF_STMT (cond);
901   if (!is_gimple_assign (def)
902       || gimple_assign_rhs_code (def) != BIT_AND_EXPR
903       || !integer_onep (gimple_assign_rhs2 (def)))
904     return;
905
906   cond = gimple_assign_rhs1 (def);
907   if (!ipa_is_ssa_with_stmt_def (cond))
908     return;
909
910   def = SSA_NAME_DEF_STMT (cond);
911
912   if (is_gimple_assign (def)
913       && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
914     {
915       cond = gimple_assign_rhs1 (def);
916       if (!ipa_is_ssa_with_stmt_def (cond))
917         return;
918       def = SSA_NAME_DEF_STMT (cond);
919     }
920
921   rec2 = ipa_get_stmt_member_ptr_load_param (def,
922                                              (TARGET_PTRMEMFUNC_VBIT_LOCATION
923                                               == ptrmemfunc_vbit_in_delta));
924
925   if (rec != rec2)
926     return;
927
928   index = ipa_get_param_decl_index (info, rec);
929   if (index >= 0 && !ipa_is_param_modified (info, index))
930     ipa_note_param_call (info, index, call);
931
932   return;
933 }
934
935 /* Analyze the statement STMT with respect to formal parameters (described in
936    INFO) and their uses.  Currently it only checks whether formal parameters
937    are called.  */
938
939 static void
940 ipa_analyze_stmt_uses (struct ipa_node_params *info, gimple stmt)
941 {
942   if (is_gimple_call (stmt))
943     ipa_analyze_call_uses (info, stmt);
944 }
945
946 /* Scan the function body of NODE and inspect the uses of formal parameters.
947    Store the findings in various structures of the associated ipa_node_params
948    structure, such as parameter flags, notes etc.  */
949
950 void
951 ipa_analyze_params_uses (struct cgraph_node *node)
952 {
953   tree decl = node->decl;
954   basic_block bb;
955   struct function *func;
956   gimple_stmt_iterator gsi;
957   struct ipa_node_params *info = IPA_NODE_REF (node);
958
959   if (ipa_get_param_count (info) == 0 || info->uses_analysis_done)
960     return;
961
962   func = DECL_STRUCT_FUNCTION (decl);
963   FOR_EACH_BB_FN (bb, func)
964     {
965       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
966         {
967           gimple stmt = gsi_stmt (gsi);
968           ipa_analyze_stmt_uses (info, stmt);
969         }
970     }
971
972   info->uses_analysis_done = 1;
973 }
974
975 /* Update the jump functions associated with call graph edge E when the call
976    graph edge CS is being inlined, assuming that E->caller is already (possibly
977    indirectly) inlined into CS->callee and that E has not been inlined.
978
979    We keep pass through functions only if they do not contain any operation.
980    This is sufficient for inlining and greately simplifies things.  */
981
982 static void
983 update_jump_functions_after_inlining (struct cgraph_edge *cs,
984                                       struct cgraph_edge *e)
985 {
986   struct ipa_edge_args *top = IPA_EDGE_REF (cs);
987   struct ipa_edge_args *args = IPA_EDGE_REF (e);
988   int count = ipa_get_cs_argument_count (args);
989   int i;
990
991   for (i = 0; i < count; i++)
992     {
993       struct ipa_jump_func *src, *dst = ipa_get_ith_jump_func (args, i);
994
995       if (dst->type == IPA_JF_ANCESTOR)
996         {
997           dst->type = IPA_JF_UNKNOWN;
998           continue;
999         }
1000
1001       if (dst->type != IPA_JF_PASS_THROUGH)
1002         continue;
1003
1004       /* We must check range due to calls with variable number of arguments and
1005          we cannot combine jump functions with operations.  */
1006       if (dst->value.pass_through.operation != NOP_EXPR
1007           || (dst->value.pass_through.formal_id
1008               >= ipa_get_cs_argument_count (top)))
1009         {
1010           dst->type = IPA_JF_UNKNOWN;
1011           continue;
1012         }
1013
1014       src = ipa_get_ith_jump_func (top, dst->value.pass_through.formal_id);
1015       *dst = *src;
1016     }
1017 }
1018
1019 /* Print out a debug message to file F that we have discovered that an indirect
1020    call described by NT is in fact a call of a known constant function described
1021    by JFUNC.  NODE is the node where the call is.  */
1022
1023 static void
1024 print_edge_addition_message (FILE *f, struct ipa_param_call_note *nt,
1025                              struct ipa_jump_func *jfunc,
1026                              struct cgraph_node *node)
1027 {
1028   fprintf (f, "ipa-prop: Discovered an indirect call to a known target (");
1029   if (jfunc->type == IPA_JF_CONST_MEMBER_PTR)
1030     {
1031       print_node_brief (f, "", jfunc->value.member_cst.pfn, 0);
1032       print_node_brief (f, ", ", jfunc->value.member_cst.delta, 0);
1033     }
1034   else
1035     print_node_brief(f, "", jfunc->value.constant, 0);
1036
1037   fprintf (f, ") in %s: ", cgraph_node_name (node));
1038   print_gimple_stmt (f, nt->stmt, 2, TDF_SLIM);
1039 }
1040
1041 /* Update the param called notes associated with NODE when CS is being inlined,
1042    assuming NODE is (potentially indirectly) inlined into CS->callee.
1043    Moreover, if the callee is discovered to be constant, create a new cgraph
1044    edge for it.  Newly discovered indirect edges will be added to *NEW_EDGES,
1045    unless NEW_EDGES is NULL.  Return true iff a new edge(s) were created.  */
1046
1047 static bool
1048 update_call_notes_after_inlining (struct cgraph_edge *cs,
1049                                   struct cgraph_node *node,
1050                                   VEC (cgraph_edge_p, heap) **new_edges)
1051 {
1052   struct ipa_node_params *info = IPA_NODE_REF (node);
1053   struct ipa_edge_args *top = IPA_EDGE_REF (cs);
1054   struct ipa_param_call_note *nt;
1055   bool res = false;
1056
1057   for (nt = info->param_calls; nt; nt = nt->next)
1058     {
1059       struct ipa_jump_func *jfunc;
1060
1061       if (nt->processed)
1062         continue;
1063
1064       /* We must check range due to calls with variable number of arguments:  */
1065       if (nt->formal_id >= ipa_get_cs_argument_count (top))
1066         {
1067           nt->processed = true;
1068           continue;
1069         }
1070
1071       jfunc = ipa_get_ith_jump_func (top, nt->formal_id);
1072       if (jfunc->type == IPA_JF_PASS_THROUGH
1073           && jfunc->value.pass_through.operation == NOP_EXPR)
1074         nt->formal_id = jfunc->value.pass_through.formal_id;
1075       else if (jfunc->type == IPA_JF_CONST
1076                || jfunc->type == IPA_JF_CONST_MEMBER_PTR)
1077         {
1078           struct cgraph_node *callee;
1079           struct cgraph_edge *new_indirect_edge;
1080           tree decl;
1081
1082           nt->processed = true;
1083           if (jfunc->type == IPA_JF_CONST_MEMBER_PTR)
1084             decl = jfunc->value.member_cst.pfn;
1085           else
1086             decl = jfunc->value.constant;
1087
1088           if (TREE_CODE (decl) != ADDR_EXPR)
1089             continue;
1090           decl = TREE_OPERAND (decl, 0);
1091
1092           if (TREE_CODE (decl) != FUNCTION_DECL)
1093             continue;
1094           callee = cgraph_node (decl);
1095           if (!callee || !callee->local.inlinable)
1096             continue;
1097
1098           res = true;
1099           if (dump_file)
1100             print_edge_addition_message (dump_file, nt, jfunc, node);
1101
1102           new_indirect_edge = cgraph_create_edge (node, callee, nt->stmt,
1103                                                   nt->count, nt->frequency,
1104                                                   nt->loop_nest);
1105           new_indirect_edge->lto_stmt_uid = nt->lto_stmt_uid;
1106           new_indirect_edge->indirect_call = 1;
1107           ipa_check_create_edge_args ();
1108           if (new_edges)
1109             VEC_safe_push (cgraph_edge_p, heap, *new_edges, new_indirect_edge);
1110           top = IPA_EDGE_REF (cs);
1111         }
1112       else
1113         {
1114           /* Ancestor jum functions and pass theoughs with operations should
1115              not be used on parameters that then get called.  */
1116           gcc_assert (jfunc->type == IPA_JF_UNKNOWN);
1117           nt->processed = true;
1118         }
1119     }
1120   return res;
1121 }
1122
1123 /* Recursively traverse subtree of NODE (including node) made of inlined
1124    cgraph_edges when CS has been inlined and invoke
1125    update_call_notes_after_inlining on all nodes and
1126    update_jump_functions_after_inlining on all non-inlined edges that lead out
1127    of this subtree.  Newly discovered indirect edges will be added to
1128    *NEW_EDGES, unless NEW_EDGES is NULL.  Return true iff a new edge(s) were
1129    created.  */
1130
1131 static bool
1132 propagate_info_to_inlined_callees (struct cgraph_edge *cs,
1133                                    struct cgraph_node *node,
1134                                    VEC (cgraph_edge_p, heap) **new_edges)
1135 {
1136   struct cgraph_edge *e;
1137   bool res;
1138
1139   res = update_call_notes_after_inlining (cs, node, new_edges);
1140
1141   for (e = node->callees; e; e = e->next_callee)
1142     if (!e->inline_failed)
1143       res |= propagate_info_to_inlined_callees (cs, e->callee, new_edges);
1144     else
1145       update_jump_functions_after_inlining (cs, e);
1146
1147   return res;
1148 }
1149
1150 /* Update jump functions and call note functions on inlining the call site CS.
1151    CS is expected to lead to a node already cloned by
1152    cgraph_clone_inline_nodes.  Newly discovered indirect edges will be added to
1153    *NEW_EDGES, unless NEW_EDGES is NULL.  Return true iff a new edge(s) were +
1154    created.  */
1155
1156 bool
1157 ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
1158                                    VEC (cgraph_edge_p, heap) **new_edges)
1159 {
1160   /* FIXME lto: We do not stream out indirect call information.  */
1161   if (flag_wpa)
1162     return false;
1163
1164   /* Do nothing if the preparation phase has not been carried out yet
1165      (i.e. during early inlining).  */
1166   if (!ipa_node_params_vector)
1167     return false;
1168   gcc_assert (ipa_edge_args_vector);
1169
1170   return propagate_info_to_inlined_callees (cs, cs->callee, new_edges);
1171 }
1172
1173 /* Frees all dynamically allocated structures that the argument info points
1174    to.  */
1175
1176 void
1177 ipa_free_edge_args_substructures (struct ipa_edge_args *args)
1178 {
1179   if (args->jump_functions)
1180     ggc_free (args->jump_functions);
1181
1182   memset (args, 0, sizeof (*args));
1183 }
1184
1185 /* Free all ipa_edge structures.  */
1186
1187 void
1188 ipa_free_all_edge_args (void)
1189 {
1190   int i;
1191   struct ipa_edge_args *args;
1192
1193   for (i = 0;
1194        VEC_iterate (ipa_edge_args_t, ipa_edge_args_vector, i, args);
1195        i++)
1196     ipa_free_edge_args_substructures (args);
1197
1198   VEC_free (ipa_edge_args_t, gc, ipa_edge_args_vector);
1199   ipa_edge_args_vector = NULL;
1200 }
1201
1202 /* Frees all dynamically allocated structures that the param info points
1203    to.  */
1204
1205 void
1206 ipa_free_node_params_substructures (struct ipa_node_params *info)
1207 {
1208   if (info->params)
1209     free (info->params);
1210
1211   while (info->param_calls)
1212     {
1213       struct ipa_param_call_note *note = info->param_calls;
1214       info->param_calls = note->next;
1215       free (note);
1216     }
1217
1218   memset (info, 0, sizeof (*info));
1219 }
1220
1221 /* Free all ipa_node_params structures.  */
1222
1223 void
1224 ipa_free_all_node_params (void)
1225 {
1226   int i;
1227   struct ipa_node_params *info;
1228
1229   for (i = 0;
1230        VEC_iterate (ipa_node_params_t, ipa_node_params_vector, i, info);
1231        i++)
1232     ipa_free_node_params_substructures (info);
1233
1234   VEC_free (ipa_node_params_t, heap, ipa_node_params_vector);
1235   ipa_node_params_vector = NULL;
1236 }
1237
1238 /* Hook that is called by cgraph.c when an edge is removed.  */
1239
1240 static void
1241 ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
1242 {
1243   /* During IPA-CP updating we can be called on not-yet analyze clones.  */
1244   if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector)
1245       <= (unsigned)cs->uid)
1246     return;
1247   ipa_free_edge_args_substructures (IPA_EDGE_REF (cs));
1248 }
1249
1250 /* Hook that is called by cgraph.c when a node is removed.  */
1251
1252 static void
1253 ipa_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
1254 {
1255   ipa_free_node_params_substructures (IPA_NODE_REF (node));
1256 }
1257
1258 /* Helper function to duplicate an array of size N that is at SRC and store a
1259    pointer to it to DST.  Nothing is done if SRC is NULL.  */
1260
1261 static void *
1262 duplicate_array (void *src, size_t n)
1263 {
1264   void *p;
1265
1266   if (!src)
1267     return NULL;
1268
1269   p = xmalloc (n);
1270   memcpy (p, src, n);
1271   return p;
1272 }
1273
1274 /* Like duplicate_array byt in GGC memory.  */
1275
1276 static void *
1277 duplicate_ggc_array (void *src, size_t n)
1278 {
1279   void *p;
1280
1281   if (!src)
1282     return NULL;
1283
1284   p = ggc_alloc (n);
1285   memcpy (p, src, n);
1286   return p;
1287 }
1288
1289 /* Hook that is called by cgraph.c when a node is duplicated.  */
1290
1291 static void
1292 ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
1293                            __attribute__((unused)) void *data)
1294 {
1295   struct ipa_edge_args *old_args, *new_args;
1296   int arg_count;
1297
1298   ipa_check_create_edge_args ();
1299
1300   old_args = IPA_EDGE_REF (src);
1301   new_args = IPA_EDGE_REF (dst);
1302
1303   arg_count = ipa_get_cs_argument_count (old_args);
1304   ipa_set_cs_argument_count (new_args, arg_count);
1305   new_args->jump_functions = (struct ipa_jump_func *)
1306     duplicate_ggc_array (old_args->jump_functions,
1307                          sizeof (struct ipa_jump_func) * arg_count);
1308 }
1309
1310 /* Hook that is called by cgraph.c when a node is duplicated.  */
1311
1312 static void
1313 ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
1314                            __attribute__((unused)) void *data)
1315 {
1316   struct ipa_node_params *old_info, *new_info;
1317   struct ipa_param_call_note *note;
1318   int param_count;
1319
1320   ipa_check_create_node_params ();
1321   old_info = IPA_NODE_REF (src);
1322   new_info = IPA_NODE_REF (dst);
1323   param_count = ipa_get_param_count (old_info);
1324
1325   ipa_set_param_count (new_info, param_count);
1326   new_info->params = (struct ipa_param_descriptor *)
1327     duplicate_array (old_info->params,
1328                      sizeof (struct ipa_param_descriptor) * param_count);
1329   new_info->ipcp_orig_node = old_info->ipcp_orig_node;
1330   new_info->count_scale = old_info->count_scale;
1331
1332   for (note = old_info->param_calls; note; note = note->next)
1333     {
1334       struct ipa_param_call_note *nn;
1335
1336       nn = (struct ipa_param_call_note *)
1337         xcalloc (1, sizeof (struct ipa_param_call_note));
1338       memcpy (nn, note, sizeof (struct ipa_param_call_note));
1339       nn->next = new_info->param_calls;
1340       new_info->param_calls = nn;
1341     }
1342 }
1343
1344 /* Register our cgraph hooks if they are not already there.  */
1345
1346 void
1347 ipa_register_cgraph_hooks (void)
1348 {
1349   if (!edge_removal_hook_holder)
1350     edge_removal_hook_holder =
1351       cgraph_add_edge_removal_hook (&ipa_edge_removal_hook, NULL);
1352   if (!node_removal_hook_holder)
1353     node_removal_hook_holder =
1354       cgraph_add_node_removal_hook (&ipa_node_removal_hook, NULL);
1355   if (!edge_duplication_hook_holder)
1356     edge_duplication_hook_holder =
1357       cgraph_add_edge_duplication_hook (&ipa_edge_duplication_hook, NULL);
1358   if (!node_duplication_hook_holder)
1359     node_duplication_hook_holder =
1360       cgraph_add_node_duplication_hook (&ipa_node_duplication_hook, NULL);
1361 }
1362
1363 /* Unregister our cgraph hooks if they are not already there.  */
1364
1365 static void
1366 ipa_unregister_cgraph_hooks (void)
1367 {
1368   cgraph_remove_edge_removal_hook (edge_removal_hook_holder);
1369   edge_removal_hook_holder = NULL;
1370   cgraph_remove_node_removal_hook (node_removal_hook_holder);
1371   node_removal_hook_holder = NULL;
1372   cgraph_remove_edge_duplication_hook (edge_duplication_hook_holder);
1373   edge_duplication_hook_holder = NULL;
1374   cgraph_remove_node_duplication_hook (node_duplication_hook_holder);
1375   node_duplication_hook_holder = NULL;
1376 }
1377
1378 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
1379    longer needed after ipa-cp.  */
1380
1381 void
1382 free_all_ipa_structures_after_ipa_cp (void)
1383 {
1384   if (!flag_indirect_inlining)
1385     {
1386       ipa_free_all_edge_args ();
1387       ipa_free_all_node_params ();
1388       ipa_unregister_cgraph_hooks ();
1389     }
1390 }
1391
1392 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
1393    longer needed after indirect inlining.  */
1394
1395 void
1396 free_all_ipa_structures_after_iinln (void)
1397 {
1398   ipa_free_all_edge_args ();
1399   ipa_free_all_node_params ();
1400   ipa_unregister_cgraph_hooks ();
1401 }
1402
1403 /* Print ipa_tree_map data structures of all functions in the
1404    callgraph to F.  */
1405
1406 void
1407 ipa_print_node_params (FILE * f, struct cgraph_node *node)
1408 {
1409   int i, count;
1410   tree temp;
1411   struct ipa_node_params *info;
1412
1413   if (!node->analyzed)
1414     return;
1415   info = IPA_NODE_REF (node);
1416   fprintf (f, "  function  %s Trees :: \n", cgraph_node_name (node));
1417   count = ipa_get_param_count (info);
1418   for (i = 0; i < count; i++)
1419     {
1420       temp = ipa_get_param (info, i);
1421       if (TREE_CODE (temp) == PARM_DECL)
1422         fprintf (f, "    param %d : %s", i,
1423                  (DECL_NAME (temp)
1424                   ? (*lang_hooks.decl_printable_name) (temp, 2)
1425                   : "(unnamed)"));
1426       if (ipa_is_param_modified (info, i))
1427         fprintf (f, " modified");
1428       if (ipa_is_param_called (info, i))
1429         fprintf (f, " called");
1430       fprintf (f, "\n");
1431     }
1432 }
1433
1434 /* Print ipa_tree_map data structures of all functions in the
1435    callgraph to F.  */
1436
1437 void
1438 ipa_print_all_params (FILE * f)
1439 {
1440   struct cgraph_node *node;
1441
1442   fprintf (f, "\nFunction parameters:\n");
1443   for (node = cgraph_nodes; node; node = node->next)
1444     ipa_print_node_params (f, node);
1445 }
1446
1447 /* Return a heap allocated vector containing formal parameters of FNDECL.  */
1448
1449 VEC(tree, heap) *
1450 ipa_get_vector_of_formal_parms (tree fndecl)
1451 {
1452   VEC(tree, heap) *args;
1453   int count;
1454   tree parm;
1455
1456   count = count_formal_params_1 (fndecl);
1457   args = VEC_alloc (tree, heap, count);
1458   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = TREE_CHAIN (parm))
1459     VEC_quick_push (tree, args, parm);
1460
1461   return args;
1462 }
1463
1464 /* Return a heap allocated vector containing types of formal parameters of
1465    function type FNTYPE.  */
1466
1467 static inline VEC(tree, heap) *
1468 get_vector_of_formal_parm_types (tree fntype)
1469 {
1470   VEC(tree, heap) *types;
1471   int count = 0;
1472   tree t;
1473
1474   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
1475     count++;
1476
1477   types = VEC_alloc (tree, heap, count);
1478   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
1479     VEC_quick_push (tree, types, TREE_VALUE (t));
1480
1481   return types;
1482 }
1483
1484 /* Modify the function declaration FNDECL and its type according to the plan in
1485    ADJUSTMENTS.  It also sets base fields of individual adjustments structures
1486    to reflect the actual parameters being modified which are determined by the
1487    base_index field.  */
1488
1489 void
1490 ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
1491                               const char *synth_parm_prefix)
1492 {
1493   VEC(tree, heap) *oparms, *otypes;
1494   tree orig_type, new_type = NULL;
1495   tree old_arg_types, t, new_arg_types = NULL;
1496   tree parm, *link = &DECL_ARGUMENTS (fndecl);
1497   int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
1498   tree new_reversed = NULL;
1499   bool care_for_types, last_parm_void;
1500
1501   if (!synth_parm_prefix)
1502     synth_parm_prefix = "SYNTH";
1503
1504   oparms = ipa_get_vector_of_formal_parms (fndecl);
1505   orig_type = TREE_TYPE (fndecl);
1506   old_arg_types = TYPE_ARG_TYPES (orig_type);
1507
1508   /* The following test is an ugly hack, some functions simply don't have any
1509      arguments in their type.  This is probably a bug but well... */
1510   care_for_types = (old_arg_types != NULL_TREE);
1511   if (care_for_types)
1512     {
1513       last_parm_void = (TREE_VALUE (tree_last (old_arg_types))
1514                         == void_type_node);
1515       otypes = get_vector_of_formal_parm_types (orig_type);
1516       if (last_parm_void)
1517         gcc_assert (VEC_length (tree, oparms) + 1 == VEC_length (tree, otypes));
1518       else
1519         gcc_assert (VEC_length (tree, oparms) == VEC_length (tree, otypes));
1520     }
1521   else
1522     {
1523       last_parm_void = false;
1524       otypes = NULL;
1525     }
1526
1527   for (i = 0; i < len; i++)
1528     {
1529       struct ipa_parm_adjustment *adj;
1530       gcc_assert (link);
1531
1532       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
1533       parm = VEC_index (tree, oparms, adj->base_index);
1534       adj->base = parm;
1535
1536       if (adj->copy_param)
1537         {
1538           if (care_for_types)
1539             new_arg_types = tree_cons (NULL_TREE, VEC_index (tree, otypes,
1540                                                              adj->base_index),
1541                                        new_arg_types);
1542           *link = parm;
1543           link = &TREE_CHAIN (parm);
1544         }
1545       else if (!adj->remove_param)
1546         {
1547           tree new_parm;
1548           tree ptype;
1549
1550           if (adj->by_ref)
1551             ptype = build_pointer_type (adj->type);
1552           else
1553             ptype = adj->type;
1554
1555           if (care_for_types)
1556             new_arg_types = tree_cons (NULL_TREE, ptype, new_arg_types);
1557
1558           new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
1559                                  ptype);
1560           DECL_NAME (new_parm) = create_tmp_var_name (synth_parm_prefix);
1561
1562           DECL_ARTIFICIAL (new_parm) = 1;
1563           DECL_ARG_TYPE (new_parm) = ptype;
1564           DECL_CONTEXT (new_parm) = fndecl;
1565           TREE_USED (new_parm) = 1;
1566           DECL_IGNORED_P (new_parm) = 1;
1567           layout_decl (new_parm, 0);
1568
1569           add_referenced_var (new_parm);
1570           mark_sym_for_renaming (new_parm);
1571           adj->base = parm;
1572           adj->reduction = new_parm;
1573
1574           *link = new_parm;
1575
1576           link = &TREE_CHAIN (new_parm);
1577         }
1578     }
1579
1580   *link = NULL_TREE;
1581
1582   if (care_for_types)
1583     {
1584       new_reversed = nreverse (new_arg_types);
1585       if (last_parm_void)
1586         {
1587           if (new_reversed)
1588             TREE_CHAIN (new_arg_types) = void_list_node;
1589           else
1590             new_reversed = void_list_node;
1591         }
1592     }
1593
1594   /* Use copy_node to preserve as much as possible from original type
1595      (debug info, attribute lists etc.)
1596      Exception is METHOD_TYPEs must have THIS argument.
1597      When we are asked to remove it, we need to build new FUNCTION_TYPE
1598      instead.  */
1599   if (TREE_CODE (orig_type) != METHOD_TYPE
1600        || (VEC_index (ipa_parm_adjustment_t, adjustments, 0)->copy_param
1601          && VEC_index (ipa_parm_adjustment_t, adjustments, 0)->base_index == 0))
1602     {
1603       new_type = copy_node (orig_type);
1604       TYPE_ARG_TYPES (new_type) = new_reversed;
1605     }
1606   else
1607     {
1608       new_type
1609         = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
1610                                                          new_reversed));
1611       TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
1612       DECL_VINDEX (fndecl) = NULL_TREE;
1613     }
1614
1615   /* This is a new type, not a copy of an old type.  Need to reassociate
1616      variants.  We can handle everything except the main variant lazily.  */
1617   t = TYPE_MAIN_VARIANT (orig_type);
1618   if (orig_type != t)
1619     {
1620       TYPE_MAIN_VARIANT (new_type) = t;
1621       TYPE_NEXT_VARIANT (new_type) = TYPE_NEXT_VARIANT (t);
1622       TYPE_NEXT_VARIANT (t) = new_type;
1623     }
1624   else
1625     {
1626       TYPE_MAIN_VARIANT (new_type) = new_type;
1627       TYPE_NEXT_VARIANT (new_type) = NULL;
1628     }
1629
1630   TREE_TYPE (fndecl) = new_type;
1631   if (otypes)
1632     VEC_free (tree, heap, otypes);
1633   VEC_free (tree, heap, oparms);
1634 }
1635
1636 /* Modify actual arguments of a function call CS as indicated in ADJUSTMENTS.
1637    If this is a directly recursive call, CS must be NULL.  Otherwise it must
1638    contain the corresponding call graph edge.  */
1639
1640 void
1641 ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
1642                            ipa_parm_adjustment_vec adjustments)
1643 {
1644   VEC(tree, heap) *vargs;
1645   gimple new_stmt;
1646   gimple_stmt_iterator gsi;
1647   tree callee_decl;
1648   int i, len;
1649
1650   len = VEC_length (ipa_parm_adjustment_t, adjustments);
1651   vargs = VEC_alloc (tree, heap, len);
1652
1653   gsi = gsi_for_stmt (stmt);
1654   for (i = 0; i < len; i++)
1655     {
1656       struct ipa_parm_adjustment *adj;
1657
1658       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
1659
1660       if (adj->copy_param)
1661         {
1662           tree arg = gimple_call_arg (stmt, adj->base_index);
1663
1664           VEC_quick_push (tree, vargs, arg);
1665         }
1666       else if (!adj->remove_param)
1667         {
1668           tree expr, orig_expr;
1669           bool allow_ptr, repl_found;
1670
1671           orig_expr = expr = gimple_call_arg (stmt, adj->base_index);
1672           if (TREE_CODE (expr) == ADDR_EXPR)
1673             {
1674               allow_ptr = false;
1675               expr = TREE_OPERAND (expr, 0);
1676             }
1677           else
1678             allow_ptr = true;
1679
1680           repl_found = build_ref_for_offset (&expr, TREE_TYPE (expr),
1681                                              adj->offset, adj->type,
1682                                              allow_ptr);
1683           if (repl_found)
1684             {
1685               if (adj->by_ref)
1686                 expr = build_fold_addr_expr (expr);
1687             }
1688           else
1689             {
1690               tree ptrtype = build_pointer_type (adj->type);
1691               expr = orig_expr;
1692               if (!POINTER_TYPE_P (TREE_TYPE (expr)))
1693                 expr = build_fold_addr_expr (expr);
1694               if (!useless_type_conversion_p (ptrtype, TREE_TYPE (expr)))
1695                 expr = fold_convert (ptrtype, expr);
1696               expr = fold_build2 (POINTER_PLUS_EXPR, ptrtype, expr,
1697                                   build_int_cst (size_type_node,
1698                                                  adj->offset / BITS_PER_UNIT));
1699               if (!adj->by_ref)
1700                 expr = fold_build1 (INDIRECT_REF, adj->type, expr);
1701             }
1702           expr = force_gimple_operand_gsi (&gsi, expr,
1703                                            adj->by_ref
1704                                            || is_gimple_reg_type (adj->type),
1705                                            NULL, true, GSI_SAME_STMT);
1706           VEC_quick_push (tree, vargs, expr);
1707         }
1708     }
1709
1710   if (dump_file && (dump_flags & TDF_DETAILS))
1711     {
1712       fprintf (dump_file, "replacing stmt:");
1713       print_gimple_stmt (dump_file, gsi_stmt (gsi), 0, 0);
1714     }
1715
1716   callee_decl = !cs ? gimple_call_fndecl (stmt) : cs->callee->decl;
1717   new_stmt = gimple_build_call_vec (callee_decl, vargs);
1718   VEC_free (tree, heap, vargs);
1719   if (gimple_call_lhs (stmt))
1720     gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
1721
1722   gimple_set_block (new_stmt, gimple_block (stmt));
1723   if (gimple_has_location (stmt))
1724     gimple_set_location (new_stmt, gimple_location (stmt));
1725   gimple_call_copy_flags (new_stmt, stmt);
1726   gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
1727
1728   if (dump_file && (dump_flags & TDF_DETAILS))
1729     {
1730       fprintf (dump_file, "with stmt:");
1731       print_gimple_stmt (dump_file, new_stmt, 0, 0);
1732       fprintf (dump_file, "\n");
1733     }
1734   gsi_replace (&gsi, new_stmt, true);
1735   if (cs)
1736     cgraph_set_call_stmt (cs, new_stmt);
1737   update_ssa (TODO_update_ssa);
1738   free_dominance_info (CDI_DOMINATORS);
1739 }
1740
1741 /* Return true iff BASE_INDEX is in ADJUSTMENTS more than once.  */
1742
1743 static bool
1744 index_in_adjustments_multiple_times_p (int base_index,
1745                                        ipa_parm_adjustment_vec adjustments)
1746 {
1747   int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
1748   bool one = false;
1749
1750   for (i = 0; i < len; i++)
1751     {
1752       struct ipa_parm_adjustment *adj;
1753       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
1754
1755       if (adj->base_index == base_index)
1756         {
1757           if (one)
1758             return true;
1759           else
1760             one = true;
1761         }
1762     }
1763   return false;
1764 }
1765
1766
1767 /* Return adjustments that should have the same effect on function parameters
1768    and call arguments as if they were first changed according to adjustments in
1769    INNER and then by adjustments in OUTER.  */
1770
1771 ipa_parm_adjustment_vec
1772 ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
1773                          ipa_parm_adjustment_vec outer)
1774 {
1775   int i, outlen = VEC_length (ipa_parm_adjustment_t, outer);
1776   int inlen = VEC_length (ipa_parm_adjustment_t, inner);
1777   int removals = 0;
1778   ipa_parm_adjustment_vec adjustments, tmp;
1779
1780   tmp = VEC_alloc (ipa_parm_adjustment_t, heap, inlen);
1781   for (i = 0; i < inlen; i++)
1782     {
1783       struct ipa_parm_adjustment *n;
1784       n = VEC_index (ipa_parm_adjustment_t, inner, i);
1785
1786       if (n->remove_param)
1787         removals++;
1788       else
1789         VEC_quick_push (ipa_parm_adjustment_t, tmp, n);
1790     }
1791
1792   adjustments = VEC_alloc (ipa_parm_adjustment_t, heap, outlen + removals);
1793   for (i = 0; i < outlen; i++)
1794     {
1795       struct ipa_parm_adjustment *r;
1796       struct ipa_parm_adjustment *out = VEC_index (ipa_parm_adjustment_t,
1797                                                    outer, i);
1798       struct ipa_parm_adjustment *in = VEC_index (ipa_parm_adjustment_t, tmp,
1799                                                   out->base_index);
1800
1801       gcc_assert (!in->remove_param);
1802       if (out->remove_param)
1803         {
1804           if (!index_in_adjustments_multiple_times_p (in->base_index, tmp))
1805             {
1806               r = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
1807               memset (r, 0, sizeof (*r));
1808               r->remove_param = true;
1809             }
1810           continue;
1811         }
1812
1813       r = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
1814       memset (r, 0, sizeof (*r));
1815       r->base_index = in->base_index;
1816       r->type = out->type;
1817
1818       /* FIXME:  Create nonlocal value too.  */
1819
1820       if (in->copy_param && out->copy_param)
1821         r->copy_param = true;
1822       else if (in->copy_param)
1823         r->offset = out->offset;
1824       else if (out->copy_param)
1825         r->offset = in->offset;
1826       else
1827         r->offset = in->offset + out->offset;
1828     }
1829
1830   for (i = 0; i < inlen; i++)
1831     {
1832       struct ipa_parm_adjustment *n = VEC_index (ipa_parm_adjustment_t,
1833                                                  inner, i);
1834
1835       if (n->remove_param)
1836         VEC_quick_push (ipa_parm_adjustment_t, adjustments, n);
1837     }
1838
1839   VEC_free (ipa_parm_adjustment_t, heap, tmp);
1840   return adjustments;
1841 }
1842
1843 /* Dump the adjustments in the vector ADJUSTMENTS to dump_file in a human
1844    friendly way, assuming they are meant to be applied to FNDECL.  */
1845
1846 void
1847 ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
1848                             tree fndecl)
1849 {
1850   int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
1851   bool first = true;
1852   VEC(tree, heap) *parms = ipa_get_vector_of_formal_parms (fndecl);
1853
1854   fprintf (file, "IPA param adjustments: ");
1855   for (i = 0; i < len; i++)
1856     {
1857       struct ipa_parm_adjustment *adj;
1858       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
1859
1860       if (!first)
1861         fprintf (file, "                 ");
1862       else
1863         first = false;
1864
1865       fprintf (file, "%i. base_index: %i - ", i, adj->base_index);
1866       print_generic_expr (file, VEC_index (tree, parms, adj->base_index), 0);
1867       if (adj->base)
1868         {
1869           fprintf (file, ", base: ");
1870           print_generic_expr (file, adj->base, 0);
1871         }
1872       if (adj->reduction)
1873         {
1874           fprintf (file, ", reduction: ");
1875           print_generic_expr (file, adj->reduction, 0);
1876         }
1877       if (adj->new_ssa_base)
1878         {
1879           fprintf (file, ", new_ssa_base: ");
1880           print_generic_expr (file, adj->new_ssa_base, 0);
1881         }
1882
1883       if (adj->copy_param)
1884         fprintf (file, ", copy_param");
1885       else if (adj->remove_param)
1886         fprintf (file, ", remove_param");
1887       else
1888         fprintf (file, ", offset %li", (long) adj->offset);
1889       if (adj->by_ref)
1890         fprintf (file, ", by_ref");
1891       print_node_brief (file, ", type: ", adj->type, 0);
1892       fprintf (file, "\n");
1893     }
1894   VEC_free (tree, heap, parms);
1895 }
1896
1897 /* Stream out jump function JUMP_FUNC to OB.  */
1898
1899 static void
1900 ipa_write_jump_function (struct output_block *ob,
1901                          struct ipa_jump_func *jump_func)
1902 {
1903   lto_output_uleb128_stream (ob->main_stream,
1904                              jump_func->type);
1905
1906   switch (jump_func->type)
1907     {
1908     case IPA_JF_UNKNOWN:
1909       break;
1910     case IPA_JF_CONST:
1911       lto_output_tree (ob, jump_func->value.constant, true);
1912       break;
1913     case IPA_JF_PASS_THROUGH:
1914       lto_output_tree (ob, jump_func->value.pass_through.operand, true);
1915       lto_output_uleb128_stream (ob->main_stream,
1916                                  jump_func->value.pass_through.formal_id);
1917       lto_output_uleb128_stream (ob->main_stream,
1918                                  jump_func->value.pass_through.operation);
1919       break;
1920     case IPA_JF_ANCESTOR:
1921       lto_output_uleb128_stream (ob->main_stream,
1922                                  jump_func->value.ancestor.offset);
1923       lto_output_tree (ob, jump_func->value.ancestor.type, true);
1924       lto_output_uleb128_stream (ob->main_stream,
1925                                  jump_func->value.ancestor.formal_id);
1926       break;
1927     case IPA_JF_CONST_MEMBER_PTR:
1928       lto_output_tree (ob, jump_func->value.member_cst.pfn, true);
1929       lto_output_tree (ob, jump_func->value.member_cst.delta, false);
1930       break;
1931     }
1932 }
1933
1934 /* Read in jump function JUMP_FUNC from IB.  */
1935
1936 static void
1937 ipa_read_jump_function (struct lto_input_block *ib,
1938                         struct ipa_jump_func *jump_func,
1939                         struct data_in *data_in)
1940 {
1941   jump_func->type = (enum jump_func_type) lto_input_uleb128 (ib);
1942
1943   switch (jump_func->type)
1944     {
1945     case IPA_JF_UNKNOWN:
1946       break;
1947     case IPA_JF_CONST:
1948       jump_func->value.constant = lto_input_tree (ib, data_in);
1949       break;
1950     case IPA_JF_PASS_THROUGH:
1951       jump_func->value.pass_through.operand = lto_input_tree (ib, data_in);
1952       jump_func->value.pass_through.formal_id = lto_input_uleb128 (ib);
1953       jump_func->value.pass_through.operation = (enum tree_code) lto_input_uleb128 (ib);
1954       break;
1955     case IPA_JF_ANCESTOR:
1956       jump_func->value.ancestor.offset = lto_input_uleb128 (ib);
1957       jump_func->value.ancestor.type = lto_input_tree (ib, data_in);
1958       jump_func->value.ancestor.formal_id = lto_input_uleb128 (ib);
1959       break;
1960     case IPA_JF_CONST_MEMBER_PTR:
1961       jump_func->value.member_cst.pfn = lto_input_tree (ib, data_in);
1962       jump_func->value.member_cst.delta = lto_input_tree (ib, data_in);
1963       break;
1964     }
1965 }
1966
1967 /* Stream out a parameter call note.  */
1968
1969 static void
1970 ipa_write_param_call_note (struct output_block *ob,
1971                            struct ipa_param_call_note *note)
1972 {
1973   gcc_assert (!note->processed);
1974   lto_output_uleb128_stream (ob->main_stream, gimple_uid (note->stmt));
1975   lto_output_sleb128_stream (ob->main_stream, note->formal_id);
1976   lto_output_sleb128_stream (ob->main_stream, note->count);
1977   lto_output_sleb128_stream (ob->main_stream, note->frequency);
1978   lto_output_sleb128_stream (ob->main_stream, note->loop_nest);
1979 }
1980
1981 /* Read in a parameter call note.  */
1982
1983 static void
1984 ipa_read_param_call_note (struct lto_input_block *ib,
1985                           struct ipa_node_params *info)
1986
1987 {
1988   struct ipa_param_call_note *note = XCNEW (struct ipa_param_call_note);
1989
1990   note->lto_stmt_uid = (unsigned int) lto_input_uleb128 (ib);
1991   note->formal_id = (int) lto_input_sleb128 (ib);
1992   note->count = (gcov_type) lto_input_sleb128 (ib);
1993   note->frequency = (int) lto_input_sleb128 (ib);
1994   note->loop_nest = (int) lto_input_sleb128 (ib);
1995
1996   note->next = info->param_calls;
1997   info->param_calls = note;
1998 }
1999
2000
2001 /* Stream out NODE info to OB.  */
2002
2003 static void
2004 ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
2005 {
2006   int node_ref;
2007   lto_cgraph_encoder_t encoder;
2008   struct ipa_node_params *info = IPA_NODE_REF (node);
2009   int j;
2010   struct cgraph_edge *e;
2011   struct bitpack_d *bp;
2012   int note_count = 0;
2013   struct ipa_param_call_note *note;
2014
2015   encoder = ob->decl_state->cgraph_node_encoder;
2016   node_ref = lto_cgraph_encoder_encode (encoder, node);
2017   lto_output_uleb128_stream (ob->main_stream, node_ref);
2018
2019   bp = bitpack_create ();
2020   bp_pack_value (bp, info->called_with_var_arguments, 1);
2021   gcc_assert (info->modification_analysis_done
2022               || ipa_get_param_count (info) == 0);
2023   gcc_assert (info->uses_analysis_done || ipa_get_param_count (info) == 0);
2024   gcc_assert (!info->node_enqueued);
2025   gcc_assert (!info->ipcp_orig_node);
2026   for (j = 0; j < ipa_get_param_count (info); j++)
2027     {
2028       bp_pack_value (bp, info->params[j].modified, 1);
2029       bp_pack_value (bp, info->params[j].called, 1);
2030     }
2031   lto_output_bitpack (ob->main_stream, bp);
2032   bitpack_delete (bp);
2033   for (e = node->callees; e; e = e->next_callee)
2034     {
2035       struct ipa_edge_args *args = IPA_EDGE_REF (e);
2036
2037       lto_output_uleb128_stream (ob->main_stream,
2038                                  ipa_get_cs_argument_count (args));
2039       for (j = 0; j < ipa_get_cs_argument_count (args); j++)
2040         ipa_write_jump_function (ob, ipa_get_ith_jump_func (args, j));
2041     }
2042
2043   for (note = info->param_calls; note; note = note->next)
2044     note_count++;
2045   lto_output_uleb128_stream (ob->main_stream, note_count);
2046   for (note = info->param_calls; note; note = note->next)
2047     ipa_write_param_call_note (ob, note);
2048 }
2049
2050 /* Srtream in NODE info from IB.  */
2051
2052 static void
2053 ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
2054                     struct data_in *data_in)
2055 {
2056   struct ipa_node_params *info = IPA_NODE_REF (node);
2057   int k;
2058   struct cgraph_edge *e;
2059   struct bitpack_d *bp;
2060   int i, note_count;
2061
2062   ipa_initialize_node_params (node);
2063
2064   bp = lto_input_bitpack (ib);
2065   info->called_with_var_arguments = bp_unpack_value (bp, 1);
2066   if (ipa_get_param_count (info) != 0)
2067     {
2068       info->modification_analysis_done = true;
2069       info->uses_analysis_done = true;
2070     }
2071   info->node_enqueued = false;
2072   for (k = 0; k < ipa_get_param_count (info); k++)
2073     {
2074       info->params[k].modified = bp_unpack_value (bp, 1);
2075       info->params[k].called = bp_unpack_value (bp, 1);
2076     }
2077   bitpack_delete (bp);
2078   for (e = node->callees; e; e = e->next_callee)
2079     {
2080       struct ipa_edge_args *args = IPA_EDGE_REF (e);
2081       int count = lto_input_uleb128 (ib);
2082
2083       ipa_set_cs_argument_count (args, count);
2084       if (!count)
2085         continue;
2086
2087       args->jump_functions = GGC_CNEWVEC (struct ipa_jump_func,
2088                                           ipa_get_cs_argument_count (args));
2089       for (k = 0; k < ipa_get_cs_argument_count (args); k++)
2090         ipa_read_jump_function (ib, ipa_get_ith_jump_func (args, k), data_in);
2091     }
2092
2093   note_count = lto_input_uleb128 (ib);
2094   for (i = 0; i < note_count; i++)
2095     ipa_read_param_call_note (ib, info);
2096 }
2097
2098 /* Write jump functions for nodes in SET.  */
2099
2100 void
2101 ipa_prop_write_jump_functions (cgraph_node_set set)
2102 {
2103   struct cgraph_node *node;
2104   struct output_block *ob = create_output_block (LTO_section_jump_functions);
2105   unsigned int count = 0;
2106   cgraph_node_set_iterator csi;
2107
2108   ob->cgraph_node = NULL;
2109
2110   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
2111     {
2112       node = csi_node (csi);
2113       if (node->analyzed && IPA_NODE_REF (node) != NULL)
2114         count++;
2115     }
2116
2117   lto_output_uleb128_stream (ob->main_stream, count);
2118
2119   /* Process all of the functions.  */
2120   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
2121     {
2122       node = csi_node (csi);
2123       if (node->analyzed && IPA_NODE_REF (node) != NULL)
2124         ipa_write_node_info (ob, node);
2125     }
2126   lto_output_1_stream (ob->main_stream, 0);
2127   produce_asm (ob, NULL);
2128   destroy_output_block (ob);
2129 }
2130
2131 /* Read section in file FILE_DATA of length LEN with data DATA.  */
2132
2133 static void
2134 ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
2135                        size_t len)
2136 {
2137   const struct lto_function_header *header =
2138     (const struct lto_function_header *) data;
2139   const int32_t cfg_offset = sizeof (struct lto_function_header);
2140   const int32_t main_offset = cfg_offset + header->cfg_size;
2141   const int32_t string_offset = main_offset + header->main_size;
2142   struct data_in *data_in;
2143   struct lto_input_block ib_main;
2144   unsigned int i;
2145   unsigned int count;
2146
2147   LTO_INIT_INPUT_BLOCK (ib_main, (const char *) data + main_offset, 0,
2148                         header->main_size);
2149
2150   data_in =
2151     lto_data_in_create (file_data, (const char *) data + string_offset,
2152                         header->string_size, NULL);
2153   count = lto_input_uleb128 (&ib_main);
2154
2155   for (i = 0; i < count; i++)
2156     {
2157       unsigned int index;
2158       struct cgraph_node *node;
2159       lto_cgraph_encoder_t encoder;
2160
2161       index = lto_input_uleb128 (&ib_main);
2162       encoder = file_data->cgraph_node_encoder;
2163       node = lto_cgraph_encoder_deref (encoder, index);
2164       ipa_read_node_info (&ib_main, node, data_in);
2165     }
2166   lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data,
2167                          len);
2168   lto_data_in_delete (data_in);
2169 }
2170
2171 /* Read ipcp jump functions.  */
2172
2173 void
2174 ipa_prop_read_jump_functions (void)
2175 {
2176   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2177   struct lto_file_decl_data *file_data;
2178   unsigned int j = 0;
2179
2180   ipa_check_create_node_params ();
2181   ipa_check_create_edge_args ();
2182   ipa_register_cgraph_hooks ();
2183
2184   while ((file_data = file_data_vec[j++]))
2185     {
2186       size_t len;
2187       const char *data = lto_get_section_data (file_data, LTO_section_jump_functions, NULL, &len);
2188
2189       if (data)
2190         ipa_prop_read_section (file_data, data, len);
2191     }
2192 }
2193
2194 /* After merging units, we can get mismatch in argument counts.
2195    Also decl merging might've rendered parameter lists obsolette.
2196    Also compute called_with_variable_arg info.  */
2197
2198 void
2199 ipa_update_after_lto_read (void)
2200 {
2201   struct cgraph_node *node;
2202   struct cgraph_edge *cs;
2203
2204   ipa_check_create_node_params ();
2205   ipa_check_create_edge_args ();
2206
2207   for (node = cgraph_nodes; node; node = node->next)
2208     {
2209       if (!node->analyzed)
2210         continue;
2211       ipa_initialize_node_params (node);
2212       for (cs = node->callees; cs; cs = cs->next_callee)
2213         {
2214           if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
2215               != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
2216             ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));
2217         }
2218     }
2219 }
2220
2221 /* Walk param call notes of NODE and set their call statements given the uid
2222    stored in each note and STMTS which is an array of statements indexed by the
2223    uid.  */
2224
2225 void
2226 lto_ipa_fixup_call_notes (struct cgraph_node *node, gimple *stmts)
2227 {
2228   struct ipa_node_params *info;
2229   struct ipa_param_call_note *note;
2230
2231   ipa_check_create_node_params ();
2232   info = IPA_NODE_REF (node);
2233   note = info->param_calls;
2234   /* If there are no notes or they have already been fixed up (the same fixup
2235      is called for both inlining and ipa-cp), there's nothing to do. */
2236   if (!note || note->stmt)
2237     return;
2238
2239   do
2240     {
2241       note->stmt = stmts[note->lto_stmt_uid];
2242       note = note->next;
2243     }
2244   while (note);
2245 }