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