aarch64 - Set the mode for the unspec in speculation_tracker insn.
[platform/upstream/linaro-gcc.git] / gcc / ipa-prop.c
1 /* Interprocedural analyses.
2    Copyright (C) 2005-2016 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 "backend.h"
24 #include "rtl.h"
25 #include "tree.h"
26 #include "gimple.h"
27 #include "alloc-pool.h"
28 #include "tree-pass.h"
29 #include "ssa.h"
30 #include "tree-streamer.h"
31 #include "cgraph.h"
32 #include "diagnostic.h"
33 #include "fold-const.h"
34 #include "gimple-fold.h"
35 #include "tree-eh.h"
36 #include "calls.h"
37 #include "stor-layout.h"
38 #include "print-tree.h"
39 #include "gimplify.h"
40 #include "gimple-iterator.h"
41 #include "gimplify-me.h"
42 #include "gimple-walk.h"
43 #include "symbol-summary.h"
44 #include "ipa-prop.h"
45 #include "tree-cfg.h"
46 #include "tree-dfa.h"
47 #include "tree-inline.h"
48 #include "ipa-inline.h"
49 #include "gimple-pretty-print.h"
50 #include "params.h"
51 #include "ipa-utils.h"
52 #include "dbgcnt.h"
53 #include "domwalk.h"
54 #include "builtins.h"
55
56 /* Function summary where the parameter infos are actually stored. */
57 ipa_node_params_t *ipa_node_params_sum = NULL;
58 /* Vector of IPA-CP transformation data for each clone.  */
59 vec<ipcp_transformation_summary, va_gc> *ipcp_transformations;
60 /* Vector where the parameter infos are actually stored. */
61 vec<ipa_edge_args, va_gc> *ipa_edge_args_vector;
62
63 /* Holders of ipa cgraph hooks: */
64 static struct cgraph_edge_hook_list *edge_removal_hook_holder;
65 static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
66 static struct cgraph_node_hook_list *function_insertion_hook_holder;
67
68 /* Description of a reference to an IPA constant.  */
69 struct ipa_cst_ref_desc
70 {
71   /* Edge that corresponds to the statement which took the reference.  */
72   struct cgraph_edge *cs;
73   /* Linked list of duplicates created when call graph edges are cloned.  */
74   struct ipa_cst_ref_desc *next_duplicate;
75   /* Number of references in IPA structures, IPA_UNDESCRIBED_USE if the value
76      if out of control.  */
77   int refcount;
78 };
79
80 /* Allocation pool for reference descriptions.  */
81
82 static object_allocator<ipa_cst_ref_desc> ipa_refdesc_pool
83   ("IPA-PROP ref descriptions");
84
85 /* Return true if DECL_FUNCTION_SPECIFIC_OPTIMIZATION of the decl associated
86    with NODE should prevent us from analyzing it for the purposes of IPA-CP.  */
87
88 static bool
89 ipa_func_spec_opts_forbid_analysis_p (struct cgraph_node *node)
90 {
91   tree fs_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node->decl);
92
93   if (!fs_opts)
94     return false;
95   return !opt_for_fn (node->decl, optimize) || !opt_for_fn (node->decl, flag_ipa_cp);
96 }
97
98 /* Return index of the formal whose tree is PTREE in function which corresponds
99    to INFO.  */
100
101 static int
102 ipa_get_param_decl_index_1 (vec<ipa_param_descriptor> descriptors, tree ptree)
103 {
104   int i, count;
105
106   count = descriptors.length ();
107   for (i = 0; i < count; i++)
108     if (descriptors[i].decl == ptree)
109       return i;
110
111   return -1;
112 }
113
114 /* Return index of the formal whose tree is PTREE in function which corresponds
115    to INFO.  */
116
117 int
118 ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
119 {
120   return ipa_get_param_decl_index_1 (info->descriptors, ptree);
121 }
122
123 /* Populate the param_decl field in parameter DESCRIPTORS that correspond to
124    NODE.  */
125
126 static void
127 ipa_populate_param_decls (struct cgraph_node *node,
128                           vec<ipa_param_descriptor> &descriptors)
129 {
130   tree fndecl;
131   tree fnargs;
132   tree parm;
133   int param_num;
134
135   fndecl = node->decl;
136   gcc_assert (gimple_has_body_p (fndecl));
137   fnargs = DECL_ARGUMENTS (fndecl);
138   param_num = 0;
139   for (parm = fnargs; parm; parm = DECL_CHAIN (parm))
140     {
141       descriptors[param_num].decl = parm;
142       descriptors[param_num].move_cost = estimate_move_cost (TREE_TYPE (parm),
143                                                              true);
144       param_num++;
145     }
146 }
147
148 /* Return how many formal parameters FNDECL has.  */
149
150 int
151 count_formal_params (tree fndecl)
152 {
153   tree parm;
154   int count = 0;
155   gcc_assert (gimple_has_body_p (fndecl));
156
157   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
158     count++;
159
160   return count;
161 }
162
163 /* Return the declaration of Ith formal parameter of the function corresponding
164    to INFO.  Note there is no setter function as this array is built just once
165    using ipa_initialize_node_params. */
166
167 void
168 ipa_dump_param (FILE *file, struct ipa_node_params *info, int i)
169 {
170   fprintf (file, "param #%i", i);
171   if (info->descriptors[i].decl)
172     {
173       fprintf (file, " ");
174       print_generic_expr (file, info->descriptors[i].decl, 0);
175     }
176 }
177
178 /* Initialize the ipa_node_params structure associated with NODE 
179    to hold PARAM_COUNT parameters.  */
180
181 void
182 ipa_alloc_node_params (struct cgraph_node *node, int param_count)
183 {
184   struct ipa_node_params *info = IPA_NODE_REF (node);
185
186   if (!info->descriptors.exists () && param_count)
187     info->descriptors.safe_grow_cleared (param_count);
188 }
189
190 /* Initialize the ipa_node_params structure associated with NODE by counting
191    the function parameters, creating the descriptors and populating their
192    param_decls.  */
193
194 void
195 ipa_initialize_node_params (struct cgraph_node *node)
196 {
197   struct ipa_node_params *info = IPA_NODE_REF (node);
198
199   if (!info->descriptors.exists ())
200     {
201       ipa_alloc_node_params (node, count_formal_params (node->decl));
202       ipa_populate_param_decls (node, info->descriptors);
203     }
204 }
205
206 /* Print the jump functions associated with call graph edge CS to file F.  */
207
208 static void
209 ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
210 {
211   int i, count;
212
213   count = ipa_get_cs_argument_count (IPA_EDGE_REF (cs));
214   for (i = 0; i < count; i++)
215     {
216       struct ipa_jump_func *jump_func;
217       enum jump_func_type type;
218
219       jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
220       type = jump_func->type;
221
222       fprintf (f, "       param %d: ", i);
223       if (type == IPA_JF_UNKNOWN)
224         fprintf (f, "UNKNOWN\n");
225       else if (type == IPA_JF_CONST)
226         {
227           tree val = jump_func->value.constant.value;
228           fprintf (f, "CONST: ");
229           print_generic_expr (f, val, 0);
230           if (TREE_CODE (val) == ADDR_EXPR
231               && TREE_CODE (TREE_OPERAND (val, 0)) == CONST_DECL)
232             {
233               fprintf (f, " -> ");
234               print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (val, 0)),
235                                   0);
236             }
237           fprintf (f, "\n");
238         }
239       else if (type == IPA_JF_PASS_THROUGH)
240         {
241           fprintf (f, "PASS THROUGH: ");
242           fprintf (f, "%d, op %s",
243                    jump_func->value.pass_through.formal_id,
244                    get_tree_code_name(jump_func->value.pass_through.operation));
245           if (jump_func->value.pass_through.operation != NOP_EXPR)
246             {
247               fprintf (f, " ");
248               print_generic_expr (f,
249                                   jump_func->value.pass_through.operand, 0);
250             }
251           if (jump_func->value.pass_through.agg_preserved)
252             fprintf (f, ", agg_preserved");
253           fprintf (f, "\n");
254         }
255       else if (type == IPA_JF_ANCESTOR)
256         {
257           fprintf (f, "ANCESTOR: ");
258           fprintf (f, "%d, offset " HOST_WIDE_INT_PRINT_DEC,
259                    jump_func->value.ancestor.formal_id,
260                    jump_func->value.ancestor.offset);
261           if (jump_func->value.ancestor.agg_preserved)
262             fprintf (f, ", agg_preserved");
263           fprintf (f, "\n");
264         }
265
266       if (jump_func->agg.items)
267         {
268           struct ipa_agg_jf_item *item;
269           int j;
270
271           fprintf (f, "         Aggregate passed by %s:\n",
272                    jump_func->agg.by_ref ? "reference" : "value");
273           FOR_EACH_VEC_SAFE_ELT (jump_func->agg.items, j, item)
274             {
275               fprintf (f, "           offset: " HOST_WIDE_INT_PRINT_DEC ", ",
276                        item->offset);
277               if (TYPE_P (item->value))
278                 fprintf (f, "clobber of " HOST_WIDE_INT_PRINT_DEC " bits",
279                          tree_to_uhwi (TYPE_SIZE (item->value)));
280               else
281                 {
282                   fprintf (f, "cst: ");
283                   print_generic_expr (f, item->value, 0);
284                 }
285               fprintf (f, "\n");
286             }
287         }
288
289       struct ipa_polymorphic_call_context *ctx
290         = ipa_get_ith_polymorhic_call_context (IPA_EDGE_REF (cs), i);
291       if (ctx && !ctx->useless_p ())
292         {
293           fprintf (f, "         Context: ");
294           ctx->dump (dump_file);
295         }
296
297       if (jump_func->alignment.known)
298         {
299           fprintf (f, "         Alignment: %u, misalignment: %u\n",
300                    jump_func->alignment.align,
301                    jump_func->alignment.misalign);
302         }
303       else
304         fprintf (f, "         Unknown alignment\n");
305     }
306 }
307
308
309 /* Print the jump functions of all arguments on all call graph edges going from
310    NODE to file F.  */
311
312 void
313 ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
314 {
315   struct cgraph_edge *cs;
316
317   fprintf (f, "  Jump functions of caller  %s/%i:\n", node->name (),
318            node->order);
319   for (cs = node->callees; cs; cs = cs->next_callee)
320     {
321       if (!ipa_edge_args_info_available_for_edge_p (cs))
322         continue;
323
324       fprintf (f, "    callsite  %s/%i -> %s/%i : \n",
325                xstrdup_for_dump (node->name ()), node->order,
326                xstrdup_for_dump (cs->callee->name ()),
327                cs->callee->order);
328       ipa_print_node_jump_functions_for_edge (f, cs);
329     }
330
331   for (cs = node->indirect_calls; cs; cs = cs->next_callee)
332     {
333       struct cgraph_indirect_call_info *ii;
334       if (!ipa_edge_args_info_available_for_edge_p (cs))
335         continue;
336
337       ii = cs->indirect_info;
338       if (ii->agg_contents)
339         fprintf (f, "    indirect %s callsite, calling param %i, "
340                  "offset " HOST_WIDE_INT_PRINT_DEC ", %s",
341                  ii->member_ptr ? "member ptr" : "aggregate",
342                  ii->param_index, ii->offset,
343                  ii->by_ref ? "by reference" : "by_value");
344       else
345         fprintf (f, "    indirect %s callsite, calling param %i, "
346                  "offset " HOST_WIDE_INT_PRINT_DEC,
347                  ii->polymorphic ? "polymorphic" : "simple", ii->param_index,
348                  ii->offset);
349
350       if (cs->call_stmt)
351         {
352           fprintf (f, ", for stmt ");
353           print_gimple_stmt (f, cs->call_stmt, 0, TDF_SLIM);
354         }
355       else
356         fprintf (f, "\n");
357       if (ii->polymorphic)
358         ii->context.dump (f);
359       ipa_print_node_jump_functions_for_edge (f, cs);
360     }
361 }
362
363 /* Print ipa_jump_func data structures of all nodes in the call graph to F.  */
364
365 void
366 ipa_print_all_jump_functions (FILE *f)
367 {
368   struct cgraph_node *node;
369
370   fprintf (f, "\nJump functions:\n");
371   FOR_EACH_FUNCTION (node)
372     {
373       ipa_print_node_jump_functions (f, node);
374     }
375 }
376
377 /* Set jfunc to be a know-really nothing jump function.  */
378
379 static void
380 ipa_set_jf_unknown (struct ipa_jump_func *jfunc)
381 {
382   jfunc->type = IPA_JF_UNKNOWN;
383   jfunc->alignment.known = false;
384 }
385
386 /* Set JFUNC to be a copy of another jmp (to be used by jump function
387    combination code).  The two functions will share their rdesc.  */
388
389 static void
390 ipa_set_jf_cst_copy (struct ipa_jump_func *dst,
391                      struct ipa_jump_func *src)
392
393 {
394   gcc_checking_assert (src->type == IPA_JF_CONST);
395   dst->type = IPA_JF_CONST;
396   dst->value.constant = src->value.constant;
397 }
398
399 /* Set JFUNC to be a constant jmp function.  */
400
401 static void
402 ipa_set_jf_constant (struct ipa_jump_func *jfunc, tree constant,
403                      struct cgraph_edge *cs)
404 {
405   jfunc->type = IPA_JF_CONST;
406   jfunc->value.constant.value = unshare_expr_without_location (constant);
407
408   if (TREE_CODE (constant) == ADDR_EXPR
409       && TREE_CODE (TREE_OPERAND (constant, 0)) == FUNCTION_DECL)
410     {
411       struct ipa_cst_ref_desc *rdesc;
412
413       rdesc = ipa_refdesc_pool.allocate ();
414       rdesc->cs = cs;
415       rdesc->next_duplicate = NULL;
416       rdesc->refcount = 1;
417       jfunc->value.constant.rdesc = rdesc;
418     }
419   else
420     jfunc->value.constant.rdesc = NULL;
421 }
422
423 /* Set JFUNC to be a simple pass-through jump function.  */
424 static void
425 ipa_set_jf_simple_pass_through (struct ipa_jump_func *jfunc, int formal_id,
426                                 bool agg_preserved)
427 {
428   jfunc->type = IPA_JF_PASS_THROUGH;
429   jfunc->value.pass_through.operand = NULL_TREE;
430   jfunc->value.pass_through.formal_id = formal_id;
431   jfunc->value.pass_through.operation = NOP_EXPR;
432   jfunc->value.pass_through.agg_preserved = agg_preserved;
433 }
434
435 /* Set JFUNC to be an arithmetic pass through jump function.  */
436
437 static void
438 ipa_set_jf_arith_pass_through (struct ipa_jump_func *jfunc, int formal_id,
439                                tree operand, enum tree_code operation)
440 {
441   jfunc->type = IPA_JF_PASS_THROUGH;
442   jfunc->value.pass_through.operand = unshare_expr_without_location (operand);
443   jfunc->value.pass_through.formal_id = formal_id;
444   jfunc->value.pass_through.operation = operation;
445   jfunc->value.pass_through.agg_preserved = false;
446 }
447
448 /* Set JFUNC to be an ancestor jump function.  */
449
450 static void
451 ipa_set_ancestor_jf (struct ipa_jump_func *jfunc, HOST_WIDE_INT offset,
452                      int formal_id, bool agg_preserved)
453 {
454   jfunc->type = IPA_JF_ANCESTOR;
455   jfunc->value.ancestor.formal_id = formal_id;
456   jfunc->value.ancestor.offset = offset;
457   jfunc->value.ancestor.agg_preserved = agg_preserved;
458 }
459
460 /* Get IPA BB information about the given BB.  FBI is the context of analyzis
461    of this function body.  */
462
463 static struct ipa_bb_info *
464 ipa_get_bb_info (struct ipa_func_body_info *fbi, basic_block bb)
465 {
466   gcc_checking_assert (fbi);
467   return &fbi->bb_infos[bb->index];
468 }
469
470 /* Structure to be passed in between detect_type_change and
471    check_stmt_for_type_change.  */
472
473 struct prop_type_change_info
474 {
475   /* Offset into the object where there is the virtual method pointer we are
476      looking for.  */
477   HOST_WIDE_INT offset;
478   /* The declaration or SSA_NAME pointer of the base that we are checking for
479      type change.  */
480   tree object;
481   /* Set to true if dynamic type change has been detected.  */
482   bool type_maybe_changed;
483 };
484
485 /* Return true if STMT can modify a virtual method table pointer.
486
487    This function makes special assumptions about both constructors and
488    destructors which are all the functions that are allowed to alter the VMT
489    pointers.  It assumes that destructors begin with assignment into all VMT
490    pointers and that constructors essentially look in the following way:
491
492    1) The very first thing they do is that they call constructors of ancestor
493    sub-objects that have them.
494
495    2) Then VMT pointers of this and all its ancestors is set to new values
496    corresponding to the type corresponding to the constructor.
497
498    3) Only afterwards, other stuff such as constructor of member sub-objects
499    and the code written by the user is run.  Only this may include calling
500    virtual functions, directly or indirectly.
501
502    There is no way to call a constructor of an ancestor sub-object in any
503    other way.
504
505    This means that we do not have to care whether constructors get the correct
506    type information because they will always change it (in fact, if we define
507    the type to be given by the VMT pointer, it is undefined).
508
509    The most important fact to derive from the above is that if, for some
510    statement in the section 3, we try to detect whether the dynamic type has
511    changed, we can safely ignore all calls as we examine the function body
512    backwards until we reach statements in section 2 because these calls cannot
513    be ancestor constructors or destructors (if the input is not bogus) and so
514    do not change the dynamic type (this holds true only for automatically
515    allocated objects but at the moment we devirtualize only these).  We then
516    must detect that statements in section 2 change the dynamic type and can try
517    to derive the new type.  That is enough and we can stop, we will never see
518    the calls into constructors of sub-objects in this code.  Therefore we can
519    safely ignore all call statements that we traverse.
520   */
521
522 static bool
523 stmt_may_be_vtbl_ptr_store (gimple *stmt)
524 {
525   if (is_gimple_call (stmt))
526     return false;
527   if (gimple_clobber_p (stmt))
528     return false;
529   else if (is_gimple_assign (stmt))
530     {
531       tree lhs = gimple_assign_lhs (stmt);
532
533       if (!AGGREGATE_TYPE_P (TREE_TYPE (lhs)))
534         {
535           if (flag_strict_aliasing
536               && !POINTER_TYPE_P (TREE_TYPE (lhs)))
537             return false;
538
539           if (TREE_CODE (lhs) == COMPONENT_REF
540               && !DECL_VIRTUAL_P (TREE_OPERAND (lhs, 1)))
541             return false;
542           /* In the future we might want to use get_base_ref_and_offset to find
543              if there is a field corresponding to the offset and if so, proceed
544              almost like if it was a component ref.  */
545         }
546     }
547   return true;
548 }
549
550 /* Callback of walk_aliased_vdefs and a helper function for detect_type_change
551    to check whether a particular statement may modify the virtual table
552    pointerIt stores its result into DATA, which points to a
553    prop_type_change_info structure.  */
554
555 static bool
556 check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
557 {
558   gimple *stmt = SSA_NAME_DEF_STMT (vdef);
559   struct prop_type_change_info *tci = (struct prop_type_change_info *) data;
560
561   if (stmt_may_be_vtbl_ptr_store (stmt))
562     {
563       tci->type_maybe_changed = true;
564       return true;
565     }
566   else
567     return false;
568 }
569
570 /* See if ARG is PARAM_DECl describing instance passed by pointer
571    or reference in FUNCTION.  Return false if the dynamic type may change
572    in between beggining of the function until CALL is invoked.
573
574    Generally functions are not allowed to change type of such instances,
575    but they call destructors.  We assume that methods can not destroy the THIS
576    pointer.  Also as a special cases, constructor and destructors may change
577    type of the THIS pointer.  */
578
579 static bool
580 param_type_may_change_p (tree function, tree arg, gimple *call)
581 {
582   /* Pure functions can not do any changes on the dynamic type;
583      that require writting to memory.  */
584   if (flags_from_decl_or_type (function) & (ECF_PURE | ECF_CONST))
585     return false;
586   /* We need to check if we are within inlined consturctor
587      or destructor (ideally we would have way to check that the
588      inline cdtor is actually working on ARG, but we don't have
589      easy tie on this, so punt on all non-pure cdtors.
590      We may also record the types of cdtors and once we know type
591      of the instance match them.
592
593      Also code unification optimizations may merge calls from
594      different blocks making return values unreliable.  So
595      do nothing during late optimization.  */
596   if (DECL_STRUCT_FUNCTION (function)->after_inlining)
597     return true;
598   if (TREE_CODE (arg) == SSA_NAME
599       && SSA_NAME_IS_DEFAULT_DEF (arg)
600       && TREE_CODE (SSA_NAME_VAR (arg)) == PARM_DECL)
601     {
602       /* Normal (non-THIS) argument.  */
603       if ((SSA_NAME_VAR (arg) != DECL_ARGUMENTS (function)
604            || TREE_CODE (TREE_TYPE (function)) != METHOD_TYPE)
605           /* THIS pointer of an method - here we want to watch constructors
606              and destructors as those definitely may change the dynamic
607              type.  */
608           || (TREE_CODE (TREE_TYPE (function)) == METHOD_TYPE
609               && !DECL_CXX_CONSTRUCTOR_P (function)
610               && !DECL_CXX_DESTRUCTOR_P (function)
611               && (SSA_NAME_VAR (arg) == DECL_ARGUMENTS (function))))
612         {
613           /* Walk the inline stack and watch out for ctors/dtors.  */
614           for (tree block = gimple_block (call); block && TREE_CODE (block) == BLOCK;
615                block = BLOCK_SUPERCONTEXT (block))
616             if (inlined_polymorphic_ctor_dtor_block_p (block, false))
617               return true;
618           return false;
619         }
620     }
621   return true;
622 }
623
624 /* Detect whether the dynamic type of ARG of COMP_TYPE has changed (before
625    callsite CALL) by looking for assignments to its virtual table pointer.  If
626    it is, return true and fill in the jump function JFUNC with relevant type
627    information or set it to unknown.  ARG is the object itself (not a pointer
628    to it, unless dereferenced).  BASE is the base of the memory access as
629    returned by get_ref_base_and_extent, as is the offset. 
630
631    This is helper function for detect_type_change and detect_type_change_ssa
632    that does the heavy work which is usually unnecesary.  */
633
634 static bool
635 detect_type_change_from_memory_writes (tree arg, tree base, tree comp_type,
636                                        gcall *call, struct ipa_jump_func *jfunc,
637                                        HOST_WIDE_INT offset)
638 {
639   struct prop_type_change_info tci;
640   ao_ref ao;
641   bool entry_reached = false;
642
643   gcc_checking_assert (DECL_P (arg)
644                        || TREE_CODE (arg) == MEM_REF
645                        || handled_component_p (arg));
646
647   comp_type = TYPE_MAIN_VARIANT (comp_type);
648
649   /* Const calls cannot call virtual methods through VMT and so type changes do
650      not matter.  */
651   if (!flag_devirtualize || !gimple_vuse (call)
652       /* Be sure expected_type is polymorphic.  */
653       || !comp_type
654       || TREE_CODE (comp_type) != RECORD_TYPE
655       || !TYPE_BINFO (TYPE_MAIN_VARIANT (comp_type))
656       || !BINFO_VTABLE (TYPE_BINFO (TYPE_MAIN_VARIANT (comp_type))))
657     return true;
658
659   ao_ref_init (&ao, arg);
660   ao.base = base;
661   ao.offset = offset;
662   ao.size = POINTER_SIZE;
663   ao.max_size = ao.size;
664
665   tci.offset = offset;
666   tci.object = get_base_address (arg);
667   tci.type_maybe_changed = false;
668
669   walk_aliased_vdefs (&ao, gimple_vuse (call), check_stmt_for_type_change,
670                       &tci, NULL, &entry_reached);
671   if (!tci.type_maybe_changed)
672     return false;
673
674   ipa_set_jf_unknown (jfunc);
675   return true;
676 }
677
678 /* Detect whether the dynamic type of ARG of COMP_TYPE may have changed.
679    If it is, return true and fill in the jump function JFUNC with relevant type
680    information or set it to unknown.  ARG is the object itself (not a pointer
681    to it, unless dereferenced).  BASE is the base of the memory access as
682    returned by get_ref_base_and_extent, as is the offset.  */
683
684 static bool
685 detect_type_change (tree arg, tree base, tree comp_type, gcall *call,
686                     struct ipa_jump_func *jfunc, HOST_WIDE_INT offset)
687 {
688   if (!flag_devirtualize)
689     return false;
690
691   if (TREE_CODE (base) == MEM_REF
692       && !param_type_may_change_p (current_function_decl,
693                                    TREE_OPERAND (base, 0),
694                                    call))
695     return false;
696   return detect_type_change_from_memory_writes (arg, base, comp_type,
697                                                 call, jfunc, offset);
698 }
699
700 /* Like detect_type_change but ARG is supposed to be a non-dereferenced pointer
701    SSA name (its dereference will become the base and the offset is assumed to
702    be zero).  */
703
704 static bool
705 detect_type_change_ssa (tree arg, tree comp_type,
706                         gcall *call, struct ipa_jump_func *jfunc)
707 {
708   gcc_checking_assert (TREE_CODE (arg) == SSA_NAME);
709   if (!flag_devirtualize
710       || !POINTER_TYPE_P (TREE_TYPE (arg)))
711     return false;
712
713   if (!param_type_may_change_p (current_function_decl, arg, call))
714     return false;
715
716   arg = build2 (MEM_REF, ptr_type_node, arg,
717                 build_int_cst (ptr_type_node, 0));
718
719   return detect_type_change_from_memory_writes (arg, arg, comp_type,
720                                                 call, jfunc, 0);
721 }
722
723 /* Callback of walk_aliased_vdefs.  Flags that it has been invoked to the
724    boolean variable pointed to by DATA.  */
725
726 static bool
727 mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
728                      void *data)
729 {
730   bool *b = (bool *) data;
731   *b = true;
732   return true;
733 }
734
735 /* Return true if we have already walked so many statements in AA that we
736    should really just start giving up.  */
737
738 static bool
739 aa_overwalked (struct ipa_func_body_info *fbi)
740 {
741   gcc_checking_assert (fbi);
742   return fbi->aa_walked > (unsigned) PARAM_VALUE (PARAM_IPA_MAX_AA_STEPS);
743 }
744
745 /* Find the nearest valid aa status for parameter specified by INDEX that
746    dominates BB.  */
747
748 static struct ipa_param_aa_status *
749 find_dominating_aa_status (struct ipa_func_body_info *fbi, basic_block bb,
750                            int index)
751 {
752   while (true)
753     {
754       bb = get_immediate_dominator (CDI_DOMINATORS, bb);
755       if (!bb)
756         return NULL;
757       struct ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
758       if (!bi->param_aa_statuses.is_empty ()
759           && bi->param_aa_statuses[index].valid)
760         return &bi->param_aa_statuses[index];
761     }
762 }
763
764 /* Get AA status structure for the given BB and parameter with INDEX.  Allocate
765    structures and/or intialize the result with a dominating description as
766    necessary.  */
767
768 static struct ipa_param_aa_status *
769 parm_bb_aa_status_for_bb (struct ipa_func_body_info *fbi, basic_block bb,
770                           int index)
771 {
772   gcc_checking_assert (fbi);
773   struct ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
774   if (bi->param_aa_statuses.is_empty ())
775     bi->param_aa_statuses.safe_grow_cleared (fbi->param_count);
776   struct ipa_param_aa_status *paa = &bi->param_aa_statuses[index];
777   if (!paa->valid)
778     {
779       gcc_checking_assert (!paa->parm_modified
780                            && !paa->ref_modified
781                            && !paa->pt_modified);
782       struct ipa_param_aa_status *dom_paa;
783       dom_paa = find_dominating_aa_status (fbi, bb, index);
784       if (dom_paa)
785         *paa = *dom_paa;
786       else
787         paa->valid = true;
788     }
789
790   return paa;
791 }
792
793 /* Return true if a load from a formal parameter PARM_LOAD is known to retrieve
794    a value known not to be modified in this function before reaching the
795    statement STMT.  FBI holds information about the function we have so far
796    gathered but do not survive the summary building stage.  */
797
798 static bool
799 parm_preserved_before_stmt_p (struct ipa_func_body_info *fbi, int index,
800                               gimple *stmt, tree parm_load)
801 {
802   struct ipa_param_aa_status *paa;
803   bool modified = false;
804   ao_ref refd;
805
806   /* FIXME: FBI can be NULL if we are being called from outside
807      ipa_node_analysis or ipcp_transform_function, which currently happens
808      during inlining analysis.  It would be great to extend fbi's lifetime and
809      always have it.  Currently, we are just not afraid of too much walking in
810      that case.  */
811   if (fbi)
812     {
813       if (aa_overwalked (fbi))
814         return false;
815       paa = parm_bb_aa_status_for_bb (fbi, gimple_bb (stmt), index);
816       if (paa->parm_modified)
817         return false;
818     }
819   else
820     paa = NULL;
821
822   gcc_checking_assert (gimple_vuse (stmt) != NULL_TREE);
823   ao_ref_init (&refd, parm_load);
824   int walked = walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified,
825                                    &modified, NULL);
826   if (fbi)
827     fbi->aa_walked += walked;
828   if (paa && modified)
829     paa->parm_modified = true;
830   return !modified;
831 }
832
833 /* If STMT is an assignment that loads a value from an parameter declaration,
834    return the index of the parameter in ipa_node_params which has not been
835    modified.  Otherwise return -1.  */
836
837 static int
838 load_from_unmodified_param (struct ipa_func_body_info *fbi,
839                             vec<ipa_param_descriptor> descriptors,
840                             gimple *stmt)
841 {
842   int index;
843   tree op1;
844
845   if (!gimple_assign_single_p (stmt))
846     return -1;
847
848   op1 = gimple_assign_rhs1 (stmt);
849   if (TREE_CODE (op1) != PARM_DECL)
850     return -1;
851
852   index = ipa_get_param_decl_index_1 (descriptors, op1);
853   if (index < 0
854       || !parm_preserved_before_stmt_p (fbi, index, stmt, op1))
855     return -1;
856
857   return index;
858 }
859
860 /* Return true if memory reference REF (which must be a load through parameter
861    with INDEX) loads data that are known to be unmodified in this function
862    before reaching statement STMT.  */
863
864 static bool
865 parm_ref_data_preserved_p (struct ipa_func_body_info *fbi,
866                            int index, gimple *stmt, tree ref)
867 {
868   struct ipa_param_aa_status *paa;
869   bool modified = false;
870   ao_ref refd;
871
872   /* FIXME: FBI can be NULL if we are being called from outside
873      ipa_node_analysis or ipcp_transform_function, which currently happens
874      during inlining analysis.  It would be great to extend fbi's lifetime and
875      always have it.  Currently, we are just not afraid of too much walking in
876      that case.  */
877   if (fbi)
878     {
879       if (aa_overwalked (fbi))
880         return false;
881       paa = parm_bb_aa_status_for_bb (fbi, gimple_bb (stmt), index);
882       if (paa->ref_modified)
883         return false;
884     }
885   else
886     paa = NULL;
887
888   gcc_checking_assert (gimple_vuse (stmt));
889   ao_ref_init (&refd, ref);
890   int walked = walk_aliased_vdefs (&refd, gimple_vuse (stmt), mark_modified,
891                                    &modified, NULL);
892   if (fbi)
893     fbi->aa_walked += walked;
894   if (paa && modified)
895     paa->ref_modified = true;
896   return !modified;
897 }
898
899 /* Return true if the data pointed to by PARM (which is a parameter with INDEX)
900    is known to be unmodified in this function before reaching call statement
901    CALL into which it is passed.  FBI describes the function body.  */
902
903 static bool
904 parm_ref_data_pass_through_p (struct ipa_func_body_info *fbi, int index,
905                               gimple *call, tree parm)
906 {
907   bool modified = false;
908   ao_ref refd;
909
910   /* It's unnecessary to calculate anything about memory contnets for a const
911      function because it is not goin to use it.  But do not cache the result
912      either.  Also, no such calculations for non-pointers.  */
913   if (!gimple_vuse (call)
914       || !POINTER_TYPE_P (TREE_TYPE (parm))
915       || aa_overwalked (fbi))
916     return false;
917
918   struct ipa_param_aa_status *paa = parm_bb_aa_status_for_bb (fbi,
919                                                               gimple_bb (call),
920                                                               index);
921   if (paa->pt_modified)
922     return false;
923
924   ao_ref_init_from_ptr_and_size (&refd, parm, NULL_TREE);
925   int walked = walk_aliased_vdefs (&refd, gimple_vuse (call), mark_modified,
926                                    &modified, NULL);
927   fbi->aa_walked += walked;
928   if (modified)
929     paa->pt_modified = true;
930   return !modified;
931 }
932
933 /* Return true if we can prove that OP is a memory reference loading unmodified
934    data from an aggregate passed as a parameter and if the aggregate is passed
935    by reference, that the alias type of the load corresponds to the type of the
936    formal parameter (so that we can rely on this type for TBAA in callers).
937    INFO and PARMS_AINFO describe parameters of the current function (but the
938    latter can be NULL), STMT is the load statement.  If function returns true,
939    *INDEX_P, *OFFSET_P and *BY_REF is filled with the parameter index, offset
940    within the aggregate and whether it is a load from a value passed by
941    reference respectively.  */
942
943 bool
944 ipa_load_from_parm_agg (struct ipa_func_body_info *fbi,
945                         vec<ipa_param_descriptor> descriptors,
946                         gimple *stmt, tree op, int *index_p,
947                         HOST_WIDE_INT *offset_p, HOST_WIDE_INT *size_p,
948                         bool *by_ref_p)
949 {
950   int index;
951   HOST_WIDE_INT size, max_size;
952   bool reverse;
953   tree base
954     = get_ref_base_and_extent (op, offset_p, &size, &max_size, &reverse);
955
956   if (max_size == -1 || max_size != size || *offset_p < 0)
957     return false;
958
959   if (DECL_P (base))
960     {
961       int index = ipa_get_param_decl_index_1 (descriptors, base);
962       if (index >= 0
963           && parm_preserved_before_stmt_p (fbi, index, stmt, op))
964         {
965           *index_p = index;
966           *by_ref_p = false;
967           if (size_p)
968             *size_p = size;
969           return true;
970         }
971       return false;
972     }
973
974   if (TREE_CODE (base) != MEM_REF
975            || TREE_CODE (TREE_OPERAND (base, 0)) != SSA_NAME
976            || !integer_zerop (TREE_OPERAND (base, 1)))
977     return false;
978
979   if (SSA_NAME_IS_DEFAULT_DEF (TREE_OPERAND (base, 0)))
980     {
981       tree parm = SSA_NAME_VAR (TREE_OPERAND (base, 0));
982       index = ipa_get_param_decl_index_1 (descriptors, parm);
983     }
984   else
985     {
986       /* This branch catches situations where a pointer parameter is not a
987          gimple register, for example:
988
989          void hip7(S*) (struct S * p)
990          {
991          void (*<T2e4>) (struct S *) D.1867;
992          struct S * p.1;
993
994          <bb 2>:
995          p.1_1 = p;
996          D.1867_2 = p.1_1->f;
997          D.1867_2 ();
998          gdp = &p;
999       */
1000
1001       gimple *def = SSA_NAME_DEF_STMT (TREE_OPERAND (base, 0));
1002       index = load_from_unmodified_param (fbi, descriptors, def);
1003     }
1004
1005   if (index >= 0
1006       && parm_ref_data_preserved_p (fbi, index, stmt, op))
1007     {
1008       *index_p = index;
1009       *by_ref_p = true;
1010       if (size_p)
1011         *size_p = size;
1012       return true;
1013     }
1014   return false;
1015 }
1016
1017 /* Given that an actual argument is an SSA_NAME (given in NAME) and is a result
1018    of an assignment statement STMT, try to determine whether we are actually
1019    handling any of the following cases and construct an appropriate jump
1020    function into JFUNC if so:
1021
1022    1) The passed value is loaded from a formal parameter which is not a gimple
1023    register (most probably because it is addressable, the value has to be
1024    scalar) and we can guarantee the value has not changed.  This case can
1025    therefore be described by a simple pass-through jump function.  For example:
1026
1027       foo (int a)
1028       {
1029         int a.0;
1030
1031         a.0_2 = a;
1032         bar (a.0_2);
1033
1034    2) The passed value can be described by a simple arithmetic pass-through
1035    jump function. E.g.
1036
1037       foo (int a)
1038       {
1039         int D.2064;
1040
1041         D.2064_4 = a.1(D) + 4;
1042         bar (D.2064_4);
1043
1044    This case can also occur in combination of the previous one, e.g.:
1045
1046       foo (int a, int z)
1047       {
1048         int a.0;
1049         int D.2064;
1050
1051         a.0_3 = a;
1052         D.2064_4 = a.0_3 + 4;
1053         foo (D.2064_4);
1054
1055    3) The passed value is an address of an object within another one (which
1056    also passed by reference).  Such situations are described by an ancestor
1057    jump function and describe situations such as:
1058
1059      B::foo() (struct B * const this)
1060      {
1061        struct A * D.1845;
1062
1063        D.1845_2 = &this_1(D)->D.1748;
1064        A::bar (D.1845_2);
1065
1066    INFO is the structure describing individual parameters access different
1067    stages of IPA optimizations.  PARMS_AINFO contains the information that is
1068    only needed for intraprocedural analysis.  */
1069
1070 static void
1071 compute_complex_assign_jump_func (struct ipa_func_body_info *fbi,
1072                                   struct ipa_node_params *info,
1073                                   struct ipa_jump_func *jfunc,
1074                                   gcall *call, gimple *stmt, tree name,
1075                                   tree param_type)
1076 {
1077   HOST_WIDE_INT offset, size, max_size;
1078   tree op1, tc_ssa, base, ssa;
1079   bool reverse;
1080   int index;
1081
1082   op1 = gimple_assign_rhs1 (stmt);
1083
1084   if (TREE_CODE (op1) == SSA_NAME)
1085     {
1086       if (SSA_NAME_IS_DEFAULT_DEF (op1))
1087         index = ipa_get_param_decl_index (info, SSA_NAME_VAR (op1));
1088       else
1089         index = load_from_unmodified_param (fbi, info->descriptors,
1090                                             SSA_NAME_DEF_STMT (op1));
1091       tc_ssa = op1;
1092     }
1093   else
1094     {
1095       index = load_from_unmodified_param (fbi, info->descriptors, stmt);
1096       tc_ssa = gimple_assign_lhs (stmt);
1097     }
1098
1099   if (index >= 0)
1100     {
1101       tree op2 = gimple_assign_rhs2 (stmt);
1102
1103       if (op2)
1104         {
1105           if (!is_gimple_ip_invariant (op2)
1106               || (TREE_CODE_CLASS (gimple_expr_code (stmt)) != tcc_comparison
1107                   && !useless_type_conversion_p (TREE_TYPE (name),
1108                                                  TREE_TYPE (op1))))
1109             return;
1110
1111           ipa_set_jf_arith_pass_through (jfunc, index, op2,
1112                                          gimple_assign_rhs_code (stmt));
1113         }
1114       else if (gimple_assign_single_p (stmt))
1115         {
1116           bool agg_p = parm_ref_data_pass_through_p (fbi, index, call, tc_ssa);
1117           ipa_set_jf_simple_pass_through (jfunc, index, agg_p);
1118         }
1119       return;
1120     }
1121
1122   if (TREE_CODE (op1) != ADDR_EXPR)
1123     return;
1124   op1 = TREE_OPERAND (op1, 0);
1125   if (TREE_CODE (TREE_TYPE (op1)) != RECORD_TYPE)
1126     return;
1127   base = get_ref_base_and_extent (op1, &offset, &size, &max_size, &reverse);
1128   if (TREE_CODE (base) != MEM_REF
1129       /* If this is a varying address, punt.  */
1130       || max_size == -1
1131       || max_size != size)
1132     return;
1133   offset += mem_ref_offset (base).to_short_addr () * BITS_PER_UNIT;
1134   ssa = TREE_OPERAND (base, 0);
1135   if (TREE_CODE (ssa) != SSA_NAME
1136       || !SSA_NAME_IS_DEFAULT_DEF (ssa)
1137       || offset < 0)
1138     return;
1139
1140   /* Dynamic types are changed in constructors and destructors.  */
1141   index = ipa_get_param_decl_index (info, SSA_NAME_VAR (ssa));
1142   if (index >= 0 && param_type && POINTER_TYPE_P (param_type))
1143     ipa_set_ancestor_jf (jfunc, offset,  index,
1144                          parm_ref_data_pass_through_p (fbi, index, call, ssa));
1145 }
1146
1147 /* Extract the base, offset and MEM_REF expression from a statement ASSIGN if
1148    it looks like:
1149
1150    iftmp.1_3 = &obj_2(D)->D.1762;
1151
1152    The base of the MEM_REF must be a default definition SSA NAME of a
1153    parameter.  Return NULL_TREE if it looks otherwise.  If case of success, the
1154    whole MEM_REF expression is returned and the offset calculated from any
1155    handled components and the MEM_REF itself is stored into *OFFSET.  The whole
1156    RHS stripped off the ADDR_EXPR is stored into *OBJ_P.  */
1157
1158 static tree
1159 get_ancestor_addr_info (gimple *assign, tree *obj_p, HOST_WIDE_INT *offset)
1160 {
1161   HOST_WIDE_INT size, max_size;
1162   tree expr, parm, obj;
1163   bool reverse;
1164
1165   if (!gimple_assign_single_p (assign))
1166     return NULL_TREE;
1167   expr = gimple_assign_rhs1 (assign);
1168
1169   if (TREE_CODE (expr) != ADDR_EXPR)
1170     return NULL_TREE;
1171   expr = TREE_OPERAND (expr, 0);
1172   obj = expr;
1173   expr = get_ref_base_and_extent (expr, offset, &size, &max_size, &reverse);
1174
1175   if (TREE_CODE (expr) != MEM_REF
1176       /* If this is a varying address, punt.  */
1177       || max_size == -1
1178       || max_size != size
1179       || *offset < 0)
1180     return NULL_TREE;
1181   parm = TREE_OPERAND (expr, 0);
1182   if (TREE_CODE (parm) != SSA_NAME
1183       || !SSA_NAME_IS_DEFAULT_DEF (parm)
1184       || TREE_CODE (SSA_NAME_VAR (parm)) != PARM_DECL)
1185     return NULL_TREE;
1186
1187   *offset += mem_ref_offset (expr).to_short_addr () * BITS_PER_UNIT;
1188   *obj_p = obj;
1189   return expr;
1190 }
1191
1192
1193 /* Given that an actual argument is an SSA_NAME that is a result of a phi
1194    statement PHI, try to find out whether NAME is in fact a
1195    multiple-inheritance typecast from a descendant into an ancestor of a formal
1196    parameter and thus can be described by an ancestor jump function and if so,
1197    write the appropriate function into JFUNC.
1198
1199    Essentially we want to match the following pattern:
1200
1201      if (obj_2(D) != 0B)
1202        goto <bb 3>;
1203      else
1204        goto <bb 4>;
1205
1206    <bb 3>:
1207      iftmp.1_3 = &obj_2(D)->D.1762;
1208
1209    <bb 4>:
1210      # iftmp.1_1 = PHI <iftmp.1_3(3), 0B(2)>
1211      D.1879_6 = middleman_1 (iftmp.1_1, i_5(D));
1212      return D.1879_6;  */
1213
1214 static void
1215 compute_complex_ancestor_jump_func (struct ipa_func_body_info *fbi,
1216                                     struct ipa_node_params *info,
1217                                     struct ipa_jump_func *jfunc,
1218                                     gcall *call, gphi *phi)
1219 {
1220   HOST_WIDE_INT offset;
1221   gimple *assign, *cond;
1222   basic_block phi_bb, assign_bb, cond_bb;
1223   tree tmp, parm, expr, obj;
1224   int index, i;
1225
1226   if (gimple_phi_num_args (phi) != 2)
1227     return;
1228
1229   if (integer_zerop (PHI_ARG_DEF (phi, 1)))
1230     tmp = PHI_ARG_DEF (phi, 0);
1231   else if (integer_zerop (PHI_ARG_DEF (phi, 0)))
1232     tmp = PHI_ARG_DEF (phi, 1);
1233   else
1234     return;
1235   if (TREE_CODE (tmp) != SSA_NAME
1236       || SSA_NAME_IS_DEFAULT_DEF (tmp)
1237       || !POINTER_TYPE_P (TREE_TYPE (tmp))
1238       || TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) != RECORD_TYPE)
1239     return;
1240
1241   assign = SSA_NAME_DEF_STMT (tmp);
1242   assign_bb = gimple_bb (assign);
1243   if (!single_pred_p (assign_bb))
1244     return;
1245   expr = get_ancestor_addr_info (assign, &obj, &offset);
1246   if (!expr)
1247     return;
1248   parm = TREE_OPERAND (expr, 0);
1249   index = ipa_get_param_decl_index (info, SSA_NAME_VAR (parm));
1250   if (index < 0)
1251     return;
1252
1253   cond_bb = single_pred (assign_bb);
1254   cond = last_stmt (cond_bb);
1255   if (!cond
1256       || gimple_code (cond) != GIMPLE_COND
1257       || gimple_cond_code (cond) != NE_EXPR
1258       || gimple_cond_lhs (cond) != parm
1259       || !integer_zerop (gimple_cond_rhs (cond)))
1260     return;
1261
1262   phi_bb = gimple_bb (phi);
1263   for (i = 0; i < 2; i++)
1264     {
1265       basic_block pred = EDGE_PRED (phi_bb, i)->src;
1266       if (pred != assign_bb && pred != cond_bb)
1267         return;
1268     }
1269
1270   ipa_set_ancestor_jf (jfunc, offset, index,
1271                        parm_ref_data_pass_through_p (fbi, index, call, parm));
1272 }
1273
1274 /* Inspect the given TYPE and return true iff it has the same structure (the
1275    same number of fields of the same types) as a C++ member pointer.  If
1276    METHOD_PTR and DELTA are non-NULL, store the trees representing the
1277    corresponding fields there.  */
1278
1279 static bool
1280 type_like_member_ptr_p (tree type, tree *method_ptr, tree *delta)
1281 {
1282   tree fld;
1283
1284   if (TREE_CODE (type) != RECORD_TYPE)
1285     return false;
1286
1287   fld = TYPE_FIELDS (type);
1288   if (!fld || !POINTER_TYPE_P (TREE_TYPE (fld))
1289       || TREE_CODE (TREE_TYPE (TREE_TYPE (fld))) != METHOD_TYPE
1290       || !tree_fits_uhwi_p (DECL_FIELD_OFFSET (fld)))
1291     return false;
1292
1293   if (method_ptr)
1294     *method_ptr = fld;
1295
1296   fld = DECL_CHAIN (fld);
1297   if (!fld || INTEGRAL_TYPE_P (fld)
1298       || !tree_fits_uhwi_p (DECL_FIELD_OFFSET (fld)))
1299     return false;
1300   if (delta)
1301     *delta = fld;
1302
1303   if (DECL_CHAIN (fld))
1304     return false;
1305
1306   return true;
1307 }
1308
1309 /* If RHS is an SSA_NAME and it is defined by a simple copy assign statement,
1310    return the rhs of its defining statement.  Otherwise return RHS as it
1311    is.  */
1312
1313 static inline tree
1314 get_ssa_def_if_simple_copy (tree rhs)
1315 {
1316   while (TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_IS_DEFAULT_DEF (rhs))
1317     {
1318       gimple *def_stmt = SSA_NAME_DEF_STMT (rhs);
1319
1320       if (gimple_assign_single_p (def_stmt))
1321         rhs = gimple_assign_rhs1 (def_stmt);
1322       else
1323         break;
1324     }
1325   return rhs;
1326 }
1327
1328 /* Simple linked list, describing known contents of an aggregate beforere
1329    call.  */
1330
1331 struct ipa_known_agg_contents_list
1332 {
1333   /* Offset and size of the described part of the aggregate.  */
1334   HOST_WIDE_INT offset, size;
1335   /* Known constant value or NULL if the contents is known to be unknown.  */
1336   tree constant;
1337   /* Pointer to the next structure in the list.  */
1338   struct ipa_known_agg_contents_list *next;
1339 };
1340
1341 /* Find the proper place in linked list of ipa_known_agg_contents_list
1342    structures where to put a new one with the given LHS_OFFSET and LHS_SIZE,
1343    unless there is a partial overlap, in which case return NULL, or such
1344    element is already there, in which case set *ALREADY_THERE to true.  */
1345
1346 static struct ipa_known_agg_contents_list **
1347 get_place_in_agg_contents_list (struct ipa_known_agg_contents_list **list,
1348                                 HOST_WIDE_INT lhs_offset,
1349                                 HOST_WIDE_INT lhs_size,
1350                                 bool *already_there)
1351 {
1352   struct ipa_known_agg_contents_list **p = list;
1353   while (*p && (*p)->offset < lhs_offset)
1354     {
1355       if ((*p)->offset + (*p)->size > lhs_offset)
1356         return NULL;
1357       p = &(*p)->next;
1358     }
1359
1360   if (*p && (*p)->offset < lhs_offset + lhs_size)
1361     {
1362       if ((*p)->offset == lhs_offset && (*p)->size == lhs_size)
1363         /* We already know this value is subsequently overwritten with
1364            something else.  */
1365         *already_there = true;
1366       else
1367         /* Otherwise this is a partial overlap which we cannot
1368            represent.  */
1369         return NULL;
1370     }
1371   return p;
1372 }
1373
1374 /* Build aggregate jump function from LIST, assuming there are exactly
1375    CONST_COUNT constant entries there and that th offset of the passed argument
1376    is ARG_OFFSET and store it into JFUNC.  */
1377
1378 static void
1379 build_agg_jump_func_from_list (struct ipa_known_agg_contents_list *list,
1380                                int const_count, HOST_WIDE_INT arg_offset,
1381                                struct ipa_jump_func *jfunc)
1382 {
1383   vec_alloc (jfunc->agg.items, const_count);
1384   while (list)
1385     {
1386       if (list->constant)
1387         {
1388           struct ipa_agg_jf_item item;
1389           item.offset = list->offset - arg_offset;
1390           gcc_assert ((item.offset % BITS_PER_UNIT) == 0);
1391           item.value = unshare_expr_without_location (list->constant);
1392           jfunc->agg.items->quick_push (item);
1393         }
1394       list = list->next;
1395     }
1396 }
1397
1398 /* Traverse statements from CALL backwards, scanning whether an aggregate given
1399    in ARG is filled in with constant values.  ARG can either be an aggregate
1400    expression or a pointer to an aggregate.  ARG_TYPE is the type of the
1401    aggregate.  JFUNC is the jump function into which the constants are
1402    subsequently stored.  */
1403
1404 static void
1405 determine_locally_known_aggregate_parts (gcall *call, tree arg,
1406                                          tree arg_type,
1407                                          struct ipa_jump_func *jfunc)
1408 {
1409   struct ipa_known_agg_contents_list *list = NULL;
1410   int item_count = 0, const_count = 0;
1411   HOST_WIDE_INT arg_offset, arg_size;
1412   gimple_stmt_iterator gsi;
1413   tree arg_base;
1414   bool check_ref, by_ref;
1415   ao_ref r;
1416
1417   if (PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS) == 0)
1418     return;
1419
1420   /* The function operates in three stages.  First, we prepare check_ref, r,
1421      arg_base and arg_offset based on what is actually passed as an actual
1422      argument.  */
1423
1424   if (POINTER_TYPE_P (arg_type))
1425     {
1426       by_ref = true;
1427       if (TREE_CODE (arg) == SSA_NAME)
1428         {
1429           tree type_size;
1430           if (!tree_fits_uhwi_p (TYPE_SIZE (TREE_TYPE (arg_type))))
1431             return;
1432           check_ref = true;
1433           arg_base = arg;
1434           arg_offset = 0;
1435           type_size = TYPE_SIZE (TREE_TYPE (arg_type));
1436           arg_size = tree_to_uhwi (type_size);
1437           ao_ref_init_from_ptr_and_size (&r, arg_base, NULL_TREE);
1438         }
1439       else if (TREE_CODE (arg) == ADDR_EXPR)
1440         {
1441           HOST_WIDE_INT arg_max_size;
1442           bool reverse;
1443
1444           arg = TREE_OPERAND (arg, 0);
1445           arg_base = get_ref_base_and_extent (arg, &arg_offset, &arg_size,
1446                                               &arg_max_size, &reverse);
1447           if (arg_max_size == -1
1448               || arg_max_size != arg_size
1449               || arg_offset < 0)
1450             return;
1451           if (DECL_P (arg_base))
1452             {
1453               check_ref = false;
1454               ao_ref_init (&r, arg_base);
1455             }
1456           else
1457             return;
1458         }
1459       else
1460         return;
1461     }
1462   else
1463     {
1464       HOST_WIDE_INT arg_max_size;
1465       bool reverse;
1466
1467       gcc_checking_assert (AGGREGATE_TYPE_P (TREE_TYPE (arg)));
1468
1469       by_ref = false;
1470       check_ref = false;
1471       arg_base = get_ref_base_and_extent (arg, &arg_offset, &arg_size,
1472                                           &arg_max_size, &reverse);
1473       if (arg_max_size == -1
1474           || arg_max_size != arg_size
1475           || arg_offset < 0)
1476         return;
1477
1478       ao_ref_init (&r, arg);
1479     }
1480
1481   /* Second stage walks back the BB, looks at individual statements and as long
1482      as it is confident of how the statements affect contents of the
1483      aggregates, it builds a sorted linked list of ipa_agg_jf_list structures
1484      describing it.  */
1485   gsi = gsi_for_stmt (call);
1486   gsi_prev (&gsi);
1487   for (; !gsi_end_p (gsi); gsi_prev (&gsi))
1488     {
1489       struct ipa_known_agg_contents_list *n, **p;
1490       gimple *stmt = gsi_stmt (gsi);
1491       HOST_WIDE_INT lhs_offset, lhs_size, lhs_max_size;
1492       tree lhs, rhs, lhs_base;
1493       bool reverse;
1494
1495       if (!stmt_may_clobber_ref_p_1 (stmt, &r))
1496         continue;
1497       if (!gimple_assign_single_p (stmt))
1498         break;
1499
1500       lhs = gimple_assign_lhs (stmt);
1501       rhs = gimple_assign_rhs1 (stmt);
1502       if (!is_gimple_reg_type (TREE_TYPE (rhs))
1503           || TREE_CODE (lhs) == BIT_FIELD_REF
1504           || contains_bitfld_component_ref_p (lhs))
1505         break;
1506
1507       lhs_base = get_ref_base_and_extent (lhs, &lhs_offset, &lhs_size,
1508                                           &lhs_max_size, &reverse);
1509       if (lhs_max_size == -1
1510           || lhs_max_size != lhs_size)
1511         break;
1512
1513       if (check_ref)
1514         {
1515           if (TREE_CODE (lhs_base) != MEM_REF
1516               || TREE_OPERAND (lhs_base, 0) != arg_base
1517               || !integer_zerop (TREE_OPERAND (lhs_base, 1)))
1518             break;
1519         }
1520       else if (lhs_base != arg_base)
1521         {
1522           if (DECL_P (lhs_base))
1523             continue;
1524           else
1525             break;
1526         }
1527
1528       bool already_there = false;
1529       p = get_place_in_agg_contents_list (&list, lhs_offset, lhs_size,
1530                                           &already_there);
1531       if (!p)
1532         break;
1533       if (already_there)
1534         continue;
1535
1536       rhs = get_ssa_def_if_simple_copy (rhs);
1537       n = XALLOCA (struct ipa_known_agg_contents_list);
1538       n->size = lhs_size;
1539       n->offset = lhs_offset;
1540       if (is_gimple_ip_invariant (rhs))
1541         {
1542           n->constant = rhs;
1543           const_count++;
1544         }
1545       else
1546         n->constant = NULL_TREE;
1547       n->next = *p;
1548       *p = n;
1549
1550       item_count++;
1551       if (const_count == PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS)
1552           || item_count == 2 * PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS))
1553         break;
1554     }
1555
1556   /* Third stage just goes over the list and creates an appropriate vector of
1557      ipa_agg_jf_item structures out of it, of sourse only if there are
1558      any known constants to begin with.  */
1559
1560   if (const_count)
1561     {
1562       jfunc->agg.by_ref = by_ref;
1563       build_agg_jump_func_from_list (list, const_count, arg_offset, jfunc);
1564     }
1565 }
1566
1567 static tree
1568 ipa_get_callee_param_type (struct cgraph_edge *e, int i)
1569 {
1570   int n;
1571   tree type = (e->callee
1572                ? TREE_TYPE (e->callee->decl)
1573                : gimple_call_fntype (e->call_stmt));
1574   tree t = TYPE_ARG_TYPES (type);
1575
1576   for (n = 0; n < i; n++)
1577     {
1578       if (!t)
1579         break;
1580       t = TREE_CHAIN (t);
1581     }
1582   if (t)
1583     return TREE_VALUE (t);
1584   if (!e->callee)
1585     return NULL;
1586   t = DECL_ARGUMENTS (e->callee->decl);
1587   for (n = 0; n < i; n++)
1588     {
1589       if (!t)
1590         return NULL;
1591       t = TREE_CHAIN (t);
1592     }
1593   if (t)
1594     return TREE_TYPE (t);
1595   return NULL;
1596 }
1597
1598 /* Compute jump function for all arguments of callsite CS and insert the
1599    information in the jump_functions array in the ipa_edge_args corresponding
1600    to this callsite.  */
1601
1602 static void
1603 ipa_compute_jump_functions_for_edge (struct ipa_func_body_info *fbi,
1604                                      struct cgraph_edge *cs)
1605 {
1606   struct ipa_node_params *info = IPA_NODE_REF (cs->caller);
1607   struct ipa_edge_args *args = IPA_EDGE_REF (cs);
1608   gcall *call = cs->call_stmt;
1609   int n, arg_num = gimple_call_num_args (call);
1610   bool useful_context = false;
1611
1612   if (arg_num == 0 || args->jump_functions)
1613     return;
1614   vec_safe_grow_cleared (args->jump_functions, arg_num);
1615   if (flag_devirtualize)
1616     vec_safe_grow_cleared (args->polymorphic_call_contexts, arg_num);
1617
1618   if (gimple_call_internal_p (call))
1619     return;
1620   if (ipa_func_spec_opts_forbid_analysis_p (cs->caller))
1621     return;
1622
1623   for (n = 0; n < arg_num; n++)
1624     {
1625       struct ipa_jump_func *jfunc = ipa_get_ith_jump_func (args, n);
1626       tree arg = gimple_call_arg (call, n);
1627       tree param_type = ipa_get_callee_param_type (cs, n);
1628       if (flag_devirtualize && POINTER_TYPE_P (TREE_TYPE (arg)))
1629         {
1630           tree instance;
1631           struct ipa_polymorphic_call_context context (cs->caller->decl,
1632                                                        arg, cs->call_stmt,
1633                                                        &instance);
1634           context.get_dynamic_type (instance, arg, NULL, cs->call_stmt);
1635           *ipa_get_ith_polymorhic_call_context (args, n) = context;
1636           if (!context.useless_p ())
1637             useful_context = true;
1638         }
1639
1640       if (POINTER_TYPE_P (TREE_TYPE(arg)))
1641         {
1642           unsigned HOST_WIDE_INT hwi_bitpos;
1643           unsigned align;
1644
1645           get_pointer_alignment_1 (arg, &align, &hwi_bitpos);
1646           if (align > BITS_PER_UNIT
1647               && align % BITS_PER_UNIT == 0
1648               && hwi_bitpos % BITS_PER_UNIT == 0)
1649             {
1650               jfunc->alignment.known = true;
1651               jfunc->alignment.align = align / BITS_PER_UNIT;
1652               jfunc->alignment.misalign = hwi_bitpos / BITS_PER_UNIT;
1653             }
1654           else
1655             gcc_assert (!jfunc->alignment.known);
1656         }
1657       else
1658         gcc_assert (!jfunc->alignment.known);
1659
1660       if (is_gimple_ip_invariant (arg))
1661         ipa_set_jf_constant (jfunc, arg, cs);
1662       else if (!is_gimple_reg_type (TREE_TYPE (arg))
1663                && TREE_CODE (arg) == PARM_DECL)
1664         {
1665           int index = ipa_get_param_decl_index (info, arg);
1666
1667           gcc_assert (index >=0);
1668           /* Aggregate passed by value, check for pass-through, otherwise we
1669              will attempt to fill in aggregate contents later in this
1670              for cycle.  */
1671           if (parm_preserved_before_stmt_p (fbi, index, call, arg))
1672             {
1673               ipa_set_jf_simple_pass_through (jfunc, index, false);
1674               continue;
1675             }
1676         }
1677       else if (TREE_CODE (arg) == SSA_NAME)
1678         {
1679           if (SSA_NAME_IS_DEFAULT_DEF (arg))
1680             {
1681               int index = ipa_get_param_decl_index (info, SSA_NAME_VAR (arg));
1682               if (index >= 0)
1683                 {
1684                   bool agg_p;
1685                   agg_p = parm_ref_data_pass_through_p (fbi, index, call, arg);
1686                   ipa_set_jf_simple_pass_through (jfunc, index, agg_p);
1687                 }
1688             }
1689           else
1690             {
1691               gimple *stmt = SSA_NAME_DEF_STMT (arg);
1692               if (is_gimple_assign (stmt))
1693                 compute_complex_assign_jump_func (fbi, info, jfunc,
1694                                                   call, stmt, arg, param_type);
1695               else if (gimple_code (stmt) == GIMPLE_PHI)
1696                 compute_complex_ancestor_jump_func (fbi, info, jfunc,
1697                                                     call,
1698                                                     as_a <gphi *> (stmt));
1699             }
1700         }
1701
1702       /* If ARG is pointer, we can not use its type to determine the type of aggregate
1703          passed (because type conversions are ignored in gimple).  Usually we can
1704          safely get type from function declaration, but in case of K&R prototypes or
1705          variadic functions we can try our luck with type of the pointer passed.
1706          TODO: Since we look for actual initialization of the memory object, we may better
1707          work out the type based on the memory stores we find.  */
1708       if (!param_type)
1709         param_type = TREE_TYPE (arg);
1710
1711       if ((jfunc->type != IPA_JF_PASS_THROUGH
1712               || !ipa_get_jf_pass_through_agg_preserved (jfunc))
1713           && (jfunc->type != IPA_JF_ANCESTOR
1714               || !ipa_get_jf_ancestor_agg_preserved (jfunc))
1715           && (AGGREGATE_TYPE_P (TREE_TYPE (arg))
1716               || POINTER_TYPE_P (param_type)))
1717         determine_locally_known_aggregate_parts (call, arg, param_type, jfunc);
1718     }
1719   if (!useful_context)
1720     vec_free (args->polymorphic_call_contexts);
1721 }
1722
1723 /* Compute jump functions for all edges - both direct and indirect - outgoing
1724    from BB.  */
1725
1726 static void
1727 ipa_compute_jump_functions_for_bb (struct ipa_func_body_info *fbi, basic_block bb)
1728 {
1729   struct ipa_bb_info *bi = ipa_get_bb_info (fbi, bb);
1730   int i;
1731   struct cgraph_edge *cs;
1732
1733   FOR_EACH_VEC_ELT_REVERSE (bi->cg_edges, i, cs)
1734     {
1735       struct cgraph_node *callee = cs->callee;
1736
1737       if (callee)
1738         {
1739           callee->ultimate_alias_target ();
1740           /* We do not need to bother analyzing calls to unknown functions
1741              unless they may become known during lto/whopr.  */
1742           if (!callee->definition && !flag_lto)
1743             continue;
1744         }
1745       ipa_compute_jump_functions_for_edge (fbi, cs);
1746     }
1747 }
1748
1749 /* If STMT looks like a statement loading a value from a member pointer formal
1750    parameter, return that parameter and store the offset of the field to
1751    *OFFSET_P, if it is non-NULL.  Otherwise return NULL (but *OFFSET_P still
1752    might be clobbered).  If USE_DELTA, then we look for a use of the delta
1753    field rather than the pfn.  */
1754
1755 static tree
1756 ipa_get_stmt_member_ptr_load_param (gimple *stmt, bool use_delta,
1757                                     HOST_WIDE_INT *offset_p)
1758 {
1759   tree rhs, rec, ref_field, ref_offset, fld, ptr_field, delta_field;
1760
1761   if (!gimple_assign_single_p (stmt))
1762     return NULL_TREE;
1763
1764   rhs = gimple_assign_rhs1 (stmt);
1765   if (TREE_CODE (rhs) == COMPONENT_REF)
1766     {
1767       ref_field = TREE_OPERAND (rhs, 1);
1768       rhs = TREE_OPERAND (rhs, 0);
1769     }
1770   else
1771     ref_field = NULL_TREE;
1772   if (TREE_CODE (rhs) != MEM_REF)
1773     return NULL_TREE;
1774   rec = TREE_OPERAND (rhs, 0);
1775   if (TREE_CODE (rec) != ADDR_EXPR)
1776     return NULL_TREE;
1777   rec = TREE_OPERAND (rec, 0);
1778   if (TREE_CODE (rec) != PARM_DECL
1779       || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, &delta_field))
1780     return NULL_TREE;
1781   ref_offset = TREE_OPERAND (rhs, 1);
1782
1783   if (use_delta)
1784     fld = delta_field;
1785   else
1786     fld = ptr_field;
1787   if (offset_p)
1788     *offset_p = int_bit_position (fld);
1789
1790   if (ref_field)
1791     {
1792       if (integer_nonzerop (ref_offset))
1793         return NULL_TREE;
1794       return ref_field == fld ? rec : NULL_TREE;
1795     }
1796   else
1797     return tree_int_cst_equal (byte_position (fld), ref_offset) ? rec
1798       : NULL_TREE;
1799 }
1800
1801 /* Returns true iff T is an SSA_NAME defined by a statement.  */
1802
1803 static bool
1804 ipa_is_ssa_with_stmt_def (tree t)
1805 {
1806   if (TREE_CODE (t) == SSA_NAME
1807       && !SSA_NAME_IS_DEFAULT_DEF (t))
1808     return true;
1809   else
1810     return false;
1811 }
1812
1813 /* Find the indirect call graph edge corresponding to STMT and mark it as a
1814    call to a parameter number PARAM_INDEX.  NODE is the caller.  Return the
1815    indirect call graph edge.  */
1816
1817 static struct cgraph_edge *
1818 ipa_note_param_call (struct cgraph_node *node, int param_index,
1819                      gcall *stmt)
1820 {
1821   struct cgraph_edge *cs;
1822
1823   cs = node->get_edge (stmt);
1824   cs->indirect_info->param_index = param_index;
1825   cs->indirect_info->agg_contents = 0;
1826   cs->indirect_info->member_ptr = 0;
1827   return cs;
1828 }
1829
1830 /* Analyze the CALL and examine uses of formal parameters of the caller NODE
1831    (described by INFO).  PARMS_AINFO is a pointer to a vector containing
1832    intermediate information about each formal parameter.  Currently it checks
1833    whether the call calls a pointer that is a formal parameter and if so, the
1834    parameter is marked with the called flag and an indirect call graph edge
1835    describing the call is created.  This is very simple for ordinary pointers
1836    represented in SSA but not-so-nice when it comes to member pointers.  The
1837    ugly part of this function does nothing more than trying to match the
1838    pattern of such a call.  An example of such a pattern is the gimple dump
1839    below, the call is on the last line:
1840
1841      <bb 2>:
1842        f$__delta_5 = f.__delta;
1843        f$__pfn_24 = f.__pfn;
1844
1845    or
1846      <bb 2>:
1847        f$__delta_5 = MEM[(struct  *)&f];
1848        f$__pfn_24 = MEM[(struct  *)&f + 4B];
1849
1850    and a few lines below:
1851
1852      <bb 5>
1853        D.2496_3 = (int) f$__pfn_24;
1854        D.2497_4 = D.2496_3 & 1;
1855        if (D.2497_4 != 0)
1856          goto <bb 3>;
1857        else
1858          goto <bb 4>;
1859
1860      <bb 6>:
1861        D.2500_7 = (unsigned int) f$__delta_5;
1862        D.2501_8 = &S + D.2500_7;
1863        D.2502_9 = (int (*__vtbl_ptr_type) (void) * *) D.2501_8;
1864        D.2503_10 = *D.2502_9;
1865        D.2504_12 = f$__pfn_24 + -1;
1866        D.2505_13 = (unsigned int) D.2504_12;
1867        D.2506_14 = D.2503_10 + D.2505_13;
1868        D.2507_15 = *D.2506_14;
1869        iftmp.11_16 = (String:: *) D.2507_15;
1870
1871      <bb 7>:
1872        # iftmp.11_1 = PHI <iftmp.11_16(3), f$__pfn_24(2)>
1873        D.2500_19 = (unsigned int) f$__delta_5;
1874        D.2508_20 = &S + D.2500_19;
1875        D.2493_21 = iftmp.11_1 (D.2508_20, 4);
1876
1877    Such patterns are results of simple calls to a member pointer:
1878
1879      int doprinting (int (MyString::* f)(int) const)
1880      {
1881        MyString S ("somestring");
1882
1883        return (S.*f)(4);
1884      }
1885
1886    Moreover, the function also looks for called pointers loaded from aggregates
1887    passed by value or reference.  */
1888
1889 static void
1890 ipa_analyze_indirect_call_uses (struct ipa_func_body_info *fbi, gcall *call,
1891                                 tree target)
1892 {
1893   struct ipa_node_params *info = fbi->info;
1894   HOST_WIDE_INT offset;
1895   bool by_ref;
1896
1897   if (SSA_NAME_IS_DEFAULT_DEF (target))
1898     {
1899       tree var = SSA_NAME_VAR (target);
1900       int index = ipa_get_param_decl_index (info, var);
1901       if (index >= 0)
1902         ipa_note_param_call (fbi->node, index, call);
1903       return;
1904     }
1905
1906   int index;
1907   gimple *def = SSA_NAME_DEF_STMT (target);
1908   if (gimple_assign_single_p (def)
1909       && ipa_load_from_parm_agg (fbi, info->descriptors, def,
1910                                  gimple_assign_rhs1 (def), &index, &offset,
1911                                  NULL, &by_ref))
1912     {
1913       struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
1914       cs->indirect_info->offset = offset;
1915       cs->indirect_info->agg_contents = 1;
1916       cs->indirect_info->by_ref = by_ref;
1917       return;
1918     }
1919
1920   /* Now we need to try to match the complex pattern of calling a member
1921      pointer. */
1922   if (gimple_code (def) != GIMPLE_PHI
1923       || gimple_phi_num_args (def) != 2
1924       || !POINTER_TYPE_P (TREE_TYPE (target))
1925       || TREE_CODE (TREE_TYPE (TREE_TYPE (target))) != METHOD_TYPE)
1926     return;
1927
1928   /* First, we need to check whether one of these is a load from a member
1929      pointer that is a parameter to this function. */
1930   tree n1 = PHI_ARG_DEF (def, 0);
1931   tree n2 = PHI_ARG_DEF (def, 1);
1932   if (!ipa_is_ssa_with_stmt_def (n1) || !ipa_is_ssa_with_stmt_def (n2))
1933     return;
1934   gimple *d1 = SSA_NAME_DEF_STMT (n1);
1935   gimple *d2 = SSA_NAME_DEF_STMT (n2);
1936
1937   tree rec;
1938   basic_block bb, virt_bb;
1939   basic_block join = gimple_bb (def);
1940   if ((rec = ipa_get_stmt_member_ptr_load_param (d1, false, &offset)))
1941     {
1942       if (ipa_get_stmt_member_ptr_load_param (d2, false, NULL))
1943         return;
1944
1945       bb = EDGE_PRED (join, 0)->src;
1946       virt_bb = gimple_bb (d2);
1947     }
1948   else if ((rec = ipa_get_stmt_member_ptr_load_param (d2, false, &offset)))
1949     {
1950       bb = EDGE_PRED (join, 1)->src;
1951       virt_bb = gimple_bb (d1);
1952     }
1953   else
1954     return;
1955
1956   /* Second, we need to check that the basic blocks are laid out in the way
1957      corresponding to the pattern. */
1958
1959   if (!single_pred_p (virt_bb) || !single_succ_p (virt_bb)
1960       || single_pred (virt_bb) != bb
1961       || single_succ (virt_bb) != join)
1962     return;
1963
1964   /* Third, let's see that the branching is done depending on the least
1965      significant bit of the pfn. */
1966
1967   gimple *branch = last_stmt (bb);
1968   if (!branch || gimple_code (branch) != GIMPLE_COND)
1969     return;
1970
1971   if ((gimple_cond_code (branch) != NE_EXPR
1972        && gimple_cond_code (branch) != EQ_EXPR)
1973       || !integer_zerop (gimple_cond_rhs (branch)))
1974     return;
1975
1976   tree cond = gimple_cond_lhs (branch);
1977   if (!ipa_is_ssa_with_stmt_def (cond))
1978     return;
1979
1980   def = SSA_NAME_DEF_STMT (cond);
1981   if (!is_gimple_assign (def)
1982       || gimple_assign_rhs_code (def) != BIT_AND_EXPR
1983       || !integer_onep (gimple_assign_rhs2 (def)))
1984     return;
1985
1986   cond = gimple_assign_rhs1 (def);
1987   if (!ipa_is_ssa_with_stmt_def (cond))
1988     return;
1989
1990   def = SSA_NAME_DEF_STMT (cond);
1991
1992   if (is_gimple_assign (def)
1993       && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
1994     {
1995       cond = gimple_assign_rhs1 (def);
1996       if (!ipa_is_ssa_with_stmt_def (cond))
1997         return;
1998       def = SSA_NAME_DEF_STMT (cond);
1999     }
2000
2001   tree rec2;
2002   rec2 = ipa_get_stmt_member_ptr_load_param (def,
2003                                              (TARGET_PTRMEMFUNC_VBIT_LOCATION
2004                                               == ptrmemfunc_vbit_in_delta),
2005                                              NULL);
2006   if (rec != rec2)
2007     return;
2008
2009   index = ipa_get_param_decl_index (info, rec);
2010   if (index >= 0
2011       && parm_preserved_before_stmt_p (fbi, index, call, rec))
2012     {
2013       struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
2014       cs->indirect_info->offset = offset;
2015       cs->indirect_info->agg_contents = 1;
2016       cs->indirect_info->member_ptr = 1;
2017     }
2018
2019   return;
2020 }
2021
2022 /* Analyze a CALL to an OBJ_TYPE_REF which is passed in TARGET and if the
2023    object referenced in the expression is a formal parameter of the caller
2024    FBI->node (described by FBI->info), create a call note for the
2025    statement.  */
2026
2027 static void
2028 ipa_analyze_virtual_call_uses (struct ipa_func_body_info *fbi,
2029                                gcall *call, tree target)
2030 {
2031   tree obj = OBJ_TYPE_REF_OBJECT (target);
2032   int index;
2033   HOST_WIDE_INT anc_offset;
2034
2035   if (!flag_devirtualize)
2036     return;
2037
2038   if (TREE_CODE (obj) != SSA_NAME)
2039     return;
2040
2041   struct ipa_node_params *info = fbi->info;
2042   if (SSA_NAME_IS_DEFAULT_DEF (obj))
2043     {
2044       struct ipa_jump_func jfunc;
2045       if (TREE_CODE (SSA_NAME_VAR (obj)) != PARM_DECL)
2046         return;
2047
2048       anc_offset = 0;
2049       index = ipa_get_param_decl_index (info, SSA_NAME_VAR (obj));
2050       gcc_assert (index >= 0);
2051       if (detect_type_change_ssa (obj, obj_type_ref_class (target),
2052                                   call, &jfunc))
2053         return;
2054     }
2055   else
2056     {
2057       struct ipa_jump_func jfunc;
2058       gimple *stmt = SSA_NAME_DEF_STMT (obj);
2059       tree expr;
2060
2061       expr = get_ancestor_addr_info (stmt, &obj, &anc_offset);
2062       if (!expr)
2063         return;
2064       index = ipa_get_param_decl_index (info,
2065                                         SSA_NAME_VAR (TREE_OPERAND (expr, 0)));
2066       gcc_assert (index >= 0);
2067       if (detect_type_change (obj, expr, obj_type_ref_class (target),
2068                               call, &jfunc, anc_offset))
2069         return;
2070     }
2071
2072   struct cgraph_edge *cs = ipa_note_param_call (fbi->node, index, call);
2073   struct cgraph_indirect_call_info *ii = cs->indirect_info;
2074   ii->offset = anc_offset;
2075   ii->otr_token = tree_to_uhwi (OBJ_TYPE_REF_TOKEN (target));
2076   ii->otr_type = obj_type_ref_class (target);
2077   ii->polymorphic = 1;
2078 }
2079
2080 /* Analyze a call statement CALL whether and how it utilizes formal parameters
2081    of the caller (described by INFO).  PARMS_AINFO is a pointer to a vector
2082    containing intermediate information about each formal parameter.  */
2083
2084 static void
2085 ipa_analyze_call_uses (struct ipa_func_body_info *fbi, gcall *call)
2086 {
2087   tree target = gimple_call_fn (call);
2088
2089   if (!target
2090       || (TREE_CODE (target) != SSA_NAME
2091           && !virtual_method_call_p (target)))
2092     return;
2093
2094   struct cgraph_edge *cs = fbi->node->get_edge (call);
2095   /* If we previously turned the call into a direct call, there is
2096      no need to analyze.  */
2097   if (cs && !cs->indirect_unknown_callee)
2098     return;
2099
2100   if (cs->indirect_info->polymorphic && flag_devirtualize)
2101     {
2102       tree instance;
2103       tree target = gimple_call_fn (call);
2104       ipa_polymorphic_call_context context (current_function_decl,
2105                                             target, call, &instance);
2106
2107       gcc_checking_assert (cs->indirect_info->otr_type
2108                            == obj_type_ref_class (target));
2109       gcc_checking_assert (cs->indirect_info->otr_token
2110                            == tree_to_shwi (OBJ_TYPE_REF_TOKEN (target)));
2111
2112       cs->indirect_info->vptr_changed
2113         = !context.get_dynamic_type (instance,
2114                                      OBJ_TYPE_REF_OBJECT (target),
2115                                      obj_type_ref_class (target), call);
2116       cs->indirect_info->context = context;
2117     }
2118
2119   if (TREE_CODE (target) == SSA_NAME)
2120     ipa_analyze_indirect_call_uses (fbi, call, target);
2121   else if (virtual_method_call_p (target))
2122     ipa_analyze_virtual_call_uses (fbi, call, target);
2123 }
2124
2125
2126 /* Analyze the call statement STMT with respect to formal parameters (described
2127    in INFO) of caller given by FBI->NODE.  Currently it only checks whether
2128    formal parameters are called.  */
2129
2130 static void
2131 ipa_analyze_stmt_uses (struct ipa_func_body_info *fbi, gimple *stmt)
2132 {
2133   if (is_gimple_call (stmt))
2134     ipa_analyze_call_uses (fbi, as_a <gcall *> (stmt));
2135 }
2136
2137 /* Callback of walk_stmt_load_store_addr_ops for the visit_load.
2138    If OP is a parameter declaration, mark it as used in the info structure
2139    passed in DATA.  */
2140
2141 static bool
2142 visit_ref_for_mod_analysis (gimple *, tree op, tree, void *data)
2143 {
2144   struct ipa_node_params *info = (struct ipa_node_params *) data;
2145
2146   op = get_base_address (op);
2147   if (op
2148       && TREE_CODE (op) == PARM_DECL)
2149     {
2150       int index = ipa_get_param_decl_index (info, op);
2151       gcc_assert (index >= 0);
2152       ipa_set_param_used (info, index, true);
2153     }
2154
2155   return false;
2156 }
2157
2158 /* Scan the statements in BB and inspect the uses of formal parameters.  Store
2159    the findings in various structures of the associated ipa_node_params
2160    structure, such as parameter flags, notes etc.  FBI holds various data about
2161    the function being analyzed.  */
2162
2163 static void
2164 ipa_analyze_params_uses_in_bb (struct ipa_func_body_info *fbi, basic_block bb)
2165 {
2166   gimple_stmt_iterator gsi;
2167   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2168     {
2169       gimple *stmt = gsi_stmt (gsi);
2170
2171       if (is_gimple_debug (stmt))
2172         continue;
2173
2174       ipa_analyze_stmt_uses (fbi, stmt);
2175       walk_stmt_load_store_addr_ops (stmt, fbi->info,
2176                                      visit_ref_for_mod_analysis,
2177                                      visit_ref_for_mod_analysis,
2178                                      visit_ref_for_mod_analysis);
2179     }
2180   for (gsi = gsi_start_phis (bb); !gsi_end_p (gsi); gsi_next (&gsi))
2181     walk_stmt_load_store_addr_ops (gsi_stmt (gsi), fbi->info,
2182                                    visit_ref_for_mod_analysis,
2183                                    visit_ref_for_mod_analysis,
2184                                    visit_ref_for_mod_analysis);
2185 }
2186
2187 /* Calculate controlled uses of parameters of NODE.  */
2188
2189 static void
2190 ipa_analyze_controlled_uses (struct cgraph_node *node)
2191 {
2192   struct ipa_node_params *info = IPA_NODE_REF (node);
2193
2194   for (int i = 0; i < ipa_get_param_count (info); i++)
2195     {
2196       tree parm = ipa_get_param (info, i);
2197       int controlled_uses = 0;
2198
2199       /* For SSA regs see if parameter is used.  For non-SSA we compute
2200          the flag during modification analysis.  */
2201       if (is_gimple_reg (parm))
2202         {
2203           tree ddef = ssa_default_def (DECL_STRUCT_FUNCTION (node->decl),
2204                                        parm);
2205           if (ddef && !has_zero_uses (ddef))
2206             {
2207               imm_use_iterator imm_iter;
2208               use_operand_p use_p;
2209
2210               ipa_set_param_used (info, i, true);
2211               FOR_EACH_IMM_USE_FAST (use_p, imm_iter, ddef)
2212                 if (!is_gimple_call (USE_STMT (use_p)))
2213                   {
2214                     if (!is_gimple_debug (USE_STMT (use_p)))
2215                       {
2216                         controlled_uses = IPA_UNDESCRIBED_USE;
2217                         break;
2218                       }
2219                   }
2220                 else
2221                   controlled_uses++;
2222             }
2223           else
2224             controlled_uses = 0;
2225         }
2226       else
2227         controlled_uses = IPA_UNDESCRIBED_USE;
2228       ipa_set_controlled_uses (info, i, controlled_uses);
2229     }
2230 }
2231
2232 /* Free stuff in BI.  */
2233
2234 static void
2235 free_ipa_bb_info (struct ipa_bb_info *bi)
2236 {
2237   bi->cg_edges.release ();
2238   bi->param_aa_statuses.release ();
2239 }
2240
2241 /* Dominator walker driving the analysis.  */
2242
2243 class analysis_dom_walker : public dom_walker
2244 {
2245 public:
2246   analysis_dom_walker (struct ipa_func_body_info *fbi)
2247     : dom_walker (CDI_DOMINATORS), m_fbi (fbi) {}
2248
2249   virtual edge before_dom_children (basic_block);
2250
2251 private:
2252   struct ipa_func_body_info *m_fbi;
2253 };
2254
2255 edge
2256 analysis_dom_walker::before_dom_children (basic_block bb)
2257 {
2258   ipa_analyze_params_uses_in_bb (m_fbi, bb);
2259   ipa_compute_jump_functions_for_bb (m_fbi, bb);
2260   return NULL;
2261 }
2262
2263 /* Release body info FBI.  */
2264
2265 void
2266 ipa_release_body_info (struct ipa_func_body_info *fbi)
2267 {
2268   int i;
2269   struct ipa_bb_info *bi;
2270
2271   FOR_EACH_VEC_ELT (fbi->bb_infos, i, bi)
2272     free_ipa_bb_info (bi);
2273   fbi->bb_infos.release ();
2274 }
2275
2276 /* Initialize the array describing properties of formal parameters
2277    of NODE, analyze their uses and compute jump functions associated
2278    with actual arguments of calls from within NODE.  */
2279
2280 void
2281 ipa_analyze_node (struct cgraph_node *node)
2282 {
2283   struct ipa_func_body_info fbi;
2284   struct ipa_node_params *info;
2285
2286   ipa_check_create_node_params ();
2287   ipa_check_create_edge_args ();
2288   info = IPA_NODE_REF (node);
2289
2290   if (info->analysis_done)
2291     return;
2292   info->analysis_done = 1;
2293
2294   if (ipa_func_spec_opts_forbid_analysis_p (node))
2295     {
2296       for (int i = 0; i < ipa_get_param_count (info); i++)
2297         {
2298           ipa_set_param_used (info, i, true);
2299           ipa_set_controlled_uses (info, i, IPA_UNDESCRIBED_USE);
2300         }
2301       return;
2302     }
2303
2304   struct function *func = DECL_STRUCT_FUNCTION (node->decl);
2305   push_cfun (func);
2306   calculate_dominance_info (CDI_DOMINATORS);
2307   ipa_initialize_node_params (node);
2308   ipa_analyze_controlled_uses (node);
2309
2310   fbi.node = node;
2311   fbi.info = IPA_NODE_REF (node);
2312   fbi.bb_infos = vNULL;
2313   fbi.bb_infos.safe_grow_cleared (last_basic_block_for_fn (cfun));
2314   fbi.param_count = ipa_get_param_count (info);
2315   fbi.aa_walked = 0;
2316
2317   for (struct cgraph_edge *cs = node->callees; cs; cs = cs->next_callee)
2318     {
2319       ipa_bb_info *bi = ipa_get_bb_info (&fbi, gimple_bb (cs->call_stmt));
2320       bi->cg_edges.safe_push (cs);
2321     }
2322
2323   for (struct cgraph_edge *cs = node->indirect_calls; cs; cs = cs->next_callee)
2324     {
2325       ipa_bb_info *bi = ipa_get_bb_info (&fbi, gimple_bb (cs->call_stmt));
2326       bi->cg_edges.safe_push (cs);
2327     }
2328
2329   analysis_dom_walker (&fbi).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun));
2330
2331   ipa_release_body_info (&fbi);
2332   free_dominance_info (CDI_DOMINATORS);
2333   pop_cfun ();
2334 }
2335
2336 /* Update the jump functions associated with call graph edge E when the call
2337    graph edge CS is being inlined, assuming that E->caller is already (possibly
2338    indirectly) inlined into CS->callee and that E has not been inlined.  */
2339
2340 static void
2341 update_jump_functions_after_inlining (struct cgraph_edge *cs,
2342                                       struct cgraph_edge *e)
2343 {
2344   struct ipa_edge_args *top = IPA_EDGE_REF (cs);
2345   struct ipa_edge_args *args = IPA_EDGE_REF (e);
2346   int count = ipa_get_cs_argument_count (args);
2347   int i;
2348
2349   for (i = 0; i < count; i++)
2350     {
2351       struct ipa_jump_func *dst = ipa_get_ith_jump_func (args, i);
2352       struct ipa_polymorphic_call_context *dst_ctx
2353         = ipa_get_ith_polymorhic_call_context (args, i);
2354
2355       if (dst->type == IPA_JF_ANCESTOR)
2356         {
2357           struct ipa_jump_func *src;
2358           int dst_fid = dst->value.ancestor.formal_id;
2359           struct ipa_polymorphic_call_context *src_ctx
2360             = ipa_get_ith_polymorhic_call_context (top, dst_fid);
2361
2362           /* Variable number of arguments can cause havoc if we try to access
2363              one that does not exist in the inlined edge.  So make sure we
2364              don't.  */
2365           if (dst_fid >= ipa_get_cs_argument_count (top))
2366             {
2367               ipa_set_jf_unknown (dst);
2368               continue;
2369             }
2370
2371           src = ipa_get_ith_jump_func (top, dst_fid);
2372
2373           if (src_ctx && !src_ctx->useless_p ())
2374             {
2375               struct ipa_polymorphic_call_context ctx = *src_ctx;
2376
2377               /* TODO: Make type preserved safe WRT contexts.  */
2378               if (!ipa_get_jf_ancestor_type_preserved (dst))
2379                 ctx.possible_dynamic_type_change (e->in_polymorphic_cdtor);
2380               ctx.offset_by (dst->value.ancestor.offset);
2381               if (!ctx.useless_p ())
2382                 {
2383                   if (!dst_ctx)
2384                     {
2385                       vec_safe_grow_cleared (args->polymorphic_call_contexts,
2386                                              count);
2387                       dst_ctx = ipa_get_ith_polymorhic_call_context (args, i);
2388                     }
2389
2390                   dst_ctx->combine_with (ctx);
2391                 }
2392             }
2393
2394           if (src->agg.items
2395               && (dst->value.ancestor.agg_preserved || !src->agg.by_ref))
2396             {
2397               struct ipa_agg_jf_item *item;
2398               int j;
2399
2400               /* Currently we do not produce clobber aggregate jump functions,
2401                  replace with merging when we do.  */
2402               gcc_assert (!dst->agg.items);
2403
2404               dst->agg.items = vec_safe_copy (src->agg.items);
2405               dst->agg.by_ref = src->agg.by_ref;
2406               FOR_EACH_VEC_SAFE_ELT (dst->agg.items, j, item)
2407                 item->offset -= dst->value.ancestor.offset;
2408             }
2409
2410           if (src->type == IPA_JF_PASS_THROUGH
2411               && src->value.pass_through.operation == NOP_EXPR)
2412             {
2413               dst->value.ancestor.formal_id = src->value.pass_through.formal_id;
2414               dst->value.ancestor.agg_preserved &=
2415                 src->value.pass_through.agg_preserved;
2416             }
2417           else if (src->type == IPA_JF_ANCESTOR)
2418             {
2419               dst->value.ancestor.formal_id = src->value.ancestor.formal_id;
2420               dst->value.ancestor.offset += src->value.ancestor.offset;
2421               dst->value.ancestor.agg_preserved &=
2422                 src->value.ancestor.agg_preserved;
2423             }
2424           else
2425             ipa_set_jf_unknown (dst);
2426         }
2427       else if (dst->type == IPA_JF_PASS_THROUGH)
2428         {
2429           struct ipa_jump_func *src;
2430           /* We must check range due to calls with variable number of arguments
2431              and we cannot combine jump functions with operations.  */
2432           if (dst->value.pass_through.operation == NOP_EXPR
2433               && (dst->value.pass_through.formal_id
2434                   < ipa_get_cs_argument_count (top)))
2435             {
2436               int dst_fid = dst->value.pass_through.formal_id;
2437               src = ipa_get_ith_jump_func (top, dst_fid);
2438               bool dst_agg_p = ipa_get_jf_pass_through_agg_preserved (dst);
2439               struct ipa_polymorphic_call_context *src_ctx
2440                 = ipa_get_ith_polymorhic_call_context (top, dst_fid);
2441
2442               if (src_ctx && !src_ctx->useless_p ())
2443                 {
2444                   struct ipa_polymorphic_call_context ctx = *src_ctx;
2445
2446                   /* TODO: Make type preserved safe WRT contexts.  */
2447                   if (!ipa_get_jf_pass_through_type_preserved (dst))
2448                     ctx.possible_dynamic_type_change (e->in_polymorphic_cdtor);
2449                   if (!ctx.useless_p ())
2450                     {
2451                       if (!dst_ctx)
2452                         {
2453                           vec_safe_grow_cleared (args->polymorphic_call_contexts,
2454                                                  count);
2455                           dst_ctx = ipa_get_ith_polymorhic_call_context (args, i);
2456                         }
2457                       dst_ctx->combine_with (ctx);
2458                     }
2459                 }
2460               switch (src->type)
2461                 {
2462                 case IPA_JF_UNKNOWN:
2463                   ipa_set_jf_unknown (dst);
2464                   break;
2465                 case IPA_JF_CONST:
2466                   ipa_set_jf_cst_copy (dst, src);
2467                   break;
2468
2469                 case IPA_JF_PASS_THROUGH:
2470                   {
2471                     int formal_id = ipa_get_jf_pass_through_formal_id (src);
2472                     enum tree_code operation;
2473                     operation = ipa_get_jf_pass_through_operation (src);
2474
2475                     if (operation == NOP_EXPR)
2476                       {
2477                         bool agg_p;
2478                         agg_p = dst_agg_p
2479                           && ipa_get_jf_pass_through_agg_preserved (src);
2480                         ipa_set_jf_simple_pass_through (dst, formal_id, agg_p);
2481                       }
2482                     else
2483                       {
2484                         tree operand = ipa_get_jf_pass_through_operand (src);
2485                         ipa_set_jf_arith_pass_through (dst, formal_id, operand,
2486                                                        operation);
2487                       }
2488                     break;
2489                   }
2490                 case IPA_JF_ANCESTOR:
2491                   {
2492                     bool agg_p;
2493                     agg_p = dst_agg_p
2494                       && ipa_get_jf_ancestor_agg_preserved (src);
2495                     ipa_set_ancestor_jf (dst,
2496                                          ipa_get_jf_ancestor_offset (src),
2497                                          ipa_get_jf_ancestor_formal_id (src),
2498                                          agg_p);
2499                     break;
2500                   }
2501                 default:
2502                   gcc_unreachable ();
2503                 }
2504
2505               if (src->agg.items
2506                   && (dst_agg_p || !src->agg.by_ref))
2507                 {
2508                   /* Currently we do not produce clobber aggregate jump
2509                      functions, replace with merging when we do.  */
2510                   gcc_assert (!dst->agg.items);
2511
2512                   dst->agg.by_ref = src->agg.by_ref;
2513                   dst->agg.items = vec_safe_copy (src->agg.items);
2514                 }
2515             }
2516           else
2517             ipa_set_jf_unknown (dst);
2518         }
2519     }
2520 }
2521
2522 /* If TARGET is an addr_expr of a function declaration, make it the 
2523    (SPECULATIVE)destination of an indirect edge IE and return the edge.
2524    Otherwise, return NULL.  */
2525
2526 struct cgraph_edge *
2527 ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target,
2528                                 bool speculative)
2529 {
2530   struct cgraph_node *callee;
2531   struct inline_edge_summary *es = inline_edge_summary (ie);
2532   bool unreachable = false;
2533
2534   if (TREE_CODE (target) == ADDR_EXPR)
2535     target = TREE_OPERAND (target, 0);
2536   if (TREE_CODE (target) != FUNCTION_DECL)
2537     {
2538       target = canonicalize_constructor_val (target, NULL);
2539       if (!target || TREE_CODE (target) != FUNCTION_DECL)
2540         {
2541           /* Member pointer call that goes through a VMT lookup.  */
2542           if (ie->indirect_info->member_ptr
2543               /* Or if target is not an invariant expression and we do not
2544                  know if it will evaulate to function at runtime.
2545                  This can happen when folding through &VAR, where &VAR
2546                  is IP invariant, but VAR itself is not.
2547
2548                  TODO: Revisit this when GCC 5 is branched.  It seems that
2549                  member_ptr check is not needed and that we may try to fold
2550                  the expression and see if VAR is readonly.  */
2551               || !is_gimple_ip_invariant (target))
2552             {
2553               if (dump_enabled_p ())
2554                 {
2555                   location_t loc = gimple_location_safe (ie->call_stmt);
2556                   dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
2557                                    "discovered direct call non-invariant "
2558                                    "%s/%i\n",
2559                                    ie->caller->name (), ie->caller->order);
2560                 }
2561               return NULL;
2562             }
2563
2564
2565           if (dump_enabled_p ())
2566             {
2567               location_t loc = gimple_location_safe (ie->call_stmt);
2568               dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
2569                                "discovered direct call to non-function in %s/%i, "
2570                                "making it __builtin_unreachable\n",
2571                                ie->caller->name (), ie->caller->order);
2572             }
2573
2574           target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
2575           callee = cgraph_node::get_create (target);
2576           unreachable = true;
2577         }
2578       else
2579         callee = cgraph_node::get (target);
2580     }
2581   else
2582     callee = cgraph_node::get (target);
2583
2584   /* Because may-edges are not explicitely represented and vtable may be external,
2585      we may create the first reference to the object in the unit.  */
2586   if (!callee || callee->global.inlined_to)
2587     {
2588
2589       /* We are better to ensure we can refer to it.
2590          In the case of static functions we are out of luck, since we already   
2591          removed its body.  In the case of public functions we may or may
2592          not introduce the reference.  */
2593       if (!canonicalize_constructor_val (target, NULL)
2594           || !TREE_PUBLIC (target))
2595         {
2596           if (dump_file)
2597             fprintf (dump_file, "ipa-prop: Discovered call to a known target "
2598                      "(%s/%i -> %s/%i) but can not refer to it. Giving up.\n",
2599                      xstrdup_for_dump (ie->caller->name ()),
2600                      ie->caller->order,
2601                      xstrdup_for_dump (ie->callee->name ()),
2602                      ie->callee->order);
2603           return NULL;
2604         }
2605       callee = cgraph_node::get_create (target);
2606     }
2607
2608   /* If the edge is already speculated.  */
2609   if (speculative && ie->speculative)
2610     {
2611       struct cgraph_edge *e2;
2612       struct ipa_ref *ref;
2613       ie->speculative_call_info (e2, ie, ref);
2614       if (e2->callee->ultimate_alias_target ()
2615           != callee->ultimate_alias_target ())
2616         {
2617           if (dump_file)
2618             fprintf (dump_file, "ipa-prop: Discovered call to a speculative target "
2619                      "(%s/%i -> %s/%i) but the call is already speculated to %s/%i. Giving up.\n",
2620                      xstrdup_for_dump (ie->caller->name ()),
2621                      ie->caller->order,
2622                      xstrdup_for_dump (callee->name ()),
2623                      callee->order,
2624                      xstrdup_for_dump (e2->callee->name ()),
2625                      e2->callee->order);
2626         }
2627       else
2628         {
2629           if (dump_file)
2630             fprintf (dump_file, "ipa-prop: Discovered call to a speculative target "
2631                      "(%s/%i -> %s/%i) this agree with previous speculation.\n",
2632                      xstrdup_for_dump (ie->caller->name ()),
2633                      ie->caller->order,
2634                      xstrdup_for_dump (callee->name ()),
2635                      callee->order);
2636         }
2637       return NULL;
2638     }
2639
2640   if (!dbg_cnt (devirt))
2641     return NULL;
2642
2643   ipa_check_create_node_params ();
2644
2645   /* We can not make edges to inline clones.  It is bug that someone removed
2646      the cgraph node too early.  */
2647   gcc_assert (!callee->global.inlined_to);
2648
2649   if (dump_file && !unreachable)
2650     {
2651       fprintf (dump_file, "ipa-prop: Discovered %s call to a %s target "
2652                "(%s/%i -> %s/%i), for stmt ",
2653                ie->indirect_info->polymorphic ? "a virtual" : "an indirect",
2654                speculative ? "speculative" : "known",
2655                xstrdup_for_dump (ie->caller->name ()),
2656                ie->caller->order,
2657                xstrdup_for_dump (callee->name ()),
2658                callee->order);
2659       if (ie->call_stmt)
2660         print_gimple_stmt (dump_file, ie->call_stmt, 2, TDF_SLIM);
2661       else
2662         fprintf (dump_file, "with uid %i\n", ie->lto_stmt_uid);
2663      }
2664   if (dump_enabled_p ())
2665     {
2666       location_t loc = gimple_location_safe (ie->call_stmt);
2667
2668       dump_printf_loc (MSG_OPTIMIZED_LOCATIONS, loc,
2669                        "converting indirect call in %s to direct call to %s\n",
2670                        ie->caller->name (), callee->name ());
2671     }
2672   if (!speculative)
2673     {
2674       struct cgraph_edge *orig = ie;
2675       ie = ie->make_direct (callee);
2676       /* If we resolved speculative edge the cost is already up to date
2677          for direct call (adjusted by inline_edge_duplication_hook).  */
2678       if (ie == orig)
2679         {
2680           es = inline_edge_summary (ie);
2681           es->call_stmt_size -= (eni_size_weights.indirect_call_cost
2682                                  - eni_size_weights.call_cost);
2683           es->call_stmt_time -= (eni_time_weights.indirect_call_cost
2684                                  - eni_time_weights.call_cost);
2685         }
2686     }
2687   else
2688     {
2689       if (!callee->can_be_discarded_p ())
2690         {
2691           cgraph_node *alias;
2692           alias = dyn_cast<cgraph_node *> (callee->noninterposable_alias ());
2693           if (alias)
2694             callee = alias;
2695         }
2696       /* make_speculative will update ie's cost to direct call cost. */
2697       ie = ie->make_speculative
2698              (callee, ie->count * 8 / 10, ie->frequency * 8 / 10);
2699     }
2700
2701   return ie;
2702 }
2703
2704 /* Retrieve value from aggregate jump function AGG for the given OFFSET or
2705    return NULL if there is not any.  BY_REF specifies whether the value has to
2706    be passed by reference or by value.  */
2707
2708 tree
2709 ipa_find_agg_cst_for_param (struct ipa_agg_jump_function *agg,
2710                             HOST_WIDE_INT offset, bool by_ref)
2711 {
2712   struct ipa_agg_jf_item *item;
2713   int i;
2714
2715   if (by_ref != agg->by_ref)
2716     return NULL;
2717
2718   FOR_EACH_VEC_SAFE_ELT (agg->items, i, item)
2719     if (item->offset == offset)
2720       {
2721         /* Currently we do not have clobber values, return NULL for them once
2722            we do.  */
2723         gcc_checking_assert (is_gimple_ip_invariant (item->value));
2724         return item->value;
2725       }
2726   return NULL;
2727 }
2728
2729 /* Remove a reference to SYMBOL from the list of references of a node given by
2730    reference description RDESC.  Return true if the reference has been
2731    successfully found and removed.  */
2732
2733 static bool
2734 remove_described_reference (symtab_node *symbol, struct ipa_cst_ref_desc *rdesc)
2735 {
2736   struct ipa_ref *to_del;
2737   struct cgraph_edge *origin;
2738
2739   origin = rdesc->cs;
2740   if (!origin)
2741     return false;
2742   to_del = origin->caller->find_reference (symbol, origin->call_stmt,
2743                                            origin->lto_stmt_uid);
2744   if (!to_del)
2745     return false;
2746
2747   to_del->remove_reference ();
2748   if (dump_file)
2749     fprintf (dump_file, "ipa-prop: Removed a reference from %s/%i to %s.\n",
2750              xstrdup_for_dump (origin->caller->name ()),
2751              origin->caller->order, xstrdup_for_dump (symbol->name ()));
2752   return true;
2753 }
2754
2755 /* If JFUNC has a reference description with refcount different from
2756    IPA_UNDESCRIBED_USE, return the reference description, otherwise return
2757    NULL.  JFUNC must be a constant jump function.  */
2758
2759 static struct ipa_cst_ref_desc *
2760 jfunc_rdesc_usable (struct ipa_jump_func *jfunc)
2761 {
2762   struct ipa_cst_ref_desc *rdesc = ipa_get_jf_constant_rdesc (jfunc);
2763   if (rdesc && rdesc->refcount != IPA_UNDESCRIBED_USE)
2764     return rdesc;
2765   else
2766     return NULL;
2767 }
2768
2769 /* If the value of constant jump function JFUNC is an address of a function
2770    declaration, return the associated call graph node.  Otherwise return
2771    NULL.  */
2772
2773 static cgraph_node *
2774 cgraph_node_for_jfunc (struct ipa_jump_func *jfunc)
2775 {
2776   gcc_checking_assert (jfunc->type == IPA_JF_CONST);
2777   tree cst = ipa_get_jf_constant (jfunc);
2778   if (TREE_CODE (cst) != ADDR_EXPR
2779       || TREE_CODE (TREE_OPERAND (cst, 0)) != FUNCTION_DECL)
2780     return NULL;
2781
2782   return cgraph_node::get (TREE_OPERAND (cst, 0));
2783 }
2784
2785
2786 /* If JFUNC is a constant jump function with a usable rdesc, decrement its
2787    refcount and if it hits zero, remove reference to SYMBOL from the caller of
2788    the edge specified in the rdesc.  Return false if either the symbol or the
2789    reference could not be found, otherwise return true.  */
2790
2791 static bool
2792 try_decrement_rdesc_refcount (struct ipa_jump_func *jfunc)
2793 {
2794   struct ipa_cst_ref_desc *rdesc;
2795   if (jfunc->type == IPA_JF_CONST
2796       && (rdesc = jfunc_rdesc_usable (jfunc))
2797       && --rdesc->refcount == 0)
2798     {
2799       symtab_node *symbol = cgraph_node_for_jfunc (jfunc);
2800       if (!symbol)
2801         return false;
2802
2803       return remove_described_reference (symbol, rdesc);
2804     }
2805   return true;
2806 }
2807
2808 /* Try to find a destination for indirect edge IE that corresponds to a simple
2809    call or a call of a member function pointer and where the destination is a
2810    pointer formal parameter described by jump function JFUNC.  If it can be
2811    determined, return the newly direct edge, otherwise return NULL.
2812    NEW_ROOT_INFO is the node info that JFUNC lattices are relative to.  */
2813
2814 static struct cgraph_edge *
2815 try_make_edge_direct_simple_call (struct cgraph_edge *ie,
2816                                   struct ipa_jump_func *jfunc,
2817                                   struct ipa_node_params *new_root_info)
2818 {
2819   struct cgraph_edge *cs;
2820   tree target;
2821   bool agg_contents = ie->indirect_info->agg_contents;
2822
2823   if (ie->indirect_info->agg_contents)
2824     target = ipa_find_agg_cst_for_param (&jfunc->agg,
2825                                          ie->indirect_info->offset,
2826                                          ie->indirect_info->by_ref);
2827   else
2828     target = ipa_value_from_jfunc (new_root_info, jfunc);
2829   if (!target)
2830     return NULL;
2831   cs = ipa_make_edge_direct_to_target (ie, target);
2832
2833   if (cs && !agg_contents)
2834     {
2835       bool ok;
2836       gcc_checking_assert (cs->callee
2837                            && (cs != ie
2838                                || jfunc->type != IPA_JF_CONST
2839                                || !cgraph_node_for_jfunc (jfunc)
2840                                || cs->callee == cgraph_node_for_jfunc (jfunc)));
2841       ok = try_decrement_rdesc_refcount (jfunc);
2842       gcc_checking_assert (ok);
2843     }
2844
2845   return cs;
2846 }
2847
2848 /* Return the target to be used in cases of impossible devirtualization.  IE
2849    and target (the latter can be NULL) are dumped when dumping is enabled.  */
2850
2851 tree
2852 ipa_impossible_devirt_target (struct cgraph_edge *ie, tree target)
2853 {
2854   if (dump_file)
2855     {
2856       if (target)
2857         fprintf (dump_file,
2858                  "Type inconsistent devirtualization: %s/%i->%s\n",
2859                  ie->caller->name (), ie->caller->order,
2860                  IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target)));
2861       else
2862         fprintf (dump_file,
2863                  "No devirtualization target in %s/%i\n",
2864                  ie->caller->name (), ie->caller->order);
2865     }
2866   tree new_target = builtin_decl_implicit (BUILT_IN_UNREACHABLE);
2867   cgraph_node::get_create (new_target);
2868   return new_target;
2869 }
2870
2871 /* Try to find a destination for indirect edge IE that corresponds to a virtual
2872    call based on a formal parameter which is described by jump function JFUNC
2873    and if it can be determined, make it direct and return the direct edge.
2874    Otherwise, return NULL.  CTX describes the polymorphic context that the
2875    parameter the call is based on brings along with it.  */
2876
2877 static struct cgraph_edge *
2878 try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
2879                                    struct ipa_jump_func *jfunc,
2880                                    struct ipa_polymorphic_call_context ctx)
2881 {
2882   tree target = NULL;
2883   bool speculative = false;
2884
2885   if (!opt_for_fn (ie->caller->decl, flag_devirtualize))
2886     return NULL;
2887
2888   gcc_assert (!ie->indirect_info->by_ref);
2889
2890   /* Try to do lookup via known virtual table pointer value.  */
2891   if (!ie->indirect_info->vptr_changed
2892       || opt_for_fn (ie->caller->decl, flag_devirtualize_speculatively))
2893     {
2894       tree vtable;
2895       unsigned HOST_WIDE_INT offset;
2896       tree t = ipa_find_agg_cst_for_param (&jfunc->agg,
2897                                            ie->indirect_info->offset,
2898                                            true);
2899       if (t && vtable_pointer_value_to_vtable (t, &vtable, &offset))
2900         {
2901           bool can_refer;
2902           t = gimple_get_virt_method_for_vtable (ie->indirect_info->otr_token,
2903                                                  vtable, offset, &can_refer);
2904           if (can_refer)
2905             {
2906               if (!t
2907                   || (TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE
2908                       && DECL_FUNCTION_CODE (t) == BUILT_IN_UNREACHABLE)
2909                   || !possible_polymorphic_call_target_p
2910                        (ie, cgraph_node::get (t)))
2911                 {
2912                   /* Do not speculate builtin_unreachable, it is stupid!  */
2913                   if (!ie->indirect_info->vptr_changed)
2914                     target = ipa_impossible_devirt_target (ie, target);
2915                   else
2916                     target = NULL;
2917                 }
2918               else
2919                 {
2920                   target = t;
2921                   speculative = ie->indirect_info->vptr_changed;
2922                 }
2923             }
2924         }
2925     }
2926
2927   ipa_polymorphic_call_context ie_context (ie);
2928   vec <cgraph_node *>targets;
2929   bool final;
2930
2931   ctx.offset_by (ie->indirect_info->offset);
2932   if (ie->indirect_info->vptr_changed)
2933     ctx.possible_dynamic_type_change (ie->in_polymorphic_cdtor,
2934                                       ie->indirect_info->otr_type);
2935   ctx.combine_with (ie_context, ie->indirect_info->otr_type);
2936   targets = possible_polymorphic_call_targets
2937     (ie->indirect_info->otr_type,
2938      ie->indirect_info->otr_token,
2939      ctx, &final);
2940   if (final && targets.length () <= 1)
2941     {
2942       speculative = false;
2943       if (targets.length () == 1)
2944         target = targets[0]->decl;
2945       else
2946         target = ipa_impossible_devirt_target (ie, NULL_TREE);
2947     }
2948   else if (!target && opt_for_fn (ie->caller->decl, flag_devirtualize_speculatively)
2949            && !ie->speculative && ie->maybe_hot_p ())
2950     {
2951       cgraph_node *n;
2952       n = try_speculative_devirtualization (ie->indirect_info->otr_type,
2953                                             ie->indirect_info->otr_token,
2954                                             ie->indirect_info->context);
2955       if (n)
2956         {
2957           target = n->decl;
2958           speculative = true;
2959         }
2960     }
2961
2962   if (target)
2963     {
2964       if (!possible_polymorphic_call_target_p
2965           (ie, cgraph_node::get_create (target)))
2966         {
2967           if (speculative)
2968             return NULL;
2969           target = ipa_impossible_devirt_target (ie, target);
2970         }
2971       return ipa_make_edge_direct_to_target (ie, target, speculative);
2972     }
2973   else
2974     return NULL;
2975 }
2976
2977 /* Update the param called notes associated with NODE when CS is being inlined,
2978    assuming NODE is (potentially indirectly) inlined into CS->callee.
2979    Moreover, if the callee is discovered to be constant, create a new cgraph
2980    edge for it.  Newly discovered indirect edges will be added to *NEW_EDGES,
2981    unless NEW_EDGES is NULL.  Return true iff a new edge(s) were created.  */
2982
2983 static bool
2984 update_indirect_edges_after_inlining (struct cgraph_edge *cs,
2985                                       struct cgraph_node *node,
2986                                       vec<cgraph_edge *> *new_edges)
2987 {
2988   struct ipa_edge_args *top;
2989   struct cgraph_edge *ie, *next_ie, *new_direct_edge;
2990   struct ipa_node_params *new_root_info;
2991   bool res = false;
2992
2993   ipa_check_create_edge_args ();
2994   top = IPA_EDGE_REF (cs);
2995   new_root_info = IPA_NODE_REF (cs->caller->global.inlined_to
2996                                 ? cs->caller->global.inlined_to
2997                                 : cs->caller);
2998
2999   for (ie = node->indirect_calls; ie; ie = next_ie)
3000     {
3001       struct cgraph_indirect_call_info *ici = ie->indirect_info;
3002       struct ipa_jump_func *jfunc;
3003       int param_index;
3004       cgraph_node *spec_target = NULL;
3005
3006       next_ie = ie->next_callee;
3007
3008       if (ici->param_index == -1)
3009         continue;
3010
3011       /* We must check range due to calls with variable number of arguments:  */
3012       if (ici->param_index >= ipa_get_cs_argument_count (top))
3013         {
3014           ici->param_index = -1;
3015           continue;
3016         }
3017
3018       param_index = ici->param_index;
3019       jfunc = ipa_get_ith_jump_func (top, param_index);
3020
3021       if (ie->speculative)
3022         {
3023           struct cgraph_edge *de;
3024           struct ipa_ref *ref;
3025           ie->speculative_call_info (de, ie, ref);
3026           spec_target = de->callee;
3027         }
3028
3029       if (!opt_for_fn (node->decl, flag_indirect_inlining))
3030         new_direct_edge = NULL;
3031       else if (ici->polymorphic)
3032         {
3033           ipa_polymorphic_call_context ctx;
3034           ctx = ipa_context_from_jfunc (new_root_info, cs, param_index, jfunc);
3035           new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc, ctx);
3036         }
3037       else
3038         new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc,
3039                                                             new_root_info);
3040       /* If speculation was removed, then we need to do nothing.  */
3041       if (new_direct_edge && new_direct_edge != ie
3042           && new_direct_edge->callee == spec_target)
3043         {
3044           new_direct_edge->indirect_inlining_edge = 1;
3045           top = IPA_EDGE_REF (cs);
3046           res = true;
3047           if (!new_direct_edge->speculative)
3048             continue;
3049         }
3050       else if (new_direct_edge)
3051         {
3052           new_direct_edge->indirect_inlining_edge = 1;
3053           if (new_direct_edge->call_stmt)
3054             new_direct_edge->call_stmt_cannot_inline_p
3055               = !gimple_check_call_matching_types (
3056                   new_direct_edge->call_stmt,
3057                   new_direct_edge->callee->decl, false);
3058           if (new_edges)
3059             {
3060               new_edges->safe_push (new_direct_edge);
3061               res = true;
3062             }
3063           top = IPA_EDGE_REF (cs);
3064           /* If speculative edge was introduced we still need to update
3065              call info of the indirect edge.  */
3066           if (!new_direct_edge->speculative)
3067             continue;
3068         }
3069       if (jfunc->type == IPA_JF_PASS_THROUGH
3070           && ipa_get_jf_pass_through_operation (jfunc) == NOP_EXPR)
3071         {
3072           if (ici->agg_contents
3073               && !ipa_get_jf_pass_through_agg_preserved (jfunc)
3074               && !ici->polymorphic)
3075             ici->param_index = -1;
3076           else
3077             {
3078               ici->param_index = ipa_get_jf_pass_through_formal_id (jfunc);
3079               if (ici->polymorphic
3080                   && !ipa_get_jf_pass_through_type_preserved (jfunc))
3081                 ici->vptr_changed = true;
3082             }
3083         }
3084       else if (jfunc->type == IPA_JF_ANCESTOR)
3085         {
3086           if (ici->agg_contents
3087               && !ipa_get_jf_ancestor_agg_preserved (jfunc)
3088               && !ici->polymorphic)
3089             ici->param_index = -1;
3090           else
3091             {
3092               ici->param_index = ipa_get_jf_ancestor_formal_id (jfunc);
3093               ici->offset += ipa_get_jf_ancestor_offset (jfunc);
3094               if (ici->polymorphic
3095                   && !ipa_get_jf_ancestor_type_preserved (jfunc))
3096                 ici->vptr_changed = true;
3097             }
3098         }
3099       else
3100         /* Either we can find a destination for this edge now or never. */
3101         ici->param_index = -1;
3102     }
3103
3104   return res;
3105 }
3106
3107 /* Recursively traverse subtree of NODE (including node) made of inlined
3108    cgraph_edges when CS has been inlined and invoke
3109    update_indirect_edges_after_inlining on all nodes and
3110    update_jump_functions_after_inlining on all non-inlined edges that lead out
3111    of this subtree.  Newly discovered indirect edges will be added to
3112    *NEW_EDGES, unless NEW_EDGES is NULL.  Return true iff a new edge(s) were
3113    created.  */
3114
3115 static bool
3116 propagate_info_to_inlined_callees (struct cgraph_edge *cs,
3117                                    struct cgraph_node *node,
3118                                    vec<cgraph_edge *> *new_edges)
3119 {
3120   struct cgraph_edge *e;
3121   bool res;
3122
3123   res = update_indirect_edges_after_inlining (cs, node, new_edges);
3124
3125   for (e = node->callees; e; e = e->next_callee)
3126     if (!e->inline_failed)
3127       res |= propagate_info_to_inlined_callees (cs, e->callee, new_edges);
3128     else
3129       update_jump_functions_after_inlining (cs, e);
3130   for (e = node->indirect_calls; e; e = e->next_callee)
3131     update_jump_functions_after_inlining (cs, e);
3132
3133   return res;
3134 }
3135
3136 /* Combine two controlled uses counts as done during inlining.  */
3137
3138 static int
3139 combine_controlled_uses_counters (int c, int d)
3140 {
3141   if (c == IPA_UNDESCRIBED_USE || d == IPA_UNDESCRIBED_USE)
3142     return IPA_UNDESCRIBED_USE;
3143   else
3144     return c + d - 1;
3145 }
3146
3147 /* Propagate number of controlled users from CS->caleee to the new root of the
3148    tree of inlined nodes.  */
3149
3150 static void
3151 propagate_controlled_uses (struct cgraph_edge *cs)
3152 {
3153   struct ipa_edge_args *args = IPA_EDGE_REF (cs);
3154   struct cgraph_node *new_root = cs->caller->global.inlined_to
3155     ? cs->caller->global.inlined_to : cs->caller;
3156   struct ipa_node_params *new_root_info = IPA_NODE_REF (new_root);
3157   struct ipa_node_params *old_root_info = IPA_NODE_REF (cs->callee);
3158   int count, i;
3159
3160   count = MIN (ipa_get_cs_argument_count (args),
3161                ipa_get_param_count (old_root_info));
3162   for (i = 0; i < count; i++)
3163     {
3164       struct ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
3165       struct ipa_cst_ref_desc *rdesc;
3166
3167       if (jf->type == IPA_JF_PASS_THROUGH)
3168         {
3169           int src_idx, c, d;
3170           src_idx = ipa_get_jf_pass_through_formal_id (jf);
3171           c = ipa_get_controlled_uses (new_root_info, src_idx);
3172           d = ipa_get_controlled_uses (old_root_info, i);
3173
3174           gcc_checking_assert (ipa_get_jf_pass_through_operation (jf)
3175                                == NOP_EXPR || c == IPA_UNDESCRIBED_USE);
3176           c = combine_controlled_uses_counters (c, d);
3177           ipa_set_controlled_uses (new_root_info, src_idx, c);
3178           if (c == 0 && new_root_info->ipcp_orig_node)
3179             {
3180               struct cgraph_node *n;
3181               struct ipa_ref *ref;
3182               tree t = new_root_info->known_csts[src_idx];
3183
3184               if (t && TREE_CODE (t) == ADDR_EXPR
3185                   && TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL
3186                   && (n = cgraph_node::get (TREE_OPERAND (t, 0)))
3187                   && (ref = new_root->find_reference (n, NULL, 0)))
3188                 {
3189                   if (dump_file)
3190                     fprintf (dump_file, "ipa-prop: Removing cloning-created "
3191                              "reference from %s/%i to %s/%i.\n",
3192                              xstrdup_for_dump (new_root->name ()),
3193                              new_root->order,
3194                              xstrdup_for_dump (n->name ()), n->order);
3195                   ref->remove_reference ();
3196                 }
3197             }
3198         }
3199       else if (jf->type == IPA_JF_CONST
3200                && (rdesc = jfunc_rdesc_usable (jf)))
3201         {
3202           int d = ipa_get_controlled_uses (old_root_info, i);
3203           int c = rdesc->refcount;
3204           rdesc->refcount = combine_controlled_uses_counters (c, d);
3205           if (rdesc->refcount == 0)
3206             {
3207               tree cst = ipa_get_jf_constant (jf);
3208               struct cgraph_node *n;
3209               gcc_checking_assert (TREE_CODE (cst) == ADDR_EXPR
3210                                    && TREE_CODE (TREE_OPERAND (cst, 0))
3211                                    == FUNCTION_DECL);
3212               n = cgraph_node::get (TREE_OPERAND (cst, 0));
3213               if (n)
3214                 {
3215                   struct cgraph_node *clone;
3216                   bool ok;
3217                   ok = remove_described_reference (n, rdesc);
3218                   gcc_checking_assert (ok);
3219
3220                   clone = cs->caller;
3221                   while (clone->global.inlined_to
3222                          && clone != rdesc->cs->caller
3223                          && IPA_NODE_REF (clone)->ipcp_orig_node)
3224                     {
3225                       struct ipa_ref *ref;
3226                       ref = clone->find_reference (n, NULL, 0);
3227                       if (ref)
3228                         {
3229                           if (dump_file)
3230                             fprintf (dump_file, "ipa-prop: Removing "
3231                                      "cloning-created reference "
3232                                      "from %s/%i to %s/%i.\n",
3233                                      xstrdup_for_dump (clone->name ()),
3234                                      clone->order,
3235                                      xstrdup_for_dump (n->name ()),
3236                                      n->order);
3237                           ref->remove_reference ();
3238                         }
3239                       clone = clone->callers->caller;
3240                     }
3241                 }
3242             }
3243         }
3244     }
3245
3246   for (i = ipa_get_param_count (old_root_info);
3247        i < ipa_get_cs_argument_count (args);
3248        i++)
3249     {
3250       struct ipa_jump_func *jf = ipa_get_ith_jump_func (args, i);
3251
3252       if (jf->type == IPA_JF_CONST)
3253         {
3254           struct ipa_cst_ref_desc *rdesc = jfunc_rdesc_usable (jf);
3255           if (rdesc)
3256             rdesc->refcount = IPA_UNDESCRIBED_USE;
3257         }
3258       else if (jf->type == IPA_JF_PASS_THROUGH)
3259         ipa_set_controlled_uses (new_root_info,
3260                                  jf->value.pass_through.formal_id,
3261                                  IPA_UNDESCRIBED_USE);
3262     }
3263 }
3264
3265 /* Update jump functions and call note functions on inlining the call site CS.
3266    CS is expected to lead to a node already cloned by
3267    cgraph_clone_inline_nodes.  Newly discovered indirect edges will be added to
3268    *NEW_EDGES, unless NEW_EDGES is NULL.  Return true iff a new edge(s) were +
3269    created.  */
3270
3271 bool
3272 ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
3273                                    vec<cgraph_edge *> *new_edges)
3274 {
3275   bool changed;
3276   /* Do nothing if the preparation phase has not been carried out yet
3277      (i.e. during early inlining).  */
3278   if (!ipa_node_params_sum)
3279     return false;
3280   gcc_assert (ipa_edge_args_vector);
3281
3282   propagate_controlled_uses (cs);
3283   changed = propagate_info_to_inlined_callees (cs, cs->callee, new_edges);
3284
3285   return changed;
3286 }
3287
3288 /* Frees all dynamically allocated structures that the argument info points
3289    to.  */
3290
3291 void
3292 ipa_free_edge_args_substructures (struct ipa_edge_args *args)
3293 {
3294   vec_free (args->jump_functions);
3295   memset (args, 0, sizeof (*args));
3296 }
3297
3298 /* Free all ipa_edge structures.  */
3299
3300 void
3301 ipa_free_all_edge_args (void)
3302 {
3303   int i;
3304   struct ipa_edge_args *args;
3305
3306   if (!ipa_edge_args_vector)
3307     return;
3308
3309   FOR_EACH_VEC_ELT (*ipa_edge_args_vector, i, args)
3310     ipa_free_edge_args_substructures (args);
3311
3312   vec_free (ipa_edge_args_vector);
3313 }
3314
3315 /* Frees all dynamically allocated structures that the param info points
3316    to.  */
3317
3318 ipa_node_params::~ipa_node_params ()
3319 {
3320   descriptors.release ();
3321   free (lattices);
3322   /* Lattice values and their sources are deallocated with their alocation
3323      pool.  */
3324   known_csts.release ();
3325   known_contexts.release ();
3326
3327   lattices = NULL;
3328   ipcp_orig_node = NULL;
3329   analysis_done = 0;
3330   node_enqueued = 0;
3331   do_clone_for_all_contexts = 0;
3332   is_all_contexts_clone = 0;
3333   node_dead = 0;
3334 }
3335
3336 /* Free all ipa_node_params structures.  */
3337
3338 void
3339 ipa_free_all_node_params (void)
3340 {
3341   delete ipa_node_params_sum;
3342   ipa_node_params_sum = NULL;
3343 }
3344
3345 /* Grow ipcp_transformations if necessary.  */
3346
3347 void
3348 ipcp_grow_transformations_if_necessary (void)
3349 {
3350   if (vec_safe_length (ipcp_transformations)
3351       <= (unsigned) symtab->cgraph_max_uid)
3352     vec_safe_grow_cleared (ipcp_transformations, symtab->cgraph_max_uid + 1);
3353 }
3354
3355 /* Set the aggregate replacements of NODE to be AGGVALS.  */
3356
3357 void
3358 ipa_set_node_agg_value_chain (struct cgraph_node *node,
3359                               struct ipa_agg_replacement_value *aggvals)
3360 {
3361   ipcp_grow_transformations_if_necessary ();
3362   (*ipcp_transformations)[node->uid].agg_values = aggvals;
3363 }
3364
3365 /* Hook that is called by cgraph.c when an edge is removed.  */
3366
3367 static void
3368 ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
3369 {
3370   struct ipa_edge_args *args;
3371
3372   /* During IPA-CP updating we can be called on not-yet analyzed clones.  */
3373   if (vec_safe_length (ipa_edge_args_vector) <= (unsigned)cs->uid)
3374     return;
3375
3376   args = IPA_EDGE_REF (cs);
3377   if (args->jump_functions)
3378     {
3379       struct ipa_jump_func *jf;
3380       int i;
3381       FOR_EACH_VEC_ELT (*args->jump_functions, i, jf)
3382         {
3383           struct ipa_cst_ref_desc *rdesc;
3384           try_decrement_rdesc_refcount (jf);
3385           if (jf->type == IPA_JF_CONST
3386               && (rdesc = ipa_get_jf_constant_rdesc (jf))
3387               && rdesc->cs == cs)
3388             rdesc->cs = NULL;
3389         }
3390     }
3391
3392   ipa_free_edge_args_substructures (IPA_EDGE_REF (cs));
3393 }
3394
3395 /* Hook that is called by cgraph.c when an edge is duplicated.  */
3396
3397 static void
3398 ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
3399                            void *)
3400 {
3401   struct ipa_edge_args *old_args, *new_args;
3402   unsigned int i;
3403
3404   ipa_check_create_edge_args ();
3405
3406   old_args = IPA_EDGE_REF (src);
3407   new_args = IPA_EDGE_REF (dst);
3408
3409   new_args->jump_functions = vec_safe_copy (old_args->jump_functions);
3410   if (old_args->polymorphic_call_contexts)
3411     new_args->polymorphic_call_contexts
3412       = vec_safe_copy (old_args->polymorphic_call_contexts);
3413
3414   for (i = 0; i < vec_safe_length (old_args->jump_functions); i++)
3415     {
3416       struct ipa_jump_func *src_jf = ipa_get_ith_jump_func (old_args, i);
3417       struct ipa_jump_func *dst_jf = ipa_get_ith_jump_func (new_args, i);
3418
3419       dst_jf->agg.items = vec_safe_copy (dst_jf->agg.items);
3420
3421       if (src_jf->type == IPA_JF_CONST)
3422         {
3423           struct ipa_cst_ref_desc *src_rdesc = jfunc_rdesc_usable (src_jf);
3424
3425           if (!src_rdesc)
3426             dst_jf->value.constant.rdesc = NULL;
3427           else if (src->caller == dst->caller)
3428             {
3429               struct ipa_ref *ref;
3430               symtab_node *n = cgraph_node_for_jfunc (src_jf);
3431               gcc_checking_assert (n);
3432               ref = src->caller->find_reference (n, src->call_stmt,
3433                                                  src->lto_stmt_uid);
3434               gcc_checking_assert (ref);
3435               dst->caller->clone_reference (ref, ref->stmt);
3436
3437               struct ipa_cst_ref_desc *dst_rdesc = ipa_refdesc_pool.allocate ();
3438               dst_rdesc->cs = dst;
3439               dst_rdesc->refcount = src_rdesc->refcount;
3440               dst_rdesc->next_duplicate = NULL;
3441               dst_jf->value.constant.rdesc = dst_rdesc;
3442             }
3443           else if (src_rdesc->cs == src)
3444             {
3445               struct ipa_cst_ref_desc *dst_rdesc = ipa_refdesc_pool.allocate ();
3446               dst_rdesc->cs = dst;
3447               dst_rdesc->refcount = src_rdesc->refcount;
3448               dst_rdesc->next_duplicate = src_rdesc->next_duplicate;
3449               src_rdesc->next_duplicate = dst_rdesc;
3450               dst_jf->value.constant.rdesc = dst_rdesc;
3451             }
3452           else
3453             {
3454               struct ipa_cst_ref_desc *dst_rdesc;
3455               /* This can happen during inlining, when a JFUNC can refer to a
3456                  reference taken in a function up in the tree of inline clones.
3457                  We need to find the duplicate that refers to our tree of
3458                  inline clones.  */
3459
3460               gcc_assert (dst->caller->global.inlined_to);
3461               for (dst_rdesc = src_rdesc->next_duplicate;
3462                    dst_rdesc;
3463                    dst_rdesc = dst_rdesc->next_duplicate)
3464                 {
3465                   struct cgraph_node *top;
3466                   top = dst_rdesc->cs->caller->global.inlined_to
3467                     ? dst_rdesc->cs->caller->global.inlined_to
3468                     : dst_rdesc->cs->caller;
3469                   if (dst->caller->global.inlined_to == top)
3470                     break;
3471                 }
3472               gcc_assert (dst_rdesc);
3473               dst_jf->value.constant.rdesc = dst_rdesc;
3474             }
3475         }
3476       else if (dst_jf->type == IPA_JF_PASS_THROUGH
3477                && src->caller == dst->caller)
3478         {
3479           struct cgraph_node *inline_root = dst->caller->global.inlined_to
3480             ? dst->caller->global.inlined_to : dst->caller;
3481           struct ipa_node_params *root_info = IPA_NODE_REF (inline_root);
3482           int idx = ipa_get_jf_pass_through_formal_id (dst_jf);
3483
3484           int c = ipa_get_controlled_uses (root_info, idx);
3485           if (c != IPA_UNDESCRIBED_USE)
3486             {
3487               c++;
3488               ipa_set_controlled_uses (root_info, idx, c);
3489             }
3490         }
3491     }
3492 }
3493
3494 /* Analyze newly added function into callgraph.  */
3495
3496 static void
3497 ipa_add_new_function (cgraph_node *node, void *data ATTRIBUTE_UNUSED)
3498 {
3499   if (node->has_gimple_body_p ())
3500     ipa_analyze_node (node);
3501 }
3502
3503 /* Hook that is called by summary when a node is duplicated.  */
3504
3505 void
3506 ipa_node_params_t::duplicate(cgraph_node *src, cgraph_node *dst,
3507                              ipa_node_params *old_info,
3508                              ipa_node_params *new_info)
3509 {
3510   ipa_agg_replacement_value *old_av, *new_av;
3511
3512   new_info->descriptors = old_info->descriptors.copy ();
3513   new_info->lattices = NULL;
3514   new_info->ipcp_orig_node = old_info->ipcp_orig_node;
3515
3516   new_info->analysis_done = old_info->analysis_done;
3517   new_info->node_enqueued = old_info->node_enqueued;
3518   new_info->versionable = old_info->versionable;
3519
3520   old_av = ipa_get_agg_replacements_for_node (src);
3521   if (old_av)
3522     {
3523       new_av = NULL;
3524       while (old_av)
3525         {
3526           struct ipa_agg_replacement_value *v;
3527
3528           v = ggc_alloc<ipa_agg_replacement_value> ();
3529           memcpy (v, old_av, sizeof (*v));
3530           v->next = new_av;
3531           new_av = v;
3532           old_av = old_av->next;
3533         }
3534       ipa_set_node_agg_value_chain (dst, new_av);
3535     }
3536
3537   ipcp_transformation_summary *src_trans = ipcp_get_transformation_summary (src);
3538
3539   if (src_trans && vec_safe_length (src_trans->alignments) > 0)
3540     {
3541       ipcp_grow_transformations_if_necessary ();
3542       src_trans = ipcp_get_transformation_summary (src);
3543       const vec<ipa_alignment, va_gc> *src_alignments = src_trans->alignments;
3544       vec<ipa_alignment, va_gc> *&dst_alignments
3545         = ipcp_get_transformation_summary (dst)->alignments;
3546       vec_safe_reserve_exact (dst_alignments, src_alignments->length ());
3547       for (unsigned i = 0; i < src_alignments->length (); ++i)
3548         dst_alignments->quick_push ((*src_alignments)[i]);
3549     }
3550 }
3551
3552 /* Register our cgraph hooks if they are not already there.  */
3553
3554 void
3555 ipa_register_cgraph_hooks (void)
3556 {
3557   ipa_check_create_node_params ();
3558
3559   if (!edge_removal_hook_holder)
3560     edge_removal_hook_holder =
3561       symtab->add_edge_removal_hook (&ipa_edge_removal_hook, NULL);
3562   if (!edge_duplication_hook_holder)
3563     edge_duplication_hook_holder =
3564       symtab->add_edge_duplication_hook (&ipa_edge_duplication_hook, NULL);
3565   function_insertion_hook_holder =
3566       symtab->add_cgraph_insertion_hook (&ipa_add_new_function, NULL);
3567 }
3568
3569 /* Unregister our cgraph hooks if they are not already there.  */
3570
3571 static void
3572 ipa_unregister_cgraph_hooks (void)
3573 {
3574   symtab->remove_edge_removal_hook (edge_removal_hook_holder);
3575   edge_removal_hook_holder = NULL;
3576   symtab->remove_edge_duplication_hook (edge_duplication_hook_holder);
3577   edge_duplication_hook_holder = NULL;
3578   symtab->remove_cgraph_insertion_hook (function_insertion_hook_holder);
3579   function_insertion_hook_holder = NULL;
3580 }
3581
3582 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
3583    longer needed after ipa-cp.  */
3584
3585 void
3586 ipa_free_all_structures_after_ipa_cp (void)
3587 {
3588   if (!optimize && !in_lto_p)
3589     {
3590       ipa_free_all_edge_args ();
3591       ipa_free_all_node_params ();
3592       ipcp_sources_pool.release ();
3593       ipcp_cst_values_pool.release ();
3594       ipcp_poly_ctx_values_pool.release ();
3595       ipcp_agg_lattice_pool.release ();
3596       ipa_unregister_cgraph_hooks ();
3597       ipa_refdesc_pool.release ();
3598     }
3599 }
3600
3601 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
3602    longer needed after indirect inlining.  */
3603
3604 void
3605 ipa_free_all_structures_after_iinln (void)
3606 {
3607   ipa_free_all_edge_args ();
3608   ipa_free_all_node_params ();
3609   ipa_unregister_cgraph_hooks ();
3610   ipcp_sources_pool.release ();
3611   ipcp_cst_values_pool.release ();
3612   ipcp_poly_ctx_values_pool.release ();
3613   ipcp_agg_lattice_pool.release ();
3614   ipa_refdesc_pool.release ();
3615 }
3616
3617 /* Print ipa_tree_map data structures of all functions in the
3618    callgraph to F.  */
3619
3620 void
3621 ipa_print_node_params (FILE *f, struct cgraph_node *node)
3622 {
3623   int i, count;
3624   struct ipa_node_params *info;
3625
3626   if (!node->definition)
3627     return;
3628   info = IPA_NODE_REF (node);
3629   fprintf (f, "  function  %s/%i parameter descriptors:\n",
3630            node->name (), node->order);
3631   count = ipa_get_param_count (info);
3632   for (i = 0; i < count; i++)
3633     {
3634       int c;
3635
3636       fprintf (f, "    ");
3637       ipa_dump_param (f, info, i);
3638       if (ipa_is_param_used (info, i))
3639         fprintf (f, " used");
3640       c = ipa_get_controlled_uses (info, i);
3641       if (c == IPA_UNDESCRIBED_USE)
3642         fprintf (f, " undescribed_use");
3643       else
3644         fprintf (f, "  controlled_uses=%i", c);
3645       fprintf (f, "\n");
3646     }
3647 }
3648
3649 /* Print ipa_tree_map data structures of all functions in the
3650    callgraph to F.  */
3651
3652 void
3653 ipa_print_all_params (FILE * f)
3654 {
3655   struct cgraph_node *node;
3656
3657   fprintf (f, "\nFunction parameters:\n");
3658   FOR_EACH_FUNCTION (node)
3659     ipa_print_node_params (f, node);
3660 }
3661
3662 /* Return a heap allocated vector containing formal parameters of FNDECL.  */
3663
3664 vec<tree> 
3665 ipa_get_vector_of_formal_parms (tree fndecl)
3666 {
3667   vec<tree> args;
3668   int count;
3669   tree parm;
3670
3671   gcc_assert (!flag_wpa);
3672   count = count_formal_params (fndecl);
3673   args.create (count);
3674   for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
3675     args.quick_push (parm);
3676
3677   return args;
3678 }
3679
3680 /* Return a heap allocated vector containing types of formal parameters of
3681    function type FNTYPE.  */
3682
3683 vec<tree>
3684 ipa_get_vector_of_formal_parm_types (tree fntype)
3685 {
3686   vec<tree> types;
3687   int count = 0;
3688   tree t;
3689
3690   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
3691     count++;
3692
3693   types.create (count);
3694   for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
3695     types.quick_push (TREE_VALUE (t));
3696
3697   return types;
3698 }
3699
3700 /* Modify the function declaration FNDECL and its type according to the plan in
3701    ADJUSTMENTS.  It also sets base fields of individual adjustments structures
3702    to reflect the actual parameters being modified which are determined by the
3703    base_index field.  */
3704
3705 void
3706 ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments)
3707 {
3708   vec<tree> oparms = ipa_get_vector_of_formal_parms (fndecl);
3709   tree orig_type = TREE_TYPE (fndecl);
3710   tree old_arg_types = TYPE_ARG_TYPES (orig_type);
3711
3712   /* The following test is an ugly hack, some functions simply don't have any
3713      arguments in their type.  This is probably a bug but well... */
3714   bool care_for_types = (old_arg_types != NULL_TREE);
3715   bool last_parm_void;
3716   vec<tree> otypes;
3717   if (care_for_types)
3718     {
3719       last_parm_void = (TREE_VALUE (tree_last (old_arg_types))
3720                         == void_type_node);
3721       otypes = ipa_get_vector_of_formal_parm_types (orig_type);
3722       if (last_parm_void)
3723         gcc_assert (oparms.length () + 1 == otypes.length ());
3724       else
3725         gcc_assert (oparms.length () == otypes.length ());
3726     }
3727   else
3728     {
3729       last_parm_void = false;
3730       otypes.create (0);
3731     }
3732
3733   int len = adjustments.length ();
3734   tree *link = &DECL_ARGUMENTS (fndecl);
3735   tree new_arg_types = NULL;
3736   for (int i = 0; i < len; i++)
3737     {
3738       struct ipa_parm_adjustment *adj;
3739       gcc_assert (link);
3740
3741       adj = &adjustments[i];
3742       tree parm;
3743       if (adj->op == IPA_PARM_OP_NEW)
3744         parm = NULL;
3745       else
3746         parm = oparms[adj->base_index];
3747       adj->base = parm;
3748
3749       if (adj->op == IPA_PARM_OP_COPY)
3750         {
3751           if (care_for_types)
3752             new_arg_types = tree_cons (NULL_TREE, otypes[adj->base_index],
3753                                        new_arg_types);
3754           *link = parm;
3755           link = &DECL_CHAIN (parm);
3756         }
3757       else if (adj->op != IPA_PARM_OP_REMOVE)
3758         {
3759           tree new_parm;
3760           tree ptype;
3761
3762           if (adj->by_ref)
3763             ptype = build_pointer_type (adj->type);
3764           else
3765             {
3766               ptype = adj->type;
3767               if (is_gimple_reg_type (ptype))
3768                 {
3769                   unsigned malign = GET_MODE_ALIGNMENT (TYPE_MODE (ptype));
3770                   if (TYPE_ALIGN (ptype) != malign)
3771                     ptype = build_aligned_type (ptype, malign);
3772                 }
3773             }
3774
3775           if (care_for_types)
3776             new_arg_types = tree_cons (NULL_TREE, ptype, new_arg_types);
3777
3778           new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
3779                                  ptype);
3780           const char *prefix = adj->arg_prefix ? adj->arg_prefix : "SYNTH";
3781           DECL_NAME (new_parm) = create_tmp_var_name (prefix);
3782           DECL_ARTIFICIAL (new_parm) = 1;
3783           DECL_ARG_TYPE (new_parm) = ptype;
3784           DECL_CONTEXT (new_parm) = fndecl;
3785           TREE_USED (new_parm) = 1;
3786           DECL_IGNORED_P (new_parm) = 1;
3787           layout_decl (new_parm, 0);
3788
3789           if (adj->op == IPA_PARM_OP_NEW)
3790             adj->base = NULL;
3791           else
3792             adj->base = parm;
3793           adj->new_decl = new_parm;
3794
3795           *link = new_parm;
3796           link = &DECL_CHAIN (new_parm);
3797         }
3798     }
3799
3800   *link = NULL_TREE;
3801
3802   tree new_reversed = NULL;
3803   if (care_for_types)
3804     {
3805       new_reversed = nreverse (new_arg_types);
3806       if (last_parm_void)
3807         {
3808           if (new_reversed)
3809             TREE_CHAIN (new_arg_types) = void_list_node;
3810           else
3811             new_reversed = void_list_node;
3812         }
3813     }
3814
3815   /* Use copy_node to preserve as much as possible from original type
3816      (debug info, attribute lists etc.)
3817      Exception is METHOD_TYPEs must have THIS argument.
3818      When we are asked to remove it, we need to build new FUNCTION_TYPE
3819      instead.  */
3820   tree new_type = NULL;
3821   if (TREE_CODE (orig_type) != METHOD_TYPE
3822        || (adjustments[0].op == IPA_PARM_OP_COPY
3823           && adjustments[0].base_index == 0))
3824     {
3825       new_type = build_distinct_type_copy (orig_type);
3826       TYPE_ARG_TYPES (new_type) = new_reversed;
3827     }
3828   else
3829     {
3830       new_type
3831         = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
3832                                                          new_reversed));
3833       TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
3834       DECL_VINDEX (fndecl) = NULL_TREE;
3835     }
3836
3837   /* When signature changes, we need to clear builtin info.  */
3838   if (DECL_BUILT_IN (fndecl))
3839     {
3840       DECL_BUILT_IN_CLASS (fndecl) = NOT_BUILT_IN;
3841       DECL_FUNCTION_CODE (fndecl) = (enum built_in_function) 0;
3842     }
3843
3844   TREE_TYPE (fndecl) = new_type;
3845   DECL_VIRTUAL_P (fndecl) = 0;
3846   DECL_LANG_SPECIFIC (fndecl) = NULL;
3847   otypes.release ();
3848   oparms.release ();
3849 }
3850
3851 /* Modify actual arguments of a function call CS as indicated in ADJUSTMENTS.
3852    If this is a directly recursive call, CS must be NULL.  Otherwise it must
3853    contain the corresponding call graph edge.  */
3854
3855 void
3856 ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt,
3857                            ipa_parm_adjustment_vec adjustments)
3858 {
3859   struct cgraph_node *current_node = cgraph_node::get (current_function_decl);
3860   vec<tree> vargs;
3861   vec<tree, va_gc> **debug_args = NULL;
3862   gcall *new_stmt;
3863   gimple_stmt_iterator gsi, prev_gsi;
3864   tree callee_decl;
3865   int i, len;
3866
3867   len = adjustments.length ();
3868   vargs.create (len);
3869   callee_decl = !cs ? gimple_call_fndecl (stmt) : cs->callee->decl;
3870   current_node->remove_stmt_references (stmt);
3871
3872   gsi = gsi_for_stmt (stmt);
3873   prev_gsi = gsi;
3874   gsi_prev (&prev_gsi);
3875   for (i = 0; i < len; i++)
3876     {
3877       struct ipa_parm_adjustment *adj;
3878
3879       adj = &adjustments[i];
3880
3881       if (adj->op == IPA_PARM_OP_COPY)
3882         {
3883           tree arg = gimple_call_arg (stmt, adj->base_index);
3884
3885           vargs.quick_push (arg);
3886         }
3887       else if (adj->op != IPA_PARM_OP_REMOVE)
3888         {
3889           tree expr, base, off;
3890           location_t loc;
3891           unsigned int deref_align = 0;
3892           bool deref_base = false;
3893
3894           /* We create a new parameter out of the value of the old one, we can
3895              do the following kind of transformations:
3896
3897              - A scalar passed by reference is converted to a scalar passed by
3898                value.  (adj->by_ref is false and the type of the original
3899                actual argument is a pointer to a scalar).
3900
3901              - A part of an aggregate is passed instead of the whole aggregate.
3902                The part can be passed either by value or by reference, this is
3903                determined by value of adj->by_ref.  Moreover, the code below
3904                handles both situations when the original aggregate is passed by
3905                value (its type is not a pointer) and when it is passed by
3906                reference (it is a pointer to an aggregate).
3907
3908              When the new argument is passed by reference (adj->by_ref is true)
3909              it must be a part of an aggregate and therefore we form it by
3910              simply taking the address of a reference inside the original
3911              aggregate.  */
3912
3913           gcc_checking_assert (adj->offset % BITS_PER_UNIT == 0);
3914           base = gimple_call_arg (stmt, adj->base_index);
3915           loc = DECL_P (base) ? DECL_SOURCE_LOCATION (base)
3916                               : EXPR_LOCATION (base);
3917
3918           if (TREE_CODE (base) != ADDR_EXPR
3919               && POINTER_TYPE_P (TREE_TYPE (base)))
3920             off = build_int_cst (adj->alias_ptr_type,
3921                                  adj->offset / BITS_PER_UNIT);
3922           else
3923             {
3924               HOST_WIDE_INT base_offset;
3925               tree prev_base;
3926               bool addrof;
3927
3928               if (TREE_CODE (base) == ADDR_EXPR)
3929                 {
3930                   base = TREE_OPERAND (base, 0);
3931                   addrof = true;
3932                 }
3933               else
3934                 addrof = false;
3935               prev_base = base;
3936               base = get_addr_base_and_unit_offset (base, &base_offset);
3937               /* Aggregate arguments can have non-invariant addresses.  */
3938               if (!base)
3939                 {
3940                   base = build_fold_addr_expr (prev_base);
3941                   off = build_int_cst (adj->alias_ptr_type,
3942                                        adj->offset / BITS_PER_UNIT);
3943                 }
3944               else if (TREE_CODE (base) == MEM_REF)
3945                 {
3946                   if (!addrof)
3947                     {
3948                       deref_base = true;
3949                       deref_align = TYPE_ALIGN (TREE_TYPE (base));
3950                     }
3951                   off = build_int_cst (adj->alias_ptr_type,
3952                                        base_offset
3953                                        + adj->offset / BITS_PER_UNIT);
3954                   off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
3955                                          off);
3956                   base = TREE_OPERAND (base, 0);
3957                 }
3958               else
3959                 {
3960                   off = build_int_cst (adj->alias_ptr_type,
3961                                        base_offset
3962                                        + adj->offset / BITS_PER_UNIT);
3963                   base = build_fold_addr_expr (base);
3964                 }
3965             }
3966
3967           if (!adj->by_ref)
3968             {
3969               tree type = adj->type;
3970               unsigned int align;
3971               unsigned HOST_WIDE_INT misalign;
3972
3973               if (deref_base)
3974                 {
3975                   align = deref_align;
3976                   misalign = 0;
3977                 }
3978               else
3979                 {
3980                   get_pointer_alignment_1 (base, &align, &misalign);
3981                   if (TYPE_ALIGN (type) > align)
3982                     align = TYPE_ALIGN (type);
3983                 }
3984               misalign += (offset_int::from (off, SIGNED).to_short_addr ()
3985                            * BITS_PER_UNIT);
3986               misalign = misalign & (align - 1);
3987               if (misalign != 0)
3988                 align = (misalign & -misalign);
3989               if (align < TYPE_ALIGN (type))
3990                 type = build_aligned_type (type, align);
3991               base = force_gimple_operand_gsi (&gsi, base,
3992                                                true, NULL, true, GSI_SAME_STMT);
3993               expr = fold_build2_loc (loc, MEM_REF, type, base, off);
3994               REF_REVERSE_STORAGE_ORDER (expr) = adj->reverse;
3995               /* If expr is not a valid gimple call argument emit
3996                  a load into a temporary.  */
3997               if (is_gimple_reg_type (TREE_TYPE (expr)))
3998                 {
3999                   gimple *tem = gimple_build_assign (NULL_TREE, expr);
4000                   if (gimple_in_ssa_p (cfun))
4001                     {
4002                       gimple_set_vuse (tem, gimple_vuse (stmt));
4003                       expr = make_ssa_name (TREE_TYPE (expr), tem);
4004                     }
4005                   else
4006                     expr = create_tmp_reg (TREE_TYPE (expr));
4007                   gimple_assign_set_lhs (tem, expr);
4008                   gsi_insert_before (&gsi, tem, GSI_SAME_STMT);
4009                 }
4010             }
4011           else
4012             {
4013               expr = fold_build2_loc (loc, MEM_REF, adj->type, base, off);
4014               REF_REVERSE_STORAGE_ORDER (expr) = adj->reverse;
4015               expr = build_fold_addr_expr (expr);
4016               expr = force_gimple_operand_gsi (&gsi, expr,
4017                                                true, NULL, true, GSI_SAME_STMT);
4018             }
4019           vargs.quick_push (expr);
4020         }
4021       if (adj->op != IPA_PARM_OP_COPY && MAY_HAVE_DEBUG_STMTS)
4022         {
4023           unsigned int ix;
4024           tree ddecl = NULL_TREE, origin = DECL_ORIGIN (adj->base), arg;
4025           gimple *def_temp;
4026
4027           arg = gimple_call_arg (stmt, adj->base_index);
4028           if (!useless_type_conversion_p (TREE_TYPE (origin), TREE_TYPE (arg)))
4029             {
4030               if (!fold_convertible_p (TREE_TYPE (origin), arg))
4031                 continue;
4032               arg = fold_convert_loc (gimple_location (stmt),
4033                                       TREE_TYPE (origin), arg);
4034             }
4035           if (debug_args == NULL)
4036             debug_args = decl_debug_args_insert (callee_decl);
4037           for (ix = 0; vec_safe_iterate (*debug_args, ix, &ddecl); ix += 2)
4038             if (ddecl == origin)
4039               {
4040                 ddecl = (**debug_args)[ix + 1];
4041                 break;
4042               }
4043           if (ddecl == NULL)
4044             {
4045               ddecl = make_node (DEBUG_EXPR_DECL);
4046               DECL_ARTIFICIAL (ddecl) = 1;
4047               TREE_TYPE (ddecl) = TREE_TYPE (origin);
4048               DECL_MODE (ddecl) = DECL_MODE (origin);
4049
4050               vec_safe_push (*debug_args, origin);
4051               vec_safe_push (*debug_args, ddecl);
4052             }
4053           def_temp = gimple_build_debug_bind (ddecl, unshare_expr (arg), stmt);
4054           gsi_insert_before (&gsi, def_temp, GSI_SAME_STMT);
4055         }
4056     }
4057
4058   if (dump_file && (dump_flags & TDF_DETAILS))
4059     {
4060       fprintf (dump_file, "replacing stmt:");
4061       print_gimple_stmt (dump_file, gsi_stmt (gsi), 0, 0);
4062     }
4063
4064   new_stmt = gimple_build_call_vec (callee_decl, vargs);
4065   vargs.release ();
4066   if (gimple_call_lhs (stmt))
4067     gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
4068
4069   gimple_set_block (new_stmt, gimple_block (stmt));
4070   if (gimple_has_location (stmt))
4071     gimple_set_location (new_stmt, gimple_location (stmt));
4072   gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
4073   gimple_call_copy_flags (new_stmt, stmt);
4074   if (gimple_in_ssa_p (cfun))
4075     {
4076       gimple_set_vuse (new_stmt, gimple_vuse (stmt));
4077       if (gimple_vdef (stmt))
4078         {
4079           gimple_set_vdef (new_stmt, gimple_vdef (stmt));
4080           SSA_NAME_DEF_STMT (gimple_vdef (new_stmt)) = new_stmt;
4081         }
4082     }
4083
4084   if (dump_file && (dump_flags & TDF_DETAILS))
4085     {
4086       fprintf (dump_file, "with stmt:");
4087       print_gimple_stmt (dump_file, new_stmt, 0, 0);
4088       fprintf (dump_file, "\n");
4089     }
4090   gsi_replace (&gsi, new_stmt, true);
4091   if (cs)
4092     cs->set_call_stmt (new_stmt);
4093   do
4094     {
4095       current_node->record_stmt_references (gsi_stmt (gsi));
4096       gsi_prev (&gsi);
4097     }
4098   while (gsi_stmt (gsi) != gsi_stmt (prev_gsi));
4099 }
4100
4101 /* If the expression *EXPR should be replaced by a reduction of a parameter, do
4102    so.  ADJUSTMENTS is a pointer to a vector of adjustments.  CONVERT
4103    specifies whether the function should care about type incompatibility the
4104    current and new expressions.  If it is false, the function will leave
4105    incompatibility issues to the caller.  Return true iff the expression
4106    was modified. */
4107
4108 bool
4109 ipa_modify_expr (tree *expr, bool convert,
4110                  ipa_parm_adjustment_vec adjustments)
4111 {
4112   struct ipa_parm_adjustment *cand
4113     = ipa_get_adjustment_candidate (&expr, &convert, adjustments, false);
4114   if (!cand)
4115     return false;
4116
4117   tree src;
4118   if (cand->by_ref)
4119     {
4120       src = build_simple_mem_ref (cand->new_decl);
4121       REF_REVERSE_STORAGE_ORDER (src) = cand->reverse;
4122     }
4123   else
4124     src = cand->new_decl;
4125
4126   if (dump_file && (dump_flags & TDF_DETAILS))
4127     {
4128       fprintf (dump_file, "About to replace expr ");
4129       print_generic_expr (dump_file, *expr, 0);
4130       fprintf (dump_file, " with ");
4131       print_generic_expr (dump_file, src, 0);
4132       fprintf (dump_file, "\n");
4133     }
4134
4135   if (convert && !useless_type_conversion_p (TREE_TYPE (*expr), cand->type))
4136     {
4137       tree vce = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (*expr), src);
4138       *expr = vce;
4139     }
4140   else
4141     *expr = src;
4142   return true;
4143 }
4144
4145 /* If T is an SSA_NAME, return NULL if it is not a default def or
4146    return its base variable if it is.  If IGNORE_DEFAULT_DEF is true,
4147    the base variable is always returned, regardless if it is a default
4148    def.  Return T if it is not an SSA_NAME.  */
4149
4150 static tree
4151 get_ssa_base_param (tree t, bool ignore_default_def)
4152 {
4153   if (TREE_CODE (t) == SSA_NAME)
4154     {
4155       if (ignore_default_def || SSA_NAME_IS_DEFAULT_DEF (t))
4156         return SSA_NAME_VAR (t);
4157       else
4158         return NULL_TREE;
4159     }
4160   return t;
4161 }
4162
4163 /* Given an expression, return an adjustment entry specifying the
4164    transformation to be done on EXPR.  If no suitable adjustment entry
4165    was found, returns NULL.
4166
4167    If IGNORE_DEFAULT_DEF is set, consider SSA_NAMEs which are not a
4168    default def, otherwise bail on them.
4169
4170    If CONVERT is non-NULL, this function will set *CONVERT if the
4171    expression provided is a component reference.  ADJUSTMENTS is the
4172    adjustments vector.  */
4173
4174 ipa_parm_adjustment *
4175 ipa_get_adjustment_candidate (tree **expr, bool *convert,
4176                               ipa_parm_adjustment_vec adjustments,
4177                               bool ignore_default_def)
4178 {
4179   if (TREE_CODE (**expr) == BIT_FIELD_REF
4180       || TREE_CODE (**expr) == IMAGPART_EXPR
4181       || TREE_CODE (**expr) == REALPART_EXPR)
4182     {
4183       *expr = &TREE_OPERAND (**expr, 0);
4184       if (convert)
4185         *convert = true;
4186     }
4187
4188   HOST_WIDE_INT offset, size, max_size;
4189   bool reverse;
4190   tree base
4191     = get_ref_base_and_extent (**expr, &offset, &size, &max_size, &reverse);
4192   if (!base || size == -1 || max_size == -1)
4193     return NULL;
4194
4195   if (TREE_CODE (base) == MEM_REF)
4196     {
4197       offset += mem_ref_offset (base).to_short_addr () * BITS_PER_UNIT;
4198       base = TREE_OPERAND (base, 0);
4199     }
4200
4201   base = get_ssa_base_param (base, ignore_default_def);
4202   if (!base || TREE_CODE (base) != PARM_DECL)
4203     return NULL;
4204
4205   struct ipa_parm_adjustment *cand = NULL;
4206   unsigned int len = adjustments.length ();
4207   for (unsigned i = 0; i < len; i++)
4208     {
4209       struct ipa_parm_adjustment *adj = &adjustments[i];
4210
4211       if (adj->base == base
4212           && (adj->offset == offset || adj->op == IPA_PARM_OP_REMOVE))
4213         {
4214           cand = adj;
4215           break;
4216         }
4217     }
4218
4219   if (!cand || cand->op == IPA_PARM_OP_COPY || cand->op == IPA_PARM_OP_REMOVE)
4220     return NULL;
4221   return cand;
4222 }
4223
4224 /* Return true iff BASE_INDEX is in ADJUSTMENTS more than once.  */
4225
4226 static bool
4227 index_in_adjustments_multiple_times_p (int base_index,
4228                                        ipa_parm_adjustment_vec adjustments)
4229 {
4230   int i, len = adjustments.length ();
4231   bool one = false;
4232
4233   for (i = 0; i < len; i++)
4234     {
4235       struct ipa_parm_adjustment *adj;
4236       adj = &adjustments[i];
4237
4238       if (adj->base_index == base_index)
4239         {
4240           if (one)
4241             return true;
4242           else
4243             one = true;
4244         }
4245     }
4246   return false;
4247 }
4248
4249
4250 /* Return adjustments that should have the same effect on function parameters
4251    and call arguments as if they were first changed according to adjustments in
4252    INNER and then by adjustments in OUTER.  */
4253
4254 ipa_parm_adjustment_vec
4255 ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
4256                          ipa_parm_adjustment_vec outer)
4257 {
4258   int i, outlen = outer.length ();
4259   int inlen = inner.length ();
4260   int removals = 0;
4261   ipa_parm_adjustment_vec adjustments, tmp;
4262
4263   tmp.create (inlen);
4264   for (i = 0; i < inlen; i++)
4265     {
4266       struct ipa_parm_adjustment *n;
4267       n = &inner[i];
4268
4269       if (n->op == IPA_PARM_OP_REMOVE)
4270         removals++;
4271       else
4272         {
4273           /* FIXME: Handling of new arguments are not implemented yet.  */
4274           gcc_assert (n->op != IPA_PARM_OP_NEW);
4275           tmp.quick_push (*n);
4276         }
4277     }
4278
4279   adjustments.create (outlen + removals);
4280   for (i = 0; i < outlen; i++)
4281     {
4282       struct ipa_parm_adjustment r;
4283       struct ipa_parm_adjustment *out = &outer[i];
4284       struct ipa_parm_adjustment *in = &tmp[out->base_index];
4285
4286       memset (&r, 0, sizeof (r));
4287       gcc_assert (in->op != IPA_PARM_OP_REMOVE);
4288       if (out->op == IPA_PARM_OP_REMOVE)
4289         {
4290           if (!index_in_adjustments_multiple_times_p (in->base_index, tmp))
4291             {
4292               r.op = IPA_PARM_OP_REMOVE;
4293               adjustments.quick_push (r);
4294             }
4295           continue;
4296         }
4297       else
4298         {
4299           /* FIXME: Handling of new arguments are not implemented yet.  */
4300           gcc_assert (out->op != IPA_PARM_OP_NEW);
4301         }
4302
4303       r.base_index = in->base_index;
4304       r.type = out->type;
4305
4306       /* FIXME:  Create nonlocal value too.  */
4307
4308       if (in->op == IPA_PARM_OP_COPY && out->op == IPA_PARM_OP_COPY)
4309         r.op = IPA_PARM_OP_COPY;
4310       else if (in->op == IPA_PARM_OP_COPY)
4311         r.offset = out->offset;
4312       else if (out->op == IPA_PARM_OP_COPY)
4313         r.offset = in->offset;
4314       else
4315         r.offset = in->offset + out->offset;
4316       adjustments.quick_push (r);
4317     }
4318
4319   for (i = 0; i < inlen; i++)
4320     {
4321       struct ipa_parm_adjustment *n = &inner[i];
4322
4323       if (n->op == IPA_PARM_OP_REMOVE)
4324         adjustments.quick_push (*n);
4325     }
4326
4327   tmp.release ();
4328   return adjustments;
4329 }
4330
4331 /* Dump the adjustments in the vector ADJUSTMENTS to dump_file in a human
4332    friendly way, assuming they are meant to be applied to FNDECL.  */
4333
4334 void
4335 ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
4336                             tree fndecl)
4337 {
4338   int i, len = adjustments.length ();
4339   bool first = true;
4340   vec<tree> parms = ipa_get_vector_of_formal_parms (fndecl);
4341
4342   fprintf (file, "IPA param adjustments: ");
4343   for (i = 0; i < len; i++)
4344     {
4345       struct ipa_parm_adjustment *adj;
4346       adj = &adjustments[i];
4347
4348       if (!first)
4349         fprintf (file, "                 ");
4350       else
4351         first = false;
4352
4353       fprintf (file, "%i. base_index: %i - ", i, adj->base_index);
4354       print_generic_expr (file, parms[adj->base_index], 0);
4355       if (adj->base)
4356         {
4357           fprintf (file, ", base: ");
4358           print_generic_expr (file, adj->base, 0);
4359         }
4360       if (adj->new_decl)
4361         {
4362           fprintf (file, ", new_decl: ");
4363           print_generic_expr (file, adj->new_decl, 0);
4364         }
4365       if (adj->new_ssa_base)
4366         {
4367           fprintf (file, ", new_ssa_base: ");
4368           print_generic_expr (file, adj->new_ssa_base, 0);
4369         }
4370
4371       if (adj->op == IPA_PARM_OP_COPY)
4372         fprintf (file, ", copy_param");
4373       else if (adj->op == IPA_PARM_OP_REMOVE)
4374         fprintf (file, ", remove_param");
4375       else
4376         fprintf (file, ", offset %li", (long) adj->offset);
4377       if (adj->by_ref)
4378         fprintf (file, ", by_ref");
4379       print_node_brief (file, ", type: ", adj->type, 0);
4380       fprintf (file, "\n");
4381     }
4382   parms.release ();
4383 }
4384
4385 /* Dump the AV linked list.  */
4386
4387 void
4388 ipa_dump_agg_replacement_values (FILE *f, struct ipa_agg_replacement_value *av)
4389 {
4390   bool comma = false;
4391   fprintf (f, "     Aggregate replacements:");
4392   for (; av; av = av->next)
4393     {
4394       fprintf (f, "%s %i[" HOST_WIDE_INT_PRINT_DEC "]=", comma ? "," : "",
4395                av->index, av->offset);
4396       print_generic_expr (f, av->value, 0);
4397       comma = true;
4398     }
4399   fprintf (f, "\n");
4400 }
4401
4402 /* Stream out jump function JUMP_FUNC to OB.  */
4403
4404 static void
4405 ipa_write_jump_function (struct output_block *ob,
4406                          struct ipa_jump_func *jump_func)
4407 {
4408   struct ipa_agg_jf_item *item;
4409   struct bitpack_d bp;
4410   int i, count;
4411
4412   streamer_write_uhwi (ob, jump_func->type);
4413   switch (jump_func->type)
4414     {
4415     case IPA_JF_UNKNOWN:
4416       break;
4417     case IPA_JF_CONST:
4418       gcc_assert (
4419           EXPR_LOCATION (jump_func->value.constant.value) == UNKNOWN_LOCATION);
4420       stream_write_tree (ob, jump_func->value.constant.value, true);
4421       break;
4422     case IPA_JF_PASS_THROUGH:
4423       streamer_write_uhwi (ob, jump_func->value.pass_through.operation);
4424       if (jump_func->value.pass_through.operation == NOP_EXPR)
4425         {
4426           streamer_write_uhwi (ob, jump_func->value.pass_through.formal_id);
4427           bp = bitpack_create (ob->main_stream);
4428           bp_pack_value (&bp, jump_func->value.pass_through.agg_preserved, 1);
4429           streamer_write_bitpack (&bp);
4430         }
4431       else
4432         {
4433           stream_write_tree (ob, jump_func->value.pass_through.operand, true);
4434           streamer_write_uhwi (ob, jump_func->value.pass_through.formal_id);
4435         }
4436       break;
4437     case IPA_JF_ANCESTOR:
4438       streamer_write_uhwi (ob, jump_func->value.ancestor.offset);
4439       streamer_write_uhwi (ob, jump_func->value.ancestor.formal_id);
4440       bp = bitpack_create (ob->main_stream);
4441       bp_pack_value (&bp, jump_func->value.ancestor.agg_preserved, 1);
4442       streamer_write_bitpack (&bp);
4443       break;
4444     }
4445
4446   count = vec_safe_length (jump_func->agg.items);
4447   streamer_write_uhwi (ob, count);
4448   if (count)
4449     {
4450       bp = bitpack_create (ob->main_stream);
4451       bp_pack_value (&bp, jump_func->agg.by_ref, 1);
4452       streamer_write_bitpack (&bp);
4453     }
4454
4455   FOR_EACH_VEC_SAFE_ELT (jump_func->agg.items, i, item)
4456     {
4457       streamer_write_uhwi (ob, item->offset);
4458       stream_write_tree (ob, item->value, true);
4459     }
4460
4461   bp = bitpack_create (ob->main_stream);
4462   bp_pack_value (&bp, jump_func->alignment.known, 1);
4463   streamer_write_bitpack (&bp);
4464   if (jump_func->alignment.known)
4465     {
4466       streamer_write_uhwi (ob, jump_func->alignment.align);
4467       streamer_write_uhwi (ob, jump_func->alignment.misalign);
4468     }
4469 }
4470
4471 /* Read in jump function JUMP_FUNC from IB.  */
4472
4473 static void
4474 ipa_read_jump_function (struct lto_input_block *ib,
4475                         struct ipa_jump_func *jump_func,
4476                         struct cgraph_edge *cs,
4477                         struct data_in *data_in)
4478 {
4479   enum jump_func_type jftype;
4480   enum tree_code operation;
4481   int i, count;
4482
4483   jftype = (enum jump_func_type) streamer_read_uhwi (ib);
4484   switch (jftype)
4485     {
4486     case IPA_JF_UNKNOWN:
4487       ipa_set_jf_unknown (jump_func);
4488       break;
4489     case IPA_JF_CONST:
4490       ipa_set_jf_constant (jump_func, stream_read_tree (ib, data_in), cs);
4491       break;
4492     case IPA_JF_PASS_THROUGH:
4493       operation = (enum tree_code) streamer_read_uhwi (ib);
4494       if (operation == NOP_EXPR)
4495         {
4496           int formal_id =  streamer_read_uhwi (ib);
4497           struct bitpack_d bp = streamer_read_bitpack (ib);
4498           bool agg_preserved = bp_unpack_value (&bp, 1);
4499           ipa_set_jf_simple_pass_through (jump_func, formal_id, agg_preserved);
4500         }
4501       else
4502         {
4503           tree operand = stream_read_tree (ib, data_in);
4504           int formal_id =  streamer_read_uhwi (ib);
4505           ipa_set_jf_arith_pass_through (jump_func, formal_id, operand,
4506                                          operation);
4507         }
4508       break;
4509     case IPA_JF_ANCESTOR:
4510       {
4511         HOST_WIDE_INT offset = streamer_read_uhwi (ib);
4512         int formal_id = streamer_read_uhwi (ib);
4513         struct bitpack_d bp = streamer_read_bitpack (ib);
4514         bool agg_preserved = bp_unpack_value (&bp, 1);
4515         ipa_set_ancestor_jf (jump_func, offset, formal_id, agg_preserved);
4516         break;
4517       }
4518     }
4519
4520   count = streamer_read_uhwi (ib);
4521   vec_alloc (jump_func->agg.items, count);
4522   if (count)
4523     {
4524       struct bitpack_d bp = streamer_read_bitpack (ib);
4525       jump_func->agg.by_ref = bp_unpack_value (&bp, 1);
4526     }
4527   for (i = 0; i < count; i++)
4528     {
4529       struct ipa_agg_jf_item item;
4530       item.offset = streamer_read_uhwi (ib);
4531       item.value = stream_read_tree (ib, data_in);
4532       jump_func->agg.items->quick_push (item);
4533     }
4534
4535   struct bitpack_d bp = streamer_read_bitpack (ib);
4536   bool alignment_known = bp_unpack_value (&bp, 1);
4537   if (alignment_known)
4538     {
4539       jump_func->alignment.known = true;
4540       jump_func->alignment.align = streamer_read_uhwi (ib);
4541       jump_func->alignment.misalign = streamer_read_uhwi (ib);
4542     }
4543   else
4544     jump_func->alignment.known = false;
4545 }
4546
4547 /* Stream out parts of cgraph_indirect_call_info corresponding to CS that are
4548    relevant to indirect inlining to OB.  */
4549
4550 static void
4551 ipa_write_indirect_edge_info (struct output_block *ob,
4552                               struct cgraph_edge *cs)
4553 {
4554   struct cgraph_indirect_call_info *ii = cs->indirect_info;
4555   struct bitpack_d bp;
4556
4557   streamer_write_hwi (ob, ii->param_index);
4558   bp = bitpack_create (ob->main_stream);
4559   bp_pack_value (&bp, ii->polymorphic, 1);
4560   bp_pack_value (&bp, ii->agg_contents, 1);
4561   bp_pack_value (&bp, ii->member_ptr, 1);
4562   bp_pack_value (&bp, ii->by_ref, 1);
4563   bp_pack_value (&bp, ii->vptr_changed, 1);
4564   streamer_write_bitpack (&bp);
4565   if (ii->agg_contents || ii->polymorphic)
4566     streamer_write_hwi (ob, ii->offset);
4567   else
4568     gcc_assert (ii->offset == 0);
4569
4570   if (ii->polymorphic)
4571     {
4572       streamer_write_hwi (ob, ii->otr_token);
4573       stream_write_tree (ob, ii->otr_type, true);
4574       ii->context.stream_out (ob);
4575     }
4576 }
4577
4578 /* Read in parts of cgraph_indirect_call_info corresponding to CS that are
4579    relevant to indirect inlining from IB.  */
4580
4581 static void
4582 ipa_read_indirect_edge_info (struct lto_input_block *ib,
4583                              struct data_in *data_in,
4584                              struct cgraph_edge *cs)
4585 {
4586   struct cgraph_indirect_call_info *ii = cs->indirect_info;
4587   struct bitpack_d bp;
4588
4589   ii->param_index = (int) streamer_read_hwi (ib);
4590   bp = streamer_read_bitpack (ib);
4591   ii->polymorphic = bp_unpack_value (&bp, 1);
4592   ii->agg_contents = bp_unpack_value (&bp, 1);
4593   ii->member_ptr = bp_unpack_value (&bp, 1);
4594   ii->by_ref = bp_unpack_value (&bp, 1);
4595   ii->vptr_changed = bp_unpack_value (&bp, 1);
4596   if (ii->agg_contents || ii->polymorphic)
4597     ii->offset = (HOST_WIDE_INT) streamer_read_hwi (ib);
4598   else
4599     ii->offset = 0;
4600   if (ii->polymorphic)
4601     {
4602       ii->otr_token = (HOST_WIDE_INT) streamer_read_hwi (ib);
4603       ii->otr_type = stream_read_tree (ib, data_in);
4604       ii->context.stream_in (ib, data_in);
4605     }
4606 }
4607
4608 /* Stream out NODE info to OB.  */
4609
4610 static void
4611 ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
4612 {
4613   int node_ref;
4614   lto_symtab_encoder_t encoder;
4615   struct ipa_node_params *info = IPA_NODE_REF (node);
4616   int j;
4617   struct cgraph_edge *e;
4618   struct bitpack_d bp;
4619
4620   encoder = ob->decl_state->symtab_node_encoder;
4621   node_ref = lto_symtab_encoder_encode (encoder, node);
4622   streamer_write_uhwi (ob, node_ref);
4623
4624   streamer_write_uhwi (ob, ipa_get_param_count (info));
4625   for (j = 0; j < ipa_get_param_count (info); j++)
4626     streamer_write_uhwi (ob, ipa_get_param_move_cost (info, j));
4627   bp = bitpack_create (ob->main_stream);
4628   gcc_assert (info->analysis_done
4629               || ipa_get_param_count (info) == 0);
4630   gcc_assert (!info->node_enqueued);
4631   gcc_assert (!info->ipcp_orig_node);
4632   for (j = 0; j < ipa_get_param_count (info); j++)
4633     bp_pack_value (&bp, ipa_is_param_used (info, j), 1);
4634   streamer_write_bitpack (&bp);
4635   for (j = 0; j < ipa_get_param_count (info); j++)
4636     streamer_write_hwi (ob, ipa_get_controlled_uses (info, j));
4637   for (e = node->callees; e; e = e->next_callee)
4638     {
4639       struct ipa_edge_args *args = IPA_EDGE_REF (e);
4640
4641       streamer_write_uhwi (ob,
4642                            ipa_get_cs_argument_count (args) * 2
4643                            + (args->polymorphic_call_contexts != NULL));
4644       for (j = 0; j < ipa_get_cs_argument_count (args); j++)
4645         {
4646           ipa_write_jump_function (ob, ipa_get_ith_jump_func (args, j));
4647           if (args->polymorphic_call_contexts != NULL)
4648             ipa_get_ith_polymorhic_call_context (args, j)->stream_out (ob);
4649         }
4650     }
4651   for (e = node->indirect_calls; e; e = e->next_callee)
4652     {
4653       struct ipa_edge_args *args = IPA_EDGE_REF (e);
4654
4655       streamer_write_uhwi (ob,
4656                            ipa_get_cs_argument_count (args) * 2
4657                            + (args->polymorphic_call_contexts != NULL));
4658       for (j = 0; j < ipa_get_cs_argument_count (args); j++)
4659         {
4660           ipa_write_jump_function (ob, ipa_get_ith_jump_func (args, j));
4661           if (args->polymorphic_call_contexts != NULL)
4662             ipa_get_ith_polymorhic_call_context (args, j)->stream_out (ob);
4663         }
4664       ipa_write_indirect_edge_info (ob, e);
4665     }
4666 }
4667
4668 /* Stream in NODE info from IB.  */
4669
4670 static void
4671 ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
4672                     struct data_in *data_in)
4673 {
4674   struct ipa_node_params *info = IPA_NODE_REF (node);
4675   int k;
4676   struct cgraph_edge *e;
4677   struct bitpack_d bp;
4678
4679   ipa_alloc_node_params (node, streamer_read_uhwi (ib));
4680
4681   for (k = 0; k < ipa_get_param_count (info); k++)
4682     info->descriptors[k].move_cost = streamer_read_uhwi (ib);
4683     
4684   bp = streamer_read_bitpack (ib);
4685   if (ipa_get_param_count (info) != 0)
4686     info->analysis_done = true;
4687   info->node_enqueued = false;
4688   for (k = 0; k < ipa_get_param_count (info); k++)
4689     ipa_set_param_used (info, k, bp_unpack_value (&bp, 1));
4690   for (k = 0; k < ipa_get_param_count (info); k++)
4691     ipa_set_controlled_uses (info, k, streamer_read_hwi (ib));
4692   for (e = node->callees; e; e = e->next_callee)
4693     {
4694       struct ipa_edge_args *args = IPA_EDGE_REF (e);
4695       int count = streamer_read_uhwi (ib);
4696       bool contexts_computed = count & 1;
4697       count /= 2;
4698
4699       if (!count)
4700         continue;
4701       vec_safe_grow_cleared (args->jump_functions, count);
4702       if (contexts_computed)
4703         vec_safe_grow_cleared (args->polymorphic_call_contexts, count);
4704
4705       for (k = 0; k < ipa_get_cs_argument_count (args); k++)
4706         {
4707           ipa_read_jump_function (ib, ipa_get_ith_jump_func (args, k), e,
4708                                   data_in);
4709           if (contexts_computed)
4710             ipa_get_ith_polymorhic_call_context (args, k)->stream_in (ib, data_in);
4711         }
4712     }
4713   for (e = node->indirect_calls; e; e = e->next_callee)
4714     {
4715       struct ipa_edge_args *args = IPA_EDGE_REF (e);
4716       int count = streamer_read_uhwi (ib);
4717       bool contexts_computed = count & 1;
4718       count /= 2;
4719
4720       if (count)
4721         {
4722           vec_safe_grow_cleared (args->jump_functions, count);
4723           if (contexts_computed)
4724             vec_safe_grow_cleared (args->polymorphic_call_contexts, count);
4725           for (k = 0; k < ipa_get_cs_argument_count (args); k++)
4726             {
4727               ipa_read_jump_function (ib, ipa_get_ith_jump_func (args, k), e,
4728                                       data_in);
4729               if (contexts_computed)
4730                 ipa_get_ith_polymorhic_call_context (args, k)->stream_in (ib, data_in);
4731             }
4732         }
4733       ipa_read_indirect_edge_info (ib, data_in, e);
4734     }
4735 }
4736
4737 /* Write jump functions for nodes in SET.  */
4738
4739 void
4740 ipa_prop_write_jump_functions (void)
4741 {
4742   struct cgraph_node *node;
4743   struct output_block *ob;
4744   unsigned int count = 0;
4745   lto_symtab_encoder_iterator lsei;
4746   lto_symtab_encoder_t encoder;
4747
4748   if (!ipa_node_params_sum)
4749     return;
4750
4751   ob = create_output_block (LTO_section_jump_functions);
4752   encoder = ob->decl_state->symtab_node_encoder;
4753   ob->symbol = NULL;
4754   for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
4755        lsei_next_function_in_partition (&lsei))
4756     {
4757       node = lsei_cgraph_node (lsei);
4758       if (node->has_gimple_body_p ()
4759           && IPA_NODE_REF (node) != NULL)
4760         count++;
4761     }
4762
4763   streamer_write_uhwi (ob, count);
4764
4765   /* Process all of the functions.  */
4766   for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
4767        lsei_next_function_in_partition (&lsei))
4768     {
4769       node = lsei_cgraph_node (lsei);
4770       if (node->has_gimple_body_p ()
4771           && IPA_NODE_REF (node) != NULL)
4772         ipa_write_node_info (ob, node);
4773     }
4774   streamer_write_char_stream (ob->main_stream, 0);
4775   produce_asm (ob, NULL);
4776   destroy_output_block (ob);
4777 }
4778
4779 /* Read section in file FILE_DATA of length LEN with data DATA.  */
4780
4781 static void
4782 ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
4783                        size_t len)
4784 {
4785   const struct lto_function_header *header =
4786     (const struct lto_function_header *) data;
4787   const int cfg_offset = sizeof (struct lto_function_header);
4788   const int main_offset = cfg_offset + header->cfg_size;
4789   const int string_offset = main_offset + header->main_size;
4790   struct data_in *data_in;
4791   unsigned int i;
4792   unsigned int count;
4793
4794   lto_input_block ib_main ((const char *) data + main_offset,
4795                            header->main_size, file_data->mode_table);
4796
4797   data_in =
4798     lto_data_in_create (file_data, (const char *) data + string_offset,
4799                         header->string_size, vNULL);
4800   count = streamer_read_uhwi (&ib_main);
4801
4802   for (i = 0; i < count; i++)
4803     {
4804       unsigned int index;
4805       struct cgraph_node *node;
4806       lto_symtab_encoder_t encoder;
4807
4808       index = streamer_read_uhwi (&ib_main);
4809       encoder = file_data->symtab_node_encoder;
4810       node = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref (encoder,
4811                                                                 index));
4812       gcc_assert (node->definition);
4813       ipa_read_node_info (&ib_main, node, data_in);
4814     }
4815   lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data,
4816                          len);
4817   lto_data_in_delete (data_in);
4818 }
4819
4820 /* Read ipcp jump functions.  */
4821
4822 void
4823 ipa_prop_read_jump_functions (void)
4824 {
4825   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
4826   struct lto_file_decl_data *file_data;
4827   unsigned int j = 0;
4828
4829   ipa_check_create_node_params ();
4830   ipa_check_create_edge_args ();
4831   ipa_register_cgraph_hooks ();
4832
4833   while ((file_data = file_data_vec[j++]))
4834     {
4835       size_t len;
4836       const char *data = lto_get_section_data (file_data, LTO_section_jump_functions, NULL, &len);
4837
4838       if (data)
4839         ipa_prop_read_section (file_data, data, len);
4840     }
4841 }
4842
4843 /* After merging units, we can get mismatch in argument counts.
4844    Also decl merging might've rendered parameter lists obsolete.
4845    Also compute called_with_variable_arg info.  */
4846
4847 void
4848 ipa_update_after_lto_read (void)
4849 {
4850   ipa_check_create_node_params ();
4851   ipa_check_create_edge_args ();
4852 }
4853
4854 void
4855 write_ipcp_transformation_info (output_block *ob, cgraph_node *node)
4856 {
4857   int node_ref;
4858   unsigned int count = 0;
4859   lto_symtab_encoder_t encoder;
4860   struct ipa_agg_replacement_value *aggvals, *av;
4861
4862   aggvals = ipa_get_agg_replacements_for_node (node);
4863   encoder = ob->decl_state->symtab_node_encoder;
4864   node_ref = lto_symtab_encoder_encode (encoder, node);
4865   streamer_write_uhwi (ob, node_ref);
4866
4867   for (av = aggvals; av; av = av->next)
4868     count++;
4869   streamer_write_uhwi (ob, count);
4870
4871   for (av = aggvals; av; av = av->next)
4872     {
4873       struct bitpack_d bp;
4874
4875       streamer_write_uhwi (ob, av->offset);
4876       streamer_write_uhwi (ob, av->index);
4877       stream_write_tree (ob, av->value, true);
4878
4879       bp = bitpack_create (ob->main_stream);
4880       bp_pack_value (&bp, av->by_ref, 1);
4881       streamer_write_bitpack (&bp);
4882     }
4883
4884   ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
4885   if (ts && vec_safe_length (ts->alignments) > 0)
4886     {
4887       count = ts->alignments->length ();
4888
4889       streamer_write_uhwi (ob, count);
4890       for (unsigned i = 0; i < count; ++i)
4891         {
4892           ipa_alignment *parm_al = &(*ts->alignments)[i];
4893
4894           struct bitpack_d bp;
4895           bp = bitpack_create (ob->main_stream);
4896           bp_pack_value (&bp, parm_al->known, 1);
4897           streamer_write_bitpack (&bp);
4898           if (parm_al->known)
4899             {
4900               streamer_write_uhwi (ob, parm_al->align);
4901               streamer_write_hwi_in_range (ob->main_stream, 0, parm_al->align,
4902                                            parm_al->misalign);
4903             }
4904         }
4905     }
4906   else
4907     streamer_write_uhwi (ob, 0);
4908 }
4909
4910 /* Stream in the aggregate value replacement chain for NODE from IB.  */
4911
4912 static void
4913 read_ipcp_transformation_info (lto_input_block *ib, cgraph_node *node,
4914                                data_in *data_in)
4915 {
4916   struct ipa_agg_replacement_value *aggvals = NULL;
4917   unsigned int count, i;
4918
4919   count = streamer_read_uhwi (ib);
4920   for (i = 0; i <count; i++)
4921     {
4922       struct ipa_agg_replacement_value *av;
4923       struct bitpack_d bp;
4924
4925       av = ggc_alloc<ipa_agg_replacement_value> ();
4926       av->offset = streamer_read_uhwi (ib);
4927       av->index = streamer_read_uhwi (ib);
4928       av->value = stream_read_tree (ib, data_in);
4929       bp = streamer_read_bitpack (ib);
4930       av->by_ref = bp_unpack_value (&bp, 1);
4931       av->next = aggvals;
4932       aggvals = av;
4933     }
4934   ipa_set_node_agg_value_chain (node, aggvals);
4935
4936   count = streamer_read_uhwi (ib);
4937   if (count > 0)
4938     {
4939       ipcp_grow_transformations_if_necessary ();
4940
4941       ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
4942       vec_safe_grow_cleared (ts->alignments, count);
4943
4944       for (i = 0; i < count; i++)
4945         {
4946           ipa_alignment *parm_al;
4947           parm_al = &(*ts->alignments)[i];
4948           struct bitpack_d bp;
4949           bp = streamer_read_bitpack (ib);
4950           parm_al->known = bp_unpack_value (&bp, 1);
4951           if (parm_al->known)
4952             {
4953               parm_al->align = streamer_read_uhwi (ib);
4954               parm_al->misalign
4955                 = streamer_read_hwi_in_range (ib, "ipa-prop misalign",
4956                                               0, parm_al->align);
4957             }
4958         }
4959     }
4960 }
4961
4962 /* Write all aggregate replacement for nodes in set.  */
4963
4964 void
4965 ipcp_write_transformation_summaries (void)
4966 {
4967   struct cgraph_node *node;
4968   struct output_block *ob;
4969   unsigned int count = 0;
4970   lto_symtab_encoder_iterator lsei;
4971   lto_symtab_encoder_t encoder;
4972
4973   ob = create_output_block (LTO_section_ipcp_transform);
4974   encoder = ob->decl_state->symtab_node_encoder;
4975   ob->symbol = NULL;
4976   for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
4977        lsei_next_function_in_partition (&lsei))
4978     {
4979       node = lsei_cgraph_node (lsei);
4980       if (node->has_gimple_body_p ())
4981         count++;
4982     }
4983
4984   streamer_write_uhwi (ob, count);
4985
4986   for (lsei = lsei_start_function_in_partition (encoder); !lsei_end_p (lsei);
4987        lsei_next_function_in_partition (&lsei))
4988     {
4989       node = lsei_cgraph_node (lsei);
4990       if (node->has_gimple_body_p ())
4991         write_ipcp_transformation_info (ob, node);
4992     }
4993   streamer_write_char_stream (ob->main_stream, 0);
4994   produce_asm (ob, NULL);
4995   destroy_output_block (ob);
4996 }
4997
4998 /* Read replacements section in file FILE_DATA of length LEN with data
4999    DATA.  */
5000
5001 static void
5002 read_replacements_section (struct lto_file_decl_data *file_data,
5003                            const char *data,
5004                            size_t len)
5005 {
5006   const struct lto_function_header *header =
5007     (const struct lto_function_header *) data;
5008   const int cfg_offset = sizeof (struct lto_function_header);
5009   const int main_offset = cfg_offset + header->cfg_size;
5010   const int string_offset = main_offset + header->main_size;
5011   struct data_in *data_in;
5012   unsigned int i;
5013   unsigned int count;
5014
5015   lto_input_block ib_main ((const char *) data + main_offset,
5016                            header->main_size, file_data->mode_table);
5017
5018   data_in = lto_data_in_create (file_data, (const char *) data + string_offset,
5019                                 header->string_size, vNULL);
5020   count = streamer_read_uhwi (&ib_main);
5021
5022   for (i = 0; i < count; i++)
5023     {
5024       unsigned int index;
5025       struct cgraph_node *node;
5026       lto_symtab_encoder_t encoder;
5027
5028       index = streamer_read_uhwi (&ib_main);
5029       encoder = file_data->symtab_node_encoder;
5030       node = dyn_cast<cgraph_node *> (lto_symtab_encoder_deref (encoder,
5031                                                                 index));
5032       gcc_assert (node->definition);
5033       read_ipcp_transformation_info (&ib_main, node, data_in);
5034     }
5035   lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data,
5036                          len);
5037   lto_data_in_delete (data_in);
5038 }
5039
5040 /* Read IPA-CP aggregate replacements.  */
5041
5042 void
5043 ipcp_read_transformation_summaries (void)
5044 {
5045   struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
5046   struct lto_file_decl_data *file_data;
5047   unsigned int j = 0;
5048
5049   while ((file_data = file_data_vec[j++]))
5050     {
5051       size_t len;
5052       const char *data = lto_get_section_data (file_data,
5053                                                LTO_section_ipcp_transform,
5054                                                NULL, &len);
5055       if (data)
5056         read_replacements_section (file_data, data, len);
5057     }
5058 }
5059
5060 /* Adjust the aggregate replacements in AGGVAL to reflect parameters skipped in
5061    NODE.  */
5062
5063 static void
5064 adjust_agg_replacement_values (struct cgraph_node *node,
5065                                struct ipa_agg_replacement_value *aggval)
5066 {
5067   struct ipa_agg_replacement_value *v;
5068   int i, c = 0, d = 0, *adj;
5069
5070   if (!node->clone.combined_args_to_skip)
5071     return;
5072
5073   for (v = aggval; v; v = v->next)
5074     {
5075       gcc_assert (v->index >= 0);
5076       if (c < v->index)
5077         c = v->index;
5078     }
5079   c++;
5080
5081   adj = XALLOCAVEC (int, c);
5082   for (i = 0; i < c; i++)
5083     if (bitmap_bit_p (node->clone.combined_args_to_skip, i))
5084       {
5085         adj[i] = -1;
5086         d++;
5087       }
5088     else
5089       adj[i] = i - d;
5090
5091   for (v = aggval; v; v = v->next)
5092     v->index = adj[v->index];
5093 }
5094
5095 /* Dominator walker driving the ipcp modification phase.  */
5096
5097 class ipcp_modif_dom_walker : public dom_walker
5098 {
5099 public:
5100   ipcp_modif_dom_walker (struct ipa_func_body_info *fbi,
5101                          vec<ipa_param_descriptor> descs,
5102                          struct ipa_agg_replacement_value *av,
5103                          bool *sc, bool *cc)
5104     : dom_walker (CDI_DOMINATORS), m_fbi (fbi), m_descriptors (descs),
5105       m_aggval (av), m_something_changed (sc), m_cfg_changed (cc) {}
5106
5107   virtual edge before_dom_children (basic_block);
5108
5109 private:
5110   struct ipa_func_body_info *m_fbi;
5111   vec<ipa_param_descriptor> m_descriptors;
5112   struct ipa_agg_replacement_value *m_aggval;
5113   bool *m_something_changed, *m_cfg_changed;
5114 };
5115
5116 edge
5117 ipcp_modif_dom_walker::before_dom_children (basic_block bb)
5118 {
5119   gimple_stmt_iterator gsi;
5120   for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
5121     {
5122       struct ipa_agg_replacement_value *v;
5123       gimple *stmt = gsi_stmt (gsi);
5124       tree rhs, val, t;
5125       HOST_WIDE_INT offset, size;
5126       int index;
5127       bool by_ref, vce;
5128
5129       if (!gimple_assign_load_p (stmt))
5130         continue;
5131       rhs = gimple_assign_rhs1 (stmt);
5132       if (!is_gimple_reg_type (TREE_TYPE (rhs)))
5133         continue;
5134
5135       vce = false;
5136       t = rhs;
5137       while (handled_component_p (t))
5138         {
5139           /* V_C_E can do things like convert an array of integers to one
5140              bigger integer and similar things we do not handle below.  */
5141           if (TREE_CODE (rhs) == VIEW_CONVERT_EXPR)
5142             {
5143               vce = true;
5144               break;
5145             }
5146           t = TREE_OPERAND (t, 0);
5147         }
5148       if (vce)
5149         continue;
5150
5151       if (!ipa_load_from_parm_agg (m_fbi, m_descriptors, stmt, rhs, &index,
5152                                    &offset, &size, &by_ref))
5153         continue;
5154       for (v = m_aggval; v; v = v->next)
5155         if (v->index == index
5156             && v->offset == offset)
5157           break;
5158       if (!v
5159           || v->by_ref != by_ref
5160           || tree_to_shwi (TYPE_SIZE (TREE_TYPE (v->value))) != size)
5161         continue;
5162
5163       gcc_checking_assert (is_gimple_ip_invariant (v->value));
5164       if (!useless_type_conversion_p (TREE_TYPE (rhs), TREE_TYPE (v->value)))
5165         {
5166           if (fold_convertible_p (TREE_TYPE (rhs), v->value))
5167             val = fold_build1 (NOP_EXPR, TREE_TYPE (rhs), v->value);
5168           else if (TYPE_SIZE (TREE_TYPE (rhs))
5169                    == TYPE_SIZE (TREE_TYPE (v->value)))
5170             val = fold_build1 (VIEW_CONVERT_EXPR, TREE_TYPE (rhs), v->value);
5171           else
5172             {
5173               if (dump_file)
5174                 {
5175                   fprintf (dump_file, "    const ");
5176                   print_generic_expr (dump_file, v->value, 0);
5177                   fprintf (dump_file, "  can't be converted to type of ");
5178                   print_generic_expr (dump_file, rhs, 0);
5179                   fprintf (dump_file, "\n");
5180                 }
5181               continue;
5182             }
5183         }
5184       else
5185         val = v->value;
5186
5187       if (dump_file && (dump_flags & TDF_DETAILS))
5188         {
5189           fprintf (dump_file, "Modifying stmt:\n  ");
5190           print_gimple_stmt (dump_file, stmt, 0, 0);
5191         }
5192       gimple_assign_set_rhs_from_tree (&gsi, val);
5193       update_stmt (stmt);
5194
5195       if (dump_file && (dump_flags & TDF_DETAILS))
5196         {
5197           fprintf (dump_file, "into:\n  ");
5198           print_gimple_stmt (dump_file, stmt, 0, 0);
5199           fprintf (dump_file, "\n");
5200         }
5201
5202       *m_something_changed = true;
5203       if (maybe_clean_eh_stmt (stmt)
5204           && gimple_purge_dead_eh_edges (gimple_bb (stmt)))
5205         *m_cfg_changed = true;
5206     }
5207   return NULL;
5208 }
5209
5210 /* Update alignment of formal parameters as described in
5211    ipcp_transformation_summary.  */
5212
5213 static void
5214 ipcp_update_alignments (struct cgraph_node *node)
5215 {
5216   tree fndecl = node->decl;
5217   tree parm = DECL_ARGUMENTS (fndecl);
5218   tree next_parm = parm;
5219   ipcp_transformation_summary *ts = ipcp_get_transformation_summary (node);
5220   if (!ts || vec_safe_length (ts->alignments) == 0)
5221     return;
5222   const vec<ipa_alignment, va_gc> &alignments = *ts->alignments;
5223   unsigned count = alignments.length ();
5224
5225   for (unsigned i = 0; i < count; ++i, parm = next_parm)
5226     {
5227       if (node->clone.combined_args_to_skip
5228           && bitmap_bit_p (node->clone.combined_args_to_skip, i))
5229         continue;
5230       gcc_checking_assert (parm);
5231       next_parm = DECL_CHAIN (parm);
5232
5233       if (!alignments[i].known || !is_gimple_reg (parm))
5234         continue;
5235       tree ddef = ssa_default_def (DECL_STRUCT_FUNCTION (node->decl), parm);
5236       if (!ddef)
5237         continue;
5238
5239       if (dump_file)
5240         fprintf (dump_file, "  Adjusting alignment of param %u to %u, "
5241                  "misalignment to %u\n", i, alignments[i].align,
5242                  alignments[i].misalign);
5243
5244       struct ptr_info_def *pi = get_ptr_info (ddef);
5245       gcc_checking_assert (pi);
5246       unsigned old_align;
5247       unsigned old_misalign;
5248       bool old_known = get_ptr_info_alignment (pi, &old_align, &old_misalign);
5249
5250       if (old_known
5251           && old_align >= alignments[i].align)
5252         {
5253           if (dump_file)
5254             fprintf (dump_file, "    But the alignment was already %u.\n",
5255                      old_align);
5256           continue;
5257         }
5258       set_ptr_info_alignment (pi, alignments[i].align, alignments[i].misalign);
5259     }
5260 }
5261
5262 /* IPCP transformation phase doing propagation of aggregate values.  */
5263
5264 unsigned int
5265 ipcp_transform_function (struct cgraph_node *node)
5266 {
5267   vec<ipa_param_descriptor> descriptors = vNULL;
5268   struct ipa_func_body_info fbi;
5269   struct ipa_agg_replacement_value *aggval;
5270   int param_count;
5271   bool cfg_changed = false, something_changed = false;
5272
5273   gcc_checking_assert (cfun);
5274   gcc_checking_assert (current_function_decl);
5275
5276   if (dump_file)
5277     fprintf (dump_file, "Modification phase of node %s/%i\n",
5278              node->name (), node->order);
5279
5280   ipcp_update_alignments (node);
5281   aggval = ipa_get_agg_replacements_for_node (node);
5282   if (!aggval)
5283       return 0;
5284   param_count = count_formal_params (node->decl);
5285   if (param_count == 0)
5286     return 0;
5287   adjust_agg_replacement_values (node, aggval);
5288   if (dump_file)
5289     ipa_dump_agg_replacement_values (dump_file, aggval);
5290
5291   fbi.node = node;
5292   fbi.info = NULL;
5293   fbi.bb_infos = vNULL;
5294   fbi.bb_infos.safe_grow_cleared (last_basic_block_for_fn (cfun));
5295   fbi.param_count = param_count;
5296   fbi.aa_walked = 0;
5297
5298   descriptors.safe_grow_cleared (param_count);
5299   ipa_populate_param_decls (node, descriptors);
5300   calculate_dominance_info (CDI_DOMINATORS);
5301   ipcp_modif_dom_walker (&fbi, descriptors, aggval, &something_changed,
5302                          &cfg_changed).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun));
5303
5304   int i;
5305   struct ipa_bb_info *bi;
5306   FOR_EACH_VEC_ELT (fbi.bb_infos, i, bi)
5307     free_ipa_bb_info (bi);
5308   fbi.bb_infos.release ();
5309   free_dominance_info (CDI_DOMINATORS);
5310   (*ipcp_transformations)[node->uid].agg_values = NULL;
5311   (*ipcp_transformations)[node->uid].alignments = NULL;
5312   descriptors.release ();
5313
5314   if (!something_changed)
5315     return 0;
5316   else if (cfg_changed)
5317     return TODO_update_ssa_only_virtuals | TODO_cleanup_cfg;
5318   else
5319     return TODO_update_ssa_only_virtuals;
5320 }