OSDN Git Service

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