Imported Upstream version 4.8.1
[platform/upstream/gcc48.git] / gcc / ipa-prop.c
1 /* Interprocedural analyses.
2    Copyright (C) 2005-2013 Free Software Foundation, Inc.
3
4 This file is part of GCC.
5
6 GCC is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14 for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with GCC; see the file COPYING3.  If not see
18 <http://www.gnu.org/licenses/>.  */
19
20 #include "config.h"
21 #include "system.h"
22 #include "coretypes.h"
23 #include "tree.h"
24 #include "langhooks.h"
25 #include "ggc.h"
26 #include "target.h"
27 #include "cgraph.h"
28 #include "ipa-prop.h"
29 #include "tree-flow.h"
30 #include "tree-pass.h"
31 #include "tree-inline.h"
32 #include "ipa-inline.h"
33 #include "gimple.h"
34 #include "flags.h"
35 #include "diagnostic.h"
36 #include "gimple-pretty-print.h"
37 #include "lto-streamer.h"
38 #include "data-streamer.h"
39 #include "tree-streamer.h"
40 #include "params.h"
41
42 /* Intermediate information about a parameter that is only useful during the
43    run of ipa_analyze_node and is not kept afterwards.  */
44
45 struct param_analysis_info
46 {
47   bool parm_modified, ref_modified, pt_modified;
48   bitmap parm_visited_statements, pt_visited_statements;
49 };
50
51 /* Vector where the parameter infos are actually stored. */
52 vec<ipa_node_params_t> ipa_node_params_vector;
53 /* Vector of known aggregate values in cloned nodes.  */
54 vec<ipa_agg_replacement_value_p, va_gc> *ipa_node_agg_replacements;
55 /* Vector where the parameter infos are actually stored. */
56 vec<ipa_edge_args_t, va_gc> *ipa_edge_args_vector;
57
58 /* Holders of ipa cgraph hooks: */
59 static struct cgraph_edge_hook_list *edge_removal_hook_holder;
60 static struct cgraph_node_hook_list *node_removal_hook_holder;
61 static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
62 static struct cgraph_2node_hook_list *node_duplication_hook_holder;
63 static struct cgraph_node_hook_list *function_insertion_hook_holder;
64
65 /* Return index of the formal whose tree is PTREE in function which corresponds
66    to INFO.  */
67
68 static int
69 ipa_get_param_decl_index_1 (vec<ipa_param_descriptor_t> descriptors, tree ptree)
70 {
71   int i, count;
72
73   count = descriptors.length ();
74   for (i = 0; i < count; i++)
75     if (descriptors[i].decl == ptree)
76       return i;
77
78   return -1;
79 }
80
81 /* Return index of the formal whose tree is PTREE in function which corresponds
82    to INFO.  */
83
84 int
85 ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
86 {
87   return ipa_get_param_decl_index_1 (info->descriptors, ptree);
88 }
89
90 /* Populate the param_decl field in parameter DESCRIPTORS that correspond to
91    NODE.  */
92
93 static void
94 ipa_populate_param_decls (struct cgraph_node *node,
95                           vec<ipa_param_descriptor_t> &descriptors)
96 {
97   tree fndecl;
98   tree fnargs;
99   tree parm;
100   int param_num;
101
102   fndecl = node->symbol.decl;
103   fnargs = DECL_ARGUMENTS (fndecl);
104   param_num = 0;
105   for (parm = fnargs; parm; parm = DECL_CHAIN (parm))
106     {
107       descriptors[param_num].decl = parm;
108       param_num++;
109     }
110 }
111
112 /* Return how many formal parameters FNDECL has.  */
113
114 static inline int
115 count_formal_params (tree fndecl)
116 {
117   tree parm;
118   int count = 0;
119
120   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
121     count++;
122
123   return count;
124 }
125
126 /* Initialize the ipa_node_params structure associated with NODE by counting
127    the function parameters, creating the descriptors and populating their
128    param_decls.  */
129
130 void
131 ipa_initialize_node_params (struct cgraph_node *node)
132 {
133   struct ipa_node_params *info = IPA_NODE_REF (node);
134
135   if (!info->descriptors.exists ())
136     {
137       int param_count;
138
139       param_count = count_formal_params (node->symbol.decl);
140       if (param_count)
141         {
142           info->descriptors.safe_grow_cleared (param_count);
143           ipa_populate_param_decls (node, info->descriptors);
144         }
145     }
146 }
147
148 /* Print the jump functions associated with call graph edge CS to file F.  */
149
150 static void
151 ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
152 {
153   int i, count;
154
155   count = ipa_get_cs_argument_count (IPA_EDGE_REF (cs));
156   for (i = 0; i < count; i++)
157     {
158       struct ipa_jump_func *jump_func;
159       enum jump_func_type type;
160
161       jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
162       type = jump_func->type;
163
164       fprintf (f, "       param %d: ", i);
165       if (type == IPA_JF_UNKNOWN)
166         fprintf (f, "UNKNOWN\n");
167       else if (type == IPA_JF_KNOWN_TYPE)
168         {
169           fprintf (f, "KNOWN TYPE: base  ");
170           print_generic_expr (f, jump_func->value.known_type.base_type, 0);
171           fprintf (f, ", offset "HOST_WIDE_INT_PRINT_DEC", component ",
172                    jump_func->value.known_type.offset);
173           print_generic_expr (f, jump_func->value.known_type.component_type, 0);
174           fprintf (f, "\n");
175         }
176       else if (type == IPA_JF_CONST)
177         {
178           tree val = jump_func->value.constant;
179           fprintf (f, "CONST: ");
180           print_generic_expr (f, val, 0);
181           if (TREE_CODE (val) == ADDR_EXPR
182               && TREE_CODE (TREE_OPERAND (val, 0)) == CONST_DECL)
183             {
184               fprintf (f, " -> ");
185               print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (val, 0)),
186                                   0);
187             }
188           fprintf (f, "\n");
189         }
190       else if (type == IPA_JF_PASS_THROUGH)
191         {
192           fprintf (f, "PASS THROUGH: ");
193           fprintf (f, "%d, op %s",
194                    jump_func->value.pass_through.formal_id,
195                    tree_code_name[(int)
196                                   jump_func->value.pass_through.operation]);
197           if (jump_func->value.pass_through.operation != NOP_EXPR)
198             {
199               fprintf (f, " ");
200               print_generic_expr (f,
201                                   jump_func->value.pass_through.operand, 0);
202             }
203           if (jump_func->value.pass_through.agg_preserved)
204             fprintf (f, ", agg_preserved");
205           fprintf (f, "\n");
206         }
207       else if (type == IPA_JF_ANCESTOR)
208         {
209           fprintf (f, "ANCESTOR: ");
210           fprintf (f, "%d, offset "HOST_WIDE_INT_PRINT_DEC", ",
211                    jump_func->value.ancestor.formal_id,
212                    jump_func->value.ancestor.offset);
213           print_generic_expr (f, jump_func->value.ancestor.type, 0);
214           if (jump_func->value.ancestor.agg_preserved)
215             fprintf (f, ", agg_preserved");
216           fprintf (f, "\n");
217         }
218
219       if (jump_func->agg.items)
220         {
221           struct ipa_agg_jf_item *item;
222           int j;
223
224           fprintf (f, "         Aggregate passed by %s:\n",
225                    jump_func->agg.by_ref ? "reference" : "value");
226           FOR_EACH_VEC_SAFE_ELT (jump_func->agg.items, j, item)
227             {
228               fprintf (f, "           offset: " HOST_WIDE_INT_PRINT_DEC ", ",
229                        item->offset);
230               if (TYPE_P (item->value))
231                 fprintf (f, "clobber of " HOST_WIDE_INT_PRINT_DEC " bits",
232                          tree_low_cst (TYPE_SIZE (item->value), 1));
233               else
234                 {
235                   fprintf (f, "cst: ");
236                   print_generic_expr (f, item->value, 0);
237                 }
238               fprintf (f, "\n");
239             }
240         }
241     }
242 }
243
244
245 /* Print the jump functions of all arguments on all call graph edges going from
246    NODE to file F.  */
247
248 void
249 ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
250 {
251   struct cgraph_edge *cs;
252   int i;
253
254   fprintf (f, "  Jump functions of caller  %s:\n", cgraph_node_name (node));
255   for (cs = node->callees; cs; cs = cs->next_callee)
256     {
257       if (!ipa_edge_args_info_available_for_edge_p (cs))
258         continue;
259
260       fprintf (f, "    callsite  %s/%i -> %s/%i : \n",
261                xstrdup (cgraph_node_name (node)), node->uid,
262                xstrdup (cgraph_node_name (cs->callee)), cs->callee->uid);
263       ipa_print_node_jump_functions_for_edge (f, cs);
264     }
265
266   for (cs = node->indirect_calls, i = 0; cs; cs = cs->next_callee, i++)
267     {
268       if (!ipa_edge_args_info_available_for_edge_p (cs))
269         continue;
270
271       if (cs->call_stmt)
272         {
273           fprintf (f, "    indirect callsite %d for stmt ", i);
274           print_gimple_stmt (f, cs->call_stmt, 0, TDF_SLIM);
275         }
276       else
277         fprintf (f, "    indirect callsite %d :\n", i);
278       ipa_print_node_jump_functions_for_edge (f, cs);
279
280     }
281 }
282
283 /* Print ipa_jump_func data structures of all nodes in the call graph to F.  */
284
285 void
286 ipa_print_all_jump_functions (FILE *f)
287 {
288   struct cgraph_node *node;
289
290   fprintf (f, "\nJump functions:\n");
291   FOR_EACH_FUNCTION (node)
292     {
293       ipa_print_node_jump_functions (f, node);
294     }
295 }
296
297 /* Set JFUNC to be a known type jump function.  */
298
299 static void
300 ipa_set_jf_known_type (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
301                        tree base_type, tree component_type)
302 {
303   jfunc->type = IPA_JF_KNOWN_TYPE;
304   jfunc->value.known_type.offset = offset,
305   jfunc->value.known_type.base_type = base_type;
306   jfunc->value.known_type.component_type = component_type;
307 }
308
309 /* Set JFUNC to be a constant jmp function.  */
310
311 static void
312 ipa_set_jf_constant (struct ipa_jump_func *jfunc, tree constant)
313 {
314   constant = unshare_expr (constant);
315   if (constant && EXPR_P (constant))
316     SET_EXPR_LOCATION (constant, UNKNOWN_LOCATION);
317   jfunc->type = IPA_JF_CONST;
318   jfunc->value.constant = unshare_expr_without_location (constant);
319 }
320
321 /* Set JFUNC to be a simple pass-through jump function.  */
322 static void
323 ipa_set_jf_simple_pass_through (struct ipa_jump_func *jfunc, int formal_id,
324                                 bool agg_preserved)
325 {
326   jfunc->type = IPA_JF_PASS_THROUGH;
327   jfunc->value.pass_through.operand = NULL_TREE;
328   jfunc->value.pass_through.formal_id = formal_id;
329   jfunc->value.pass_through.operation = NOP_EXPR;
330   jfunc->value.pass_through.agg_preserved = agg_preserved;
331 }
332
333 /* Set JFUNC to be an arithmetic pass through jump function.  */
334
335 static void
336 ipa_set_jf_arith_pass_through (struct ipa_jump_func *jfunc, int formal_id,
337                                tree operand, enum tree_code operation)
338 {
339   jfunc->type = IPA_JF_PASS_THROUGH;
340   jfunc->value.pass_through.operand = unshare_expr_without_location (operand);
341   jfunc->value.pass_through.formal_id = formal_id;
342   jfunc->value.pass_through.operation = operation;
343   jfunc->value.pass_through.agg_preserved = false;
344 }
345
346 /* Set JFUNC to be an ancestor jump function.  */
347
348 static void
349 ipa_set_ancestor_jf (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
350                      tree type, int formal_id, bool agg_preserved)
351 {
352   jfunc->type = IPA_JF_ANCESTOR;
353   jfunc->value.ancestor.formal_id = formal_id;
354   jfunc->value.ancestor.offset = offset;
355   jfunc->value.ancestor.type = type;
356   jfunc->value.ancestor.agg_preserved = agg_preserved;
357 }
358
359 /* Structure to be passed in between detect_type_change and
360    check_stmt_for_type_change.  */
361
362 struct type_change_info
363 {
364   /* Offset into the object where there is the virtual method pointer we are
365      looking for.  */
366   HOST_WIDE_INT offset;
367   /* The declaration or SSA_NAME pointer of the base that we are checking for
368      type change.  */
369   tree object;
370   /* If we actually can tell the type that the object has changed to, it is
371      stored in this field.  Otherwise it remains NULL_TREE.  */
372   tree known_current_type;
373   /* Set to true if dynamic type change has been detected.  */
374   bool type_maybe_changed;
375   /* Set to true if multiple types have been encountered.  known_current_type
376      must be disregarded in that case.  */
377   bool multiple_types_encountered;
378 };
379
380 /* Return true if STMT can modify a virtual method table pointer.
381
382    This function makes special assumptions about both constructors and
383    destructors which are all the functions that are allowed to alter the VMT
384    pointers.  It assumes that destructors begin with assignment into all VMT
385    pointers and that constructors essentially look in the following way:
386
387    1) The very first thing they do is that they call constructors of ancestor
388    sub-objects that have them.
389
390    2) Then VMT pointers of this and all its ancestors is set to new values
391    corresponding to the type corresponding to the constructor.
392
393    3) Only afterwards, other stuff such as constructor of member sub-objects
394    and the code written by the user is run.  Only this may include calling
395    virtual functions, directly or indirectly.
396
397    There is no way to call a constructor of an ancestor sub-object in any
398    other way.
399
400    This means that we do not have to care whether constructors get the correct
401    type information because they will always change it (in fact, if we define
402    the type to be given by the VMT pointer, it is undefined).
403
404    The most important fact to derive from the above is that if, for some
405    statement in the section 3, we try to detect whether the dynamic type has
406    changed, we can safely ignore all calls as we examine the function body
407    backwards until we reach statements in section 2 because these calls cannot
408    be ancestor constructors or destructors (if the input is not bogus) and so
409    do not change the dynamic type (this holds true only for automatically
410    allocated objects but at the moment we devirtualize only these).  We then
411    must detect that statements in section 2 change the dynamic type and can try
412    to derive the new type.  That is enough and we can stop, we will never see
413    the calls into constructors of sub-objects in this code.  Therefore we can
414    safely ignore all call statements that we traverse.
415   */
416
417 static bool
418 stmt_may_be_vtbl_ptr_store (gimple stmt)
419 {
420   if (is_gimple_call (stmt))
421     return false;
422   else if (is_gimple_assign (stmt))
423     {
424       tree lhs = gimple_assign_lhs (stmt);
425
426       if (!AGGREGATE_TYPE_P (TREE_TYPE (lhs)))
427         {
428           if (flag_strict_aliasing
429               && !POINTER_TYPE_P (TREE_TYPE (lhs)))
430             return false;
431
432           if (TREE_CODE (lhs) == COMPONENT_REF
433               && !DECL_VIRTUAL_P (TREE_OPERAND (lhs, 1)))
434             return false;
435           /* In the future we might want to use get_base_ref_and_offset to find
436              if there is a field corresponding to the offset and if so, proceed
437              almost like if it was a component ref.  */
438         }
439     }
440   return true;
441 }
442
443 /* If STMT can be proved to be an assignment to the virtual method table
444    pointer of ANALYZED_OBJ and the type associated with the new table
445    identified, return the type.  Otherwise return NULL_TREE.  */
446
447 static tree
448 extr_type_from_vtbl_ptr_store (gimple stmt, struct type_change_info *tci)
449 {
450   HOST_WIDE_INT offset, size, max_size;
451   tree lhs, rhs, base;
452
453   if (!gimple_assign_single_p (stmt))
454     return NULL_TREE;
455
456   lhs = gimple_assign_lhs (stmt);
457   rhs = gimple_assign_rhs1 (stmt);
458   if (TREE_CODE (lhs) != COMPONENT_REF
459       || !DECL_VIRTUAL_P (TREE_OPERAND (lhs, 1))
460       || TREE_CODE (rhs) != ADDR_EXPR)
461     return NULL_TREE;
462   rhs = get_base_address (TREE_OPERAND (rhs, 0));
463   if (!rhs
464       || TREE_CODE (rhs) != VAR_DECL
465       || !DECL_VIRTUAL_P (rhs))
466     return NULL_TREE;
467
468   base = get_ref_base_and_extent (lhs, &offset, &size, &max_size);
469   if (offset != tci->offset
470       || size != POINTER_SIZE
471       || max_size != POINTER_SIZE)
472     return NULL_TREE;
473   if (TREE_CODE (base) == MEM_REF)
474     {
475       if (TREE_CODE (tci->object) != MEM_REF
476           || TREE_OPERAND (tci->object, 0) != TREE_OPERAND (base, 0)
477           || !tree_int_cst_equal (TREE_OPERAND (tci->object, 1),
478                                   TREE_OPERAND (base, 1)))
479         return NULL_TREE;
480     }
481   else if (tci->object != base)
482     return NULL_TREE;
483
484   return DECL_CONTEXT (rhs);
485 }
486
487 /* Callback of walk_aliased_vdefs and a helper function for
488    detect_type_change to check whether a particular statement may modify
489    the virtual table pointer, and if possible also determine the new type of
490    the (sub-)object.  It stores its result into DATA, which points to a
491    type_change_info structure.  */
492
493 static bool
494 check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
495 {
496   gimple stmt = SSA_NAME_DEF_STMT (vdef);
497   struct type_change_info *tci = (struct type_change_info *) data;
498
499   if (stmt_may_be_vtbl_ptr_store (stmt))
500     {
501       tree type;
502       type = extr_type_from_vtbl_ptr_store (stmt, tci);
503       if (tci->type_maybe_changed
504           && type != tci->known_current_type)
505         tci->multiple_types_encountered = true;
506       tci->known_current_type = type;
507       tci->type_maybe_changed = true;
508       return true;
509     }
510   else
511     return false;
512 }
513
514
515
516 /* Like detect_type_change but with extra argument COMP_TYPE which will become
517    the component type part of new JFUNC of dynamic type change is detected and
518    the new base type is identified.  */
519
520 static bool
521 detect_type_change_1 (tree arg, tree base, tree comp_type, gimple call,
522                       struct ipa_jump_func *jfunc, HOST_WIDE_INT offset)
523 {
524   struct type_change_info tci;
525   ao_ref ao;
526
527   gcc_checking_assert (DECL_P (arg)
528                        || TREE_CODE (arg) == MEM_REF
529                        || handled_component_p (arg));
530   /* Const calls cannot call virtual methods through VMT and so type changes do
531      not matter.  */
532   if (!flag_devirtualize || !gimple_vuse (call))
533     return false;
534
535   ao_ref_init (&ao, arg);
536   ao.base = base;
537   ao.offset = offset;
538   ao.size = POINTER_SIZE;
539   ao.max_size = ao.size;
540
541   tci.offset = offset;
542   tci.object = get_base_address (arg);
543   tci.known_current_type = NULL_TREE;
544   tci.type_maybe_changed = false;
545   tci.multiple_types_encountered = false;
546
547   walk_aliased_vdefs (&ao, gimple_vuse (call), check_stmt_for_type_change,
548                       &tci, NULL);
549   if (!tci.type_maybe_changed)
550     return false;
551
552   if (!tci.known_current_type
553       || tci.multiple_types_encountered
554       || offset != 0)
555     jfunc->type = IPA_JF_UNKNOWN;
556   else
557     ipa_set_jf_known_type (jfunc, 0, tci.known_current_type, comp_type);
558
559   return true;
560 }
561
562 /* Detect whether the dynamic type of ARG has changed (before callsite CALL) by
563    looking for assignments to its virtual table pointer.  If it is, return true
564    and fill in the jump function JFUNC with relevant type information or set it
565    to unknown.  ARG is the object itself (not a pointer to it, unless
566    dereferenced).  BASE is the base of the memory access as returned by
567    get_ref_base_and_extent, as is the offset.  */
568
569 static bool
570 detect_type_change (tree arg, tree base, gimple call,
571                     struct ipa_jump_func *jfunc, HOST_WIDE_INT offset)
572 {
573   return detect_type_change_1 (arg, base, TREE_TYPE (arg), call, jfunc, offset);
574 }
575
576 /* Like detect_type_change but ARG is supposed to be a non-dereferenced pointer
577    SSA name (its dereference will become the base and the offset is assumed to
578    be zero).  */
579
580 static bool
581 detect_type_change_ssa (tree arg, gimple call, struct ipa_jump_func *jfunc)
582 {
583   tree comp_type;
584
585   gcc_checking_assert (TREE_CODE (arg) == SSA_NAME);
586   if (!flag_devirtualize
587       || !POINTER_TYPE_P (TREE_TYPE (arg))
588       || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != RECORD_TYPE)
589     return false;
590
591   comp_type = TREE_TYPE (TREE_TYPE (arg));
592   arg = build2 (MEM_REF, ptr_type_node, arg,
593                 build_int_cst (ptr_type_node, 0));
594
595   return detect_type_change_1 (arg, arg, comp_type, call, jfunc, 0);
596 }
597
598 /* Callback of walk_aliased_vdefs.  Flags that it has been invoked to the
599    boolean variable pointed to by DATA.  */
600
601 static bool
602 mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
603                      void *data)
604 {
605   bool *b = (bool *) data;
606   *b = true;
607   return true;
608 }
609
610 /* Return true if a load from a formal parameter PARM_LOAD is known to retreive
611    a value known not to be modified in this function before reaching the
612    statement STMT.  PARM_AINFO is a pointer to a structure containing temporary
613    information about the parameter.  */
614
615 static bool
616 parm_preserved_before_stmt_p (struct param_analysis_info *parm_ainfo,
617                                gimple stmt, tree parm_load)
618 {
619   bool modified = false;
620   bitmap *visited_stmts;
621   ao_ref refd;
622
623   if (parm_ainfo && parm_ainfo->parm_modified)
624     return false;
625
626   gcc_checking_assert (gimple_vuse (stmt) != NULL_TREE);
627   ao_ref_init (&refd, parm_load);
628   /* We can cache visited statements only when parm_ainfo is available and when
629      we are looking at a naked load of the whole parameter.  */
630   if (!parm_ainfo || TREE_CODE (parm_load) != PARM_DECL)
631     visited_stmts = NULL;
632   else
633     visited_stmts = &parm_ainfo->parm_visited_statements;
634   walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified, &modified,
635                       visited_stmts);
636   if (parm_ainfo && modified)
637     parm_ainfo->parm_modified = true;
638   return !modified;
639 }
640
641 /* If STMT is an assignment that loads a value from an parameter declaration,
642    return the index of the parameter in ipa_node_params which has not been
643    modified.  Otherwise return -1.  */
644
645 static int
646 load_from_unmodified_param (vec<ipa_param_descriptor_t> descriptors,
647                             struct param_analysis_info *parms_ainfo,
648                             gimple stmt)
649 {
650   int index;
651   tree op1;
652
653   if (!gimple_assign_single_p (stmt))
654     return -1;
655
656   op1 = gimple_assign_rhs1 (stmt);
657   if (TREE_CODE (op1) != PARM_DECL)
658     return -1;
659
660   index = ipa_get_param_decl_index_1 (descriptors, op1);
661   if (index < 0
662       || !parm_preserved_before_stmt_p (parms_ainfo ? &parms_ainfo[index]
663                                         : NULL, stmt, op1))
664     return -1;
665
666   return index;
667 }
668
669 /* Return true if memory reference REF loads data that are known to be
670    unmodified in this function before reaching statement STMT.  PARM_AINFO, if
671    non-NULL, is a pointer to a structure containing temporary information about
672    PARM.  */
673
674 static bool
675 parm_ref_data_preserved_p (struct param_analysis_info *parm_ainfo,
676                               gimple stmt, tree ref)
677 {
678   bool modified = false;
679   ao_ref refd;
680
681   gcc_checking_assert (gimple_vuse (stmt));
682   if (parm_ainfo && parm_ainfo->ref_modified)
683     return false;
684
685   ao_ref_init (&refd, ref);
686   walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified, &modified,
687                       NULL);
688   if (parm_ainfo && modified)
689     parm_ainfo->ref_modified = true;
690   return !modified;
691 }
692
693 /* Return true if the data pointed to by PARM is known to be unmodified in this
694    function before reaching call statement CALL into which it is passed.
695    PARM_AINFO is a pointer to a structure containing temporary information
696    about PARM.  */
697
698 static bool
699 parm_ref_data_pass_through_p (struct param_analysis_info *parm_ainfo,
700                                gimple call, tree parm)
701 {
702   bool modified = false;
703   ao_ref refd;
704
705   /* It's unnecessary to calculate anything about memory contnets for a const
706      function because it is not goin to use it.  But do not cache the result
707      either.  Also, no such calculations for non-pointers.  */
708   if (!gimple_vuse (call)
709       || !POINTER_TYPE_P (TREE_TYPE (parm)))
710     return false;
711
712   if (parm_ainfo->pt_modified)
713     return false;
714
715   ao_ref_init_from_ptr_and_size (&refd, parm, NULL_TREE);
716   walk_aliased_vdefs (&refd, gimple_vuse (call), mark_modified, &modified,
717                       parm_ainfo ? &parm_ainfo->pt_visited_statements : NULL);
718   if (modified)
719     parm_ainfo->pt_modified = true;
720   return !modified;
721 }
722
723 /* Return true if we can prove that OP is a memory reference loading unmodified
724    data from an aggregate passed as a parameter and if the aggregate is passed
725    by reference, that the alias type of the load corresponds to the type of the
726    formal parameter (so that we can rely on this type for TBAA in callers).
727    INFO and PARMS_AINFO describe parameters of the current function (but the
728    latter can be NULL), STMT is the load statement.  If function returns true,
729    *INDEX_P, *OFFSET_P and *BY_REF is filled with the parameter index, offset
730    within the aggregate and whether it is a load from a value passed by
731    reference respectively.  */
732
733 static bool
734 ipa_load_from_parm_agg_1 (vec<ipa_param_descriptor_t> descriptors,
735                           struct param_analysis_info *parms_ainfo, gimple stmt,
736                           tree op, int *index_p, HOST_WIDE_INT *offset_p,
737                           bool *by_ref_p)
738 {
739   int index;
740   HOST_WIDE_INT size, max_size;
741   tree base = get_ref_base_and_extent (op, offset_p, &size, &max_size);
742
743   if (max_size == -1 || max_size != size || *offset_p < 0)
744     return false;
745
746   if (DECL_P (base))
747     {
748       int index = ipa_get_param_decl_index_1 (descriptors, base);
749       if (index >= 0
750           && parm_preserved_before_stmt_p (parms_ainfo ? &parms_ainfo[index]
751                                            : NULL, stmt, op))
752         {
753           *index_p = index;
754           *by_ref_p = false;
755           return true;
756         }
757       return false;
758     }
759
760   if (TREE_CODE (base) != MEM_REF
761            || TREE_CODE (TREE_OPERAND (base, 0)) != SSA_NAME
762            || !integer_zerop (TREE_OPERAND (base, 1)))
763     return false;
764
765   if (SSA_NAME_IS_DEFAULT_DEF (TREE_OPERAND (base, 0)))
766     {
767       tree parm = SSA_NAME_VAR (TREE_OPERAND (base, 0));
768       index = ipa_get_param_decl_index_1 (descriptors, parm);
769     }
770   else
771     {
772       /* This branch catches situations where a pointer parameter is not a
773          gimple register, for example:
774
775          void hip7(S*) (struct S * p)
776          {
777          void (*<T2e4>) (struct S *) D.1867;
778          struct S * p.1;
779
780          <bb 2>:
781          p.1_1 = p;
782          D.1867_2 = p.1_1->f;
783          D.1867_2 ();
784          gdp = &p;
785       */
786
787       gimple def = SSA_NAME_DEF_STMT (TREE_OPERAND (base, 0));
788       index = load_from_unmodified_param (descriptors, parms_ainfo, def);
789     }
790
791   if (index >= 0
792       && parm_ref_data_preserved_p (parms_ainfo ? &parms_ainfo[index] : NULL,
793                                     stmt, op))
794     {
795       *index_p = index;
796       *by_ref_p = true;
797       return true;
798     }
799   return false;
800 }
801
802 /* Just like the previous function, just without the param_analysis_info
803    pointer, for users outside of this file.  */
804
805 bool
806 ipa_load_from_parm_agg (struct ipa_node_params *info, gimple stmt,
807                         tree op, int *index_p, HOST_WIDE_INT *offset_p,
808                         bool *by_ref_p)
809 {
810   return ipa_load_from_parm_agg_1 (info->descriptors, NULL, stmt, op, index_p,
811                                    offset_p, by_ref_p);
812 }
813
814 /* Given that an actual argument is an SSA_NAME (given in NAME) and is a result
815    of an assignment statement STMT, try to determine whether we are actually
816    handling any of the following cases and construct an appropriate jump
817    function into JFUNC if so:
818
819    1) The passed value is loaded from a formal parameter which is not a gimple
820    register (most probably because it is addressable, the value has to be
821    scalar) and we can guarantee the value has not changed.  This case can
822    therefore be described by a simple pass-through jump function.  For example:
823
824       foo (int a)
825       {
826         int a.0;
827
828         a.0_2 = a;
829         bar (a.0_2);
830
831    2) The passed value can be described by a simple arithmetic pass-through
832    jump function. E.g.
833
834       foo (int a)
835       {
836         int D.2064;
837
838         D.2064_4 = a.1(D) + 4;
839         bar (D.2064_4);
840
841    This case can also occur in combination of the previous one, e.g.:
842
843       foo (int a, int z)
844       {
845         int a.0;
846         int D.2064;
847
848         a.0_3 = a;
849         D.2064_4 = a.0_3 + 4;
850         foo (D.2064_4);
851
852    3) The passed value is an address of an object within another one (which
853    also passed by reference).  Such situations are described by an ancestor
854    jump function and describe situations such as:
855
856      B::foo() (struct B * const this)
857      {
858        struct A * D.1845;
859
860        D.1845_2 = &this_1(D)->D.1748;
861        A::bar (D.1845_2);
862
863    INFO is the structure describing individual parameters access different
864    stages of IPA optimizations.  PARMS_AINFO contains the information that is
865    only needed for intraprocedural analysis.  */
866
867 static void
868 compute_complex_assign_jump_func (struct ipa_node_params *info,
869                                   struct param_analysis_info *parms_ainfo,
870                                   struct ipa_jump_func *jfunc,
871                                   gimple call, gimple stmt, tree name)
872 {
873   HOST_WIDE_INT offset, size, max_size;
874   tree op1, tc_ssa, base, ssa;
875   int index;
876
877   op1 = gimple_assign_rhs1 (stmt);
878
879   if (TREE_CODE (op1) == SSA_NAME)
880     {
881       if (SSA_NAME_IS_DEFAULT_DEF (op1))
882         index = ipa_get_param_decl_index (info, SSA_NAME_VAR (op1));
883       else
884         index = load_from_unmodified_param (info->descriptors, parms_ainfo,
885                                             SSA_NAME_DEF_STMT (op1));
886       tc_ssa = op1;
887     }
888   else
889     {
890       index = load_from_unmodified_param (info->descriptors, parms_ainfo, stmt);
891       tc_ssa = gimple_assign_lhs (stmt);
892     }
893
894   if (index >= 0)
895     {
896       tree op2 = gimple_assign_rhs2 (stmt);
897
898       if (op2)
899         {
900           if (!is_gimple_ip_invariant (op2)
901               || (TREE_CODE_CLASS (gimple_expr_code (stmt)) != tcc_comparison
902                   && !useless_type_conversion_p (TREE_TYPE (name),
903                                                  TREE_TYPE (op1))))
904             return;
905
906           ipa_set_jf_arith_pass_through (jfunc, index, op2,
907                                          gimple_assign_rhs_code (stmt));
908         }
909       else if (gimple_assign_single_p (stmt)
910                && !detect_type_change_ssa (tc_ssa, call, jfunc))
911         {
912           bool agg_p = parm_ref_data_pass_through_p (&parms_ainfo[index],
913                                                      call, tc_ssa);
914           ipa_set_jf_simple_pass_through (jfunc, index, agg_p);
915         }
916       return;
917     }
918
919   if (TREE_CODE (op1) != ADDR_EXPR)
920     return;
921   op1 = TREE_OPERAND (op1, 0);
922   if (TREE_CODE (TREE_TYPE (op1)) != RECORD_TYPE)
923     return;
924   base = get_ref_base_and_extent (op1, &offset, &size, &max_size);
925   if (TREE_CODE (base) != MEM_REF
926       /* If this is a varying address, punt.  */
927       || max_size == -1
928       || max_size != size)
929     return;
930   offset += mem_ref_offset (base).low * BITS_PER_UNIT;
931   ssa = TREE_OPERAND (base, 0);
932   if (TREE_CODE (ssa) != SSA_NAME
933       || !SSA_NAME_IS_DEFAULT_DEF (ssa)
934       || offset < 0)
935     return;
936
937   /* Dynamic types are changed only in constructors and destructors and  */
938   index = ipa_get_param_decl_index (info, SSA_NAME_VAR (ssa));
939   if (index >= 0
940       && !detect_type_change (op1, base, call, jfunc, offset))
941     ipa_set_ancestor_jf (jfunc, offset, TREE_TYPE (op1), index,
942                          parm_ref_data_pass_through_p (&parms_ainfo[index],
943                                                        call, ssa));
944 }
945
946 /* Extract the base, offset and MEM_REF expression from a statement ASSIGN if
947    it looks like:
948
949    iftmp.1_3 = &obj_2(D)->D.1762;
950
951    The base of the MEM_REF must be a default definition SSA NAME of a
952    parameter.  Return NULL_TREE if it looks otherwise.  If case of success, the
953    whole MEM_REF expression is returned and the offset calculated from any
954    handled components and the MEM_REF itself is stored into *OFFSET.  The whole
955    RHS stripped off the ADDR_EXPR is stored into *OBJ_P.  */
956
957 static tree
958 get_ancestor_addr_info (gimple assign, tree *obj_p, HOST_WIDE_INT *offset)
959 {
960   HOST_WIDE_INT size, max_size;
961   tree expr, parm, obj;
962
963   if (!gimple_assign_single_p (assign))
964     return NULL_TREE;
965   expr = gimple_assign_rhs1 (assign);
966
967   if (TREE_CODE (expr) != ADDR_EXPR)
968     return NULL_TREE;
969   expr = TREE_OPERAND (expr, 0);
970   obj = expr;
971   expr = get_ref_base_and_extent (expr, offset, &size, &max_size);
972
973   if (TREE_CODE (expr) != MEM_REF
974       /* If this is a varying address, punt.  */
975       || max_size == -1
976       || max_size != size
977       || *offset < 0)
978     return NULL_TREE;
979   parm = TREE_OPERAND (expr, 0);
980   if (TREE_CODE (parm) != SSA_NAME
981       || !SSA_NAME_IS_DEFAULT_DEF (parm)
982       || TREE_CODE (SSA_NAME_VAR (parm)) != PARM_DECL)
983     return NULL_TREE;
984
985   *offset += mem_ref_offset (expr).low * BITS_PER_UNIT;
986   *obj_p = obj;
987   return expr;
988 }
989
990
991 /* Given that an actual argument is an SSA_NAME that is a result of a phi
992    statement PHI, try to find out whether NAME is in fact a
993    multiple-inheritance typecast from a descendant into an ancestor of a formal
994    parameter and thus can be described by an ancestor jump function and if so,
995    write the appropriate function into JFUNC.
996
997    Essentially we want to match the following pattern:
998
999      if (obj_2(D) != 0B)
1000        goto <bb 3>;
1001      else
1002        goto <bb 4>;
1003
1004    <bb 3>:
1005      iftmp.1_3 = &obj_2(D)->D.1762;
1006
1007    <bb 4>:
1008      # iftmp.1_1 = PHI <iftmp.1_3(3), 0B(2)>
1009      D.1879_6 = middleman_1 (iftmp.1_1, i_5(D));
1010      return D.1879_6;  */
1011
1012 static void
1013 compute_complex_ancestor_jump_func (struct ipa_node_params *info,
1014                                     struct param_analysis_info *parms_ainfo,
1015                                     struct ipa_jump_func *jfunc,
1016                                     gimple call, gimple phi)
1017 {
1018   HOST_WIDE_INT offset;
1019   gimple assign, cond;
1020   basic_block phi_bb, assign_bb, cond_bb;
1021   tree tmp, parm, expr, obj;
1022   int index, i;
1023
1024   if (gimple_phi_num_args (phi) != 2)
1025     return;
1026
1027   if (integer_zerop (PHI_ARG_DEF (phi, 1)))
1028     tmp = PHI_ARG_DEF (phi, 0);
1029   else if (integer_zerop (PHI_ARG_DEF (phi, 0)))
1030     tmp = PHI_ARG_DEF (phi, 1);
1031   else
1032     return;
1033   if (TREE_CODE (tmp) != SSA_NAME
1034       || SSA_NAME_IS_DEFAULT_DEF (tmp)
1035       || !POINTER_TYPE_P (TREE_TYPE (tmp))
1036       || TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) != RECORD_TYPE)
1037     return;
1038
1039   assign = SSA_NAME_DEF_STMT (tmp);
1040   assign_bb = gimple_bb (assign);
1041   if (!single_pred_p (assign_bb))
1042     return;
1043   expr = get_ancestor_addr_info (assign, &obj, &offset);
1044   if (!expr)
1045     return;
1046   parm = TREE_OPERAND (expr, 0);
1047   index = ipa_get_param_decl_index (info, SSA_NAME_VAR (parm));
1048   gcc_assert (index >= 0);
1049
1050   cond_bb = single_pred (assign_bb);
1051   cond = last_stmt (cond_bb);
1052   if (!cond
1053       || gimple_code (cond) != GIMPLE_COND
1054       || gimple_cond_code (cond) != NE_EXPR
1055       || gimple_cond_lhs (cond) != parm
1056       || !integer_zerop (gimple_cond_rhs (cond)))
1057     return;
1058
1059   phi_bb = gimple_bb (phi);
1060   for (i = 0; i < 2; i++)
1061     {
1062       basic_block pred = EDGE_PRED (phi_bb, i)->src;
1063       if (pred != assign_bb && pred != cond_bb)
1064         return;
1065     }
1066
1067   if (!detect_type_change (obj, expr, call, jfunc, offset))
1068     ipa_set_ancestor_jf (jfunc, offset, TREE_TYPE (obj), index,
1069                          parm_ref_data_pass_through_p (&parms_ainfo[index],
1070                                                        call, parm));
1071 }
1072
1073 /* Given OP which is passed as an actual argument to a called function,
1074    determine if it is possible to construct a KNOWN_TYPE jump function for it
1075    and if so, create one and store it to JFUNC.  */
1076
1077 static void
1078 compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
1079                               gimple call)
1080 {
1081   HOST_WIDE_INT offset, size, max_size;
1082   tree base;
1083
1084   if (!flag_devirtualize
1085       || TREE_CODE (op) != ADDR_EXPR
1086       || TREE_CODE (TREE_TYPE (TREE_TYPE (op))) != RECORD_TYPE)
1087     return;
1088
1089   op = TREE_OPERAND (op, 0);
1090   base = get_ref_base_and_extent (op, &offset, &size, &max_size);
1091   if (!DECL_P (base)
1092       || max_size == -1
1093       || max_size != size
1094       || TREE_CODE (TREE_TYPE (base)) != RECORD_TYPE
1095       || is_global_var (base))
1096     return;
1097
1098   if (!TYPE_BINFO (TREE_TYPE (base))
1099       || detect_type_change (op, base, call, jfunc, offset))
1100     return;
1101
1102   ipa_set_jf_known_type (jfunc, offset, TREE_TYPE (base), TREE_TYPE (op));
1103 }
1104
1105 /* Inspect the given TYPE and return true iff it has the same structure (the
1106    same number of fields of the same types) as a C++ member pointer.  If
1107    METHOD_PTR and DELTA are non-NULL, store the trees representing the
1108    corresponding fields there.  */
1109
1110 static bool
1111 type_like_member_ptr_p (tree type, tree *method_ptr, tree *delta)
1112 {
1113   tree fld;
1114
1115   if (TREE_CODE (type) != RECORD_TYPE)
1116     return false;
1117
1118   fld = TYPE_FIELDS (type);
1119   if (!fld || !POINTER_TYPE_P (TREE_TYPE (fld))
1120       || TREE_CODE (TREE_TYPE (TREE_TYPE (fld))) != METHOD_TYPE
1121       || !host_integerp (DECL_FIELD_OFFSET (fld), 1))
1122     return false;
1123
1124   if (method_ptr)
1125     *method_ptr = fld;
1126
1127   fld = DECL_CHAIN (fld);
1128   if (!fld || INTEGRAL_TYPE_P (fld)
1129       || !host_integerp (DECL_FIELD_OFFSET (fld), 1))
1130     return false;
1131   if (delta)
1132     *delta = fld;
1133
1134   if (DECL_CHAIN (fld))
1135     return false;
1136
1137   return true;
1138 }
1139
1140 /* If RHS is an SSA_NAME and it is defined by a simple copy assign statement,
1141    return the rhs of its defining statement.  Otherwise return RHS as it
1142    is.  */
1143
1144 static inline tree
1145 get_ssa_def_if_simple_copy (tree rhs)
1146 {
1147   while (TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_IS_DEFAULT_DEF (rhs))
1148     {
1149       gimple def_stmt = SSA_NAME_DEF_STMT (rhs);
1150
1151       if (gimple_assign_single_p (def_stmt))
1152         rhs = gimple_assign_rhs1 (def_stmt);
1153       else
1154         break;
1155     }
1156   return rhs;
1157 }
1158
1159 /* Simple linked list, describing known contents of an aggregate beforere
1160    call.  */
1161
1162 struct ipa_known_agg_contents_list
1163 {
1164   /* Offset and size of the described part of the aggregate.  */
1165   HOST_WIDE_INT offset, size;
1166   /* Known constant value or NULL if the contents is known to be unknown.  */
1167   tree constant;
1168   /* Pointer to the next structure in the list.  */
1169   struct ipa_known_agg_contents_list *next;
1170 };
1171
1172 /* Traverse statements from CALL backwards, scanning whether an aggregate given
1173    in ARG is filled in with constant values.  ARG can either be an aggregate
1174    expression or a pointer to an aggregate.  JFUNC is the jump function into
1175    which the constants are subsequently stored.  */
1176
1177 static void
1178 determine_known_aggregate_parts (gimple call, tree arg,
1179                                  struct ipa_jump_func *jfunc)
1180 {
1181   struct ipa_known_agg_contents_list *list = NULL;
1182   int item_count = 0, const_count = 0;
1183   HOST_WIDE_INT arg_offset, arg_size;
1184   gimple_stmt_iterator gsi;
1185   tree arg_base;
1186   bool check_ref, by_ref;
1187   ao_ref r;
1188
1189   /* The function operates in three stages.  First, we prepare check_ref, r,
1190      arg_base and arg_offset based on what is actually passed as an actual
1191      argument.  */
1192
1193   if (POINTER_TYPE_P (TREE_TYPE (arg)))
1194     {
1195       by_ref = true;
1196       if (TREE_CODE (arg) == SSA_NAME)
1197         {
1198           tree type_size;
1199           if (!host_integerp (TYPE_SIZE (TREE_TYPE (TREE_TYPE (arg))), 1))
1200             return;
1201           check_ref = true;
1202           arg_base = arg;
1203           arg_offset = 0;
1204           type_size = TYPE_SIZE (TREE_TYPE (TREE_TYPE (arg)));
1205           arg_size = tree_low_cst (type_size, 1);
1206           ao_ref_init_from_ptr_and_size (&r, arg_base, NULL_TREE);
1207         }
1208       else if (TREE_CODE (arg) == ADDR_EXPR)
1209         {
1210           HOST_WIDE_INT arg_max_size;
1211
1212           arg = TREE_OPERAND (arg, 0);
1213           arg_base = get_ref_base_and_extent (arg, &arg_offset, &arg_size,
1214                                           &arg_max_size);
1215           if (arg_max_size == -1
1216               || arg_max_size != arg_size
1217               || arg_offset < 0)
1218             return;
1219           if (DECL_P (arg_base))
1220             {
1221               tree size;
1222               check_ref = false;
1223               size = build_int_cst (integer_type_node, arg_size);
1224               ao_ref_init_from_ptr_and_size (&r, arg_base, size);
1225             }
1226           else
1227             return;
1228         }
1229       else
1230         return;
1231     }
1232   else
1233     {
1234       HOST_WIDE_INT arg_max_size;
1235
1236       gcc_checking_assert (AGGREGATE_TYPE_P (TREE_TYPE (arg)));
1237
1238       by_ref = false;
1239       check_ref = false;
1240       arg_base = get_ref_base_and_extent (arg, &arg_offset, &arg_size,
1241                                           &arg_max_size);
1242       if (arg_max_size == -1
1243           || arg_max_size != arg_size
1244           || arg_offset < 0)
1245         return;
1246
1247       ao_ref_init (&r, arg);
1248     }
1249
1250   /* Second stage walks back the BB, looks at individual statements and as long
1251      as it is confident of how the statements affect contents of the
1252      aggregates, it builds a sorted linked list of ipa_agg_jf_list structures
1253      describing it.  */
1254   gsi = gsi_for_stmt (call);
1255   gsi_prev (&gsi);
1256   for (; !gsi_end_p (gsi); gsi_prev (&gsi))
1257     {
1258       struct ipa_known_agg_contents_list *n, **p;
1259       gimple stmt = gsi_stmt (gsi);
1260       HOST_WIDE_INT lhs_offset, lhs_size, lhs_max_size;
1261       tree lhs, rhs, lhs_base;
1262       bool partial_overlap;
1263
1264       if (!stmt_may_clobber_ref_p_1 (stmt, &r))
1265         continue;
1266       if (!gimple_assign_single_p (stmt))
1267         break;
1268
1269       lhs = gimple_assign_lhs (stmt);
1270       rhs = gimple_assign_rhs1 (stmt);
1271       if (!is_gimple_reg_type (rhs)
1272           || TREE_CODE (lhs) == BIT_FIELD_REF
1273           || contains_bitfld_component_ref_p (lhs))
1274         break;
1275
1276       lhs_base = get_ref_base_and_extent (lhs, &lhs_offset, &lhs_size,
1277                                           &lhs_max_size);
1278       if (lhs_max_size == -1
1279           || lhs_max_size != lhs_size
1280           || (lhs_offset < arg_offset
1281               && lhs_offset + lhs_size > arg_offset)
1282           || (lhs_offset < arg_offset + arg_size
1283               && lhs_offset + lhs_size > arg_offset + arg_size))
1284         break;
1285
1286       if (check_ref)
1287         {
1288           if (TREE_CODE (lhs_base) != MEM_REF
1289               || TREE_OPERAND (lhs_base, 0) != arg_base
1290               || !integer_zerop (TREE_OPERAND (lhs_base, 1)))
1291             break;
1292         }
1293       else if (lhs_base != arg_base)
1294         {
1295           if (DECL_P (lhs_base))
1296             continue;
1297           else
1298             break;
1299         }
1300
1301       if (lhs_offset + lhs_size < arg_offset
1302           || lhs_offset >= (arg_offset + arg_size))
1303         continue;
1304
1305       partial_overlap = false;
1306       p = &list;
1307       while (*p && (*p)->offset < lhs_offset)
1308         {
1309           if ((*p)->offset + (*p)->size > lhs_offset)
1310             {
1311               partial_overlap = true;
1312               break;
1313             }
1314           p = &(*p)->next;
1315         }
1316       if (partial_overlap)
1317         break;
1318       if (*p && (*p)->offset < lhs_offset + lhs_size)
1319         {
1320           if ((*p)->offset == lhs_offset && (*p)->size == lhs_size)
1321             /* We already know this value is subsequently overwritten with
1322                something else.  */
1323             continue;
1324           else
1325             /* Otherwise this is a partial overlap which we cannot
1326                represent.  */
1327             break;
1328         }
1329
1330       rhs = get_ssa_def_if_simple_copy (rhs);
1331       n = XALLOCA (struct ipa_known_agg_contents_list);
1332       n->size = lhs_size;
1333       n->offset = lhs_offset;
1334       if (is_gimple_ip_invariant (rhs))
1335         {
1336           n->constant = rhs;
1337           const_count++;
1338         }
1339       else
1340         n->constant = NULL_TREE;
1341       n->next = *p;
1342       *p = n;
1343
1344       item_count++;
1345       if (const_count == PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS)
1346           || item_count == 2 * PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS))
1347         break;
1348     }
1349
1350   /* Third stage just goes over the list and creates an appropriate vector of
1351      ipa_agg_jf_item structures out of it, of sourse only if there are
1352      any known constants to begin with.  */
1353
1354   if (const_count)
1355     {
1356       jfunc->agg.by_ref = by_ref;
1357       vec_alloc (jfunc->agg.items, const_count);
1358       while (list)
1359         {
1360           if (list->constant)
1361             {
1362               struct ipa_agg_jf_item item;
1363               item.offset = list->offset - arg_offset;
1364               gcc_assert ((item.offset % BITS_PER_UNIT) == 0);
1365               item.value = unshare_expr_without_location (list->constant);
1366               jfunc->agg.items->quick_push (item);
1367             }
1368           list = list->next;
1369         }
1370     }
1371 }
1372
1373 /* Compute jump function for all arguments of callsite CS and insert the
1374    information in the jump_functions array in the ipa_edge_args corresponding
1375    to this callsite.  */
1376
1377 static void
1378 ipa_compute_jump_functions_for_edge (struct param_analysis_info *parms_ainfo,
1379                                      struct cgraph_edge *cs)
1380 {
1381   struct ipa_node_params *info = IPA_NODE_REF (cs->caller);
1382   struct ipa_edge_args *args = IPA_EDGE_REF (cs);
1383   gimple call = cs->call_stmt;
1384   int n, arg_num = gimple_call_num_args (call);
1385
1386   if (arg_num == 0 || args->jump_functions)
1387     return;
1388   vec_safe_grow_cleared (args->jump_functions, arg_num);
1389
1390   for (n = 0; n < arg_num; n++)
1391     {
1392       struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, n);
1393       tree arg = gimple_call_arg (call, n);
1394
1395       if (is_gimple_ip_invariant (arg))
1396         ipa_set_jf_constant (jfunc, arg);
1397       else if (!is_gimple_reg_type (TREE_TYPE (arg))
1398                && TREE_CODE (arg) == PARM_DECL)
1399         {
1400           int index = ipa_get_param_decl_index (info, arg);
1401
1402           gcc_assert (index >=0);
1403           /* Aggregate passed by value, check for pass-through, otherwise we
1404              will attempt to fill in aggregate contents later in this
1405              for cycle.  */
1406           if (parm_preserved_before_stmt_p (&parms_ainfo[index], call, arg))
1407             {
1408               ipa_set_jf_simple_pass_through (jfunc, index, false);
1409               continue;
1410             }
1411         }
1412       else if (TREE_CODE (arg) == SSA_NAME)
1413         {
1414           if (SSA_NAME_IS_DEFAULT_DEF (arg))
1415             {
1416               int index = ipa_get_param_decl_index (info, SSA_NAME_VAR (arg));
1417               if (index >= 0
1418                   && !detect_type_change_ssa (arg, call, jfunc))
1419                 {
1420                   bool agg_p;
1421                   agg_p = parm_ref_data_pass_through_p (&parms_ainfo[index],
1422                                                         call, arg);
1423                   ipa_set_jf_simple_pass_through (jfunc, index, agg_p);
1424                 }
1425             }
1426           else
1427             {
1428               gimple stmt = SSA_NAME_DEF_STMT (arg);
1429               if (is_gimple_assign (stmt))
1430                 compute_complex_assign_jump_func (info, parms_ainfo, jfunc,
1431                                                   call, stmt, arg);
1432               else if (gimple_code (stmt) == GIMPLE_PHI)
1433                 compute_complex_ancestor_jump_func (info, parms_ainfo, jfunc,
1434                                                     call, stmt);
1435             }
1436         }
1437       else
1438         compute_known_type_jump_func (arg, jfunc, call);
1439
1440       if ((jfunc->type != IPA_JF_PASS_THROUGH
1441               || !ipa_get_jf_pass_through_agg_preserved (jfunc))
1442           && (jfunc->type != IPA_JF_ANCESTOR
1443               || !ipa_get_jf_ancestor_agg_preserved (jfunc))
1444           && (AGGREGATE_TYPE_P (TREE_TYPE (arg))
1445               || (POINTER_TYPE_P (TREE_TYPE (arg)))))
1446         determine_known_aggregate_parts (call, arg, jfunc);
1447     }
1448 }
1449
1450 /* Compute jump functions for all edges - both direct and indirect - outgoing
1451    from NODE.  Also count the actual arguments in the process.  */
1452
1453 static void
1454 ipa_compute_jump_functions (struct cgraph_node *node,
1455                             struct param_analysis_info *parms_ainfo)
1456 {
1457   struct cgraph_edge *cs;
1458
1459   for (cs = node->callees; cs; cs = cs->next_callee)
1460     {
1461       struct cgraph_node *callee = cgraph_function_or_thunk_node (cs->callee,
1462                                                                   NULL);
1463       /* We do not need to bother analyzing calls to unknown
1464          functions unless they may become known during lto/whopr.  */
1465       if (!callee->analyzed && !flag_lto)
1466         continue;
1467       ipa_compute_jump_functions_for_edge (parms_ainfo, cs);
1468     }
1469
1470   for (cs = node->indirect_calls; cs; cs = cs->next_callee)
1471     ipa_compute_jump_functions_for_edge (parms_ainfo, cs);
1472 }
1473
1474 /* If STMT looks like a statement loading a value from a member pointer formal
1475    parameter, return that parameter and store the offset of the field to
1476    *OFFSET_P, if it is non-NULL.  Otherwise return NULL (but *OFFSET_P still
1477    might be clobbered).  If USE_DELTA, then we look for a use of the delta
1478    field rather than the pfn.  */
1479
1480 static tree
1481 ipa_get_stmt_member_ptr_load_param (gimple stmt, bool use_delta,
1482                                     HOST_WIDE_INT *offset_p)
1483 {
1484   tree rhs, rec, ref_field, ref_offset, fld, ptr_field, delta_field;
1485
1486   if (!gimple_assign_single_p (stmt))
1487     return NULL_TREE;
1488
1489   rhs = gimple_assign_rhs1 (stmt);
1490   if (TREE_CODE (rhs) == COMPONENT_REF)
1491     {
1492       ref_field = TREE_OPERAND (rhs, 1);
1493       rhs = TREE_OPERAND (rhs, 0);
1494     }
1495   else
1496     ref_field = NULL_TREE;
1497   if (TREE_CODE (rhs) != MEM_REF)
1498     return NULL_TREE;
1499   rec = TREE_OPERAND (rhs, 0);
1500   if (TREE_CODE (rec) != ADDR_EXPR)
1501     return NULL_TREE;
1502   rec = TREE_OPERAND (rec, 0);
1503   if (TREE_CODE (rec) != PARM_DECL
1504       || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, &delta_field))
1505     return NULL_TREE;
1506   ref_offset = TREE_OPERAND (rhs, 1);
1507
1508   if (use_delta)
1509     fld = delta_field;
1510   else
1511     fld = ptr_field;
1512   if (offset_p)
1513     *offset_p = int_bit_position (fld);
1514
1515   if (ref_field)
1516     {
1517       if (integer_nonzerop (ref_offset))
1518         return NULL_TREE;
1519       return ref_field == fld ? rec : NULL_TREE;
1520     }
1521   else
1522     return tree_int_cst_equal (byte_position (fld), ref_offset) ? rec
1523       : NULL_TREE;
1524 }
1525
1526 /* Returns true iff T is an SSA_NAME defined by a statement.  */
1527
1528 static bool
1529 ipa_is_ssa_with_stmt_def (tree t)
1530 {
1531   if (TREE_CODE (t) == SSA_NAME
1532       && !SSA_NAME_IS_DEFAULT_DEF (t))
1533     return true;
1534   else
1535     return false;
1536 }
1537
1538 /* Find the indirect call graph edge corresponding to STMT and mark it as a
1539    call to a parameter number PARAM_INDEX.  NODE is the caller.  Return the
1540    indirect call graph edge.  */
1541
1542 static struct cgraph_edge *
1543 ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt)
1544 {
1545   struct cgraph_edge *cs;
1546
1547   cs = cgraph_edge (node, stmt);
1548   cs->indirect_info->param_index = param_index;
1549   cs->indirect_info->offset = 0;
1550   cs->indirect_info->polymorphic = 0;
1551   cs->indirect_info->agg_contents = 0;
1552   return cs;
1553 }
1554
1555 /* Analyze the CALL and examine uses of formal parameters of the caller NODE
1556    (described by INFO).  PARMS_AINFO is a pointer to a vector containing
1557    intermediate information about each formal parameter.  Currently it checks
1558    whether the call calls a pointer that is a formal parameter and if so, the
1559    parameter is marked with the called flag and an indirect call graph edge
1560    describing the call is created.  This is very simple for ordinary pointers
1561    represented in SSA but not-so-nice when it comes to member pointers.  The
1562    ugly part of this function does nothing more than trying to match the
1563    pattern of such a call.  An example of such a pattern is the gimple dump
1564    below, the call is on the last line:
1565
1566      <bb 2>:
1567        f$__delta_5 = f.__delta;
1568        f$__pfn_24 = f.__pfn;
1569
1570    or
1571      <bb 2>:
1572        f$__delta_5 = MEM[(struct  *)&f];
1573        f$__pfn_24 = MEM[(struct  *)&f + 4B];
1574
1575    and a few lines below:
1576
1577      <bb 5>
1578        D.2496_3 = (int) f$__pfn_24;
1579        D.2497_4 = D.2496_3 & 1;
1580        if (D.2497_4 != 0)
1581          goto <bb 3>;
1582        else
1583          goto <bb 4>;
1584
1585      <bb 6>:
1586        D.2500_7 = (unsigned int) f$__delta_5;
1587        D.2501_8 = &S + D.2500_7;
1588        D.2502_9 = (int (*__vtbl_ptr_type) (void) * *) D.2501_8;
1589        D.2503_10 = *D.2502_9;
1590        D.2504_12 = f$__pfn_24 + -1;
1591        D.2505_13 = (unsigned int) D.2504_12;
1592        D.2506_14 = D.2503_10 + D.2505_13;
1593        D.2507_15 = *D.2506_14;
1594        iftmp.11_16 = (String:: *) D.2507_15;
1595
1596      <bb 7>:
1597        # iftmp.11_1 = PHI <iftmp.11_16(3), f$__pfn_24(2)>
1598        D.2500_19 = (unsigned int) f$__delta_5;
1599        D.2508_20 = &S + D.2500_19;
1600        D.2493_21 = iftmp.11_1 (D.2508_20, 4);
1601
1602    Such patterns are results of simple calls to a member pointer:
1603
1604      int doprinting (int (MyString::* f)(int) const)
1605      {
1606        MyString S ("somestring");
1607
1608        return (S.*f)(4);
1609      }
1610
1611    Moreover, the function also looks for called pointers loaded from aggregates
1612    passed by value or reference.  */
1613
1614 static void
1615 ipa_analyze_indirect_call_uses (struct cgraph_node *node,
1616                                 struct ipa_node_params *info,
1617                                 struct param_analysis_info *parms_ainfo,
1618                                 gimple call, tree target)
1619 {
1620   gimple def;
1621   tree n1, n2;
1622   gimple d1, d2;
1623   tree rec, rec2, cond;
1624   gimple branch;
1625   int index;
1626   basic_block bb, virt_bb, join;
1627   HOST_WIDE_INT offset;
1628   bool by_ref;
1629
1630   if (SSA_NAME_IS_DEFAULT_DEF (target))
1631     {
1632       tree var = SSA_NAME_VAR (target);
1633       index = ipa_get_param_decl_index (info, var);
1634       if (index >= 0)
1635         ipa_note_param_call (node, index, call);
1636       return;
1637     }
1638
1639   def = SSA_NAME_DEF_STMT (target);
1640   if (gimple_assign_single_p (def)
1641       && ipa_load_from_parm_agg_1 (info->descriptors, parms_ainfo, def,
1642                                    gimple_assign_rhs1 (def), &index, &offset,
1643                                    &by_ref))
1644     {
1645       struct cgraph_edge *cs = ipa_note_param_call (node, index, call);
1646       cs->indirect_info->offset = offset;
1647       cs->indirect_info->agg_contents = 1;
1648       cs->indirect_info->by_ref = by_ref;
1649       return;
1650     }
1651
1652   /* Now we need to try to match the complex pattern of calling a member
1653      pointer. */
1654   if (gimple_code (def) != GIMPLE_PHI
1655       || gimple_phi_num_args (def) != 2
1656       || !POINTER_TYPE_P (TREE_TYPE (target))
1657       || TREE_CODE (TREE_TYPE (TREE_TYPE (target))) != METHOD_TYPE)
1658     return;
1659
1660   /* First, we need to check whether one of these is a load from a member
1661      pointer that is a parameter to this function. */
1662   n1 = PHI_ARG_DEF (def, 0);
1663   n2 = PHI_ARG_DEF (def, 1);
1664   if (!ipa_is_ssa_with_stmt_def (n1) || !ipa_is_ssa_with_stmt_def (n2))
1665     return;
1666   d1 = SSA_NAME_DEF_STMT (n1);
1667   d2 = SSA_NAME_DEF_STMT (n2);
1668
1669   join = gimple_bb (def);
1670   if ((rec = ipa_get_stmt_member_ptr_load_param (d1, false, &offset)))
1671     {
1672       if (ipa_get_stmt_member_ptr_load_param (d2, false, NULL))
1673         return;
1674
1675       bb = EDGE_PRED (join, 0)->src;
1676       virt_bb = gimple_bb (d2);
1677     }
1678   else if ((rec = ipa_get_stmt_member_ptr_load_param (d2, false, &offset)))
1679     {
1680       bb = EDGE_PRED (join, 1)->src;
1681       virt_bb = gimple_bb (d1);
1682     }
1683   else
1684     return;
1685
1686   /* Second, we need to check that the basic blocks are laid out in the way
1687      corresponding to the pattern. */
1688
1689   if (!single_pred_p (virt_bb) || !single_succ_p (virt_bb)
1690       || single_pred (virt_bb) != bb
1691       || single_succ (virt_bb) != join)
1692     return;
1693
1694   /* Third, let's see that the branching is done depending on the least
1695      significant bit of the pfn. */
1696
1697   branch = last_stmt (bb);
1698   if (!branch || gimple_code (branch) != GIMPLE_COND)
1699     return;
1700
1701   if ((gimple_cond_code (branch) != NE_EXPR
1702        && gimple_cond_code (branch) != EQ_EXPR)
1703       || !integer_zerop (gimple_cond_rhs (branch)))
1704     return;
1705
1706   cond = gimple_cond_lhs (branch);
1707   if (!ipa_is_ssa_with_stmt_def (cond))
1708     return;
1709
1710   def = SSA_NAME_DEF_STMT (cond);
1711   if (!is_gimple_assign (def)
1712       || gimple_assign_rhs_code (def) != BIT_AND_EXPR
1713       || !integer_onep (gimple_assign_rhs2 (def)))
1714     return;
1715
1716   cond = gimple_assign_rhs1 (def);
1717   if (!ipa_is_ssa_with_stmt_def (cond))
1718     return;
1719
1720   def = SSA_NAME_DEF_STMT (cond);
1721
1722   if (is_gimple_assign (def)
1723       && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
1724     {
1725       cond = gimple_assign_rhs1 (def);
1726       if (!ipa_is_ssa_with_stmt_def (cond))
1727         return;
1728       def = SSA_NAME_DEF_STMT (cond);
1729     }
1730
1731   rec2 = ipa_get_stmt_member_ptr_load_param (def,
1732                                              (TARGET_PTRMEMFUNC_VBIT_LOCATION
1733                                               == ptrmemfunc_vbit_in_delta),
1734                                              NULL);
1735   if (rec != rec2)
1736     return;
1737
1738   index = ipa_get_param_decl_index (info, rec);
1739   if (index >= 0
1740       && parm_preserved_before_stmt_p (&parms_ainfo[index], call, rec))
1741     {
1742       struct cgraph_edge *cs = ipa_note_param_call (node, index, call);
1743       cs->indirect_info->offset = offset;
1744       cs->indirect_info->agg_contents = 1;
1745     }
1746
1747   return;
1748 }
1749
1750 /* Analyze a CALL to an OBJ_TYPE_REF which is passed in TARGET and if the
1751    object referenced in the expression is a formal parameter of the caller
1752    (described by INFO), create a call note for the statement. */
1753
1754 static void
1755 ipa_analyze_virtual_call_uses (struct cgraph_node *node,
1756                                struct ipa_node_params *info, gimple call,
1757                                tree target)
1758 {
1759   struct cgraph_edge *cs;
1760   struct cgraph_indirect_call_info *ii;
1761   struct ipa_jump_func jfunc;
1762   tree obj = OBJ_TYPE_REF_OBJECT (target);
1763   int index;
1764   HOST_WIDE_INT anc_offset;
1765
1766   if (!flag_devirtualize)
1767     return;
1768
1769   if (TREE_CODE (obj) != SSA_NAME)
1770     return;
1771
1772   if (SSA_NAME_IS_DEFAULT_DEF (obj))
1773     {
1774       if (TREE_CODE (SSA_NAME_VAR (obj)) != PARM_DECL)
1775         return;
1776
1777       anc_offset = 0;
1778       index = ipa_get_param_decl_index (info, SSA_NAME_VAR (obj));
1779       gcc_assert (index >= 0);
1780       if (detect_type_change_ssa (obj, call, &jfunc))
1781         return;
1782     }
1783   else
1784     {
1785       gimple stmt = SSA_NAME_DEF_STMT (obj);
1786       tree expr;
1787
1788       expr = get_ancestor_addr_info (stmt, &obj, &anc_offset);
1789       if (!expr)
1790         return;
1791       index = ipa_get_param_decl_index (info,
1792                                         SSA_NAME_VAR (TREE_OPERAND (expr, 0)));
1793       gcc_assert (index >= 0);
1794       if (detect_type_change (obj, expr, call, &jfunc, anc_offset))
1795         return;
1796     }
1797
1798   cs = ipa_note_param_call (node, index, call);
1799   ii = cs->indirect_info;
1800   ii->offset = anc_offset;
1801   ii->otr_token = tree_low_cst (OBJ_TYPE_REF_TOKEN (target), 1);
1802   ii->otr_type = TREE_TYPE (TREE_TYPE (OBJ_TYPE_REF_OBJECT (target)));
1803   ii->polymorphic = 1;
1804 }
1805
1806 /* Analyze a call statement CALL whether and how it utilizes formal parameters
1807    of the caller (described by INFO).  PARMS_AINFO is a pointer to a vector
1808    containing intermediate information about each formal parameter.  */
1809
1810 static void
1811 ipa_analyze_call_uses (struct cgraph_node *node,
1812                        struct ipa_node_params *info,
1813                        struct param_analysis_info *parms_ainfo, gimple call)
1814 {
1815   tree target = gimple_call_fn (call);
1816
1817   if (!target)
1818     return;
1819   if (TREE_CODE (target) == SSA_NAME)
1820     ipa_analyze_indirect_call_uses (node, info, parms_ainfo, call, target);
1821   else if (TREE_CODE (target) == OBJ_TYPE_REF)
1822     ipa_analyze_virtual_call_uses (node, info, call, target);
1823 }
1824
1825
1826 /* Analyze the call statement STMT with respect to formal parameters (described
1827    in INFO) of caller given by NODE.  Currently it only checks whether formal
1828    parameters are called.  PARMS_AINFO is a pointer to a vector containing
1829    intermediate information about each formal parameter.  */
1830
1831 static void
1832 ipa_analyze_stmt_uses (struct cgraph_node *node, struct ipa_node_params *info,
1833                        struct param_analysis_info *parms_ainfo, gimple stmt)
1834 {
1835   if (is_gimple_call (stmt))
1836     ipa_analyze_call_uses (node, info, parms_ainfo, stmt);
1837 }
1838
1839 /* Callback of walk_stmt_load_store_addr_ops for the visit_load.
1840    If OP is a parameter declaration, mark it as used in the info structure
1841    passed in DATA.  */
1842
1843 static bool
1844 visit_ref_for_mod_analysis (gimple stmt ATTRIBUTE_UNUSED,
1845                              tree op, void *data)
1846 {
1847   struct ipa_node_params *info = (struct ipa_node_params *) data;
1848
1849   op = get_base_address (op);
1850   if (op
1851       && TREE_CODE (op) == PARM_DECL)
1852     {
1853       int index = ipa_get_param_decl_index (info, op);
1854       gcc_assert (index >= 0);
1855       ipa_set_param_used (info, index, true);
1856     }
1857
1858   return false;
1859 }
1860
1861 /* Scan the function body of NODE and inspect the uses of formal parameters.
1862    Store the findings in various structures of the associated ipa_node_params
1863    structure, such as parameter flags, notes etc.  PARMS_AINFO is a pointer to a
1864    vector containing intermediate information about each formal parameter.   */
1865
1866 static void
1867 ipa_analyze_params_uses (struct cgraph_node *node,
1868                          struct param_analysis_info *parms_ainfo)
1869 {
1870   tree decl = node->symbol.decl;
1871   basic_block bb;
1872   struct function *func;
1873   gimple_stmt_iterator gsi;
1874   struct ipa_node_params *info = IPA_NODE_REF (node);
1875   int i;
1876
1877   if (ipa_get_param_count (info) == 0 || info->uses_analysis_done)
1878     return;
1879
1880   for (i = 0; i < ipa_get_param_count (info); i++)
1881     {
1882       tree parm = ipa_get_param (info, i);
1883       tree ddef;
1884       /* For SSA regs see if parameter is used.  For non-SSA we compute
1885          the flag during modification analysis.  */
1886       if (is_gimple_reg (parm)
1887           && (ddef = ssa_default_def (DECL_STRUCT_FUNCTION (node->symbol.decl),
1888                                       parm)) != NULL_TREE
1889           && !has_zero_uses (ddef))
1890         ipa_set_param_used (info, i, true);
1891     }
1892
1893   func = DECL_STRUCT_FUNCTION (decl);
1894   FOR_EACH_BB_FN (bb, func)
1895     {
1896       for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1897         {
1898           gimple stmt = gsi_stmt (gsi);
1899
1900           if (is_gimple_debug (stmt))
1901             continue;
1902
1903           ipa_analyze_stmt_uses (node, info, parms_ainfo, stmt);
1904           walk_stmt_load_store_addr_ops (stmt, info,
1905                                          visit_ref_for_mod_analysis,
1906                                          visit_ref_for_mod_analysis,
1907                                          visit_ref_for_mod_analysis);
1908         }
1909       for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1910         walk_stmt_load_store_addr_ops (gsi_stmt (gsi), info,
1911                                        visit_ref_for_mod_analysis,
1912                                        visit_ref_for_mod_analysis,
1913                                        visit_ref_for_mod_analysis);
1914     }
1915
1916   info->uses_analysis_done = 1;
1917 }
1918
1919 /* Free stuff in PARMS_AINFO, assume there are PARAM_COUNT parameters.  */
1920
1921 static void
1922 free_parms_ainfo (struct param_analysis_info *parms_ainfo, int param_count)
1923 {
1924   int i;
1925
1926   for (i = 0; i < param_count; i++)
1927     {
1928       if (parms_ainfo[i].parm_visited_statements)
1929         BITMAP_FREE (parms_ainfo[i].parm_visited_statements);
1930       if (parms_ainfo[i].pt_visited_statements)
1931         BITMAP_FREE (parms_ainfo[i].pt_visited_statements);
1932     }
1933 }
1934
1935 /* Initialize the array describing properties of of formal parameters
1936    of NODE, analyze their uses and compute jump functions associated
1937    with actual arguments of calls from within NODE.  */
1938
1939 void
1940 ipa_analyze_node (struct cgraph_node *node)
1941 {
1942   struct ipa_node_params *info;
1943   struct param_analysis_info *parms_ainfo;
1944   int param_count;
1945
1946   ipa_check_create_node_params ();
1947   ipa_check_create_edge_args ();
1948   info = IPA_NODE_REF (node);
1949   push_cfun (DECL_STRUCT_FUNCTION (node->symbol.decl));
1950   ipa_initialize_node_params (node);
1951
1952   param_count = ipa_get_param_count (info);
1953   parms_ainfo = XALLOCAVEC (struct param_analysis_info, param_count);
1954   memset (parms_ainfo, 0, sizeof (struct param_analysis_info) * param_count);
1955
1956   ipa_analyze_params_uses (node, parms_ainfo);
1957   ipa_compute_jump_functions (node, parms_ainfo);
1958
1959   free_parms_ainfo (parms_ainfo, param_count);
1960   pop_cfun ();
1961 }
1962
1963
1964 /* Update the jump function DST when the call graph edge corresponding to SRC is
1965    is being inlined, knowing that DST is of type ancestor and src of known
1966    type.  */
1967
1968 static void
1969 combine_known_type_and_ancestor_jfs (struct ipa_jump_func *src,
1970                                      struct ipa_jump_func *dst)
1971 {
1972   HOST_WIDE_INT combined_offset;
1973   tree combined_type;
1974
1975   combined_offset = ipa_get_jf_known_type_offset (src)
1976     + ipa_get_jf_ancestor_offset (dst);
1977   combined_type = ipa_get_jf_ancestor_type (dst);
1978
1979   ipa_set_jf_known_type (dst, combined_offset,
1980                          ipa_get_jf_known_type_base_type (src),
1981                          combined_type);
1982 }
1983
1984 /* Update the jump functions associated with call graph edge E when the call
1985    graph edge CS is being inlined, assuming that E->caller is already (possibly
1986    indirectly) inlined into CS->callee and that E has not been inlined.  */
1987
1988 static void
1989 update_jump_functions_after_inlining (struct cgraph_edge *cs,
1990                                       struct cgraph_edge *e)
1991 {
1992   struct ipa_edge_args *top = IPA_EDGE_REF (cs);
1993   struct ipa_edge_args *args = IPA_EDGE_REF (e);
1994   int count = ipa_get_cs_argument_count (args);
1995   int i;
1996
1997   for (i = 0; i < count; i++)
1998     {
1999       struct ipa_jump_func *dst = ipa_get_ith_jump_func (args, i);
2000
2001       if (dst->type == IPA_JF_ANCESTOR)
2002         {
2003           struct ipa_jump_func *src;
2004           int dst_fid = dst->value.ancestor.formal_id;
2005
2006           /* Variable number of arguments can cause havoc if we try to access
2007              one that does not exist in the inlined edge.  So make sure we
2008              don't.  */
2009           if (dst_fid >= ipa_get_cs_argument_count (top))
2010             {
2011               dst->type = IPA_JF_UNKNOWN;
2012               continue;
2013             }
2014
2015           src = ipa_get_ith_jump_func (top, dst_fid);
2016
2017           if (src->agg.items
2018               && (dst->value.ancestor.agg_preserved || !src->agg.by_ref))
2019             {
2020               struct ipa_agg_jf_item *item;
2021               int j;
2022
2023               /* Currently we do not produce clobber aggregate jump functions,
2024                  replace with merging when we do.  */
2025               gcc_assert (!dst->agg.items);
2026
2027               dst->agg.items = vec_safe_copy (src->agg.items);
2028               dst->agg.by_ref = src->agg.by_ref;
2029               FOR_EACH_VEC_SAFE_ELT (dst->agg.items, j, item)
2030                 item->offset -= dst->value.ancestor.offset;
2031             }
2032
2033           if (src->type == IPA_JF_KNOWN_TYPE)
2034             combine_known_type_and_ancestor_jfs (src, dst);
2035           else if (src->type == IPA_JF_PASS_THROUGH
2036                    && src->value.pass_through.operation == NOP_EXPR)
2037             {
2038               dst->value.ancestor.formal_id = src->value.pass_through.formal_id;
2039               dst->value.ancestor.agg_preserved &=
2040                 src->value.pass_through.agg_preserved;
2041             }
2042           else if (src->type == IPA_JF_ANCESTOR)
2043             {
2044               dst->value.ancestor.formal_id = src->value.ancestor.formal_id;
2045               dst->value.ancestor.offset += src->value.ancestor.offset;
2046               dst->value.ancestor.agg_preserved &=
2047                 src->value.ancestor.agg_preserved;
2048             }
2049           else
2050             dst->type = IPA_JF_UNKNOWN;
2051         }
2052       else if (dst->type == IPA_JF_PASS_THROUGH)
2053         {
2054           struct ipa_jump_func *src;
2055           /* We must check range due to calls with variable number of arguments
2056              and we cannot combine jump functions with operations.  */
2057           if (dst->value.pass_through.operation == NOP_EXPR
2058               && (dst->value.pass_through.formal_id
2059                   < ipa_get_cs_argument_count (top)))
2060             {
2061               bool agg_p;
2062               int dst_fid = dst->value.pass_through.formal_id;
2063               src = ipa_get_ith_jump_func (top, dst_fid);
2064               agg_p = dst->value.pass_through.agg_preserved;
2065
2066               dst->type = src->type;
2067               dst->value = src->value;
2068
2069               if (src->agg.items
2070                   && (agg_p || !src->agg.by_ref))
2071                 {
2072                   /* Currently we do not produce clobber aggregate jump
2073                      functions, replace with merging when we do.  */
2074                   gcc_assert (!dst->agg.items);
2075
2076                   dst->agg.by_ref = src->agg.by_ref;
2077                   dst->agg.items = vec_safe_copy (src->agg.items);
2078                 }
2079
2080               if (!agg_p)
2081                 {
2082                   if (dst->type == IPA_JF_PASS_THROUGH)
2083                     dst->value.pass_through.agg_preserved = false;
2084                   else if (dst->type == IPA_JF_ANCESTOR)
2085                     dst->value.ancestor.agg_preserved = false;
2086                 }
2087             }
2088           else
2089             dst->type = IPA_JF_UNKNOWN;
2090         }
2091     }
2092 }
2093
2094 /* If TARGET is an addr_expr of a function declaration, make it the destination
2095    of an indirect edge IE and return the edge.  Otherwise, return NULL.  */
2096
2097 struct cgraph_edge *
2098 ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target)
2099 {
2100   struct cgraph_node *callee;
2101   struct inline_edge_summary *es = inline_edge_summary (ie);
2102
2103   if (TREE_CODE (target) == ADDR_EXPR)
2104     target = TREE_OPERAND (target, 0);
2105   if (TREE_CODE (target) != FUNCTION_DECL)
2106     {
2107       target = canonicalize_constructor_val (target, NULL);
2108       if (!target || TREE_CODE (target) != FUNCTION_DECL)
2109         {
2110           if (dump_file)
2111             fprintf (dump_file, "ipa-prop: Discovered direct call to non-function"
2112                                 " in (%s/%i).\n",
2113                      cgraph_node_name (ie->caller), ie->caller->uid);
2114           return NULL;
2115         }
2116     }
2117   callee = cgraph_get_node (target);
2118
2119   /* Because may-edges are not explicitely represented and vtable may be external,
2120      we may create the first reference to the object in the unit.  */
2121   if (!callee || callee->global.inlined_to)
2122     {
2123       struct cgraph_node *first_clone = callee;
2124
2125       /* We are better to ensure we can refer to it.
2126          In the case of static functions we are out of luck, since we already   
2127          removed its body.  In the case of public functions we may or may
2128          not introduce the reference.  */
2129       if (!canonicalize_constructor_val (target, NULL)
2130           || !TREE_PUBLIC (target))
2131         {
2132           if (dump_file)
2133             fprintf (dump_file, "ipa-prop: Discovered call to a known target "
2134                      "(%s/%i -> %s/%i) but can not refer to it. Giving up.\n",
2135                      xstrdup (cgraph_node_name (ie->caller)), ie->caller->uid,
2136                      xstrdup (cgraph_node_name (ie->callee)), ie->callee->uid);
2137           return NULL;
2138         }
2139
2140       /* Create symbol table node.  Even if inline clone exists, we can not take
2141          it as a target of non-inlined call.  */
2142       callee = cgraph_create_node (target);
2143
2144       /* OK, we previously inlined the function, then removed the offline copy and
2145          now we want it back for external call.  This can happen when devirtualizing
2146          while inlining function called once that happens after extern inlined and
2147          virtuals are already removed.  In this case introduce the external node
2148          and make it available for call.  */
2149       if (first_clone)
2150         {
2151           first_clone->clone_of = callee;
2152           callee->clones = first_clone;
2153           symtab_prevail_in_asm_name_hash ((symtab_node)callee);
2154           symtab_insert_node_to_hashtable ((symtab_node)callee);
2155           if (dump_file)
2156             fprintf (dump_file, "ipa-prop: Introduced new external node "
2157                      "(%s/%i) and turned into root of the clone tree.\n",
2158                      xstrdup (cgraph_node_name (callee)), callee->uid);
2159         }
2160       else if (dump_file)
2161         fprintf (dump_file, "ipa-prop: Introduced new external node "
2162                  "(%s/%i).\n",
2163                  xstrdup (cgraph_node_name (callee)), callee->uid);
2164     }
2165   ipa_check_create_node_params ();
2166
2167   /* We can not make edges to inline clones.  It is bug that someone removed
2168      the cgraph node too early.  */
2169   gcc_assert (!callee->global.inlined_to);
2170
2171   cgraph_make_edge_direct (ie, callee);
2172   es = inline_edge_summary (ie);
2173   es->call_stmt_size -= (eni_size_weights.indirect_call_cost
2174                          - eni_size_weights.call_cost);
2175   es->call_stmt_time -= (eni_time_weights.indirect_call_cost
2176                          - eni_time_weights.call_cost);
2177   if (dump_file)
2178     {
2179       fprintf (dump_file, "ipa-prop: Discovered %s call to a known target "
2180                "(%s/%i -> %s/%i), for stmt ",
2181                ie->indirect_info->polymorphic ? "a virtual" : "an indirect",
2182                xstrdup (cgraph_node_name (ie->caller)), ie->caller->uid,
2183                xstrdup (cgraph_node_name (ie->callee)), ie->callee->uid);
2184       if (ie->call_stmt)
2185         print_gimple_stmt (dump_file, ie->call_stmt, 2, TDF_SLIM);
2186       else
2187         fprintf (dump_file, "with uid %i\n", ie->lto_stmt_uid);
2188     }
2189   callee = cgraph_function_or_thunk_node (callee, NULL);
2190
2191   return ie;
2192 }
2193
2194 /* Retrieve value from aggregate jump function AGG for the given OFFSET or
2195    return NULL if there is not any.  BY_REF specifies whether the value has to
2196    be passed by reference or by value.  */
2197
2198 tree
2199 ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *agg,
2200                             HOST_WIDE_INT offset, bool by_ref)
2201 {
2202   struct ipa_agg_jf_item *item;
2203   int i;
2204
2205   if (by_ref != agg->by_ref)
2206     return NULL;
2207
2208   FOR_EACH_VEC_SAFE_ELT (agg->items, i, item)
2209     if (item->offset == offset)
2210       {
2211         /* Currently we do not have clobber values, return NULL for them once
2212            we do.  */
2213         gcc_checking_assert (is_gimple_ip_invariant (item->value));
2214         return item->value;
2215       }
2216   return NULL;
2217 }
2218
2219 /* Try to find a destination for indirect edge IE that corresponds to a simple
2220    call or a call of a member function pointer and where the destination is a
2221    pointer formal parameter described by jump function JFUNC.  If it can be
2222    determined, return the newly direct edge, otherwise return NULL.
2223    NEW_ROOT_INFO is the node info that JFUNC lattices are relative to.  */
2224
2225 static struct cgraph_edge *
2226 try_make_edge_direct_simple_call (struct cgraph_edge *ie,
2227                                   struct ipa_jump_func *jfunc,
2228                                   struct ipa_node_params *new_root_info)
2229 {
2230   tree target;
2231
2232   if (ie->indirect_info->agg_contents)
2233     target = ipa_find_agg_cst_for_param (&jfunc->agg,
2234                                          ie->indirect_info->offset,
2235                                          ie->indirect_info->by_ref);
2236   else
2237     target = ipa_value_from_jfunc (new_root_info, jfunc);
2238   if (!target)
2239     return NULL;
2240   return ipa_make_edge_direct_to_target (ie, target);
2241 }
2242
2243 /* Try to find a destination for indirect edge IE that corresponds to a virtual
2244    call based on a formal parameter which is described by jump function JFUNC
2245    and if it can be determined, make it direct and return the direct edge.
2246    Otherwise, return NULL.  NEW_ROOT_INFO is the node info that JFUNC lattices
2247    are relative to.  */
2248
2249 static struct cgraph_edge *
2250 try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
2251                                    struct ipa_jump_func *jfunc,
2252                                    struct ipa_node_params *new_root_info)
2253 {
2254   tree binfo, target;
2255
2256   binfo = ipa_value_from_jfunc (new_root_info, jfunc);
2257
2258   if (!binfo)
2259     return NULL;
2260
2261   if (TREE_CODE (binfo) != TREE_BINFO)
2262     {
2263       binfo = gimple_extract_devirt_binfo_from_cst (binfo);
2264       if (!binfo)
2265         return NULL;
2266     }
2267
2268   binfo = get_binfo_at_offset (binfo, ie->indirect_info->offset,
2269                                ie->indirect_info->otr_type);
2270   if (binfo)
2271     target = gimple_get_virt_method_for_binfo (ie->indirect_info->otr_token,
2272                                                binfo);
2273   else
2274     return NULL;
2275
2276   if (target)
2277     return ipa_make_edge_direct_to_target (ie, target);
2278   else
2279     return NULL;
2280 }
2281
2282 /* Update the param called notes associated with NODE when CS is being inlined,
2283    assuming NODE is (potentially indirectly) inlined into CS->callee.
2284    Moreover, if the callee is discovered to be constant, create a new cgraph
2285    edge for it.  Newly discovered indirect edges will be added to *NEW_EDGES,
2286    unless NEW_EDGES is NULL.  Return true iff a new edge(s) were created.  */
2287
2288 static bool
2289 update_indirect_edges_after_inlining (struct cgraph_edge *cs,
2290                                       struct cgraph_node *node,
2291                                       vec<cgraph_edge_p> *new_edges)
2292 {
2293   struct ipa_edge_args *top;
2294   struct cgraph_edge *ie, *next_ie, *new_direct_edge;
2295   struct ipa_node_params *new_root_info;
2296   bool res = false;
2297
2298   ipa_check_create_edge_args ();
2299   top = IPA_EDGE_REF (cs);
2300   new_root_info = IPA_NODE_REF (cs->caller->global.inlined_to
2301                                 ? cs->caller->global.inlined_to
2302                                 : cs->caller);
2303
2304   for (ie = node->indirect_calls; ie; ie = next_ie)
2305     {
2306       struct cgraph_indirect_call_info *ici = ie->indirect_info;
2307       struct ipa_jump_func *jfunc;
2308       int param_index;
2309
2310       next_ie = ie->next_callee;
2311
2312       if (ici->param_index == -1)
2313         continue;
2314
2315       /* We must check range due to calls with variable number of arguments:  */
2316       if (ici->param_index >= ipa_get_cs_argument_count (top))
2317         {
2318           ici->param_index = -1;
2319           continue;
2320         }
2321
2322       param_index = ici->param_index;
2323       jfunc = ipa_get_ith_jump_func (top, param_index);
2324
2325       if (!flag_indirect_inlining)
2326         new_direct_edge = NULL;
2327       else if (ici->polymorphic)
2328         new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc,
2329                                                              new_root_info);
2330       else
2331         new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc,
2332                                                             new_root_info);
2333       if (new_direct_edge)
2334         {
2335           new_direct_edge->indirect_inlining_edge = 1;
2336           if (new_direct_edge->call_stmt)
2337             new_direct_edge->call_stmt_cannot_inline_p
2338               = !gimple_check_call_matching_types (new_direct_edge->call_stmt,
2339                                                    new_direct_edge->callee->symbol.decl);
2340           if (new_edges)
2341             {
2342               new_edges->safe_push (new_direct_edge);
2343               top = IPA_EDGE_REF (cs);
2344               res = true;
2345             }
2346         }
2347       else if (jfunc->type == IPA_JF_PASS_THROUGH
2348                && ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
2349         {
2350           if (ici->agg_contents
2351               && !ipa_get_jf_pass_through_agg_preserved (jfunc))
2352             ici->param_index = -1;
2353           else
2354             ici->param_index = ipa_get_jf_pass_through_formal_id (jfunc);
2355         }
2356       else if (jfunc->type == IPA_JF_ANCESTOR)
2357         {
2358           if (ici->agg_contents
2359               && !ipa_get_jf_ancestor_agg_preserved (jfunc))
2360             ici->param_index = -1;
2361           else
2362             {
2363               ici->param_index = ipa_get_jf_ancestor_formal_id (jfunc);
2364               ici->offset += ipa_get_jf_ancestor_offset (jfunc);
2365             }
2366         }
2367       else
2368         /* Either we can find a destination for this edge now or never. */
2369         ici->param_index = -1;
2370     }
2371
2372   return res;
2373 }
2374
2375 /* Recursively traverse subtree of NODE (including node) made of inlined
2376    cgraph_edges when CS has been inlined and invoke
2377    update_indirect_edges_after_inlining on all nodes and
2378    update_jump_functions_after_inlining on all non-inlined edges that lead out
2379    of this subtree.  Newly discovered indirect edges will be added to
2380    *NEW_EDGES, unless NEW_EDGES is NULL.  Return true iff a new edge(s) were
2381    created.  */
2382
2383 static bool
2384 propagate_info_to_inlined_callees (struct cgraph_edge *cs,
2385                                    struct cgraph_node *node,
2386                                    vec<cgraph_edge_p> *new_edges)
2387 {
2388   struct cgraph_edge *e;
2389   bool res;
2390
2391   res = update_indirect_edges_after_inlining (cs, node, new_edges);
2392
2393   for (e = node->callees; e; e = e->next_callee)
2394     if (!e->inline_failed)
2395       res |= propagate_info_to_inlined_callees (cs, e->callee, new_edges);
2396     else
2397       update_jump_functions_after_inlining (cs, e);
2398   for (e = node->indirect_calls; e; e = e->next_callee)
2399     update_jump_functions_after_inlining (cs, e);
2400
2401   return res;
2402 }
2403
2404 /* Update jump functions and call note functions on inlining the call site CS.
2405    CS is expected to lead to a node already cloned by
2406    cgraph_clone_inline_nodes.  Newly discovered indirect edges will be added to
2407    *NEW_EDGES, unless NEW_EDGES is NULL.  Return true iff a new edge(s) were +
2408    created.  */
2409
2410 bool
2411 ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
2412                                    vec<cgraph_edge_p> *new_edges)
2413 {
2414   bool changed;
2415   /* Do nothing if the preparation phase has not been carried out yet
2416      (i.e. during early inlining).  */
2417   if (!ipa_node_params_vector.exists ())
2418     return false;
2419   gcc_assert (ipa_edge_args_vector);
2420
2421   changed = propagate_info_to_inlined_callees (cs, cs->callee, new_edges);
2422
2423   /* We do not keep jump functions of inlined edges up to date. Better to free
2424      them so we do not access them accidentally.  */
2425   ipa_free_edge_args_substructures (IPA_EDGE_REF (cs));
2426   return changed;
2427 }
2428
2429 /* Frees all dynamically allocated structures that the argument info points
2430    to.  */
2431
2432 void
2433 ipa_free_edge_args_substructures (struct ipa_edge_args *args)
2434 {
2435   vec_free (args->jump_functions);
2436   memset (args, 0, sizeof (*args));
2437 }
2438
2439 /* Free all ipa_edge structures.  */
2440
2441 void
2442 ipa_free_all_edge_args (void)
2443 {
2444   int i;
2445   struct ipa_edge_args *args;
2446
2447   if (!ipa_edge_args_vector)
2448     return;
2449
2450   FOR_EACH_VEC_ELT (*ipa_edge_args_vector, i, args)
2451     ipa_free_edge_args_substructures (args);
2452
2453   vec_free (ipa_edge_args_vector);
2454 }
2455
2456 /* Frees all dynamically allocated structures that the param info points
2457    to.  */
2458
2459 void
2460 ipa_free_node_params_substructures (struct ipa_node_params *info)
2461 {
2462   info->descriptors.release ();
2463   free (info->lattices);
2464   /* Lattice values and their sources are deallocated with their alocation
2465      pool.  */
2466   info->known_vals.release ();
2467   memset (info, 0, sizeof (*info));
2468 }
2469
2470 /* Free all ipa_node_params structures.  */
2471
2472 void
2473 ipa_free_all_node_params (void)
2474 {
2475   int i;
2476   struct ipa_node_params *info;
2477
2478   FOR_EACH_VEC_ELT (ipa_node_params_vector, i, info)
2479     ipa_free_node_params_substructures (info);
2480
2481   ipa_node_params_vector.release ();
2482 }
2483
2484 /* Set the aggregate replacements of NODE to be AGGVALS.  */
2485
2486 void
2487 ipa_set_node_agg_value_chain (struct cgraph_node *node,
2488                               struct ipa_agg_replacement_value *aggvals)
2489 {
2490   if (vec_safe_length (ipa_node_agg_replacements) <= (unsigned) cgraph_max_uid)
2491     vec_safe_grow_cleared (ipa_node_agg_replacements, cgraph_max_uid + 1);
2492
2493   (*ipa_node_agg_replacements)[node->uid] = aggvals;
2494 }
2495
2496 /* Hook that is called by cgraph.c when an edge is removed.  */
2497
2498 static void
2499 ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
2500 {
2501   /* During IPA-CP updating we can be called on not-yet analyze clones.  */
2502   if (vec_safe_length (ipa_edge_args_vector) <= (unsigned)cs->uid)
2503     return;
2504   ipa_free_edge_args_substructures (IPA_EDGE_REF (cs));
2505 }
2506
2507 /* Hook that is called by cgraph.c when a node is removed.  */
2508
2509 static void
2510 ipa_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
2511 {
2512   /* During IPA-CP updating we can be called on not-yet analyze clones.  */
2513   if (ipa_node_params_vector.length () > (unsigned)node->uid)
2514     ipa_free_node_params_substructures (IPA_NODE_REF (node));
2515   if (vec_safe_length (ipa_node_agg_replacements) > (unsigned)node->uid)
2516     (*ipa_node_agg_replacements)[(unsigned)node->uid] = NULL;
2517 }
2518
2519 /* Hook that is called by cgraph.c when an edge is duplicated.  */
2520
2521 static void
2522 ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
2523                            __attribute__((unused)) void *data)
2524 {
2525   struct ipa_edge_args *old_args, *new_args;
2526   unsigned int i;
2527
2528   ipa_check_create_edge_args ();
2529
2530   old_args = IPA_EDGE_REF (src);
2531   new_args = IPA_EDGE_REF (dst);
2532
2533   new_args->jump_functions = vec_safe_copy (old_args->jump_functions);
2534
2535   for (i = 0; i < vec_safe_length (old_args->jump_functions); i++)
2536     (*new_args->jump_functions)[i].agg.items
2537         = vec_safe_copy ((*old_args->jump_functions)[i].agg.items);
2538 }
2539
2540 /* Hook that is called by cgraph.c when a node is duplicated.  */
2541
2542 static void
2543 ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
2544                            ATTRIBUTE_UNUSED void *data)
2545 {
2546   struct ipa_node_params *old_info, *new_info;
2547   struct ipa_agg_replacement_value *old_av, *new_av;
2548
2549   ipa_check_create_node_params ();
2550   old_info = IPA_NODE_REF (src);
2551   new_info = IPA_NODE_REF (dst);
2552
2553   new_info->descriptors = old_info->descriptors.copy ();
2554   new_info->lattices = NULL;
2555   new_info->ipcp_orig_node = old_info->ipcp_orig_node;
2556
2557   new_info->uses_analysis_done = old_info->uses_analysis_done;
2558   new_info->node_enqueued = old_info->node_enqueued;
2559
2560   old_av = ipa_get_agg_replacements_for_node (src);
2561   if (!old_av)
2562     return;
2563
2564   new_av = NULL;
2565   while (old_av)
2566     {
2567       struct ipa_agg_replacement_value *v;
2568
2569       v = ggc_alloc_ipa_agg_replacement_value ();
2570       memcpy (v, old_av, sizeof (*v));
2571       v->next = new_av;
2572       new_av = v;
2573       old_av = old_av->next;
2574     }
2575   ipa_set_node_agg_value_chain (dst, new_av);
2576 }
2577
2578
2579 /* Analyze newly added function into callgraph.  */
2580
2581 static void
2582 ipa_add_new_function (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
2583 {
2584   ipa_analyze_node (node);
2585 }
2586
2587 /* Register our cgraph hooks if they are not already there.  */
2588
2589 void
2590 ipa_register_cgraph_hooks (void)
2591 {
2592   if (!edge_removal_hook_holder)
2593     edge_removal_hook_holder =
2594       cgraph_add_edge_removal_hook (&ipa_edge_removal_hook, NULL);
2595   if (!node_removal_hook_holder)
2596     node_removal_hook_holder =
2597       cgraph_add_node_removal_hook (&ipa_node_removal_hook, NULL);
2598   if (!edge_duplication_hook_holder)
2599     edge_duplication_hook_holder =
2600       cgraph_add_edge_duplication_hook (&ipa_edge_duplication_hook, NULL);
2601   if (!node_duplication_hook_holder)
2602     node_duplication_hook_holder =
2603       cgraph_add_node_duplication_hook (&ipa_node_duplication_hook, NULL);
2604   function_insertion_hook_holder =
2605       cgraph_add_function_insertion_hook (&ipa_add_new_function, NULL);
2606 }
2607
2608 /* Unregister our cgraph hooks if they are not already there.  */
2609
2610 static void
2611 ipa_unregister_cgraph_hooks (void)
2612 {
2613   cgraph_remove_edge_removal_hook (edge_removal_hook_holder);
2614   edge_removal_hook_holder = NULL;
2615   cgraph_remove_node_removal_hook (node_removal_hook_holder);
2616   node_removal_hook_holder = NULL;
2617   cgraph_remove_edge_duplication_hook (edge_duplication_hook_holder);
2618   edge_duplication_hook_holder = NULL;
2619   cgraph_remove_node_duplication_hook (node_duplication_hook_holder);
2620   node_duplication_hook_holder = NULL;
2621   cgraph_remove_function_insertion_hook (function_insertion_hook_holder);
2622   function_insertion_hook_holder = NULL;
2623 }
2624
2625 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
2626    longer needed after ipa-cp.  */
2627
2628 void
2629 ipa_free_all_structures_after_ipa_cp (void)
2630 {
2631   if (!optimize)
2632     {
2633       ipa_free_all_edge_args ();
2634       ipa_free_all_node_params ();
2635       free_alloc_pool (ipcp_sources_pool);
2636       free_alloc_pool (ipcp_values_pool);
2637       free_alloc_pool (ipcp_agg_lattice_pool);
2638       ipa_unregister_cgraph_hooks ();
2639     }
2640 }
2641
2642 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
2643    longer needed after indirect inlining.  */
2644
2645 void
2646 ipa_free_all_structures_after_iinln (void)
2647 {
2648   ipa_free_all_edge_args ();
2649   ipa_free_all_node_params ();
2650   ipa_unregister_cgraph_hooks ();
2651   if (ipcp_sources_pool)
2652     free_alloc_pool (ipcp_sources_pool);
2653   if (ipcp_values_pool)
2654     free_alloc_pool (ipcp_values_pool);
2655   if (ipcp_agg_lattice_pool)
2656     free_alloc_pool (ipcp_agg_lattice_pool);
2657 }
2658
2659 /* Print ipa_tree_map data structures of all functions in the
2660    callgraph to F.  */
2661
2662 void
2663 ipa_print_node_params (FILE *f, struct cgraph_node *node)
2664 {
2665   int i, count;
2666   tree temp;
2667   struct ipa_node_params *info;
2668
2669   if (!node->analyzed)
2670     return;
2671   info = IPA_NODE_REF (node);
2672   fprintf (f, "  function  %s parameter descriptors:\n",
2673            cgraph_node_name (node));
2674   count = ipa_get_param_count (info);
2675   for (i = 0; i < count; i++)
2676     {
2677       temp = ipa_get_param (info, i);
2678       if (TREE_CODE (temp) == PARM_DECL)
2679         fprintf (f, "    param %d : %s", i,
2680                  (DECL_NAME (temp)
2681                   ? (*lang_hooks.decl_printable_name) (temp, 2)
2682                   : "(unnamed)"));
2683       if (ipa_is_param_used (info, i))
2684         fprintf (f, " used");
2685       fprintf (f, "\n");
2686     }
2687 }
2688
2689 /* Print ipa_tree_map data structures of all functions in the
2690    callgraph to F.  */
2691
2692 void
2693 ipa_print_all_params (FILE * f)
2694 {
2695   struct cgraph_node *node;
2696
2697   fprintf (f, "\nFunction parameters:\n");
2698   FOR_EACH_FUNCTION (node)
2699     ipa_print_node_params (f, node);
2700 }
2701
2702 /* Return a heap allocated vector containing formal parameters of FNDECL.  */
2703
2704 vec<tree> 
2705 ipa_get_vector_of_formal_parms (tree fndecl)
2706 {
2707   vec<tree> args;
2708   int count;
2709   tree parm;
2710
2711   count = count_formal_params (fndecl);
2712   args.create (count);
2713   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
2714     args.quick_push (parm);
2715
2716   return args;
2717 }
2718
2719 /* Return a heap allocated vector containing types of formal parameters of
2720    function type FNTYPE.  */
2721
2722 static inline vec<tree> 
2723 get_vector_of_formal_parm_types (tree fntype)
2724 {
2725   vec<tree> types;
2726   int count = 0;
2727   tree t;
2728
2729   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
2730     count++;
2731
2732   types.create (count);
2733   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
2734     types.quick_push (TREE_VALUE (t));
2735
2736   return types;
2737 }
2738
2739 /* Modify the function declaration FNDECL and its type according to the plan in
2740    ADJUSTMENTS.  It also sets base fields of individual adjustments structures
2741    to reflect the actual parameters being modified which are determined by the
2742    base_index field.  */
2743
2744 void
2745 ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
2746                               const char *synth_parm_prefix)
2747 {
2748   vec<tree> oparms, otypes;
2749   tree orig_type, new_type = NULL;
2750   tree old_arg_types, t, new_arg_types = NULL;
2751   tree parm, *link = &DECL_ARGUMENTS (fndecl);
2752   int i, len = adjustments.length ();
2753   tree new_reversed = NULL;
2754   bool care_for_types, last_parm_void;
2755
2756   if (!synth_parm_prefix)
2757     synth_parm_prefix = "SYNTH";
2758
2759   oparms = ipa_get_vector_of_formal_parms (fndecl);
2760   orig_type = TREE_TYPE (fndecl);
2761   old_arg_types = TYPE_ARG_TYPES (orig_type);
2762
2763   /* The following test is an ugly hack, some functions simply don't have any
2764      arguments in their type.  This is probably a bug but well... */
2765   care_for_types = (old_arg_types != NULL_TREE);
2766   if (care_for_types)
2767     {
2768       last_parm_void = (TREE_VALUE (tree_last (old_arg_types))
2769                         == void_type_node);
2770       otypes = get_vector_of_formal_parm_types (orig_type);
2771       if (last_parm_void)
2772         gcc_assert (oparms.length () + 1 == otypes.length ());
2773       else
2774         gcc_assert (oparms.length () == otypes.length ());
2775     }
2776   else
2777     {
2778       last_parm_void = false;
2779       otypes.create (0);
2780     }
2781
2782   for (i = 0; i < len; i++)
2783     {
2784       struct ipa_parm_adjustment *adj;
2785       gcc_assert (link);
2786
2787       adj = &adjustments[i];
2788       parm = oparms[adj->base_index];
2789       adj->base = parm;
2790
2791       if (adj->copy_param)
2792         {
2793           if (care_for_types)
2794             new_arg_types = tree_cons (NULL_TREE, otypes[adj->base_index],
2795                                        new_arg_types);
2796           *link = parm;
2797           link = &DECL_CHAIN (parm);
2798         }
2799       else if (!adj->remove_param)
2800         {
2801           tree new_parm;
2802           tree ptype;
2803
2804           if (adj->by_ref)
2805             ptype = build_pointer_type (adj->type);
2806           else
2807             ptype = adj->type;
2808
2809           if (care_for_types)
2810             new_arg_types = tree_cons (NULL_TREE, ptype, new_arg_types);
2811
2812           new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
2813                                  ptype);
2814           DECL_NAME (new_parm) = create_tmp_var_name (synth_parm_prefix);
2815
2816           DECL_ARTIFICIAL (new_parm) = 1;
2817           DECL_ARG_TYPE (new_parm) = ptype;
2818           DECL_CONTEXT (new_parm) = fndecl;
2819           TREE_USED (new_parm) = 1;
2820           DECL_IGNORED_P (new_parm) = 1;
2821           layout_decl (new_parm, 0);
2822
2823           adj->base = parm;
2824           adj->reduction = new_parm;
2825
2826           *link = new_parm;
2827
2828           link = &DECL_CHAIN (new_parm);
2829         }
2830     }
2831
2832   *link = NULL_TREE;
2833
2834   if (care_for_types)
2835     {
2836       new_reversed = nreverse (new_arg_types);
2837       if (last_parm_void)
2838         {
2839           if (new_reversed)
2840             TREE_CHAIN (new_arg_types) = void_list_node;
2841           else
2842             new_reversed = void_list_node;
2843         }
2844     }
2845
2846   /* Use copy_node to preserve as much as possible from original type
2847      (debug info, attribute lists etc.)
2848      Exception is METHOD_TYPEs must have THIS argument.
2849      When we are asked to remove it, we need to build new FUNCTION_TYPE
2850      instead.  */
2851   if (TREE_CODE (orig_type) != METHOD_TYPE
2852        || (adjustments[0].copy_param
2853           && adjustments[0].base_index == 0))
2854     {
2855       new_type = build_distinct_type_copy (orig_type);
2856       TYPE_ARG_TYPES (new_type) = new_reversed;
2857     }
2858   else
2859     {
2860       new_type
2861         = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
2862                                                          new_reversed));
2863       TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
2864       DECL_VINDEX (fndecl) = NULL_TREE;
2865     }
2866
2867   /* When signature changes, we need to clear builtin info.  */
2868   if (DECL_BUILT_IN (fndecl))
2869     {
2870       DECL_BUILT_IN_CLASS (fndecl) = NOT_BUILT_IN;
2871       DECL_FUNCTION_CODE (fndecl) = (enum built_in_function) 0;
2872     }
2873
2874   /* This is a new type, not a copy of an old type.  Need to reassociate
2875      variants.  We can handle everything except the main variant lazily.  */
2876   t = TYPE_MAIN_VARIANT (orig_type);
2877   if (orig_type != t)
2878     {
2879       TYPE_MAIN_VARIANT (new_type) = t;
2880       TYPE_NEXT_VARIANT (new_type) = TYPE_NEXT_VARIANT (t);
2881       TYPE_NEXT_VARIANT (t) = new_type;
2882     }
2883   else
2884     {
2885       TYPE_MAIN_VARIANT (new_type) = new_type;
2886       TYPE_NEXT_VARIANT (new_type) = NULL;
2887     }
2888
2889   TREE_TYPE (fndecl) = new_type;
2890   DECL_VIRTUAL_P (fndecl) = 0;
2891   otypes.release ();
2892   oparms.release ();
2893 }
2894
2895 /* Modify actual arguments of a function call CS as indicated in ADJUSTMENTS.
2896    If this is a directly recursive call, CS must be NULL.  Otherwise it must
2897    contain the corresponding call graph edge.  */
2898
2899 void
2900 ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
2901                            ipa_parm_adjustment_vec adjustments)
2902 {
2903   vec<tree> vargs;
2904   vec<tree, va_gc> **debug_args = NULL;
2905   gimple new_stmt;
2906   gimple_stmt_iterator gsi;
2907   tree callee_decl;
2908   int i, len;
2909
2910   len = adjustments.length ();
2911   vargs.create (len);
2912   callee_decl = !cs ? gimple_call_fndecl (stmt) : cs->callee->symbol.decl;
2913
2914   gsi = gsi_for_stmt (stmt);
2915   for (i = 0; i < len; i++)
2916     {
2917       struct ipa_parm_adjustment *adj;
2918
2919       adj = &adjustments[i];
2920
2921       if (adj->copy_param)
2922         {
2923           tree arg = gimple_call_arg (stmt, adj->base_index);
2924
2925           vargs.quick_push (arg);
2926         }
2927       else if (!adj->remove_param)
2928         {
2929           tree expr, base, off;
2930           location_t loc;
2931           unsigned int deref_align;
2932           bool deref_base = false;
2933
2934           /* We create a new parameter out of the value of the old one, we can
2935              do the following kind of transformations:
2936
2937              - A scalar passed by reference is converted to a scalar passed by
2938                value.  (adj->by_ref is false and the type of the original
2939                actual argument is a pointer to a scalar).
2940
2941              - A part of an aggregate is passed instead of the whole aggregate.
2942                The part can be passed either by value or by reference, this is
2943                determined by value of adj->by_ref.  Moreover, the code below
2944                handles both situations when the original aggregate is passed by
2945                value (its type is not a pointer) and when it is passed by
2946                reference (it is a pointer to an aggregate).
2947
2948              When the new argument is passed by reference (adj->by_ref is true)
2949              it must be a part of an aggregate and therefore we form it by
2950              simply taking the address of a reference inside the original
2951              aggregate.  */
2952
2953           gcc_checking_assert (adj->offset % BITS_PER_UNIT == 0);
2954           base = gimple_call_arg (stmt, adj->base_index);
2955           loc = DECL_P (base) ? DECL_SOURCE_LOCATION (base)
2956                               : EXPR_LOCATION (base);
2957
2958           if (TREE_CODE (base) != ADDR_EXPR
2959               && POINTER_TYPE_P (TREE_TYPE (base)))
2960             off = build_int_cst (adj->alias_ptr_type,
2961                                  adj->offset / BITS_PER_UNIT);
2962           else
2963             {
2964               HOST_WIDE_INT base_offset;
2965               tree prev_base;
2966               bool addrof;
2967
2968               if (TREE_CODE (base) == ADDR_EXPR)
2969                 {
2970                   base = TREE_OPERAND (base, 0);
2971                   addrof = true;
2972                 }
2973               else
2974                 addrof = false;
2975               prev_base = base;
2976               base = get_addr_base_and_unit_offset (base, &base_offset);
2977               /* Aggregate arguments can have non-invariant addresses.  */
2978               if (!base)
2979                 {
2980                   base = build_fold_addr_expr (prev_base);
2981                   off = build_int_cst (adj->alias_ptr_type,
2982                                        adj->offset / BITS_PER_UNIT);
2983                 }
2984               else if (TREE_CODE (base) == MEM_REF)
2985                 {
2986                   if (!addrof)
2987                     {
2988                       deref_base = true;
2989                       deref_align = TYPE_ALIGN (TREE_TYPE (base));
2990                     }
2991                   off = build_int_cst (adj->alias_ptr_type,
2992                                        base_offset
2993                                        + adj->offset / BITS_PER_UNIT);
2994                   off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
2995                                          off);
2996                   base = TREE_OPERAND (base, 0);
2997                 }
2998               else
2999                 {
3000                   off = build_int_cst (adj->alias_ptr_type,
3001                                        base_offset
3002                                        + adj->offset / BITS_PER_UNIT);
3003                   base = build_fold_addr_expr (base);
3004                 }
3005             }
3006
3007           if (!adj->by_ref)
3008             {
3009               tree type = adj->type;
3010               unsigned int align;
3011               unsigned HOST_WIDE_INT misalign;
3012
3013               if (deref_base)
3014                 {
3015                   align = deref_align;
3016                   misalign = 0;
3017                 }
3018               else
3019                 {
3020                   get_pointer_alignment_1 (base, &align, &misalign);
3021                   if (TYPE_ALIGN (type) > align)
3022                     align = TYPE_ALIGN (type);
3023                 }
3024               misalign += (tree_to_double_int (off)
3025                            .sext (TYPE_PRECISION (TREE_TYPE (off))).low
3026                            * BITS_PER_UNIT);
3027               misalign = misalign & (align - 1);
3028               if (misalign != 0)
3029                 align = (misalign & -misalign);
3030               if (align < TYPE_ALIGN (type))
3031                 type = build_aligned_type (type, align);
3032               expr = fold_build2_loc (loc, MEM_REF, type, base, off);
3033             }
3034           else
3035             {
3036               expr = fold_build2_loc (loc, MEM_REF, adj->type, base, off);
3037               expr = build_fold_addr_expr (expr);
3038             }
3039
3040           expr = force_gimple_operand_gsi (&gsi, expr,
3041                                            adj->by_ref
3042                                            || is_gimple_reg_type (adj->type),
3043                                            NULL, true, GSI_SAME_STMT);
3044           vargs.quick_push (expr);
3045         }
3046       if (!adj->copy_param && MAY_HAVE_DEBUG_STMTS)
3047         {
3048           unsigned int ix;
3049           tree ddecl = NULL_TREE, origin = DECL_ORIGIN (adj->base), arg;
3050           gimple def_temp;
3051
3052           arg = gimple_call_arg (stmt, adj->base_index);
3053           if (!useless_type_conversion_p (TREE_TYPE (origin), TREE_TYPE (arg)))
3054             {
3055               if (!fold_convertible_p (TREE_TYPE (origin), arg))
3056                 continue;
3057               arg = fold_convert_loc (gimple_location (stmt),
3058                                       TREE_TYPE (origin), arg);
3059             }
3060           if (debug_args == NULL)
3061             debug_args = decl_debug_args_insert (callee_decl);
3062           for (ix = 0; vec_safe_iterate (*debug_args, ix, &ddecl); ix += 2)
3063             if (ddecl == origin)
3064               {
3065                 ddecl = (**debug_args)[ix + 1];
3066                 break;
3067               }
3068           if (ddecl == NULL)
3069             {
3070               ddecl = make_node (DEBUG_EXPR_DECL);
3071               DECL_ARTIFICIAL (ddecl) = 1;
3072               TREE_TYPE (ddecl) = TREE_TYPE (origin);
3073               DECL_MODE (ddecl) = DECL_MODE (origin);
3074
3075               vec_safe_push (*debug_args, origin);
3076               vec_safe_push (*debug_args, ddecl);
3077             }
3078           def_temp = gimple_build_debug_bind (ddecl, unshare_expr (arg), stmt);
3079           gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT);
3080         }
3081     }
3082
3083   if (dump_file && (dump_flags & TDF_DETAILS))
3084     {
3085       fprintf (dump_file, "replacing stmt:");
3086       print_gimple_stmt (dump_file, gsi_stmt (gsi), 0, 0);
3087     }
3088
3089   new_stmt = gimple_build_call_vec (callee_decl, vargs);
3090   vargs.release ();
3091   if (gimple_call_lhs (stmt))
3092     gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
3093
3094   gimple_set_block (new_stmt, gimple_block (stmt));
3095   if (gimple_has_location (stmt))
3096     gimple_set_location (new_stmt, gimple_location (stmt));
3097   gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
3098   gimple_call_copy_flags (new_stmt, stmt);
3099
3100   if (dump_file && (dump_flags & TDF_DETAILS))
3101     {
3102       fprintf (dump_file, "with stmt:");
3103       print_gimple_stmt (dump_file, new_stmt, 0, 0);
3104       fprintf (dump_file, "\n");
3105     }
3106   gsi_replace (&gsi, new_stmt, true);
3107   if (cs)
3108     cgraph_set_call_stmt (cs, new_stmt);
3109   update_ssa (TODO_update_ssa);
3110   free_dominance_info (CDI_DOMINATORS);
3111 }
3112
3113 /* Return true iff BASE_INDEX is in ADJUSTMENTS more than once.  */
3114
3115 static bool
3116 index_in_adjustments_multiple_times_p (int base_index,
3117                                        ipa_parm_adjustment_vec adjustments)
3118 {
3119   int i, len = adjustments.length ();
3120   bool one = false;
3121
3122   for (i = 0; i < len; i++)
3123     {
3124       struct ipa_parm_adjustment *adj;
3125       adj = &adjustments[i];
3126
3127       if (adj->base_index == base_index)
3128         {
3129           if (one)
3130             return true;
3131           else
3132             one = true;
3133         }
3134     }
3135   return false;
3136 }
3137
3138
3139 /* Return adjustments that should have the same effect on function parameters
3140    and call arguments as if they were first changed according to adjustments in
3141    INNER and then by adjustments in OUTER.  */
3142
3143 ipa_parm_adjustment_vec
3144 ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
3145                          ipa_parm_adjustment_vec outer)
3146 {
3147   int i, outlen = outer.length ();
3148   int inlen = inner.length ();
3149   int removals = 0;
3150   ipa_parm_adjustment_vec adjustments, tmp;
3151
3152   tmp.create (inlen);
3153   for (i = 0; i < inlen; i++)
3154     {
3155       struct ipa_parm_adjustment *n;
3156       n = &inner[i];
3157
3158       if (n->remove_param)
3159         removals++;
3160       else
3161         tmp.quick_push (*n);
3162     }
3163
3164   adjustments.create (outlen + removals);
3165   for (i = 0; i < outlen; i++)
3166     {
3167       struct ipa_parm_adjustment r;
3168       struct ipa_parm_adjustment *out = &outer[i];
3169       struct ipa_parm_adjustment *in = &tmp[out->base_index];
3170
3171       memset (&r, 0, sizeof (r));
3172       gcc_assert (!in->remove_param);
3173       if (out->remove_param)
3174         {
3175           if (!index_in_adjustments_multiple_times_p (in->base_index, tmp))
3176             {
3177               r.remove_param = true;
3178               adjustments.quick_push (r);
3179             }
3180           continue;
3181         }
3182
3183       r.base_index = in->base_index;
3184       r.type = out->type;
3185
3186       /* FIXME:  Create nonlocal value too.  */
3187
3188       if (in->copy_param && out->copy_param)
3189         r.copy_param = true;
3190       else if (in->copy_param)
3191         r.offset = out->offset;
3192       else if (out->copy_param)
3193         r.offset = in->offset;
3194       else
3195         r.offset = in->offset + out->offset;
3196       adjustments.quick_push (r);
3197     }
3198
3199   for (i = 0; i < inlen; i++)
3200     {
3201       struct ipa_parm_adjustment *n = &inner[i];
3202
3203       if (n->remove_param)
3204         adjustments.quick_push (*n);
3205     }
3206
3207   tmp.release ();
3208   return adjustments;
3209 }
3210
3211 /* Dump the adjustments in the vector ADJUSTMENTS to dump_file in a human
3212    friendly way, assuming they are meant to be applied to FNDECL.  */
3213
3214 void
3215 ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
3216                             tree fndecl)
3217 {
3218   int i, len = adjustments.length ();
3219   bool first = true;
3220   vec<tree> parms = ipa_get_vector_of_formal_parms (fndecl);
3221
3222   fprintf (file, "IPA param adjustments: ");
3223   for (i = 0; i < len; i++)
3224     {
3225       struct ipa_parm_adjustment *adj;
3226       adj = &adjustments[i];
3227
3228       if (!first)
3229         fprintf (file, "                 ");
3230       else
3231         first = false;
3232
3233       fprintf (file, "%i. base_index: %i - ", i, adj->base_index);
3234       print_generic_expr (file, parms[adj->base_index], 0);
3235       if (adj->base)
3236         {
3237           fprintf (file, ", base: ");
3238           print_generic_expr (file, adj->base, 0);
3239         }
3240       if (adj->reduction)
3241         {
3242           fprintf (file, ", reduction: ");
3243           print_generic_expr (file, adj->reduction, 0);
3244         }
3245       if (adj->new_ssa_base)
3246         {
3247           fprintf (file, ", new_ssa_base: ");
3248           print_generic_expr (file, adj->new_ssa_base, 0);
3249         }
3250
3251       if (adj->copy_param)
3252         fprintf (file, ", copy_param");
3253       else if (adj->remove_param)
3254         fprintf (file, ", remove_param");
3255       else
3256         fprintf (file, ", offset %li", (long) adj->offset);
3257       if (adj->by_ref)
3258         fprintf (file, ", by_ref");
3259       print_node_brief (file, ", type: ", adj->type, 0);
3260       fprintf (file, "\n");
3261     }
3262   parms.release ();
3263 }
3264
3265 /* Dump the AV linked list.  */
3266
3267 void
3268 ipa_dump_agg_replacement_values (FILE *f, struct ipa_agg_replacement_value *av)
3269 {
3270   bool comma = false;
3271   fprintf (f, "     Aggregate replacements:");
3272   for (; av; av = av->next)
3273     {
3274       fprintf (f, "%s %i[" HOST_WIDE_INT_PRINT_DEC "]=", comma ? "," : "",
3275                av->index, av->offset);
3276       print_generic_expr (f, av->value, 0);
3277       comma = true;
3278     }
3279   fprintf (f, "\n");
3280 }
3281
3282 /* Stream out jump function JUMP_FUNC to OB.  */
3283
3284 static void
3285 ipa_write_jump_function (struct output_block *ob,
3286                          struct ipa_jump_func *jump_func)
3287 {
3288   struct ipa_agg_jf_item *item;
3289   struct bitpack_d bp;
3290   int i, count;
3291
3292   streamer_write_uhwi (ob, jump_func->type);
3293   switch (jump_func->type)
3294     {
3295     case IPA_JF_UNKNOWN:
3296       break;
3297     case IPA_JF_KNOWN_TYPE:
3298       streamer_write_uhwi (ob, jump_func->value.known_type.offset);
3299       stream_write_tree (ob, jump_func->value.known_type.base_type, true);
3300       stream_write_tree (ob, jump_func->value.known_type.component_type, true);
3301       break;
3302     case IPA_JF_CONST:
3303       gcc_assert (
3304           EXPR_LOCATION (jump_func->value.constant) == UNKNOWN_LOCATION);
3305       stream_write_tree (ob, jump_func->value.constant, true);
3306       break;
3307     case IPA_JF_PASS_THROUGH:
3308       stream_write_tree (ob, jump_func->value.pass_through.operand, true);
3309       streamer_write_uhwi (ob, jump_func->value.pass_through.formal_id);
3310       streamer_write_uhwi (ob, jump_func->value.pass_through.operation);
3311       bp = bitpack_create (ob->main_stream);
3312       bp_pack_value (&bp, jump_func->value.pass_through.agg_preserved, 1);
3313       streamer_write_bitpack (&bp);
3314       break;
3315     case IPA_JF_ANCESTOR:
3316       streamer_write_uhwi (ob, jump_func->value.ancestor.offset);
3317       stream_write_tree (ob, jump_func->value.ancestor.type, true);
3318       streamer_write_uhwi (ob, jump_func->value.ancestor.formal_id);
3319       bp = bitpack_create (ob->main_stream);
3320       bp_pack_value (&bp, jump_func->value.ancestor.agg_preserved, 1);
3321       streamer_write_bitpack (&bp);
3322       break;
3323     }
3324
3325   count = vec_safe_length (jump_func->agg.items);
3326   streamer_write_uhwi (ob, count);
3327   if (count)
3328     {
3329       bp = bitpack_create (ob->main_stream);
3330       bp_pack_value (&bp, jump_func->agg.by_ref, 1);
3331       streamer_write_bitpack (&bp);
3332     }
3333
3334   FOR_EACH_VEC_SAFE_ELT (jump_func->agg.items, i, item)
3335     {
3336       streamer_write_uhwi (ob, item->offset);
3337       stream_write_tree (ob, item->value, true);
3338     }
3339 }
3340
3341 /* Read in jump function JUMP_FUNC from IB.  */
3342
3343 static void
3344 ipa_read_jump_function (struct lto_input_block *ib,
3345                         struct ipa_jump_func *jump_func,
3346                         struct data_in *data_in)
3347 {
3348   struct bitpack_d bp;
3349   int i, count;
3350
3351   jump_func->type = (enum jump_func_type) streamer_read_uhwi (ib);
3352   switch (jump_func->type)
3353     {
3354     case IPA_JF_UNKNOWN:
3355       break;
3356     case IPA_JF_KNOWN_TYPE:
3357       jump_func->value.known_type.offset = streamer_read_uhwi (ib);
3358       jump_func->value.known_type.base_type = stream_read_tree (ib, data_in);
3359       jump_func->value.known_type.component_type = stream_read_tree (ib,
3360                                                                      data_in);
3361       break;
3362     case IPA_JF_CONST:
3363       jump_func->value.constant = stream_read_tree (ib, data_in);
3364       break;
3365     case IPA_JF_PASS_THROUGH:
3366       jump_func->value.pass_through.operand = stream_read_tree (ib, data_in);
3367       jump_func->value.pass_through.formal_id = streamer_read_uhwi (ib);
3368       jump_func->value.pass_through.operation
3369         = (enum tree_code) streamer_read_uhwi (ib);
3370       bp = streamer_read_bitpack (ib);
3371       jump_func->value.pass_through.agg_preserved = bp_unpack_value (&bp, 1);
3372       break;
3373     case IPA_JF_ANCESTOR:
3374       jump_func->value.ancestor.offset = streamer_read_uhwi (ib);
3375       jump_func->value.ancestor.type = stream_read_tree (ib, data_in);
3376       jump_func->value.ancestor.formal_id = streamer_read_uhwi (ib);
3377       bp = streamer_read_bitpack (ib);
3378       jump_func->value.ancestor.agg_preserved = bp_unpack_value (&bp, 1);
3379       break;
3380     }
3381
3382   count = streamer_read_uhwi (ib);
3383   vec_alloc (jump_func->agg.items, count);
3384   if (count)
3385     {
3386       bp = streamer_read_bitpack (ib);
3387       jump_func->agg.by_ref = bp_unpack_value (&bp, 1);
3388     }
3389   for (i = 0; i < count; i++)
3390     {
3391       struct ipa_agg_jf_item item;
3392       item.offset = streamer_read_uhwi (ib);
3393       item.value = stream_read_tree (ib, data_in);
3394       jump_func->agg.items->quick_push (item);
3395     }
3396 }
3397
3398 /* Stream out parts of cgraph_indirect_call_info corresponding to CS that are
3399    relevant to indirect inlining to OB.  */
3400
3401 static void
3402 ipa_write_indirect_edge_info (struct output_block *ob,
3403                               struct cgraph_edge *cs)
3404 {
3405   struct cgraph_indirect_call_info *ii = cs->indirect_info;
3406   struct bitpack_d bp;
3407
3408   streamer_write_hwi (ob, ii->param_index);
3409   streamer_write_hwi (ob, ii->offset);
3410   bp = bitpack_create (ob->main_stream);
3411   bp_pack_value (&bp, ii->polymorphic, 1);
3412   bp_pack_value (&bp, ii->agg_contents, 1);
3413   bp_pack_value (&bp, ii->by_ref, 1);
3414   streamer_write_bitpack (&bp);
3415
3416   if (ii->polymorphic)
3417     {
3418       streamer_write_hwi (ob, ii->otr_token);
3419       stream_write_tree (ob, ii->otr_type, true);
3420     }
3421 }
3422
3423 /* Read in parts of cgraph_indirect_call_info corresponding to CS that are
3424    relevant to indirect inlining from IB.  */
3425
3426 static void
3427 ipa_read_indirect_edge_info (struct lto_input_block *ib,
3428                              struct data_in *data_in ATTRIBUTE_UNUSED,
3429                              struct cgraph_edge *cs)
3430 {
3431   struct cgraph_indirect_call_info *ii = cs->indirect_info;
3432   struct bitpack_d bp;
3433
3434   ii->param_index = (int) streamer_read_hwi (ib);
3435   ii->offset = (HOST_WIDE_INT) streamer_read_hwi (ib);
3436   bp = streamer_read_bitpack (ib);
3437   ii->polymorphic = bp_unpack_value (&bp, 1);
3438   ii->agg_contents = bp_unpack_value (&bp, 1);
3439   ii->by_ref = bp_unpack_value (&bp, 1);
3440   if (ii->polymorphic)
3441     {
3442       ii->otr_token = (HOST_WIDE_INT) streamer_read_hwi (ib);
3443       ii->otr_type = stream_read_tree (ib, data_in);
3444     }
3445 }
3446
3447 /* Stream out NODE info to OB.  */
3448
3449 static void
3450 ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
3451 {
3452   int node_ref;
3453   lto_symtab_encoder_t encoder;
3454   struct ipa_node_params *info = IPA_NODE_REF (node);
3455   int j;
3456   struct cgraph_edge *e;
3457   struct bitpack_d bp;
3458
3459   encoder = ob->decl_state->symtab_node_encoder;
3460   node_ref = lto_symtab_encoder_encode (encoder, (symtab_node) node);
3461   streamer_write_uhwi (ob, node_ref);
3462
3463   bp = bitpack_create (ob->main_stream);
3464   gcc_assert (info->uses_analysis_done
3465               || ipa_get_param_count (info) == 0);
3466   gcc_assert (!info->node_enqueued);
3467   gcc_assert (!info->ipcp_orig_node);
3468   for (j = 0; j < ipa_get_param_count (info); j++)
3469     bp_pack_value (&bp, ipa_is_param_used (info, j), 1);
3470   streamer_write_bitpack (&bp);
3471   for (e = node->callees; e; e = e->next_callee)
3472     {
3473       struct ipa_edge_args *args = IPA_EDGE_REF (e);
3474
3475       streamer_write_uhwi (ob, ipa_get_cs_argument_count (args));
3476       for (j = 0; j < ipa_get_cs_argument_count (args); j++)
3477         ipa_write_jump_function (ob, ipa_get_ith_jump_func (args, j));
3478     }
3479   for (e = node->indirect_calls; e; e = e->next_callee)
3480     {
3481       struct ipa_edge_args *args = IPA_EDGE_REF (e);
3482
3483       streamer_write_uhwi (ob, ipa_get_cs_argument_count (args));
3484       for (j = 0; j < ipa_get_cs_argument_count (args); j++)
3485         ipa_write_jump_function (ob, ipa_get_ith_jump_func (args, j));
3486       ipa_write_indirect_edge_info (ob, e);
3487     }
3488 }
3489
3490 /* Stream in NODE info from IB.  */
3491
3492 static void
3493 ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
3494                     struct data_in *data_in)
3495 {
3496   struct ipa_node_params *info = IPA_NODE_REF (node);
3497   int k;
3498   struct cgraph_edge *e;
3499   struct bitpack_d bp;
3500
3501   ipa_initialize_node_params (node);
3502
3503   bp = streamer_read_bitpack (ib);
3504   if (ipa_get_param_count (info) != 0)
3505     info->uses_analysis_done = true;
3506   info->node_enqueued = false;
3507   for (k = 0; k < ipa_get_param_count (info); k++)
3508     ipa_set_param_used (info, k, bp_unpack_value (&bp, 1));
3509   for (e = node->callees; e; e = e->next_callee)
3510     {
3511       struct ipa_edge_args *args = IPA_EDGE_REF (e);
3512       int count = streamer_read_uhwi (ib);
3513
3514       if (!count)
3515         continue;
3516       vec_safe_grow_cleared (args->jump_functions, count);
3517
3518       for (k = 0; k < ipa_get_cs_argument_count (args); k++)
3519         ipa_read_jump_function (ib, ipa_get_ith_jump_func (args, k), data_in);
3520     }
3521   for (e = node->indirect_calls; e; e = e->next_callee)
3522     {
3523       struct ipa_edge_args *args = IPA_EDGE_REF (e);
3524       int count = streamer_read_uhwi (ib);
3525
3526       if (count)
3527         {
3528           vec_safe_grow_cleared (args->jump_functions, count);
3529           for (k = 0; k < ipa_get_cs_argument_count (args); k++)
3530             ipa_read_jump_function (ib, ipa_get_ith_jump_func (args, k),
3531                                     data_in);
3532         }
3533       ipa_read_indirect_edge_info (ib, data_in, e);
3534     }
3535 }
3536
3537 /* Write jump functions for nodes in SET.  */
3538
3539 void
3540 ipa_prop_write_jump_functions (void)
3541 {
3542   struct cgraph_node *node;
3543   struct output_block *ob;
3544   unsigned int count = 0;
3545   lto_symtab_encoder_iterator lsei;
3546   lto_symtab_encoder_t encoder;
3547
3548
3549   if (!ipa_node_params_vector.exists ())
3550     return;
3551
3552   ob = create_output_block (LTO_section_jump_functions);
3553   encoder = ob->decl_state->symtab_node_encoder;
3554   ob->cgraph_node = NULL;
3555   for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
3556        lsei_next_function_in_partition (&lsei))
3557     {
3558       node = lsei_cgraph_node (lsei);
3559       if (cgraph_function_with_gimple_body_p (node)
3560           && IPA_NODE_REF (node) != NULL)
3561         count++;
3562     }
3563
3564   streamer_write_uhwi (ob, count);
3565
3566   /* Process all of the functions.  */
3567   for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
3568        lsei_next_function_in_partition (&lsei))
3569     {
3570       node = lsei_cgraph_node (lsei);
3571       if (cgraph_function_with_gimple_body_p (node)
3572           && IPA_NODE_REF (node) != NULL)
3573         ipa_write_node_info (ob, node);
3574     }
3575   streamer_write_char_stream (ob->main_stream, 0);
3576   produce_asm (ob, NULL);
3577   destroy_output_block (ob);
3578 }
3579
3580 /* Read section in file FILE_DATA of length LEN with data DATA.  */
3581
3582 static void
3583 ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
3584                        size_t len)
3585 {
3586   const struct lto_function_header *header =
3587     (const struct lto_function_header *) data;
3588   const int cfg_offset = sizeof (struct lto_function_header);
3589   const int main_offset = cfg_offset + header->cfg_size;
3590   const int string_offset = main_offset + header->main_size;
3591   struct data_in *data_in;
3592   struct lto_input_block ib_main;
3593   unsigned int i;
3594   unsigned int count;
3595
3596   LTO_INIT_INPUT_BLOCK (ib_main, (const char *) data + main_offset, 0,
3597                         header->main_size);
3598
3599   data_in =
3600     lto_data_in_create (file_data, (const char *) data + string_offset,
3601                         header->string_size, vNULL);
3602   count = streamer_read_uhwi (&ib_main);
3603
3604   for (i = 0; i < count; i++)
3605     {
3606       unsigned int index;
3607       struct cgraph_node *node;
3608       lto_symtab_encoder_t encoder;
3609
3610       index = streamer_read_uhwi (&ib_main);
3611       encoder = file_data->symtab_node_encoder;
3612       node = cgraph (lto_symtab_encoder_deref (encoder, index));
3613       gcc_assert (node->analyzed);
3614       ipa_read_node_info (&ib_main, node, data_in);
3615     }
3616   lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data,
3617                          len);
3618   lto_data_in_delete (data_in);
3619 }
3620
3621 /* Read ipcp jump functions.  */
3622
3623 void
3624 ipa_prop_read_jump_functions (void)
3625 {
3626   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
3627   struct lto_file_decl_data *file_data;
3628   unsigned int j = 0;
3629
3630   ipa_check_create_node_params ();
3631   ipa_check_create_edge_args ();
3632   ipa_register_cgraph_hooks ();
3633
3634   while ((file_data = file_data_vec[j++]))
3635     {
3636       size_t len;
3637       const char *data = lto_get_section_data (file_data, LTO_section_jump_functions, NULL, &len);
3638
3639       if (data)
3640         ipa_prop_read_section (file_data, data, len);
3641     }
3642 }
3643
3644 /* After merging units, we can get mismatch in argument counts.
3645    Also decl merging might've rendered parameter lists obsolete.
3646    Also compute called_with_variable_arg info.  */
3647
3648 void
3649 ipa_update_after_lto_read (void)
3650 {
3651   struct cgraph_node *node;
3652
3653   ipa_check_create_node_params ();
3654   ipa_check_create_edge_args ();
3655
3656   FOR_EACH_DEFINED_FUNCTION (node)
3657     if (node->analyzed)
3658       ipa_initialize_node_params (node);
3659 }
3660
3661 void
3662 write_agg_replacement_chain (struct output_block *ob, struct cgraph_node *node)
3663 {
3664   int node_ref;
3665   unsigned int count = 0;
3666   lto_symtab_encoder_t encoder;
3667   struct ipa_agg_replacement_value *aggvals, *av;
3668
3669   aggvals = ipa_get_agg_replacements_for_node (node);
3670   encoder = ob->decl_state->symtab_node_encoder;
3671   node_ref = lto_symtab_encoder_encode (encoder, (symtab_node) node);
3672   streamer_write_uhwi (ob, node_ref);
3673
3674   for (av = aggvals; av; av = av->next)
3675     count++;
3676   streamer_write_uhwi (ob, count);
3677
3678   for (av = aggvals; av; av = av->next)
3679     {
3680       struct bitpack_d bp;
3681
3682       streamer_write_uhwi (ob, av->offset);
3683       streamer_write_uhwi (ob, av->index);
3684       stream_write_tree (ob, av->value, true);
3685
3686       bp = bitpack_create (ob->main_stream);
3687       bp_pack_value (&bp, av->by_ref, 1);
3688       streamer_write_bitpack (&bp);
3689     }
3690 }
3691
3692 /* Stream in the aggregate value replacement chain for NODE from IB.  */
3693
3694 static void
3695 read_agg_replacement_chain (struct lto_input_block *ib,
3696                             struct cgraph_node *node,
3697                             struct data_in *data_in)
3698 {
3699   struct ipa_agg_replacement_value *aggvals = NULL;
3700   unsigned int count, i;
3701
3702   count = streamer_read_uhwi (ib);
3703   for (i = 0; i <count; i++)
3704     {
3705       struct ipa_agg_replacement_value *av;
3706       struct bitpack_d bp;
3707
3708       av = ggc_alloc_ipa_agg_replacement_value ();
3709       av->offset = streamer_read_uhwi (ib);
3710       av->index = streamer_read_uhwi (ib);
3711       av->value = stream_read_tree (ib, data_in);
3712       bp = streamer_read_bitpack (ib);
3713       av->by_ref = bp_unpack_value (&bp, 1);
3714       av->next = aggvals;
3715       aggvals = av;
3716     }
3717   ipa_set_node_agg_value_chain (node, aggvals);
3718 }
3719
3720 /* Write all aggregate replacement for nodes in set.  */
3721
3722 void
3723 ipa_prop_write_all_agg_replacement (void)
3724 {
3725   struct cgraph_node *node;
3726   struct output_block *ob;
3727   unsigned int count = 0;
3728   lto_symtab_encoder_iterator lsei;
3729   lto_symtab_encoder_t encoder;
3730
3731   if (!ipa_node_agg_replacements)
3732     return;
3733
3734   ob = create_output_block (LTO_section_ipcp_transform);
3735   encoder = ob->decl_state->symtab_node_encoder;
3736   ob->cgraph_node = NULL;
3737   for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
3738        lsei_next_function_in_partition (&lsei))
3739     {
3740       node = lsei_cgraph_node (lsei);
3741       if (cgraph_function_with_gimple_body_p (node)
3742           && ipa_get_agg_replacements_for_node (node) != NULL)
3743         count++;
3744     }
3745
3746   streamer_write_uhwi (ob, count);
3747
3748   for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
3749        lsei_next_function_in_partition (&lsei))
3750     {
3751       node = lsei_cgraph_node (lsei);
3752       if (cgraph_function_with_gimple_body_p (node)
3753           && ipa_get_agg_replacements_for_node (node) != NULL)
3754         write_agg_replacement_chain (ob, node);
3755     }
3756   streamer_write_char_stream (ob->main_stream, 0);
3757   produce_asm (ob, NULL);
3758   destroy_output_block (ob);
3759 }
3760
3761 /* Read replacements section in file FILE_DATA of length LEN with data
3762    DATA.  */
3763
3764 static void
3765 read_replacements_section (struct lto_file_decl_data *file_data,
3766                            const char *data,
3767                            size_t len)
3768 {
3769   const struct lto_function_header *header =
3770     (const struct lto_function_header *) data;
3771   const int cfg_offset = sizeof (struct lto_function_header);
3772   const int main_offset = cfg_offset + header->cfg_size;
3773   const int string_offset = main_offset + header->main_size;
3774   struct data_in *data_in;
3775   struct lto_input_block ib_main;
3776   unsigned int i;
3777   unsigned int count;
3778
3779   LTO_INIT_INPUT_BLOCK (ib_main, (const char *) data + main_offset, 0,
3780                         header->main_size);
3781
3782   data_in = lto_data_in_create (file_data, (const char *) data + string_offset,
3783                                 header->string_size, vNULL);
3784   count = streamer_read_uhwi (&ib_main);
3785
3786   for (i = 0; i < count; i++)
3787     {
3788       unsigned int index;
3789       struct cgraph_node *node;
3790       lto_symtab_encoder_t encoder;
3791
3792       index = streamer_read_uhwi (&ib_main);
3793       encoder = file_data->symtab_node_encoder;
3794       node = cgraph (lto_symtab_encoder_deref (encoder, index));
3795       gcc_assert (node->analyzed);
3796       read_agg_replacement_chain (&ib_main, node, data_in);
3797     }
3798   lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data,
3799                          len);
3800   lto_data_in_delete (data_in);
3801 }
3802
3803 /* Read IPA-CP aggregate replacements.  */
3804
3805 void
3806 ipa_prop_read_all_agg_replacement (void)
3807 {
3808   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
3809   struct lto_file_decl_data *file_data;
3810   unsigned int j = 0;
3811
3812   while ((file_data = file_data_vec[j++]))
3813     {
3814       size_t len;
3815       const char *data = lto_get_section_data (file_data,
3816                                                LTO_section_ipcp_transform,
3817                                                NULL, &len);
3818       if (data)
3819         read_replacements_section (file_data, data, len);
3820     }
3821 }
3822
3823 /* Adjust the aggregate replacements in AGGVAL to reflect parameters skipped in
3824    NODE.  */
3825
3826 static void
3827 adjust_agg_replacement_values (struct cgraph_node *node,
3828                                struct ipa_agg_replacement_value *aggval)
3829 {
3830   struct ipa_agg_replacement_value *v;
3831   int i, c = 0, d = 0, *adj;
3832
3833   if (!node->clone.combined_args_to_skip)
3834     return;
3835
3836   for (v = aggval; v; v = v->next)
3837     {
3838       gcc_assert (v->index >= 0);
3839       if (c < v->index)
3840         c = v->index;
3841     }
3842   c++;
3843
3844   adj = XALLOCAVEC (int, c);
3845   for (i = 0; i < c; i++)
3846     if (bitmap_bit_p (node->clone.combined_args_to_skip, i))
3847       {
3848         adj[i] = -1;
3849         d++;
3850       }
3851     else
3852       adj[i] = i - d;
3853
3854   for (v = aggval; v; v = v->next)
3855     v->index = adj[v->index];
3856 }
3857
3858
3859 /* Function body transformation phase.  */
3860
3861 unsigned int
3862 ipcp_transform_function (struct cgraph_node *node)
3863 {
3864   vec<ipa_param_descriptor_t> descriptors = vNULL;
3865   struct param_analysis_info *parms_ainfo;
3866   struct ipa_agg_replacement_value *aggval;
3867   gimple_stmt_iterator gsi;
3868   basic_block bb;
3869   int param_count;
3870   bool cfg_changed = false, something_changed = false;
3871
3872   gcc_checking_assert (cfun);
3873   gcc_checking_assert (current_function_decl);
3874
3875   if (dump_file)
3876     fprintf (dump_file, "Modification phase of node %s/%i\n",
3877              cgraph_node_name (node), node->uid);
3878
3879   aggval = ipa_get_agg_replacements_for_node (node);
3880   if (!aggval)
3881       return 0;
3882   param_count = count_formal_params (node->symbol.decl);
3883   if (param_count == 0)
3884     return 0;
3885   adjust_agg_replacement_values (node, aggval);
3886   if (dump_file)
3887     ipa_dump_agg_replacement_values (dump_file, aggval);
3888   parms_ainfo = XALLOCAVEC (struct param_analysis_info, param_count);
3889   memset (parms_ainfo, 0, sizeof (struct param_analysis_info) * param_count);
3890   descriptors.safe_grow_cleared (param_count);
3891   ipa_populate_param_decls (node, descriptors);
3892
3893   FOR_EACH_BB (bb)
3894     for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
3895       {
3896         struct ipa_agg_replacement_value *v;
3897         gimple stmt = gsi_stmt (gsi);
3898         tree rhs, val, t;
3899         HOST_WIDE_INT offset;
3900         int index;
3901         bool by_ref, vce;
3902
3903         if (!gimple_assign_load_p (stmt))
3904           continue;
3905         rhs = gimple_assign_rhs1 (stmt);
3906         if (!is_gimple_reg_type (TREE_TYPE (rhs)))
3907           continue;
3908
3909         vce = false;
3910         t = rhs;
3911         while (handled_component_p (t))
3912           {
3913             /* V_C_E can do things like convert an array of integers to one
3914                bigger integer and similar things we do not handle below.  */
3915             if (TREE_CODE (rhs) == VIEW_CONVERT_EXPR)
3916               {
3917                 vce = true;
3918                 break;
3919               }
3920             t = TREE_OPERAND (t, 0);
3921           }
3922         if (vce)
3923           continue;
3924
3925         if (!ipa_load_from_parm_agg_1 (descriptors, parms_ainfo, stmt,
3926                                        rhs, &index, &offset, &by_ref))
3927           continue;
3928         for (v = aggval; v; v = v->next)
3929           if (v->index == index
3930               && v->offset == offset)
3931             break;
3932         if (!v || v->by_ref != by_ref)
3933           continue;
3934
3935         gcc_checking_assert (is_gimple_ip_invariant (v->value));
3936         if (!useless_type_conversion_p (TREE_TYPE (rhs), TREE_TYPE (v->value)))
3937           {
3938             if (fold_convertible_p (TREE_TYPE (rhs), v->value))
3939               val = fold_build1 (NOP_EXPR, TREE_TYPE (rhs), v->value);
3940             else if (TYPE_SIZE (TREE_TYPE (rhs))
3941                      == TYPE_SIZE (TREE_TYPE (v->value)))
3942               val = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (rhs), v->value);
3943             else
3944               {
3945                 if (dump_file)
3946                   {
3947                     fprintf (dump_file, "    const ");
3948                     print_generic_expr (dump_file, v->value, 0);
3949                     fprintf (dump_file, "  can't be converted to type of ");
3950                     print_generic_expr (dump_file, rhs, 0);
3951                     fprintf (dump_file, "\n");
3952                   }
3953                 continue;
3954               }
3955           }
3956         else
3957           val = v->value;
3958
3959         if (dump_file && (dump_flags & TDF_DETAILS))
3960           {
3961             fprintf (dump_file, "Modifying stmt:\n  ");
3962             print_gimple_stmt (dump_file, stmt, 0, 0);
3963           }
3964         gimple_assign_set_rhs_from_tree (&gsi, val);
3965         update_stmt (stmt);
3966
3967         if (dump_file && (dump_flags & TDF_DETAILS))
3968           {
3969             fprintf (dump_file, "into:\n  ");
3970             print_gimple_stmt (dump_file, stmt, 0, 0);
3971             fprintf (dump_file, "\n");
3972           }
3973
3974         something_changed = true;
3975         if (maybe_clean_eh_stmt (stmt)
3976             && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
3977           cfg_changed = true;
3978       }
3979
3980   (*ipa_node_agg_replacements)[node->uid] = NULL;
3981   free_parms_ainfo (parms_ainfo, param_count);
3982   descriptors.release ();
3983
3984   if (!something_changed)
3985     return 0;
3986   else if (cfg_changed)
3987     return TODO_update_ssa_only_virtuals | TODO_cleanup_cfg;
3988   else
3989     return TODO_update_ssa_only_virtuals;
3990 }