OSDN Git Service

2011-04-19 Martin Jambor <mjambor@suse.cz>
[pf3gnuchains/gcc-fork.git] / gcc / ipa-prop.c
1 /* Interprocedural analyses.
2    Copyright (C) 2005, 2007, 2008, 2009, 2010
3    Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "tree.h"
25 #include "langhooks.h"
26 #include "ggc.h"
27 #include "target.h"
28 #include "cgraph.h"
29 #include "ipa-prop.h"
30 #include "tree-flow.h"
31 #include "tree-pass.h"
32 #include "tree-inline.h"
33 #include "gimple.h"
34 #include "flags.h"
35 #include "timevar.h"
36 #include "flags.h"
37 #include "diagnostic.h"
38 #include "tree-pretty-print.h"
39 #include "gimple-pretty-print.h"
40 #include "lto-streamer.h"
41
42
43 /* Intermediate information about a parameter that is only useful during the
44    run of ipa_analyze_node and is not kept afterwards.  */
45
46 struct param_analysis_info
47 {
48   bool modified;
49   bitmap visited_statements;
50 };
51
52 /* Vector where the parameter infos are actually stored. */
53 VEC (ipa_node_params_t, heap) *ipa_node_params_vector;
54 /* Vector where the parameter infos are actually stored. */
55 VEC (ipa_edge_args_t, gc) *ipa_edge_args_vector;
56
57 /* Bitmap with all UIDs of call graph edges that have been already processed
58    by indirect inlining.  */
59 static bitmap iinlining_processed_edges;
60
61 /* Holders of ipa cgraph hooks: */
62 static struct cgraph_edge_hook_list *edge_removal_hook_holder;
63 static struct cgraph_node_hook_list *node_removal_hook_holder;
64 static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
65 static struct cgraph_2node_hook_list *node_duplication_hook_holder;
66
67 /* Add cgraph NODE described by INFO to the worklist WL regardless of whether
68    it is in one or not.  It should almost never be used directly, as opposed to
69    ipa_push_func_to_list.  */
70
71 void
72 ipa_push_func_to_list_1 (struct ipa_func_list **wl,
73                          struct cgraph_node *node,
74                          struct ipa_node_params *info)
75 {
76   struct ipa_func_list *temp;
77
78   info->node_enqueued = 1;
79   temp = XCNEW (struct ipa_func_list);
80   temp->node = node;
81   temp->next = *wl;
82   *wl = temp;
83 }
84
85 /* Initialize worklist to contain all functions.  */
86
87 struct ipa_func_list *
88 ipa_init_func_list (void)
89 {
90   struct cgraph_node *node;
91   struct ipa_func_list * wl;
92
93   wl = NULL;
94   for (node = cgraph_nodes; node; node = node->next)
95     if (node->analyzed)
96       {
97         struct ipa_node_params *info = IPA_NODE_REF (node);
98         /* Unreachable nodes should have been eliminated before ipcp and
99            inlining.  */
100         gcc_assert (node->needed || node->reachable);
101         ipa_push_func_to_list_1 (&wl, node, info);
102       }
103
104   return wl;
105 }
106
107 /* Remove a function from the worklist WL and return it.  */
108
109 struct cgraph_node *
110 ipa_pop_func_from_list (struct ipa_func_list **wl)
111 {
112   struct ipa_node_params *info;
113   struct ipa_func_list *first;
114   struct cgraph_node *node;
115
116   first = *wl;
117   *wl = (*wl)->next;
118   node = first->node;
119   free (first);
120
121   info = IPA_NODE_REF (node);
122   info->node_enqueued = 0;
123   return node;
124 }
125
126 /* Return index of the formal whose tree is PTREE in function which corresponds
127    to INFO.  */
128
129 static int
130 ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
131 {
132   int i, count;
133
134   count = ipa_get_param_count (info);
135   for (i = 0; i < count; i++)
136     if (ipa_get_param(info, i) == ptree)
137       return i;
138
139   return -1;
140 }
141
142 /* Populate the param_decl field in parameter descriptors of INFO that
143    corresponds to NODE.  */
144
145 static void
146 ipa_populate_param_decls (struct cgraph_node *node,
147                           struct ipa_node_params *info)
148 {
149   tree fndecl;
150   tree fnargs;
151   tree parm;
152   int param_num;
153
154   fndecl = node->decl;
155   fnargs = DECL_ARGUMENTS (fndecl);
156   param_num = 0;
157   for (parm = fnargs; parm; parm = DECL_CHAIN (parm))
158     {
159       info->params[param_num].decl = parm;
160       param_num++;
161     }
162 }
163
164 /* Return how many formal parameters FNDECL has.  */
165
166 static inline int
167 count_formal_params_1 (tree fndecl)
168 {
169   tree parm;
170   int count = 0;
171
172   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
173     count++;
174
175   return count;
176 }
177
178 /* Count number of formal parameters in NOTE. Store the result to the
179    appropriate field of INFO.  */
180
181 static void
182 ipa_count_formal_params (struct cgraph_node *node,
183                          struct ipa_node_params *info)
184 {
185   int param_num;
186
187   param_num = count_formal_params_1 (node->decl);
188   ipa_set_param_count (info, param_num);
189 }
190
191 /* Initialize the ipa_node_params structure associated with NODE by counting
192    the function parameters, creating the descriptors and populating their
193    param_decls.  */
194
195 void
196 ipa_initialize_node_params (struct cgraph_node *node)
197 {
198   struct ipa_node_params *info = IPA_NODE_REF (node);
199
200   if (!info->params)
201     {
202       ipa_count_formal_params (node, info);
203       info->params = XCNEWVEC (struct ipa_param_descriptor,
204                                     ipa_get_param_count (info));
205       ipa_populate_param_decls (node, info);
206     }
207 }
208
209 /* Count number of arguments callsite CS has and store it in
210    ipa_edge_args structure corresponding to this callsite.  */
211
212 static void
213 ipa_count_arguments (struct cgraph_edge *cs)
214 {
215   gimple stmt;
216   int arg_num;
217
218   stmt = cs->call_stmt;
219   gcc_assert (is_gimple_call (stmt));
220   arg_num = gimple_call_num_args (stmt);
221   if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector)
222       <= (unsigned) cgraph_edge_max_uid)
223     VEC_safe_grow_cleared (ipa_edge_args_t, gc,
224                            ipa_edge_args_vector, cgraph_edge_max_uid + 1);
225   ipa_set_cs_argument_count (IPA_EDGE_REF (cs), arg_num);
226 }
227
228 /* Print the jump functions associated with call graph edge CS to file F.  */
229
230 static void
231 ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
232 {
233   int i, count;
234
235   count = ipa_get_cs_argument_count (IPA_EDGE_REF (cs));
236   for (i = 0; i < count; i++)
237     {
238       struct ipa_jump_func *jump_func;
239       enum jump_func_type type;
240
241       jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
242       type = jump_func->type;
243
244       fprintf (f, "       param %d: ", i);
245       if (type == IPA_JF_UNKNOWN)
246         fprintf (f, "UNKNOWN\n");
247       else if (type == IPA_JF_KNOWN_TYPE)
248         {
249           tree binfo_type = TREE_TYPE (jump_func->value.base_binfo);
250           fprintf (f, "KNOWN TYPE, type in binfo is: ");
251           print_generic_expr (f, binfo_type, 0);
252           fprintf (f, " (%u)\n", TYPE_UID (binfo_type));
253         }
254       else if (type == IPA_JF_CONST)
255         {
256           tree val = jump_func->value.constant;
257           fprintf (f, "CONST: ");
258           print_generic_expr (f, val, 0);
259           if (TREE_CODE (val) == ADDR_EXPR
260               && TREE_CODE (TREE_OPERAND (val, 0)) == CONST_DECL)
261             {
262               fprintf (f, " -> ");
263               print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (val, 0)),
264                                   0);
265             }
266           fprintf (f, "\n");
267         }
268       else if (type == IPA_JF_CONST_MEMBER_PTR)
269         {
270           fprintf (f, "CONST MEMBER PTR: ");
271           print_generic_expr (f, jump_func->value.member_cst.pfn, 0);
272           fprintf (f, ", ");
273           print_generic_expr (f, jump_func->value.member_cst.delta, 0);
274           fprintf (f, "\n");
275         }
276       else if (type == IPA_JF_PASS_THROUGH)
277         {
278           fprintf (f, "PASS THROUGH: ");
279           fprintf (f, "%d, op %s ",
280                    jump_func->value.pass_through.formal_id,
281                    tree_code_name[(int)
282                                   jump_func->value.pass_through.operation]);
283           if (jump_func->value.pass_through.operation != NOP_EXPR)
284             print_generic_expr (dump_file,
285                                 jump_func->value.pass_through.operand, 0);
286           fprintf (dump_file, "\n");
287         }
288       else if (type == IPA_JF_ANCESTOR)
289         {
290           fprintf (f, "ANCESTOR: ");
291           fprintf (f, "%d, offset "HOST_WIDE_INT_PRINT_DEC", ",
292                    jump_func->value.ancestor.formal_id,
293                    jump_func->value.ancestor.offset);
294           print_generic_expr (f, jump_func->value.ancestor.type, 0);
295           fprintf (dump_file, "\n");
296         }
297     }
298 }
299
300
301 /* Print the jump functions of all arguments on all call graph edges going from
302    NODE to file F.  */
303
304 void
305 ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
306 {
307   struct cgraph_edge *cs;
308   int i;
309
310   fprintf (f, "  Jump functions of caller  %s:\n", cgraph_node_name (node));
311   for (cs = node->callees; cs; cs = cs->next_callee)
312     {
313       if (!ipa_edge_args_info_available_for_edge_p (cs))
314         continue;
315
316       fprintf (f, "    callsite  %s/%i -> %s/%i : \n",
317                cgraph_node_name (node), node->uid,
318                cgraph_node_name (cs->callee), cs->callee->uid);
319       ipa_print_node_jump_functions_for_edge (f, cs);
320     }
321
322   for (cs = node->indirect_calls, i = 0; cs; cs = cs->next_callee, i++)
323     {
324       if (!ipa_edge_args_info_available_for_edge_p (cs))
325         continue;
326
327       if (cs->call_stmt)
328         {
329           fprintf (f, "    indirect callsite %d for stmt ", i);
330           print_gimple_stmt (f, cs->call_stmt, 0, TDF_SLIM);
331         }
332       else
333         fprintf (f, "    indirect callsite %d :\n", i);
334       ipa_print_node_jump_functions_for_edge (f, cs);
335
336     }
337 }
338
339 /* Print ipa_jump_func data structures of all nodes in the call graph to F.  */
340
341 void
342 ipa_print_all_jump_functions (FILE *f)
343 {
344   struct cgraph_node *node;
345
346   fprintf (f, "\nJump functions:\n");
347   for (node = cgraph_nodes; node; node = node->next)
348     {
349       ipa_print_node_jump_functions (f, node);
350     }
351 }
352
353 /* Structure to be passed in between detect_type_change and
354    check_stmt_for_type_change.  */
355
356 struct type_change_info
357 {
358   /* Set to true if dynamic type change has been detected.  */
359   bool type_maybe_changed;
360 };
361
362 /* Return true if STMT can modify a virtual method table pointer.
363
364    This function makes special assumptions about both constructors and
365    destructors which are all the functions that are allowed to alter the VMT
366    pointers.  It assumes that destructors begin with assignment into all VMT
367    pointers and that constructors essentially look in the following way:
368
369    1) The very first thing they do is that they call constructors of ancestor
370    sub-objects that have them.
371
372    2) Then VMT pointers of this and all its ancestors is set to new values
373    corresponding to the type corresponding to the constructor.
374
375    3) Only afterwards, other stuff such as constructor of member sub-objects
376    and the code written by the user is run.  Only this may include calling
377    virtual functions, directly or indirectly.
378
379    There is no way to call a constructor of an ancestor sub-object in any
380    other way.
381
382    This means that we do not have to care whether constructors get the correct
383    type information because they will always change it (in fact, if we define
384    the type to be given by the VMT pointer, it is undefined).
385
386    The most important fact to derive from the above is that if, for some
387    statement in the section 3, we try to detect whether the dynamic type has
388    changed, we can safely ignore all calls as we examine the function body
389    backwards until we reach statements in section 2 because these calls cannot
390    be ancestor constructors or destructors (if the input is not bogus) and so
391    do not change the dynamic type (this holds true only for automatically
392    allocated objects but at the moment we devirtualize only these).  We then
393    must detect that statements in section 2 change the dynamic type and can try
394    to derive the new type.  That is enough and we can stop, we will never see
395    the calls into constructors of sub-objects in this code.  Therefore we can
396    safely ignore all call statements that we traverse.
397   */
398
399 static bool
400 stmt_may_be_vtbl_ptr_store (gimple stmt)
401 {
402   if (is_gimple_call (stmt))
403     return false;
404   else if (is_gimple_assign (stmt))
405     {
406       tree lhs = gimple_assign_lhs (stmt);
407
408       if (!AGGREGATE_TYPE_P (TREE_TYPE (lhs)))
409         {
410           if (flag_strict_aliasing
411               && !POINTER_TYPE_P (TREE_TYPE (lhs)))
412             return false;
413
414           if (TREE_CODE (lhs) == COMPONENT_REF
415               && !DECL_VIRTUAL_P (TREE_OPERAND (lhs, 1)))
416             return false;
417           /* In the future we might want to use get_base_ref_and_offset to find
418              if there is a field corresponding to the offset and if so, proceed
419              almost like if it was a component ref.  */
420         }
421     }
422   return true;
423 }
424
425 /* Callback of walk_aliased_vdefs and a helper function for
426    detect_type_change to check whether a particular statement may modify
427    the virtual table pointer, and if possible also determine the new type of
428    the (sub-)object.  It stores its result into DATA, which points to a
429    type_change_info structure.  */
430
431 static bool
432 check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
433 {
434   gimple stmt = SSA_NAME_DEF_STMT (vdef);
435   struct type_change_info *tci = (struct type_change_info *) data;
436
437   if (stmt_may_be_vtbl_ptr_store (stmt))
438     {
439       tci->type_maybe_changed = true;
440       return true;
441     }
442   else
443     return false;
444 }
445
446 /* Detect whether the dynamic type of ARG has changed (before callsite CALL) by
447    looking for assignments to its virtual table pointer.  If it is, return true
448    and fill in the jump function JFUNC with relevant type information or set it
449    to unknown.  ARG is the object itself (not a pointer to it, unless
450    dereferenced).  BASE is the base of the memory access as returned by
451    get_ref_base_and_extent, as is the offset.  */
452
453 static bool
454 detect_type_change (tree arg, tree base, gimple call,
455                     struct ipa_jump_func *jfunc, HOST_WIDE_INT offset)
456 {
457   struct type_change_info tci;
458   ao_ref ao;
459
460   gcc_checking_assert (DECL_P (arg)
461                        || TREE_CODE (arg) == MEM_REF
462                        || handled_component_p (arg));
463   /* Const calls cannot call virtual methods through VMT and so type changes do
464      not matter.  */
465   if (!flag_devirtualize || !gimple_vuse (call))
466     return false;
467
468   tci.type_maybe_changed = false;
469
470   ao.ref = arg;
471   ao.base = base;
472   ao.offset = offset;
473   ao.size = POINTER_SIZE;
474   ao.max_size = ao.size;
475   ao.ref_alias_set = -1;
476   ao.base_alias_set = -1;
477
478   walk_aliased_vdefs (&ao, gimple_vuse (call), check_stmt_for_type_change,
479                       &tci, NULL);
480   if (!tci.type_maybe_changed)
481     return false;
482
483   jfunc->type = IPA_JF_UNKNOWN;
484   return true;
485 }
486
487 /* Like detect_type_change but ARG is supposed to be a non-dereferenced pointer
488    SSA name (its dereference will become the base and the offset is assumed to
489    be zero).  */
490
491 static bool
492 detect_type_change_ssa (tree arg, gimple call, struct ipa_jump_func *jfunc)
493 {
494   gcc_checking_assert (TREE_CODE (arg) == SSA_NAME);
495   if (!flag_devirtualize
496       || !POINTER_TYPE_P (TREE_TYPE (arg))
497       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != RECORD_TYPE)
498     return false;
499
500   arg = build2 (MEM_REF, ptr_type_node, arg,
501                 build_int_cst (ptr_type_node, 0));
502
503   return detect_type_change (arg, arg, call, jfunc, 0);
504 }
505
506
507 /* Given that an actual argument is an SSA_NAME (given in NAME) and is a result
508    of an assignment statement STMT, try to find out whether NAME can be
509    described by a (possibly polynomial) pass-through jump-function or an
510    ancestor jump function and if so, write the appropriate function into
511    JFUNC */
512
513 static void
514 compute_complex_assign_jump_func (struct ipa_node_params *info,
515                                   struct ipa_jump_func *jfunc,
516                                   gimple call, gimple stmt, tree name)
517 {
518   HOST_WIDE_INT offset, size, max_size;
519   tree op1, op2, base, ssa;
520   int index;
521
522   op1 = gimple_assign_rhs1 (stmt);
523   op2 = gimple_assign_rhs2 (stmt);
524
525   if (TREE_CODE (op1) == SSA_NAME
526       && SSA_NAME_IS_DEFAULT_DEF (op1))
527     {
528       index = ipa_get_param_decl_index (info, SSA_NAME_VAR (op1));
529       if (index < 0)
530         return;
531
532       if (op2)
533         {
534           if (!is_gimple_ip_invariant (op2)
535               || (TREE_CODE_CLASS (gimple_expr_code (stmt)) != tcc_comparison
536                   && !useless_type_conversion_p (TREE_TYPE (name),
537                                                  TREE_TYPE (op1))))
538             return;
539
540           jfunc->type = IPA_JF_PASS_THROUGH;
541           jfunc->value.pass_through.formal_id = index;
542           jfunc->value.pass_through.operation = gimple_assign_rhs_code (stmt);
543           jfunc->value.pass_through.operand = op2;
544         }
545       else if (gimple_assign_unary_nop_p (stmt)
546                && !detect_type_change_ssa (op1, call, jfunc))
547         {
548           jfunc->type = IPA_JF_PASS_THROUGH;
549           jfunc->value.pass_through.formal_id = index;
550           jfunc->value.pass_through.operation = NOP_EXPR;
551         }
552       return;
553     }
554
555   if (TREE_CODE (op1) != ADDR_EXPR)
556     return;
557   op1 = TREE_OPERAND (op1, 0);
558   if (TREE_CODE (TREE_TYPE (op1)) != RECORD_TYPE)
559     return;
560   base = get_ref_base_and_extent (op1, &offset, &size, &max_size);
561   if (TREE_CODE (base) != MEM_REF
562       /* If this is a varying address, punt.  */
563       || max_size == -1
564       || max_size != size)
565     return;
566   offset += mem_ref_offset (base).low * BITS_PER_UNIT;
567   ssa = TREE_OPERAND (base, 0);
568   if (TREE_CODE (ssa) != SSA_NAME
569       || !SSA_NAME_IS_DEFAULT_DEF (ssa)
570       || offset < 0)
571     return;
572
573   /* Dynamic types are changed only in constructors and destructors and  */
574   index = ipa_get_param_decl_index (info, SSA_NAME_VAR (ssa));
575   if (index >= 0
576       && !detect_type_change (op1, base, call, jfunc, offset))
577     {
578       jfunc->type = IPA_JF_ANCESTOR;
579       jfunc->value.ancestor.formal_id = index;
580       jfunc->value.ancestor.offset = offset;
581       jfunc->value.ancestor.type = TREE_TYPE (op1);
582     }
583 }
584
585 /* Extract the base, offset and MEM_REF expression from a statement ASSIGN if
586    it looks like:
587
588    iftmp.1_3 = &obj_2(D)->D.1762;
589
590    The base of the MEM_REF must be a default definition SSA NAME of a
591    parameter.  Return NULL_TREE if it looks otherwise.  If case of success, the
592    whole MEM_REF expression is returned and the offset calculated from any
593    handled components and the MEM_REF itself is stored into *OFFSET.  The whole
594    RHS stripped off the ADDR_EXPR is stored into *OBJ_P.  */
595
596 static tree
597 get_ancestor_addr_info (gimple assign, tree *obj_p, HOST_WIDE_INT *offset)
598 {
599   HOST_WIDE_INT size, max_size;
600   tree expr, parm, obj;
601
602   if (!gimple_assign_single_p (assign))
603     return NULL_TREE;
604   expr = gimple_assign_rhs1 (assign);
605
606   if (TREE_CODE (expr) != ADDR_EXPR)
607     return NULL_TREE;
608   expr = TREE_OPERAND (expr, 0);
609   obj = expr;
610   expr = get_ref_base_and_extent (expr, offset, &size, &max_size);
611
612   if (TREE_CODE (expr) != MEM_REF
613       /* If this is a varying address, punt.  */
614       || max_size == -1
615       || max_size != size
616       || *offset < 0)
617     return NULL_TREE;
618   parm = TREE_OPERAND (expr, 0);
619   if (TREE_CODE (parm) != SSA_NAME
620       || !SSA_NAME_IS_DEFAULT_DEF (parm)
621       || TREE_CODE (SSA_NAME_VAR (parm)) != PARM_DECL)
622     return NULL_TREE;
623
624   *offset += mem_ref_offset (expr).low * BITS_PER_UNIT;
625   *obj_p = obj;
626   return expr;
627 }
628
629
630 /* Given that an actual argument is an SSA_NAME that is a result of a phi
631    statement PHI, try to find out whether NAME is in fact a
632    multiple-inheritance typecast from a descendant into an ancestor of a formal
633    parameter and thus can be described by an ancestor jump function and if so,
634    write the appropriate function into JFUNC.
635
636    Essentially we want to match the following pattern:
637
638      if (obj_2(D) != 0B)
639        goto <bb 3>;
640      else
641        goto <bb 4>;
642
643    <bb 3>:
644      iftmp.1_3 = &obj_2(D)->D.1762;
645
646    <bb 4>:
647      # iftmp.1_1 = PHI <iftmp.1_3(3), 0B(2)>
648      D.1879_6 = middleman_1 (iftmp.1_1, i_5(D));
649      return D.1879_6;  */
650
651 static void
652 compute_complex_ancestor_jump_func (struct ipa_node_params *info,
653                                     struct ipa_jump_func *jfunc,
654                                     gimple call, gimple phi)
655 {
656   HOST_WIDE_INT offset;
657   gimple assign, cond;
658   basic_block phi_bb, assign_bb, cond_bb;
659   tree tmp, parm, expr, obj;
660   int index, i;
661
662   if (gimple_phi_num_args (phi) != 2)
663     return;
664
665   if (integer_zerop (PHI_ARG_DEF (phi, 1)))
666     tmp = PHI_ARG_DEF (phi, 0);
667   else if (integer_zerop (PHI_ARG_DEF (phi, 0)))
668     tmp = PHI_ARG_DEF (phi, 1);
669   else
670     return;
671   if (TREE_CODE (tmp) != SSA_NAME
672       || SSA_NAME_IS_DEFAULT_DEF (tmp)
673       || !POINTER_TYPE_P (TREE_TYPE (tmp))
674       || TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) != RECORD_TYPE)
675     return;
676
677   assign = SSA_NAME_DEF_STMT (tmp);
678   assign_bb = gimple_bb (assign);
679   if (!single_pred_p (assign_bb))
680     return;
681   expr = get_ancestor_addr_info (assign, &obj, &offset);
682   if (!expr)
683     return;
684   parm = TREE_OPERAND (expr, 0);
685   index = ipa_get_param_decl_index (info, SSA_NAME_VAR (parm));
686   gcc_assert (index >= 0);
687
688   cond_bb = single_pred (assign_bb);
689   cond = last_stmt (cond_bb);
690   if (!cond
691       || gimple_code (cond) != GIMPLE_COND
692       || gimple_cond_code (cond) != NE_EXPR
693       || gimple_cond_lhs (cond) != parm
694       || !integer_zerop (gimple_cond_rhs (cond)))
695     return;
696
697   phi_bb = gimple_bb (phi);
698   for (i = 0; i < 2; i++)
699     {
700       basic_block pred = EDGE_PRED (phi_bb, i)->src;
701       if (pred != assign_bb && pred != cond_bb)
702         return;
703     }
704
705   if (!detect_type_change (obj, expr, call, jfunc, offset))
706     {
707       jfunc->type = IPA_JF_ANCESTOR;
708       jfunc->value.ancestor.formal_id = index;
709       jfunc->value.ancestor.offset = offset;
710       jfunc->value.ancestor.type = TREE_TYPE (obj);
711     }
712 }
713
714 /* Given OP which is passed as an actual argument to a called function,
715    determine if it is possible to construct a KNOWN_TYPE jump function for it
716    and if so, create one and store it to JFUNC.  */
717
718 static void
719 compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
720                               gimple call)
721 {
722   HOST_WIDE_INT offset, size, max_size;
723   tree base, binfo;
724
725   if (!flag_devirtualize
726       || TREE_CODE (op) != ADDR_EXPR
727       || TREE_CODE (TREE_TYPE (TREE_TYPE (op))) != RECORD_TYPE)
728     return;
729
730   op = TREE_OPERAND (op, 0);
731   base = get_ref_base_and_extent (op, &offset, &size, &max_size);
732   if (!DECL_P (base)
733       || max_size == -1
734       || max_size != size
735       || TREE_CODE (TREE_TYPE (base)) != RECORD_TYPE
736       || is_global_var (base))
737     return;
738
739   if (detect_type_change (op, base, call, jfunc, offset))
740     return;
741
742   binfo = TYPE_BINFO (TREE_TYPE (base));
743   if (!binfo)
744     return;
745   binfo = get_binfo_at_offset (binfo, offset, TREE_TYPE (op));
746   if (binfo)
747     {
748       jfunc->type = IPA_JF_KNOWN_TYPE;
749       jfunc->value.base_binfo = binfo;
750     }
751 }
752
753
754 /* Determine the jump functions of scalar arguments.  Scalar means SSA names
755    and constants of a number of selected types.  INFO is the ipa_node_params
756    structure associated with the caller, FUNCTIONS is a pointer to an array of
757    jump function structures associated with CALL which is the call statement
758    being examined.*/
759
760 static void
761 compute_scalar_jump_functions (struct ipa_node_params *info,
762                                struct ipa_jump_func *functions,
763                                gimple call)
764 {
765   tree arg;
766   unsigned num = 0;
767
768   for (num = 0; num < gimple_call_num_args (call); num++)
769     {
770       arg = gimple_call_arg (call, num);
771
772       if (is_gimple_ip_invariant (arg))
773         {
774           functions[num].type = IPA_JF_CONST;
775           functions[num].value.constant = arg;
776         }
777       else if (TREE_CODE (arg) == SSA_NAME)
778         {
779           if (SSA_NAME_IS_DEFAULT_DEF (arg))
780             {
781               int index = ipa_get_param_decl_index (info, SSA_NAME_VAR (arg));
782
783               if (index >= 0
784                   && !detect_type_change_ssa (arg, call, &functions[num]))
785                 {
786                   functions[num].type = IPA_JF_PASS_THROUGH;
787                   functions[num].value.pass_through.formal_id = index;
788                   functions[num].value.pass_through.operation = NOP_EXPR;
789                 }
790             }
791           else
792             {
793               gimple stmt = SSA_NAME_DEF_STMT (arg);
794               if (is_gimple_assign (stmt))
795                 compute_complex_assign_jump_func (info, &functions[num],
796                                                   call, stmt, arg);
797               else if (gimple_code (stmt) == GIMPLE_PHI)
798                 compute_complex_ancestor_jump_func (info, &functions[num],
799                                                     call, stmt);
800             }
801         }
802       else
803         compute_known_type_jump_func (arg, &functions[num], call);
804     }
805 }
806
807 /* Inspect the given TYPE and return true iff it has the same structure (the
808    same number of fields of the same types) as a C++ member pointer.  If
809    METHOD_PTR and DELTA are non-NULL, store the trees representing the
810    corresponding fields there.  */
811
812 static bool
813 type_like_member_ptr_p (tree type, tree *method_ptr, tree *delta)
814 {
815   tree fld;
816
817   if (TREE_CODE (type) != RECORD_TYPE)
818     return false;
819
820   fld = TYPE_FIELDS (type);
821   if (!fld || !POINTER_TYPE_P (TREE_TYPE (fld))
822       || TREE_CODE (TREE_TYPE (TREE_TYPE (fld))) != METHOD_TYPE)
823     return false;
824
825   if (method_ptr)
826     *method_ptr = fld;
827
828   fld = DECL_CHAIN (fld);
829   if (!fld || INTEGRAL_TYPE_P (fld))
830     return false;
831   if (delta)
832     *delta = fld;
833
834   if (DECL_CHAIN (fld))
835     return false;
836
837   return true;
838 }
839
840 /* Callback of walk_aliased_vdefs.  Flags that it has been invoked to the
841    boolean variable pointed to by DATA.  */
842
843 static bool
844 mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
845                      void *data)
846 {
847   bool *b = (bool *) data;
848   *b = true;
849   return true;
850 }
851
852 /* Return true if the formal parameter PARM might have been modified in this
853    function before reaching the statement CALL.  PARM_INFO is a pointer to a
854    structure containing intermediate information about PARM.  */
855
856 static bool
857 is_parm_modified_before_call (struct param_analysis_info *parm_info,
858                               gimple call, tree parm)
859 {
860   bool modified = false;
861   ao_ref refd;
862
863   if (parm_info->modified)
864     return true;
865
866   ao_ref_init (&refd, parm);
867   walk_aliased_vdefs (&refd, gimple_vuse (call), mark_modified,
868                       &modified, &parm_info->visited_statements);
869   if (modified)
870     {
871       parm_info->modified = true;
872       return true;
873     }
874   return false;
875 }
876
877 /* Go through arguments of the CALL and for every one that looks like a member
878    pointer, check whether it can be safely declared pass-through and if so,
879    mark that to the corresponding item of jump FUNCTIONS.  Return true iff
880    there are non-pass-through member pointers within the arguments.  INFO
881    describes formal parameters of the caller.  PARMS_INFO is a pointer to a
882    vector containing intermediate information about each formal parameter.  */
883
884 static bool
885 compute_pass_through_member_ptrs (struct ipa_node_params *info,
886                                   struct param_analysis_info *parms_info,
887                                   struct ipa_jump_func *functions,
888                                   gimple call)
889 {
890   bool undecided_members = false;
891   unsigned num;
892   tree arg;
893
894   for (num = 0; num < gimple_call_num_args (call); num++)
895     {
896       arg = gimple_call_arg (call, num);
897
898       if (type_like_member_ptr_p (TREE_TYPE (arg), NULL, NULL))
899         {
900           if (TREE_CODE (arg) == PARM_DECL)
901             {
902               int index = ipa_get_param_decl_index (info, arg);
903
904               gcc_assert (index >=0);
905               if (!is_parm_modified_before_call (&parms_info[index], call, arg))
906                 {
907                   functions[num].type = IPA_JF_PASS_THROUGH;
908                   functions[num].value.pass_through.formal_id = index;
909                   functions[num].value.pass_through.operation = NOP_EXPR;
910                 }
911               else
912                 undecided_members = true;
913             }
914           else
915             undecided_members = true;
916         }
917     }
918
919   return undecided_members;
920 }
921
922 /* Simple function filling in a member pointer constant jump function (with PFN
923    and DELTA as the constant value) into JFUNC.  */
924
925 static void
926 fill_member_ptr_cst_jump_function (struct ipa_jump_func *jfunc,
927                                    tree pfn, tree delta)
928 {
929   jfunc->type = IPA_JF_CONST_MEMBER_PTR;
930   jfunc->value.member_cst.pfn = pfn;
931   jfunc->value.member_cst.delta = delta;
932 }
933
934 /* If RHS is an SSA_NAME and it is defined by a simple copy assign statement,
935    return the rhs of its defining statement.  */
936
937 static inline tree
938 get_ssa_def_if_simple_copy (tree rhs)
939 {
940   while (TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_IS_DEFAULT_DEF (rhs))
941     {
942       gimple def_stmt = SSA_NAME_DEF_STMT (rhs);
943
944       if (gimple_assign_single_p (def_stmt))
945         rhs = gimple_assign_rhs1 (def_stmt);
946       else
947         break;
948     }
949   return rhs;
950 }
951
952 /* Traverse statements from CALL backwards, scanning whether the argument ARG
953    which is a member pointer is filled in with constant values.  If it is, fill
954    the jump function JFUNC in appropriately.  METHOD_FIELD and DELTA_FIELD are
955    fields of the record type of the member pointer.  To give an example, we
956    look for a pattern looking like the following:
957
958      D.2515.__pfn ={v} printStuff;
959      D.2515.__delta ={v} 0;
960      i_1 = doprinting (D.2515);  */
961
962 static void
963 determine_cst_member_ptr (gimple call, tree arg, tree method_field,
964                           tree delta_field, struct ipa_jump_func *jfunc)
965 {
966   gimple_stmt_iterator gsi;
967   tree method = NULL_TREE;
968   tree delta = NULL_TREE;
969
970   gsi = gsi_for_stmt (call);
971
972   gsi_prev (&gsi);
973   for (; !gsi_end_p (gsi); gsi_prev (&gsi))
974     {
975       gimple stmt = gsi_stmt (gsi);
976       tree lhs, rhs, fld;
977
978       if (!stmt_may_clobber_ref_p (stmt, arg))
979         continue;
980       if (!gimple_assign_single_p (stmt))
981         return;
982
983       lhs = gimple_assign_lhs (stmt);
984       rhs = gimple_assign_rhs1 (stmt);
985
986       if (TREE_CODE (lhs) != COMPONENT_REF
987           || TREE_OPERAND (lhs, 0) != arg)
988         return;
989
990       fld = TREE_OPERAND (lhs, 1);
991       if (!method && fld == method_field)
992         {
993           rhs = get_ssa_def_if_simple_copy (rhs);
994           if (TREE_CODE (rhs) == ADDR_EXPR
995               && TREE_CODE (TREE_OPERAND (rhs, 0)) == FUNCTION_DECL
996               && TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 0))) == METHOD_TYPE)
997             {
998               method = TREE_OPERAND (rhs, 0);
999               if (delta)
1000                 {
1001                   fill_member_ptr_cst_jump_function (jfunc, rhs, delta);
1002                   return;
1003                 }
1004             }
1005           else
1006             return;
1007         }
1008
1009       if (!delta && fld == delta_field)
1010         {
1011           rhs = get_ssa_def_if_simple_copy (rhs);
1012           if (TREE_CODE (rhs) == INTEGER_CST)
1013             {
1014               delta = rhs;
1015               if (method)
1016                 {
1017                   fill_member_ptr_cst_jump_function (jfunc, rhs, delta);
1018                   return;
1019                 }
1020             }
1021           else
1022             return;
1023         }
1024     }
1025
1026   return;
1027 }
1028
1029 /* Go through the arguments of the CALL and for every member pointer within
1030    tries determine whether it is a constant.  If it is, create a corresponding
1031    constant jump function in FUNCTIONS which is an array of jump functions
1032    associated with the call.  */
1033
1034 static void
1035 compute_cst_member_ptr_arguments (struct ipa_jump_func *functions,
1036                                   gimple call)
1037 {
1038   unsigned num;
1039   tree arg, method_field, delta_field;
1040
1041   for (num = 0; num < gimple_call_num_args (call); num++)
1042     {
1043       arg = gimple_call_arg (call, num);
1044
1045       if (functions[num].type == IPA_JF_UNKNOWN
1046           && type_like_member_ptr_p (TREE_TYPE (arg), &method_field,
1047                                      &delta_field))
1048         determine_cst_member_ptr (call, arg, method_field, delta_field,
1049                                   &functions[num]);
1050     }
1051 }
1052
1053 /* Compute jump function for all arguments of callsite CS and insert the
1054    information in the jump_functions array in the ipa_edge_args corresponding
1055    to this callsite.  */
1056
1057 static void
1058 ipa_compute_jump_functions_for_edge (struct param_analysis_info *parms_info,
1059                                      struct cgraph_edge *cs)
1060 {
1061   struct ipa_node_params *info = IPA_NODE_REF (cs->caller);
1062   struct ipa_edge_args *arguments = IPA_EDGE_REF (cs);
1063   gimple call;
1064
1065   if (ipa_get_cs_argument_count (arguments) == 0 || arguments->jump_functions)
1066     return;
1067   arguments->jump_functions = ggc_alloc_cleared_vec_ipa_jump_func
1068     (ipa_get_cs_argument_count (arguments));
1069
1070   call = cs->call_stmt;
1071   gcc_assert (is_gimple_call (call));
1072
1073   /* We will deal with constants and SSA scalars first:  */
1074   compute_scalar_jump_functions (info, arguments->jump_functions, call);
1075
1076   /* Let's check whether there are any potential member pointers and if so,
1077      whether we can determine their functions as pass_through.  */
1078   if (!compute_pass_through_member_ptrs (info, parms_info,
1079                                          arguments->jump_functions, call))
1080     return;
1081
1082   /* Finally, let's check whether we actually pass a new constant member
1083      pointer here...  */
1084   compute_cst_member_ptr_arguments (arguments->jump_functions, call);
1085 }
1086
1087 /* Compute jump functions for all edges - both direct and indirect - outgoing
1088    from NODE.  Also count the actual arguments in the process.  */
1089
1090 static void
1091 ipa_compute_jump_functions (struct cgraph_node *node,
1092                             struct param_analysis_info *parms_info)
1093 {
1094   struct cgraph_edge *cs;
1095
1096   for (cs = node->callees; cs; cs = cs->next_callee)
1097     {
1098       /* We do not need to bother analyzing calls to unknown
1099          functions unless they may become known during lto/whopr.  */
1100       if (!cs->callee->analyzed && !flag_lto)
1101         continue;
1102       ipa_count_arguments (cs);
1103       /* If the descriptor of the callee is not initialized yet, we have to do
1104          it now. */
1105       if (cs->callee->analyzed)
1106         ipa_initialize_node_params (cs->callee);
1107       if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
1108           != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
1109         ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));
1110       ipa_compute_jump_functions_for_edge (parms_info, cs);
1111     }
1112
1113   for (cs = node->indirect_calls; cs; cs = cs->next_callee)
1114     {
1115       ipa_count_arguments (cs);
1116       ipa_compute_jump_functions_for_edge (parms_info, cs);
1117     }
1118 }
1119
1120 /* If RHS looks like a rhs of a statement loading pfn from a member
1121    pointer formal parameter, return the parameter, otherwise return
1122    NULL.  If USE_DELTA, then we look for a use of the delta field
1123    rather than the pfn.  */
1124
1125 static tree
1126 ipa_get_member_ptr_load_param (tree rhs, bool use_delta)
1127 {
1128   tree rec, ref_field, ref_offset, fld, fld_offset, ptr_field, delta_field;
1129
1130   if (TREE_CODE (rhs) == COMPONENT_REF)
1131     {
1132       ref_field = TREE_OPERAND (rhs, 1);
1133       rhs = TREE_OPERAND (rhs, 0);
1134     }
1135   else
1136     ref_field = NULL_TREE;
1137   if (TREE_CODE (rhs) != MEM_REF)
1138     return NULL_TREE;
1139   rec = TREE_OPERAND (rhs, 0);
1140   if (TREE_CODE (rec) != ADDR_EXPR)
1141     return NULL_TREE;
1142   rec = TREE_OPERAND (rec, 0);
1143   if (TREE_CODE (rec) != PARM_DECL
1144       || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, &delta_field))
1145     return NULL_TREE;
1146
1147   ref_offset = TREE_OPERAND (rhs, 1);
1148
1149   if (ref_field)
1150     {
1151       if (integer_nonzerop (ref_offset))
1152         return NULL_TREE;
1153
1154       if (use_delta)
1155         fld = delta_field;
1156       else
1157         fld = ptr_field;
1158
1159       return ref_field == fld ? rec : NULL_TREE;
1160     }
1161
1162   if (use_delta)
1163     fld_offset = byte_position (delta_field);
1164   else
1165     fld_offset = byte_position (ptr_field);
1166
1167   return tree_int_cst_equal (ref_offset, fld_offset) ? rec : NULL_TREE;
1168 }
1169
1170 /* If STMT looks like a statement loading a value from a member pointer formal
1171    parameter, this function returns that parameter.  */
1172
1173 static tree
1174 ipa_get_stmt_member_ptr_load_param (gimple stmt, bool use_delta)
1175 {
1176   tree rhs;
1177
1178   if (!gimple_assign_single_p (stmt))
1179     return NULL_TREE;
1180
1181   rhs = gimple_assign_rhs1 (stmt);
1182   return ipa_get_member_ptr_load_param (rhs, use_delta);
1183 }
1184
1185 /* Returns true iff T is an SSA_NAME defined by a statement.  */
1186
1187 static bool
1188 ipa_is_ssa_with_stmt_def (tree t)
1189 {
1190   if (TREE_CODE (t) == SSA_NAME
1191       && !SSA_NAME_IS_DEFAULT_DEF (t))
1192     return true;
1193   else
1194     return false;
1195 }
1196
1197 /* Find the indirect call graph edge corresponding to STMT and mark it as a
1198    call to a parameter number PARAM_INDEX.  NODE is the caller.  Return the
1199    indirect call graph edge.  */
1200
1201 static struct cgraph_edge *
1202 ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt)
1203 {
1204   struct cgraph_edge *cs;
1205
1206   cs = cgraph_edge (node, stmt);
1207   cs->indirect_info->param_index = param_index;
1208   cs->indirect_info->anc_offset = 0;
1209   cs->indirect_info->polymorphic = 0;
1210   return cs;
1211 }
1212
1213 /* Analyze the CALL and examine uses of formal parameters of the caller NODE
1214    (described by INFO).  PARMS_INFO is a pointer to a vector containing
1215    intermediate information about each formal parameter.  Currently it checks
1216    whether the call calls a pointer that is a formal parameter and if so, the
1217    parameter is marked with the called flag and an indirect call graph edge
1218    describing the call is created.  This is very simple for ordinary pointers
1219    represented in SSA but not-so-nice when it comes to member pointers.  The
1220    ugly part of this function does nothing more than trying to match the
1221    pattern of such a call.  An example of such a pattern is the gimple dump
1222    below, the call is on the last line:
1223
1224      <bb 2>:
1225        f$__delta_5 = f.__delta;
1226        f$__pfn_24 = f.__pfn;
1227
1228    or
1229      <bb 2>:
1230        f$__delta_5 = MEM[(struct  *)&f];
1231        f$__pfn_24 = MEM[(struct  *)&f + 4B];
1232
1233    and a few lines below:
1234
1235      <bb 5>
1236        D.2496_3 = (int) f$__pfn_24;
1237        D.2497_4 = D.2496_3 & 1;
1238        if (D.2497_4 != 0)
1239          goto <bb 3>;
1240        else
1241          goto <bb 4>;
1242
1243      <bb 6>:
1244        D.2500_7 = (unsigned int) f$__delta_5;
1245        D.2501_8 = &S + D.2500_7;
1246        D.2502_9 = (int (*__vtbl_ptr_type) (void) * *) D.2501_8;
1247        D.2503_10 = *D.2502_9;
1248        D.2504_12 = f$__pfn_24 + -1;
1249        D.2505_13 = (unsigned int) D.2504_12;
1250        D.2506_14 = D.2503_10 + D.2505_13;
1251        D.2507_15 = *D.2506_14;
1252        iftmp.11_16 = (String:: *) D.2507_15;
1253
1254      <bb 7>:
1255        # iftmp.11_1 = PHI <iftmp.11_16(3), f$__pfn_24(2)>
1256        D.2500_19 = (unsigned int) f$__delta_5;
1257        D.2508_20 = &S + D.2500_19;
1258        D.2493_21 = iftmp.11_1 (D.2508_20, 4);
1259
1260    Such patterns are results of simple calls to a member pointer:
1261
1262      int doprinting (int (MyString::* f)(int) const)
1263      {
1264        MyString S ("somestring");
1265
1266        return (S.*f)(4);
1267      }
1268 */
1269
1270 static void
1271 ipa_analyze_indirect_call_uses (struct cgraph_node *node,
1272                                 struct ipa_node_params *info,
1273                                 struct param_analysis_info *parms_info,
1274                                 gimple call, tree target)
1275 {
1276   gimple def;
1277   tree n1, n2;
1278   gimple d1, d2;
1279   tree rec, rec2, cond;
1280   gimple branch;
1281   int index;
1282   basic_block bb, virt_bb, join;
1283
1284   if (SSA_NAME_IS_DEFAULT_DEF (target))
1285     {
1286       tree var = SSA_NAME_VAR (target);
1287       index = ipa_get_param_decl_index (info, var);
1288       if (index >= 0)
1289         ipa_note_param_call (node, index, call);
1290       return;
1291     }
1292
1293   /* Now we need to try to match the complex pattern of calling a member
1294      pointer. */
1295
1296   if (!POINTER_TYPE_P (TREE_TYPE (target))
1297       || TREE_CODE (TREE_TYPE (TREE_TYPE (target))) != METHOD_TYPE)
1298     return;
1299
1300   def = SSA_NAME_DEF_STMT (target);
1301   if (gimple_code (def) != GIMPLE_PHI)
1302     return;
1303
1304   if (gimple_phi_num_args (def) != 2)
1305     return;
1306
1307   /* First, we need to check whether one of these is a load from a member
1308      pointer that is a parameter to this function. */
1309   n1 = PHI_ARG_DEF (def, 0);
1310   n2 = PHI_ARG_DEF (def, 1);
1311   if (!ipa_is_ssa_with_stmt_def (n1) || !ipa_is_ssa_with_stmt_def (n2))
1312     return;
1313   d1 = SSA_NAME_DEF_STMT (n1);
1314   d2 = SSA_NAME_DEF_STMT (n2);
1315
1316   join = gimple_bb (def);
1317   if ((rec = ipa_get_stmt_member_ptr_load_param (d1, false)))
1318     {
1319       if (ipa_get_stmt_member_ptr_load_param (d2, false))
1320         return;
1321
1322       bb = EDGE_PRED (join, 0)->src;
1323       virt_bb = gimple_bb (d2);
1324     }
1325   else if ((rec = ipa_get_stmt_member_ptr_load_param (d2, false)))
1326     {
1327       bb = EDGE_PRED (join, 1)->src;
1328       virt_bb = gimple_bb (d1);
1329     }
1330   else
1331     return;
1332
1333   /* Second, we need to check that the basic blocks are laid out in the way
1334      corresponding to the pattern. */
1335
1336   if (!single_pred_p (virt_bb) || !single_succ_p (virt_bb)
1337       || single_pred (virt_bb) != bb
1338       || single_succ (virt_bb) != join)
1339     return;
1340
1341   /* Third, let's see that the branching is done depending on the least
1342      significant bit of the pfn. */
1343
1344   branch = last_stmt (bb);
1345   if (!branch || gimple_code (branch) != GIMPLE_COND)
1346     return;
1347
1348   if (gimple_cond_code (branch) != NE_EXPR
1349       || !integer_zerop (gimple_cond_rhs (branch)))
1350     return;
1351
1352   cond = gimple_cond_lhs (branch);
1353   if (!ipa_is_ssa_with_stmt_def (cond))
1354     return;
1355
1356   def = SSA_NAME_DEF_STMT (cond);
1357   if (!is_gimple_assign (def)
1358       || gimple_assign_rhs_code (def) != BIT_AND_EXPR
1359       || !integer_onep (gimple_assign_rhs2 (def)))
1360     return;
1361
1362   cond = gimple_assign_rhs1 (def);
1363   if (!ipa_is_ssa_with_stmt_def (cond))
1364     return;
1365
1366   def = SSA_NAME_DEF_STMT (cond);
1367
1368   if (is_gimple_assign (def)
1369       && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
1370     {
1371       cond = gimple_assign_rhs1 (def);
1372       if (!ipa_is_ssa_with_stmt_def (cond))
1373         return;
1374       def = SSA_NAME_DEF_STMT (cond);
1375     }
1376
1377   rec2 = ipa_get_stmt_member_ptr_load_param (def,
1378                                              (TARGET_PTRMEMFUNC_VBIT_LOCATION
1379                                               == ptrmemfunc_vbit_in_delta));
1380
1381   if (rec != rec2)
1382     return;
1383
1384   index = ipa_get_param_decl_index (info, rec);
1385   if (index >= 0 && !is_parm_modified_before_call (&parms_info[index],
1386                                                    call, rec))
1387     ipa_note_param_call (node, index, call);
1388
1389   return;
1390 }
1391
1392 /* Analyze a CALL to an OBJ_TYPE_REF which is passed in TARGET and if the
1393    object referenced in the expression is a formal parameter of the caller
1394    (described by INFO), create a call note for the statement. */
1395
1396 static void
1397 ipa_analyze_virtual_call_uses (struct cgraph_node *node,
1398                                struct ipa_node_params *info, gimple call,
1399                                tree target)
1400 {
1401   struct cgraph_edge *cs;
1402   struct cgraph_indirect_call_info *ii;
1403   struct ipa_jump_func jfunc;
1404   tree obj = OBJ_TYPE_REF_OBJECT (target);
1405   int index;
1406   HOST_WIDE_INT anc_offset;
1407
1408   if (!flag_devirtualize)
1409     return;
1410
1411   if (TREE_CODE (obj) != SSA_NAME)
1412     return;
1413
1414   if (SSA_NAME_IS_DEFAULT_DEF (obj))
1415     {
1416       if (TREE_CODE (SSA_NAME_VAR (obj)) != PARM_DECL)
1417         return;
1418
1419       anc_offset = 0;
1420       index = ipa_get_param_decl_index (info, SSA_NAME_VAR (obj));
1421       gcc_assert (index >= 0);
1422       if (detect_type_change_ssa (obj, call, &jfunc))
1423         return;
1424     }
1425   else
1426     {
1427       gimple stmt = SSA_NAME_DEF_STMT (obj);
1428       tree expr;
1429
1430       expr = get_ancestor_addr_info (stmt, &obj, &anc_offset);
1431       if (!expr)
1432         return;
1433       index = ipa_get_param_decl_index (info,
1434                                         SSA_NAME_VAR (TREE_OPERAND (expr, 0)));
1435       gcc_assert (index >= 0);
1436       if (detect_type_change (obj, expr, call, &jfunc, anc_offset))
1437         return;
1438     }
1439
1440   cs = ipa_note_param_call (node, index, call);
1441   ii = cs->indirect_info;
1442   ii->anc_offset = anc_offset;
1443   ii->otr_token = tree_low_cst (OBJ_TYPE_REF_TOKEN (target), 1);
1444   ii->otr_type = TREE_TYPE (TREE_TYPE (OBJ_TYPE_REF_OBJECT (target)));
1445   ii->polymorphic = 1;
1446 }
1447
1448 /* Analyze a call statement CALL whether and how it utilizes formal parameters
1449    of the caller (described by INFO).  PARMS_INFO is a pointer to a vector
1450    containing intermediate information about each formal parameter.  */
1451
1452 static void
1453 ipa_analyze_call_uses (struct cgraph_node *node,
1454                        struct ipa_node_params *info,
1455                        struct param_analysis_info *parms_info, gimple call)
1456 {
1457   tree target = gimple_call_fn (call);
1458
1459   if (TREE_CODE (target) == SSA_NAME)
1460     ipa_analyze_indirect_call_uses (node, info, parms_info, call, target);
1461   else if (TREE_CODE (target) == OBJ_TYPE_REF)
1462     ipa_analyze_virtual_call_uses (node, info, call, target);
1463 }
1464
1465
1466 /* Analyze the call statement STMT with respect to formal parameters (described
1467    in INFO) of caller given by NODE.  Currently it only checks whether formal
1468    parameters are called.  PARMS_INFO is a pointer to a vector containing
1469    intermediate information about each formal parameter.  */
1470
1471 static void
1472 ipa_analyze_stmt_uses (struct cgraph_node *node, struct ipa_node_params *info,
1473                        struct param_analysis_info *parms_info, gimple stmt)
1474 {
1475   if (is_gimple_call (stmt))
1476     ipa_analyze_call_uses (node, info, parms_info, stmt);
1477 }
1478
1479 /* Callback of walk_stmt_load_store_addr_ops for the visit_load.
1480    If OP is a parameter declaration, mark it as used in the info structure
1481    passed in DATA.  */
1482
1483 static bool
1484 visit_ref_for_mod_analysis (gimple stmt ATTRIBUTE_UNUSED,
1485                              tree op, void *data)
1486 {
1487   struct ipa_node_params *info = (struct ipa_node_params *) data;
1488
1489   op = get_base_address (op);
1490   if (op
1491       && TREE_CODE (op) == PARM_DECL)
1492     {
1493       int index = ipa_get_param_decl_index (info, op);
1494       gcc_assert (index >= 0);
1495       info->params[index].used = true;
1496     }
1497
1498   return false;
1499 }
1500
1501 /* Scan the function body of NODE and inspect the uses of formal parameters.
1502    Store the findings in various structures of the associated ipa_node_params
1503    structure, such as parameter flags, notes etc.  PARMS_INFO is a pointer to a
1504    vector containing intermediate information about each formal parameter.   */
1505
1506 static void
1507 ipa_analyze_params_uses (struct cgraph_node *node,
1508                          struct param_analysis_info *parms_info)
1509 {
1510   tree decl = node->decl;
1511   basic_block bb;
1512   struct function *func;
1513   gimple_stmt_iterator gsi;
1514   struct ipa_node_params *info = IPA_NODE_REF (node);
1515   int i;
1516
1517   if (ipa_get_param_count (info) == 0 || info->uses_analysis_done)
1518     return;
1519
1520   for (i = 0; i < ipa_get_param_count (info); i++)
1521     {
1522       tree parm = ipa_get_param (info, i);
1523       /* For SSA regs see if parameter is used.  For non-SSA we compute
1524          the flag during modification analysis.  */
1525       if (is_gimple_reg (parm)
1526           && gimple_default_def (DECL_STRUCT_FUNCTION (node->decl), parm))
1527         info->params[i].used = true;
1528     }
1529
1530   func = DECL_STRUCT_FUNCTION (decl);
1531   FOR_EACH_BB_FN (bb, func)
1532     {
1533       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1534         {
1535           gimple stmt = gsi_stmt (gsi);
1536
1537           if (is_gimple_debug (stmt))
1538             continue;
1539
1540           ipa_analyze_stmt_uses (node, info, parms_info, stmt);
1541           walk_stmt_load_store_addr_ops (stmt, info,
1542                                          visit_ref_for_mod_analysis,
1543                                          visit_ref_for_mod_analysis,
1544                                          visit_ref_for_mod_analysis);
1545         }
1546       for (gsi = gsi_start (phi_nodes (bb)); !gsi_end_p (gsi); gsi_next (&gsi))
1547         walk_stmt_load_store_addr_ops (gsi_stmt (gsi), info,
1548                                        visit_ref_for_mod_analysis,
1549                                        visit_ref_for_mod_analysis,
1550                                        visit_ref_for_mod_analysis);
1551     }
1552
1553   info->uses_analysis_done = 1;
1554 }
1555
1556 /* Initialize the array describing properties of of formal parameters
1557    of NODE, analyze their uses and compute jump functions associated
1558    with actual arguments of calls from within NODE.  */
1559
1560 void
1561 ipa_analyze_node (struct cgraph_node *node)
1562 {
1563   struct ipa_node_params *info;
1564   struct param_analysis_info *parms_info;
1565   int i, param_count;
1566
1567   ipa_check_create_node_params ();
1568   ipa_check_create_edge_args ();
1569   info = IPA_NODE_REF (node);
1570   push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1571   current_function_decl = node->decl;
1572   ipa_initialize_node_params (node);
1573
1574   param_count = ipa_get_param_count (info);
1575   parms_info = XALLOCAVEC (struct param_analysis_info, param_count);
1576   memset (parms_info, 0, sizeof (struct param_analysis_info) * param_count);
1577
1578   ipa_analyze_params_uses (node, parms_info);
1579   ipa_compute_jump_functions (node, parms_info);
1580
1581   for (i = 0; i < param_count; i++)
1582     if (parms_info[i].visited_statements)
1583       BITMAP_FREE (parms_info[i].visited_statements);
1584
1585   current_function_decl = NULL;
1586   pop_cfun ();
1587 }
1588
1589
1590 /* Update the jump function DST when the call graph edge corresponding to SRC is
1591    is being inlined, knowing that DST is of type ancestor and src of known
1592    type.  */
1593
1594 static void
1595 combine_known_type_and_ancestor_jfs (struct ipa_jump_func *src,
1596                                      struct ipa_jump_func *dst)
1597 {
1598   tree new_binfo;
1599
1600   new_binfo = get_binfo_at_offset (src->value.base_binfo,
1601                                    dst->value.ancestor.offset,
1602                                    dst->value.ancestor.type);
1603   if (new_binfo)
1604     {
1605       dst->type = IPA_JF_KNOWN_TYPE;
1606       dst->value.base_binfo = new_binfo;
1607     }
1608   else
1609     dst->type = IPA_JF_UNKNOWN;
1610 }
1611
1612 /* Update the jump functions associated with call graph edge E when the call
1613    graph edge CS is being inlined, assuming that E->caller is already (possibly
1614    indirectly) inlined into CS->callee and that E has not been inlined.  */
1615
1616 static void
1617 update_jump_functions_after_inlining (struct cgraph_edge *cs,
1618                                       struct cgraph_edge *e)
1619 {
1620   struct ipa_edge_args *top = IPA_EDGE_REF (cs);
1621   struct ipa_edge_args *args = IPA_EDGE_REF (e);
1622   int count = ipa_get_cs_argument_count (args);
1623   int i;
1624
1625   for (i = 0; i < count; i++)
1626     {
1627       struct ipa_jump_func *dst = ipa_get_ith_jump_func (args, i);
1628
1629       if (dst->type == IPA_JF_ANCESTOR)
1630         {
1631           struct ipa_jump_func *src;
1632
1633           /* Variable number of arguments can cause havoc if we try to access
1634              one that does not exist in the inlined edge.  So make sure we
1635              don't.  */
1636           if (dst->value.ancestor.formal_id >= ipa_get_cs_argument_count (top))
1637             {
1638               dst->type = IPA_JF_UNKNOWN;
1639               continue;
1640             }
1641
1642           src = ipa_get_ith_jump_func (top, dst->value.ancestor.formal_id);
1643           if (src->type == IPA_JF_KNOWN_TYPE)
1644             combine_known_type_and_ancestor_jfs (src, dst);
1645           else if (src->type == IPA_JF_PASS_THROUGH
1646                    && src->value.pass_through.operation == NOP_EXPR)
1647             dst->value.ancestor.formal_id = src->value.pass_through.formal_id;
1648           else if (src->type == IPA_JF_ANCESTOR)
1649             {
1650               dst->value.ancestor.formal_id = src->value.ancestor.formal_id;
1651               dst->value.ancestor.offset += src->value.ancestor.offset;
1652             }
1653           else
1654             dst->type = IPA_JF_UNKNOWN;
1655         }
1656       else if (dst->type == IPA_JF_PASS_THROUGH)
1657         {
1658           struct ipa_jump_func *src;
1659           /* We must check range due to calls with variable number of arguments
1660              and we cannot combine jump functions with operations.  */
1661           if (dst->value.pass_through.operation == NOP_EXPR
1662               && (dst->value.pass_through.formal_id
1663                   < ipa_get_cs_argument_count (top)))
1664             {
1665               src = ipa_get_ith_jump_func (top,
1666                                            dst->value.pass_through.formal_id);
1667               *dst = *src;
1668             }
1669           else
1670             dst->type = IPA_JF_UNKNOWN;
1671         }
1672     }
1673 }
1674
1675 /* If TARGET is an addr_expr of a function declaration, make it the destination
1676    of an indirect edge IE and return the edge.  Otherwise, return NULL.  Delta,
1677    if non-NULL, is an integer constant that must be added to this pointer
1678    (first parameter).  */
1679
1680 struct cgraph_edge *
1681 ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target, tree delta)
1682 {
1683   struct cgraph_node *callee;
1684
1685   if (TREE_CODE (target) == ADDR_EXPR)
1686     target = TREE_OPERAND (target, 0);
1687   if (TREE_CODE (target) != FUNCTION_DECL)
1688     return NULL;
1689   callee = cgraph_get_node (target);
1690   if (!callee)
1691     return NULL;
1692   ipa_check_create_node_params ();
1693
1694   /* We can not make edges to inline clones.  It is bug that someone removed the cgraph
1695      node too early.  */
1696   gcc_assert (!callee->global.inlined_to);
1697
1698   cgraph_make_edge_direct (ie, callee, delta ? tree_low_cst (delta, 0) : 0);
1699   if (dump_file)
1700     {
1701       fprintf (dump_file, "ipa-prop: Discovered %s call to a known target "
1702                "(%s/%i -> %s/%i), for stmt ",
1703                ie->indirect_info->polymorphic ? "a virtual" : "an indirect",
1704                cgraph_node_name (ie->caller), ie->caller->uid,
1705                cgraph_node_name (ie->callee), ie->callee->uid);
1706       if (ie->call_stmt)
1707         print_gimple_stmt (dump_file, ie->call_stmt, 2, TDF_SLIM);
1708       else
1709         fprintf (dump_file, "with uid %i\n", ie->lto_stmt_uid);
1710
1711       if (delta)
1712         {
1713           fprintf (dump_file, "          Thunk delta is ");
1714           print_generic_expr (dump_file, delta, 0);
1715           fprintf (dump_file, "\n");
1716         }
1717     }
1718
1719   if (ipa_get_cs_argument_count (IPA_EDGE_REF (ie))
1720       != ipa_get_param_count (IPA_NODE_REF (callee)))
1721     ipa_set_called_with_variable_arg (IPA_NODE_REF (callee));
1722
1723   return ie;
1724 }
1725
1726 /* Try to find a destination for indirect edge IE that corresponds to a simple
1727    call or a call of a member function pointer and where the destination is a
1728    pointer formal parameter described by jump function JFUNC.  If it can be
1729    determined, return the newly direct edge, otherwise return NULL.  */
1730
1731 static struct cgraph_edge *
1732 try_make_edge_direct_simple_call (struct cgraph_edge *ie,
1733                                   struct ipa_jump_func *jfunc)
1734 {
1735   tree target;
1736
1737   if (jfunc->type == IPA_JF_CONST)
1738     target = jfunc->value.constant;
1739   else if (jfunc->type == IPA_JF_CONST_MEMBER_PTR)
1740     target = jfunc->value.member_cst.pfn;
1741   else
1742     return NULL;
1743
1744   return ipa_make_edge_direct_to_target (ie, target, NULL_TREE);
1745 }
1746
1747 /* Try to find a destination for indirect edge IE that corresponds to a
1748    virtual call based on a formal parameter which is described by jump
1749    function JFUNC and if it can be determined, make it direct and return the
1750    direct edge.  Otherwise, return NULL.  */
1751
1752 static struct cgraph_edge *
1753 try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
1754                                    struct ipa_jump_func *jfunc)
1755 {
1756   tree binfo, type, target, delta;
1757   HOST_WIDE_INT token;
1758
1759   if (jfunc->type == IPA_JF_KNOWN_TYPE)
1760     binfo = jfunc->value.base_binfo;
1761   else
1762     return NULL;
1763
1764   if (!binfo)
1765     return NULL;
1766
1767   token = ie->indirect_info->otr_token;
1768   type = ie->indirect_info->otr_type;
1769   binfo = get_binfo_at_offset (binfo, ie->indirect_info->anc_offset, type);
1770   if (binfo)
1771     target = gimple_get_virt_method_for_binfo (token, binfo, &delta, true);
1772   else
1773     return NULL;
1774
1775   if (target)
1776     return ipa_make_edge_direct_to_target (ie, target, delta);
1777   else
1778     return NULL;
1779 }
1780
1781 /* Update the param called notes associated with NODE when CS is being inlined,
1782    assuming NODE is (potentially indirectly) inlined into CS->callee.
1783    Moreover, if the callee is discovered to be constant, create a new cgraph
1784    edge for it.  Newly discovered indirect edges will be added to *NEW_EDGES,
1785    unless NEW_EDGES is NULL.  Return true iff a new edge(s) were created.  */
1786
1787 static bool
1788 update_indirect_edges_after_inlining (struct cgraph_edge *cs,
1789                                       struct cgraph_node *node,
1790                                       VEC (cgraph_edge_p, heap) **new_edges)
1791 {
1792   struct ipa_edge_args *top;
1793   struct cgraph_edge *ie, *next_ie, *new_direct_edge;
1794   bool res = false;
1795
1796   ipa_check_create_edge_args ();
1797   top = IPA_EDGE_REF (cs);
1798
1799   for (ie = node->indirect_calls; ie; ie = next_ie)
1800     {
1801       struct cgraph_indirect_call_info *ici = ie->indirect_info;
1802       struct ipa_jump_func *jfunc;
1803
1804       next_ie = ie->next_callee;
1805       if (bitmap_bit_p (iinlining_processed_edges, ie->uid))
1806         continue;
1807
1808       /* If we ever use indirect edges for anything other than indirect
1809          inlining, we will need to skip those with negative param_indices. */
1810       if (ici->param_index == -1)
1811         continue;
1812
1813       /* We must check range due to calls with variable number of arguments:  */
1814       if (ici->param_index >= ipa_get_cs_argument_count (top))
1815         {
1816           bitmap_set_bit (iinlining_processed_edges, ie->uid);
1817           continue;
1818         }
1819
1820       jfunc = ipa_get_ith_jump_func (top, ici->param_index);
1821       if (jfunc->type == IPA_JF_PASS_THROUGH
1822           && jfunc->value.pass_through.operation == NOP_EXPR)
1823         ici->param_index = jfunc->value.pass_through.formal_id;
1824       else if (jfunc->type == IPA_JF_ANCESTOR)
1825         {
1826           ici->param_index = jfunc->value.ancestor.formal_id;
1827           ici->anc_offset += jfunc->value.ancestor.offset;
1828         }
1829       else
1830         /* Either we can find a destination for this edge now or never. */
1831         bitmap_set_bit (iinlining_processed_edges, ie->uid);
1832
1833       if (ici->polymorphic)
1834         new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc);
1835       else
1836         new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc);
1837
1838       if (new_direct_edge)
1839         {
1840           new_direct_edge->indirect_inlining_edge = 1;
1841           if (new_edges)
1842             {
1843               VEC_safe_push (cgraph_edge_p, heap, *new_edges,
1844                              new_direct_edge);
1845               top = IPA_EDGE_REF (cs);
1846               res = true;
1847             }
1848         }
1849     }
1850
1851   return res;
1852 }
1853
1854 /* Recursively traverse subtree of NODE (including node) made of inlined
1855    cgraph_edges when CS has been inlined and invoke
1856    update_indirect_edges_after_inlining on all nodes and
1857    update_jump_functions_after_inlining on all non-inlined edges that lead out
1858    of this subtree.  Newly discovered indirect edges will be added to
1859    *NEW_EDGES, unless NEW_EDGES is NULL.  Return true iff a new edge(s) were
1860    created.  */
1861
1862 static bool
1863 propagate_info_to_inlined_callees (struct cgraph_edge *cs,
1864                                    struct cgraph_node *node,
1865                                    VEC (cgraph_edge_p, heap) **new_edges)
1866 {
1867   struct cgraph_edge *e;
1868   bool res;
1869
1870   res = update_indirect_edges_after_inlining (cs, node, new_edges);
1871
1872   for (e = node->callees; e; e = e->next_callee)
1873     if (!e->inline_failed)
1874       res |= propagate_info_to_inlined_callees (cs, e->callee, new_edges);
1875     else
1876       update_jump_functions_after_inlining (cs, e);
1877
1878   return res;
1879 }
1880
1881 /* Update jump functions and call note functions on inlining the call site CS.
1882    CS is expected to lead to a node already cloned by
1883    cgraph_clone_inline_nodes.  Newly discovered indirect edges will be added to
1884    *NEW_EDGES, unless NEW_EDGES is NULL.  Return true iff a new edge(s) were +
1885    created.  */
1886
1887 bool
1888 ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
1889                                    VEC (cgraph_edge_p, heap) **new_edges)
1890 {
1891   /* FIXME lto: We do not stream out indirect call information.  */
1892   if (flag_wpa)
1893     return false;
1894
1895   /* Do nothing if the preparation phase has not been carried out yet
1896      (i.e. during early inlining).  */
1897   if (!ipa_node_params_vector)
1898     return false;
1899   gcc_assert (ipa_edge_args_vector);
1900
1901   return propagate_info_to_inlined_callees (cs, cs->callee, new_edges);
1902 }
1903
1904 /* Frees all dynamically allocated structures that the argument info points
1905    to.  */
1906
1907 void
1908 ipa_free_edge_args_substructures (struct ipa_edge_args *args)
1909 {
1910   if (args->jump_functions)
1911     ggc_free (args->jump_functions);
1912
1913   memset (args, 0, sizeof (*args));
1914 }
1915
1916 /* Free all ipa_edge structures.  */
1917
1918 void
1919 ipa_free_all_edge_args (void)
1920 {
1921   int i;
1922   struct ipa_edge_args *args;
1923
1924   FOR_EACH_VEC_ELT (ipa_edge_args_t, ipa_edge_args_vector, i, args)
1925     ipa_free_edge_args_substructures (args);
1926
1927   VEC_free (ipa_edge_args_t, gc, ipa_edge_args_vector);
1928   ipa_edge_args_vector = NULL;
1929 }
1930
1931 /* Frees all dynamically allocated structures that the param info points
1932    to.  */
1933
1934 void
1935 ipa_free_node_params_substructures (struct ipa_node_params *info)
1936 {
1937   if (info->params)
1938     free (info->params);
1939
1940   memset (info, 0, sizeof (*info));
1941 }
1942
1943 /* Free all ipa_node_params structures.  */
1944
1945 void
1946 ipa_free_all_node_params (void)
1947 {
1948   int i;
1949   struct ipa_node_params *info;
1950
1951   FOR_EACH_VEC_ELT (ipa_node_params_t, ipa_node_params_vector, i, info)
1952     ipa_free_node_params_substructures (info);
1953
1954   VEC_free (ipa_node_params_t, heap, ipa_node_params_vector);
1955   ipa_node_params_vector = NULL;
1956 }
1957
1958 /* Hook that is called by cgraph.c when an edge is removed.  */
1959
1960 static void
1961 ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
1962 {
1963   /* During IPA-CP updating we can be called on not-yet analyze clones.  */
1964   if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector)
1965       <= (unsigned)cs->uid)
1966     return;
1967   ipa_free_edge_args_substructures (IPA_EDGE_REF (cs));
1968 }
1969
1970 /* Hook that is called by cgraph.c when a node is removed.  */
1971
1972 static void
1973 ipa_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
1974 {
1975   /* During IPA-CP updating we can be called on not-yet analyze clones.  */
1976   if (VEC_length (ipa_node_params_t, ipa_node_params_vector)
1977       <= (unsigned)node->uid)
1978     return;
1979   ipa_free_node_params_substructures (IPA_NODE_REF (node));
1980 }
1981
1982 /* Helper function to duplicate an array of size N that is at SRC and store a
1983    pointer to it to DST.  Nothing is done if SRC is NULL.  */
1984
1985 static void *
1986 duplicate_array (void *src, size_t n)
1987 {
1988   void *p;
1989
1990   if (!src)
1991     return NULL;
1992
1993   p = xmalloc (n);
1994   memcpy (p, src, n);
1995   return p;
1996 }
1997
1998 static struct ipa_jump_func *
1999 duplicate_ipa_jump_func_array (const struct ipa_jump_func * src, size_t n)
2000 {
2001   struct ipa_jump_func *p;
2002
2003   if (!src)
2004     return NULL;
2005
2006   p = ggc_alloc_vec_ipa_jump_func (n);
2007   memcpy (p, src, n * sizeof (struct ipa_jump_func));
2008   return p;
2009 }
2010
2011 /* Hook that is called by cgraph.c when a node is duplicated.  */
2012
2013 static void
2014 ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
2015                            __attribute__((unused)) void *data)
2016 {
2017   struct ipa_edge_args *old_args, *new_args;
2018   int arg_count;
2019
2020   ipa_check_create_edge_args ();
2021
2022   old_args = IPA_EDGE_REF (src);
2023   new_args = IPA_EDGE_REF (dst);
2024
2025   arg_count = ipa_get_cs_argument_count (old_args);
2026   ipa_set_cs_argument_count (new_args, arg_count);
2027   new_args->jump_functions =
2028     duplicate_ipa_jump_func_array (old_args->jump_functions, arg_count);
2029
2030   if (iinlining_processed_edges
2031       && bitmap_bit_p (iinlining_processed_edges, src->uid))
2032     bitmap_set_bit (iinlining_processed_edges, dst->uid);
2033 }
2034
2035 /* Hook that is called by cgraph.c when a node is duplicated.  */
2036
2037 static void
2038 ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
2039                            ATTRIBUTE_UNUSED void *data)
2040 {
2041   struct ipa_node_params *old_info, *new_info;
2042   int param_count, i;
2043
2044   ipa_check_create_node_params ();
2045   old_info = IPA_NODE_REF (src);
2046   new_info = IPA_NODE_REF (dst);
2047   param_count = ipa_get_param_count (old_info);
2048
2049   ipa_set_param_count (new_info, param_count);
2050   new_info->params = (struct ipa_param_descriptor *)
2051     duplicate_array (old_info->params,
2052                      sizeof (struct ipa_param_descriptor) * param_count);
2053   for (i = 0; i < param_count; i++)
2054     new_info->params[i].types = VEC_copy (tree, heap,
2055                                           old_info->params[i].types);
2056   new_info->ipcp_orig_node = old_info->ipcp_orig_node;
2057   new_info->count_scale = old_info->count_scale;
2058
2059   new_info->called_with_var_arguments = old_info->called_with_var_arguments;
2060   new_info->uses_analysis_done = old_info->uses_analysis_done;
2061   new_info->node_enqueued = old_info->node_enqueued;
2062 }
2063
2064 /* Register our cgraph hooks if they are not already there.  */
2065
2066 void
2067 ipa_register_cgraph_hooks (void)
2068 {
2069   if (!edge_removal_hook_holder)
2070     edge_removal_hook_holder =
2071       cgraph_add_edge_removal_hook (&ipa_edge_removal_hook, NULL);
2072   if (!node_removal_hook_holder)
2073     node_removal_hook_holder =
2074       cgraph_add_node_removal_hook (&ipa_node_removal_hook, NULL);
2075   if (!edge_duplication_hook_holder)
2076     edge_duplication_hook_holder =
2077       cgraph_add_edge_duplication_hook (&ipa_edge_duplication_hook, NULL);
2078   if (!node_duplication_hook_holder)
2079     node_duplication_hook_holder =
2080       cgraph_add_node_duplication_hook (&ipa_node_duplication_hook, NULL);
2081 }
2082
2083 /* Unregister our cgraph hooks if they are not already there.  */
2084
2085 static void
2086 ipa_unregister_cgraph_hooks (void)
2087 {
2088   cgraph_remove_edge_removal_hook (edge_removal_hook_holder);
2089   edge_removal_hook_holder = NULL;
2090   cgraph_remove_node_removal_hook (node_removal_hook_holder);
2091   node_removal_hook_holder = NULL;
2092   cgraph_remove_edge_duplication_hook (edge_duplication_hook_holder);
2093   edge_duplication_hook_holder = NULL;
2094   cgraph_remove_node_duplication_hook (node_duplication_hook_holder);
2095   node_duplication_hook_holder = NULL;
2096 }
2097
2098 /* Allocate all necessary data structures necessary for indirect inlining.  */
2099
2100 void
2101 ipa_create_all_structures_for_iinln (void)
2102 {
2103   iinlining_processed_edges = BITMAP_ALLOC (NULL);
2104 }
2105
2106 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
2107    longer needed after ipa-cp.  */
2108
2109 void
2110 ipa_free_all_structures_after_ipa_cp (void)
2111 {
2112   if (!flag_indirect_inlining)
2113     {
2114       ipa_free_all_edge_args ();
2115       ipa_free_all_node_params ();
2116       ipa_unregister_cgraph_hooks ();
2117     }
2118 }
2119
2120 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
2121    longer needed after indirect inlining.  */
2122
2123 void
2124 ipa_free_all_structures_after_iinln (void)
2125 {
2126   BITMAP_FREE (iinlining_processed_edges);
2127
2128   ipa_free_all_edge_args ();
2129   ipa_free_all_node_params ();
2130   ipa_unregister_cgraph_hooks ();
2131 }
2132
2133 /* Print ipa_tree_map data structures of all functions in the
2134    callgraph to F.  */
2135
2136 void
2137 ipa_print_node_params (FILE * f, struct cgraph_node *node)
2138 {
2139   int i, count;
2140   tree temp;
2141   struct ipa_node_params *info;
2142
2143   if (!node->analyzed)
2144     return;
2145   info = IPA_NODE_REF (node);
2146   fprintf (f, "  function  %s parameter descriptors:\n",
2147            cgraph_node_name (node));
2148   count = ipa_get_param_count (info);
2149   for (i = 0; i < count; i++)
2150     {
2151       temp = ipa_get_param (info, i);
2152       if (TREE_CODE (temp) == PARM_DECL)
2153         fprintf (f, "    param %d : %s", i,
2154                  (DECL_NAME (temp)
2155                   ? (*lang_hooks.decl_printable_name) (temp, 2)
2156                   : "(unnamed)"));
2157       if (ipa_is_param_used (info, i))
2158         fprintf (f, " used");
2159       fprintf (f, "\n");
2160     }
2161 }
2162
2163 /* Print ipa_tree_map data structures of all functions in the
2164    callgraph to F.  */
2165
2166 void
2167 ipa_print_all_params (FILE * f)
2168 {
2169   struct cgraph_node *node;
2170
2171   fprintf (f, "\nFunction parameters:\n");
2172   for (node = cgraph_nodes; node; node = node->next)
2173     ipa_print_node_params (f, node);
2174 }
2175
2176 /* Return a heap allocated vector containing formal parameters of FNDECL.  */
2177
2178 VEC(tree, heap) *
2179 ipa_get_vector_of_formal_parms (tree fndecl)
2180 {
2181   VEC(tree, heap) *args;
2182   int count;
2183   tree parm;
2184
2185   count = count_formal_params_1 (fndecl);
2186   args = VEC_alloc (tree, heap, count);
2187   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
2188     VEC_quick_push (tree, args, parm);
2189
2190   return args;
2191 }
2192
2193 /* Return a heap allocated vector containing types of formal parameters of
2194    function type FNTYPE.  */
2195
2196 static inline VEC(tree, heap) *
2197 get_vector_of_formal_parm_types (tree fntype)
2198 {
2199   VEC(tree, heap) *types;
2200   int count = 0;
2201   tree t;
2202
2203   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
2204     count++;
2205
2206   types = VEC_alloc (tree, heap, count);
2207   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
2208     VEC_quick_push (tree, types, TREE_VALUE (t));
2209
2210   return types;
2211 }
2212
2213 /* Modify the function declaration FNDECL and its type according to the plan in
2214    ADJUSTMENTS.  It also sets base fields of individual adjustments structures
2215    to reflect the actual parameters being modified which are determined by the
2216    base_index field.  */
2217
2218 void
2219 ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
2220                               const char *synth_parm_prefix)
2221 {
2222   VEC(tree, heap) *oparms, *otypes;
2223   tree orig_type, new_type = NULL;
2224   tree old_arg_types, t, new_arg_types = NULL;
2225   tree parm, *link = &DECL_ARGUMENTS (fndecl);
2226   int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
2227   tree new_reversed = NULL;
2228   bool care_for_types, last_parm_void;
2229
2230   if (!synth_parm_prefix)
2231     synth_parm_prefix = "SYNTH";
2232
2233   oparms = ipa_get_vector_of_formal_parms (fndecl);
2234   orig_type = TREE_TYPE (fndecl);
2235   old_arg_types = TYPE_ARG_TYPES (orig_type);
2236
2237   /* The following test is an ugly hack, some functions simply don't have any
2238      arguments in their type.  This is probably a bug but well... */
2239   care_for_types = (old_arg_types != NULL_TREE);
2240   if (care_for_types)
2241     {
2242       last_parm_void = (TREE_VALUE (tree_last (old_arg_types))
2243                         == void_type_node);
2244       otypes = get_vector_of_formal_parm_types (orig_type);
2245       if (last_parm_void)
2246         gcc_assert (VEC_length (tree, oparms) + 1 == VEC_length (tree, otypes));
2247       else
2248         gcc_assert (VEC_length (tree, oparms) == VEC_length (tree, otypes));
2249     }
2250   else
2251     {
2252       last_parm_void = false;
2253       otypes = NULL;
2254     }
2255
2256   for (i = 0; i < len; i++)
2257     {
2258       struct ipa_parm_adjustment *adj;
2259       gcc_assert (link);
2260
2261       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2262       parm = VEC_index (tree, oparms, adj->base_index);
2263       adj->base = parm;
2264
2265       if (adj->copy_param)
2266         {
2267           if (care_for_types)
2268             new_arg_types = tree_cons (NULL_TREE, VEC_index (tree, otypes,
2269                                                              adj->base_index),
2270                                        new_arg_types);
2271           *link = parm;
2272           link = &DECL_CHAIN (parm);
2273         }
2274       else if (!adj->remove_param)
2275         {
2276           tree new_parm;
2277           tree ptype;
2278
2279           if (adj->by_ref)
2280             ptype = build_pointer_type (adj->type);
2281           else
2282             ptype = adj->type;
2283
2284           if (care_for_types)
2285             new_arg_types = tree_cons (NULL_TREE, ptype, new_arg_types);
2286
2287           new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
2288                                  ptype);
2289           DECL_NAME (new_parm) = create_tmp_var_name (synth_parm_prefix);
2290
2291           DECL_ARTIFICIAL (new_parm) = 1;
2292           DECL_ARG_TYPE (new_parm) = ptype;
2293           DECL_CONTEXT (new_parm) = fndecl;
2294           TREE_USED (new_parm) = 1;
2295           DECL_IGNORED_P (new_parm) = 1;
2296           layout_decl (new_parm, 0);
2297
2298           add_referenced_var (new_parm);
2299           mark_sym_for_renaming (new_parm);
2300           adj->base = parm;
2301           adj->reduction = new_parm;
2302
2303           *link = new_parm;
2304
2305           link = &DECL_CHAIN (new_parm);
2306         }
2307     }
2308
2309   *link = NULL_TREE;
2310
2311   if (care_for_types)
2312     {
2313       new_reversed = nreverse (new_arg_types);
2314       if (last_parm_void)
2315         {
2316           if (new_reversed)
2317             TREE_CHAIN (new_arg_types) = void_list_node;
2318           else
2319             new_reversed = void_list_node;
2320         }
2321     }
2322
2323   /* Use copy_node to preserve as much as possible from original type
2324      (debug info, attribute lists etc.)
2325      Exception is METHOD_TYPEs must have THIS argument.
2326      When we are asked to remove it, we need to build new FUNCTION_TYPE
2327      instead.  */
2328   if (TREE_CODE (orig_type) != METHOD_TYPE
2329        || (VEC_index (ipa_parm_adjustment_t, adjustments, 0)->copy_param
2330          && VEC_index (ipa_parm_adjustment_t, adjustments, 0)->base_index == 0))
2331     {
2332       new_type = build_distinct_type_copy (orig_type);
2333       TYPE_ARG_TYPES (new_type) = new_reversed;
2334     }
2335   else
2336     {
2337       new_type
2338         = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
2339                                                          new_reversed));
2340       TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
2341       DECL_VINDEX (fndecl) = NULL_TREE;
2342     }
2343
2344   /* When signature changes, we need to clear builtin info.  */
2345   if (DECL_BUILT_IN (fndecl))
2346     {
2347       DECL_BUILT_IN_CLASS (fndecl) = NOT_BUILT_IN;
2348       DECL_FUNCTION_CODE (fndecl) = (enum built_in_function) 0;
2349     }
2350
2351   /* This is a new type, not a copy of an old type.  Need to reassociate
2352      variants.  We can handle everything except the main variant lazily.  */
2353   t = TYPE_MAIN_VARIANT (orig_type);
2354   if (orig_type != t)
2355     {
2356       TYPE_MAIN_VARIANT (new_type) = t;
2357       TYPE_NEXT_VARIANT (new_type) = TYPE_NEXT_VARIANT (t);
2358       TYPE_NEXT_VARIANT (t) = new_type;
2359     }
2360   else
2361     {
2362       TYPE_MAIN_VARIANT (new_type) = new_type;
2363       TYPE_NEXT_VARIANT (new_type) = NULL;
2364     }
2365
2366   TREE_TYPE (fndecl) = new_type;
2367   DECL_VIRTUAL_P (fndecl) = 0;
2368   if (otypes)
2369     VEC_free (tree, heap, otypes);
2370   VEC_free (tree, heap, oparms);
2371 }
2372
2373 /* Modify actual arguments of a function call CS as indicated in ADJUSTMENTS.
2374    If this is a directly recursive call, CS must be NULL.  Otherwise it must
2375    contain the corresponding call graph edge.  */
2376
2377 void
2378 ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
2379                            ipa_parm_adjustment_vec adjustments)
2380 {
2381   VEC(tree, heap) *vargs;
2382   gimple new_stmt;
2383   gimple_stmt_iterator gsi;
2384   tree callee_decl;
2385   int i, len;
2386
2387   len = VEC_length (ipa_parm_adjustment_t, adjustments);
2388   vargs = VEC_alloc (tree, heap, len);
2389
2390   gsi = gsi_for_stmt (stmt);
2391   for (i = 0; i < len; i++)
2392     {
2393       struct ipa_parm_adjustment *adj;
2394
2395       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2396
2397       if (adj->copy_param)
2398         {
2399           tree arg = gimple_call_arg (stmt, adj->base_index);
2400
2401           VEC_quick_push (tree, vargs, arg);
2402         }
2403       else if (!adj->remove_param)
2404         {
2405           tree expr, base, off;
2406           location_t loc;
2407
2408           /* We create a new parameter out of the value of the old one, we can
2409              do the following kind of transformations:
2410
2411              - A scalar passed by reference is converted to a scalar passed by
2412                value.  (adj->by_ref is false and the type of the original
2413                actual argument is a pointer to a scalar).
2414
2415              - A part of an aggregate is passed instead of the whole aggregate.
2416                The part can be passed either by value or by reference, this is
2417                determined by value of adj->by_ref.  Moreover, the code below
2418                handles both situations when the original aggregate is passed by
2419                value (its type is not a pointer) and when it is passed by
2420                reference (it is a pointer to an aggregate).
2421
2422              When the new argument is passed by reference (adj->by_ref is true)
2423              it must be a part of an aggregate and therefore we form it by
2424              simply taking the address of a reference inside the original
2425              aggregate.  */
2426
2427           gcc_checking_assert (adj->offset % BITS_PER_UNIT == 0);
2428           base = gimple_call_arg (stmt, adj->base_index);
2429           loc = EXPR_LOCATION (base);
2430
2431           if (TREE_CODE (base) != ADDR_EXPR
2432               && POINTER_TYPE_P (TREE_TYPE (base)))
2433             off = build_int_cst (adj->alias_ptr_type,
2434                                  adj->offset / BITS_PER_UNIT);
2435           else
2436             {
2437               HOST_WIDE_INT base_offset;
2438               tree prev_base;
2439
2440               if (TREE_CODE (base) == ADDR_EXPR)
2441                 base = TREE_OPERAND (base, 0);
2442               prev_base = base;
2443               base = get_addr_base_and_unit_offset (base, &base_offset);
2444               /* Aggregate arguments can have non-invariant addresses.  */
2445               if (!base)
2446                 {
2447                   base = build_fold_addr_expr (prev_base);
2448                   off = build_int_cst (adj->alias_ptr_type,
2449                                        adj->offset / BITS_PER_UNIT);
2450                 }
2451               else if (TREE_CODE (base) == MEM_REF)
2452                 {
2453                   off = build_int_cst (adj->alias_ptr_type,
2454                                        base_offset
2455                                        + adj->offset / BITS_PER_UNIT);
2456                   off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
2457                                          off, 0);
2458                   base = TREE_OPERAND (base, 0);
2459                 }
2460               else
2461                 {
2462                   off = build_int_cst (adj->alias_ptr_type,
2463                                        base_offset
2464                                        + adj->offset / BITS_PER_UNIT);
2465                   base = build_fold_addr_expr (base);
2466                 }
2467             }
2468
2469           expr = fold_build2_loc (loc, MEM_REF, adj->type, base, off);
2470           if (adj->by_ref)
2471             expr = build_fold_addr_expr (expr);
2472
2473           expr = force_gimple_operand_gsi (&gsi, expr,
2474                                            adj->by_ref
2475                                            || is_gimple_reg_type (adj->type),
2476                                            NULL, true, GSI_SAME_STMT);
2477           VEC_quick_push (tree, vargs, expr);
2478         }
2479     }
2480
2481   if (dump_file && (dump_flags & TDF_DETAILS))
2482     {
2483       fprintf (dump_file, "replacing stmt:");
2484       print_gimple_stmt (dump_file, gsi_stmt (gsi), 0, 0);
2485     }
2486
2487   callee_decl = !cs ? gimple_call_fndecl (stmt) : cs->callee->decl;
2488   new_stmt = gimple_build_call_vec (callee_decl, vargs);
2489   VEC_free (tree, heap, vargs);
2490   if (gimple_call_lhs (stmt))
2491     gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
2492
2493   gimple_set_block (new_stmt, gimple_block (stmt));
2494   if (gimple_has_location (stmt))
2495     gimple_set_location (new_stmt, gimple_location (stmt));
2496   gimple_call_copy_flags (new_stmt, stmt);
2497   gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
2498
2499   if (dump_file && (dump_flags & TDF_DETAILS))
2500     {
2501       fprintf (dump_file, "with stmt:");
2502       print_gimple_stmt (dump_file, new_stmt, 0, 0);
2503       fprintf (dump_file, "\n");
2504     }
2505   gsi_replace (&gsi, new_stmt, true);
2506   if (cs)
2507     cgraph_set_call_stmt (cs, new_stmt);
2508   update_ssa (TODO_update_ssa);
2509   free_dominance_info (CDI_DOMINATORS);
2510 }
2511
2512 /* Return true iff BASE_INDEX is in ADJUSTMENTS more than once.  */
2513
2514 static bool
2515 index_in_adjustments_multiple_times_p (int base_index,
2516                                        ipa_parm_adjustment_vec adjustments)
2517 {
2518   int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
2519   bool one = false;
2520
2521   for (i = 0; i < len; i++)
2522     {
2523       struct ipa_parm_adjustment *adj;
2524       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2525
2526       if (adj->base_index == base_index)
2527         {
2528           if (one)
2529             return true;
2530           else
2531             one = true;
2532         }
2533     }
2534   return false;
2535 }
2536
2537
2538 /* Return adjustments that should have the same effect on function parameters
2539    and call arguments as if they were first changed according to adjustments in
2540    INNER and then by adjustments in OUTER.  */
2541
2542 ipa_parm_adjustment_vec
2543 ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
2544                          ipa_parm_adjustment_vec outer)
2545 {
2546   int i, outlen = VEC_length (ipa_parm_adjustment_t, outer);
2547   int inlen = VEC_length (ipa_parm_adjustment_t, inner);
2548   int removals = 0;
2549   ipa_parm_adjustment_vec adjustments, tmp;
2550
2551   tmp = VEC_alloc (ipa_parm_adjustment_t, heap, inlen);
2552   for (i = 0; i < inlen; i++)
2553     {
2554       struct ipa_parm_adjustment *n;
2555       n = VEC_index (ipa_parm_adjustment_t, inner, i);
2556
2557       if (n->remove_param)
2558         removals++;
2559       else
2560         VEC_quick_push (ipa_parm_adjustment_t, tmp, n);
2561     }
2562
2563   adjustments = VEC_alloc (ipa_parm_adjustment_t, heap, outlen + removals);
2564   for (i = 0; i < outlen; i++)
2565     {
2566       struct ipa_parm_adjustment *r;
2567       struct ipa_parm_adjustment *out = VEC_index (ipa_parm_adjustment_t,
2568                                                    outer, i);
2569       struct ipa_parm_adjustment *in = VEC_index (ipa_parm_adjustment_t, tmp,
2570                                                   out->base_index);
2571
2572       gcc_assert (!in->remove_param);
2573       if (out->remove_param)
2574         {
2575           if (!index_in_adjustments_multiple_times_p (in->base_index, tmp))
2576             {
2577               r = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
2578               memset (r, 0, sizeof (*r));
2579               r->remove_param = true;
2580             }
2581           continue;
2582         }
2583
2584       r = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
2585       memset (r, 0, sizeof (*r));
2586       r->base_index = in->base_index;
2587       r->type = out->type;
2588
2589       /* FIXME:  Create nonlocal value too.  */
2590
2591       if (in->copy_param && out->copy_param)
2592         r->copy_param = true;
2593       else if (in->copy_param)
2594         r->offset = out->offset;
2595       else if (out->copy_param)
2596         r->offset = in->offset;
2597       else
2598         r->offset = in->offset + out->offset;
2599     }
2600
2601   for (i = 0; i < inlen; i++)
2602     {
2603       struct ipa_parm_adjustment *n = VEC_index (ipa_parm_adjustment_t,
2604                                                  inner, i);
2605
2606       if (n->remove_param)
2607         VEC_quick_push (ipa_parm_adjustment_t, adjustments, n);
2608     }
2609
2610   VEC_free (ipa_parm_adjustment_t, heap, tmp);
2611   return adjustments;
2612 }
2613
2614 /* Dump the adjustments in the vector ADJUSTMENTS to dump_file in a human
2615    friendly way, assuming they are meant to be applied to FNDECL.  */
2616
2617 void
2618 ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
2619                             tree fndecl)
2620 {
2621   int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
2622   bool first = true;
2623   VEC(tree, heap) *parms = ipa_get_vector_of_formal_parms (fndecl);
2624
2625   fprintf (file, "IPA param adjustments: ");
2626   for (i = 0; i < len; i++)
2627     {
2628       struct ipa_parm_adjustment *adj;
2629       adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2630
2631       if (!first)
2632         fprintf (file, "                 ");
2633       else
2634         first = false;
2635
2636       fprintf (file, "%i. base_index: %i - ", i, adj->base_index);
2637       print_generic_expr (file, VEC_index (tree, parms, adj->base_index), 0);
2638       if (adj->base)
2639         {
2640           fprintf (file, ", base: ");
2641           print_generic_expr (file, adj->base, 0);
2642         }
2643       if (adj->reduction)
2644         {
2645           fprintf (file, ", reduction: ");
2646           print_generic_expr (file, adj->reduction, 0);
2647         }
2648       if (adj->new_ssa_base)
2649         {
2650           fprintf (file, ", new_ssa_base: ");
2651           print_generic_expr (file, adj->new_ssa_base, 0);
2652         }
2653
2654       if (adj->copy_param)
2655         fprintf (file, ", copy_param");
2656       else if (adj->remove_param)
2657         fprintf (file, ", remove_param");
2658       else
2659         fprintf (file, ", offset %li", (long) adj->offset);
2660       if (adj->by_ref)
2661         fprintf (file, ", by_ref");
2662       print_node_brief (file, ", type: ", adj->type, 0);
2663       fprintf (file, "\n");
2664     }
2665   VEC_free (tree, heap, parms);
2666 }
2667
2668 /* Stream out jump function JUMP_FUNC to OB.  */
2669
2670 static void
2671 ipa_write_jump_function (struct output_block *ob,
2672                          struct ipa_jump_func *jump_func)
2673 {
2674   lto_output_uleb128_stream (ob->main_stream,
2675                              jump_func->type);
2676
2677   switch (jump_func->type)
2678     {
2679     case IPA_JF_UNKNOWN:
2680       break;
2681     case IPA_JF_KNOWN_TYPE:
2682       lto_output_tree (ob, jump_func->value.base_binfo, true);
2683       break;
2684     case IPA_JF_CONST:
2685       lto_output_tree (ob, jump_func->value.constant, true);
2686       break;
2687     case IPA_JF_PASS_THROUGH:
2688       lto_output_tree (ob, jump_func->value.pass_through.operand, true);
2689       lto_output_uleb128_stream (ob->main_stream,
2690                                  jump_func->value.pass_through.formal_id);
2691       lto_output_uleb128_stream (ob->main_stream,
2692                                  jump_func->value.pass_through.operation);
2693       break;
2694     case IPA_JF_ANCESTOR:
2695       lto_output_uleb128_stream (ob->main_stream,
2696                                  jump_func->value.ancestor.offset);
2697       lto_output_tree (ob, jump_func->value.ancestor.type, true);
2698       lto_output_uleb128_stream (ob->main_stream,
2699                                  jump_func->value.ancestor.formal_id);
2700       break;
2701     case IPA_JF_CONST_MEMBER_PTR:
2702       lto_output_tree (ob, jump_func->value.member_cst.pfn, true);
2703       lto_output_tree (ob, jump_func->value.member_cst.delta, false);
2704       break;
2705     }
2706 }
2707
2708 /* Read in jump function JUMP_FUNC from IB.  */
2709
2710 static void
2711 ipa_read_jump_function (struct lto_input_block *ib,
2712                         struct ipa_jump_func *jump_func,
2713                         struct data_in *data_in)
2714 {
2715   jump_func->type = (enum jump_func_type) lto_input_uleb128 (ib);
2716
2717   switch (jump_func->type)
2718     {
2719     case IPA_JF_UNKNOWN:
2720       break;
2721     case IPA_JF_KNOWN_TYPE:
2722       jump_func->value.base_binfo = lto_input_tree (ib, data_in);
2723       break;
2724     case IPA_JF_CONST:
2725       jump_func->value.constant = lto_input_tree (ib, data_in);
2726       break;
2727     case IPA_JF_PASS_THROUGH:
2728       jump_func->value.pass_through.operand = lto_input_tree (ib, data_in);
2729       jump_func->value.pass_through.formal_id = lto_input_uleb128 (ib);
2730       jump_func->value.pass_through.operation = (enum tree_code) lto_input_uleb128 (ib);
2731       break;
2732     case IPA_JF_ANCESTOR:
2733       jump_func->value.ancestor.offset = lto_input_uleb128 (ib);
2734       jump_func->value.ancestor.type = lto_input_tree (ib, data_in);
2735       jump_func->value.ancestor.formal_id = lto_input_uleb128 (ib);
2736       break;
2737     case IPA_JF_CONST_MEMBER_PTR:
2738       jump_func->value.member_cst.pfn = lto_input_tree (ib, data_in);
2739       jump_func->value.member_cst.delta = lto_input_tree (ib, data_in);
2740       break;
2741     }
2742 }
2743
2744 /* Stream out parts of cgraph_indirect_call_info corresponding to CS that are
2745    relevant to indirect inlining to OB.  */
2746
2747 static void
2748 ipa_write_indirect_edge_info (struct output_block *ob,
2749                               struct cgraph_edge *cs)
2750 {
2751   struct cgraph_indirect_call_info *ii = cs->indirect_info;
2752   struct bitpack_d bp;
2753
2754   lto_output_sleb128_stream (ob->main_stream, ii->param_index);
2755   lto_output_sleb128_stream (ob->main_stream, ii->anc_offset);
2756   bp = bitpack_create (ob->main_stream);
2757   bp_pack_value (&bp, ii->polymorphic, 1);
2758   lto_output_bitpack (&bp);
2759
2760   if (ii->polymorphic)
2761     {
2762       lto_output_sleb128_stream (ob->main_stream, ii->otr_token);
2763       lto_output_tree (ob, ii->otr_type, true);
2764     }
2765 }
2766
2767 /* Read in parts of cgraph_indirect_call_info corresponding to CS that are
2768    relevant to indirect inlining from IB.  */
2769
2770 static void
2771 ipa_read_indirect_edge_info (struct lto_input_block *ib,
2772                              struct data_in *data_in ATTRIBUTE_UNUSED,
2773                              struct cgraph_edge *cs)
2774 {
2775   struct cgraph_indirect_call_info *ii = cs->indirect_info;
2776   struct bitpack_d bp;
2777
2778   ii->param_index = (int) lto_input_sleb128 (ib);
2779   ii->anc_offset = (HOST_WIDE_INT) lto_input_sleb128 (ib);
2780   bp = lto_input_bitpack (ib);
2781   ii->polymorphic = bp_unpack_value (&bp, 1);
2782   if (ii->polymorphic)
2783     {
2784       ii->otr_token = (HOST_WIDE_INT) lto_input_sleb128 (ib);
2785       ii->otr_type = lto_input_tree (ib, data_in);
2786     }
2787 }
2788
2789 /* Stream out NODE info to OB.  */
2790
2791 static void
2792 ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
2793 {
2794   int node_ref;
2795   lto_cgraph_encoder_t encoder;
2796   struct ipa_node_params *info = IPA_NODE_REF (node);
2797   int j;
2798   struct cgraph_edge *e;
2799   struct bitpack_d bp;
2800
2801   encoder = ob->decl_state->cgraph_node_encoder;
2802   node_ref = lto_cgraph_encoder_encode (encoder, node);
2803   lto_output_uleb128_stream (ob->main_stream, node_ref);
2804
2805   bp = bitpack_create (ob->main_stream);
2806   bp_pack_value (&bp, info->called_with_var_arguments, 1);
2807   gcc_assert (info->uses_analysis_done
2808               || ipa_get_param_count (info) == 0);
2809   gcc_assert (!info->node_enqueued);
2810   gcc_assert (!info->ipcp_orig_node);
2811   for (j = 0; j < ipa_get_param_count (info); j++)
2812     bp_pack_value (&bp, info->params[j].used, 1);
2813   lto_output_bitpack (&bp);
2814   for (e = node->callees; e; e = e->next_callee)
2815     {
2816       struct ipa_edge_args *args = IPA_EDGE_REF (e);
2817
2818       lto_output_uleb128_stream (ob->main_stream,
2819                                  ipa_get_cs_argument_count (args));
2820       for (j = 0; j < ipa_get_cs_argument_count (args); j++)
2821         ipa_write_jump_function (ob, ipa_get_ith_jump_func (args, j));
2822     }
2823   for (e = node->indirect_calls; e; e = e->next_callee)
2824     ipa_write_indirect_edge_info (ob, e);
2825 }
2826
2827 /* Stream in NODE info from IB.  */
2828
2829 static void
2830 ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
2831                     struct data_in *data_in)
2832 {
2833   struct ipa_node_params *info = IPA_NODE_REF (node);
2834   int k;
2835   struct cgraph_edge *e;
2836   struct bitpack_d bp;
2837
2838   ipa_initialize_node_params (node);
2839
2840   bp = lto_input_bitpack (ib);
2841   info->called_with_var_arguments = bp_unpack_value (&bp, 1);
2842   if (ipa_get_param_count (info) != 0)
2843     info->uses_analysis_done = true;
2844   info->node_enqueued = false;
2845   for (k = 0; k < ipa_get_param_count (info); k++)
2846     info->params[k].used = bp_unpack_value (&bp, 1);
2847   for (e = node->callees; e; e = e->next_callee)
2848     {
2849       struct ipa_edge_args *args = IPA_EDGE_REF (e);
2850       int count = lto_input_uleb128 (ib);
2851
2852       ipa_set_cs_argument_count (args, count);
2853       if (!count)
2854         continue;
2855
2856       args->jump_functions = ggc_alloc_cleared_vec_ipa_jump_func
2857         (ipa_get_cs_argument_count (args));
2858       for (k = 0; k < ipa_get_cs_argument_count (args); k++)
2859         ipa_read_jump_function (ib, ipa_get_ith_jump_func (args, k), data_in);
2860     }
2861   for (e = node->indirect_calls; e; e = e->next_callee)
2862     ipa_read_indirect_edge_info (ib, data_in, e);
2863 }
2864
2865 /* Write jump functions for nodes in SET.  */
2866
2867 void
2868 ipa_prop_write_jump_functions (cgraph_node_set set)
2869 {
2870   struct cgraph_node *node;
2871   struct output_block *ob = create_output_block (LTO_section_jump_functions);
2872   unsigned int count = 0;
2873   cgraph_node_set_iterator csi;
2874
2875   ob->cgraph_node = NULL;
2876
2877   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
2878     {
2879       node = csi_node (csi);
2880       if (node->analyzed && IPA_NODE_REF (node) != NULL)
2881         count++;
2882     }
2883
2884   lto_output_uleb128_stream (ob->main_stream, count);
2885
2886   /* Process all of the functions.  */
2887   for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
2888     {
2889       node = csi_node (csi);
2890       if (node->analyzed && IPA_NODE_REF (node) != NULL)
2891         ipa_write_node_info (ob, node);
2892     }
2893   lto_output_1_stream (ob->main_stream, 0);
2894   produce_asm (ob, NULL);
2895   destroy_output_block (ob);
2896 }
2897
2898 /* Read section in file FILE_DATA of length LEN with data DATA.  */
2899
2900 static void
2901 ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
2902                        size_t len)
2903 {
2904   const struct lto_function_header *header =
2905     (const struct lto_function_header *) data;
2906   const int32_t cfg_offset = sizeof (struct lto_function_header);
2907   const int32_t main_offset = cfg_offset + header->cfg_size;
2908   const int32_t string_offset = main_offset + header->main_size;
2909   struct data_in *data_in;
2910   struct lto_input_block ib_main;
2911   unsigned int i;
2912   unsigned int count;
2913
2914   LTO_INIT_INPUT_BLOCK (ib_main, (const char *) data + main_offset, 0,
2915                         header->main_size);
2916
2917   data_in =
2918     lto_data_in_create (file_data, (const char *) data + string_offset,
2919                         header->string_size, NULL);
2920   count = lto_input_uleb128 (&ib_main);
2921
2922   for (i = 0; i < count; i++)
2923     {
2924       unsigned int index;
2925       struct cgraph_node *node;
2926       lto_cgraph_encoder_t encoder;
2927
2928       index = lto_input_uleb128 (&ib_main);
2929       encoder = file_data->cgraph_node_encoder;
2930       node = lto_cgraph_encoder_deref (encoder, index);
2931       gcc_assert (node->analyzed);
2932       ipa_read_node_info (&ib_main, node, data_in);
2933     }
2934   lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data,
2935                          len);
2936   lto_data_in_delete (data_in);
2937 }
2938
2939 /* Read ipcp jump functions.  */
2940
2941 void
2942 ipa_prop_read_jump_functions (void)
2943 {
2944   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2945   struct lto_file_decl_data *file_data;
2946   unsigned int j = 0;
2947
2948   ipa_check_create_node_params ();
2949   ipa_check_create_edge_args ();
2950   ipa_register_cgraph_hooks ();
2951
2952   while ((file_data = file_data_vec[j++]))
2953     {
2954       size_t len;
2955       const char *data = lto_get_section_data (file_data, LTO_section_jump_functions, NULL, &len);
2956
2957       if (data)
2958         ipa_prop_read_section (file_data, data, len);
2959     }
2960 }
2961
2962 /* After merging units, we can get mismatch in argument counts.
2963    Also decl merging might've rendered parameter lists obsolete.
2964    Also compute called_with_variable_arg info.  */
2965
2966 void
2967 ipa_update_after_lto_read (void)
2968 {
2969   struct cgraph_node *node;
2970   struct cgraph_edge *cs;
2971
2972   ipa_check_create_node_params ();
2973   ipa_check_create_edge_args ();
2974
2975   for (node = cgraph_nodes; node; node = node->next)
2976     if (node->analyzed)
2977       ipa_initialize_node_params (node);
2978
2979   for (node = cgraph_nodes; node; node = node->next)
2980     if (node->analyzed)
2981       for (cs = node->callees; cs; cs = cs->next_callee)
2982         {
2983           if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
2984               != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
2985             ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));
2986         }
2987 }