1 /* Interprocedural analyses.
2 Copyright (C) 2005, 2007, 2008, 2009, 2010
3 Free Software Foundation, Inc.
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
23 #include "coretypes.h"
25 #include "langhooks.h"
30 #include "tree-flow.h"
31 #include "tree-pass.h"
32 #include "tree-inline.h"
37 #include "diagnostic.h"
38 #include "tree-pretty-print.h"
39 #include "gimple-pretty-print.h"
40 #include "lto-streamer.h"
43 /* Intermediate information about a parameter that is only useful during the
44 run of ipa_analyze_node and is not kept afterwards. */
46 struct param_analysis_info
49 bitmap visited_statements;
52 /* Vector where the parameter infos are actually stored. */
53 VEC (ipa_node_params_t, heap) *ipa_node_params_vector;
54 /* Vector where the parameter infos are actually stored. */
55 VEC (ipa_edge_args_t, gc) *ipa_edge_args_vector;
57 /* Bitmap with all UIDs of call graph edges that have been already processed
58 by indirect inlining. */
59 static bitmap iinlining_processed_edges;
61 /* Holders of ipa cgraph hooks: */
62 static struct cgraph_edge_hook_list *edge_removal_hook_holder;
63 static struct cgraph_node_hook_list *node_removal_hook_holder;
64 static struct cgraph_2edge_hook_list *edge_duplication_hook_holder;
65 static struct cgraph_2node_hook_list *node_duplication_hook_holder;
67 /* Add cgraph NODE described by INFO to the worklist WL regardless of whether
68 it is in one or not. It should almost never be used directly, as opposed to
69 ipa_push_func_to_list. */
72 ipa_push_func_to_list_1 (struct ipa_func_list **wl,
73 struct cgraph_node *node,
74 struct ipa_node_params *info)
76 struct ipa_func_list *temp;
78 info->node_enqueued = 1;
79 temp = XCNEW (struct ipa_func_list);
85 /* Initialize worklist to contain all functions. */
87 struct ipa_func_list *
88 ipa_init_func_list (void)
90 struct cgraph_node *node;
91 struct ipa_func_list * wl;
94 for (node = cgraph_nodes; node; node = node->next)
97 struct ipa_node_params *info = IPA_NODE_REF (node);
98 /* Unreachable nodes should have been eliminated before ipcp and
100 gcc_assert (node->needed || node->reachable);
101 ipa_push_func_to_list_1 (&wl, node, info);
107 /* Remove a function from the worklist WL and return it. */
110 ipa_pop_func_from_list (struct ipa_func_list **wl)
112 struct ipa_node_params *info;
113 struct ipa_func_list *first;
114 struct cgraph_node *node;
121 info = IPA_NODE_REF (node);
122 info->node_enqueued = 0;
126 /* Return index of the formal whose tree is PTREE in function which corresponds
130 ipa_get_param_decl_index (struct ipa_node_params *info, tree ptree)
134 count = ipa_get_param_count (info);
135 for (i = 0; i < count; i++)
136 if (ipa_get_param(info, i) == ptree)
142 /* Populate the param_decl field in parameter descriptors of INFO that
143 corresponds to NODE. */
146 ipa_populate_param_decls (struct cgraph_node *node,
147 struct ipa_node_params *info)
155 fnargs = DECL_ARGUMENTS (fndecl);
157 for (parm = fnargs; parm; parm = DECL_CHAIN (parm))
159 info->params[param_num].decl = parm;
164 /* Return how many formal parameters FNDECL has. */
167 count_formal_params_1 (tree fndecl)
172 for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
178 /* Count number of formal parameters in NOTE. Store the result to the
179 appropriate field of INFO. */
182 ipa_count_formal_params (struct cgraph_node *node,
183 struct ipa_node_params *info)
187 param_num = count_formal_params_1 (node->decl);
188 ipa_set_param_count (info, param_num);
191 /* Initialize the ipa_node_params structure associated with NODE by counting
192 the function parameters, creating the descriptors and populating their
196 ipa_initialize_node_params (struct cgraph_node *node)
198 struct ipa_node_params *info = IPA_NODE_REF (node);
202 ipa_count_formal_params (node, info);
203 info->params = XCNEWVEC (struct ipa_param_descriptor,
204 ipa_get_param_count (info));
205 ipa_populate_param_decls (node, info);
209 /* Count number of arguments callsite CS has and store it in
210 ipa_edge_args structure corresponding to this callsite. */
213 ipa_count_arguments (struct cgraph_edge *cs)
218 stmt = cs->call_stmt;
219 gcc_assert (is_gimple_call (stmt));
220 arg_num = gimple_call_num_args (stmt);
221 if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector)
222 <= (unsigned) cgraph_edge_max_uid)
223 VEC_safe_grow_cleared (ipa_edge_args_t, gc,
224 ipa_edge_args_vector, cgraph_edge_max_uid + 1);
225 ipa_set_cs_argument_count (IPA_EDGE_REF (cs), arg_num);
228 /* Print the jump functions associated with call graph edge CS to file F. */
231 ipa_print_node_jump_functions_for_edge (FILE *f, struct cgraph_edge *cs)
235 count = ipa_get_cs_argument_count (IPA_EDGE_REF (cs));
236 for (i = 0; i < count; i++)
238 struct ipa_jump_func *jump_func;
239 enum jump_func_type type;
241 jump_func = ipa_get_ith_jump_func (IPA_EDGE_REF (cs), i);
242 type = jump_func->type;
244 fprintf (f, " param %d: ", i);
245 if (type == IPA_JF_UNKNOWN)
246 fprintf (f, "UNKNOWN\n");
247 else if (type == IPA_JF_KNOWN_TYPE)
249 tree binfo_type = TREE_TYPE (jump_func->value.base_binfo);
250 fprintf (f, "KNOWN TYPE, type in binfo is: ");
251 print_generic_expr (f, binfo_type, 0);
252 fprintf (f, " (%u)\n", TYPE_UID (binfo_type));
254 else if (type == IPA_JF_CONST)
256 tree val = jump_func->value.constant;
257 fprintf (f, "CONST: ");
258 print_generic_expr (f, val, 0);
259 if (TREE_CODE (val) == ADDR_EXPR
260 && TREE_CODE (TREE_OPERAND (val, 0)) == CONST_DECL)
263 print_generic_expr (f, DECL_INITIAL (TREE_OPERAND (val, 0)),
268 else if (type == IPA_JF_CONST_MEMBER_PTR)
270 fprintf (f, "CONST MEMBER PTR: ");
271 print_generic_expr (f, jump_func->value.member_cst.pfn, 0);
273 print_generic_expr (f, jump_func->value.member_cst.delta, 0);
276 else if (type == IPA_JF_PASS_THROUGH)
278 fprintf (f, "PASS THROUGH: ");
279 fprintf (f, "%d, op %s ",
280 jump_func->value.pass_through.formal_id,
282 jump_func->value.pass_through.operation]);
283 if (jump_func->value.pass_through.operation != NOP_EXPR)
284 print_generic_expr (dump_file,
285 jump_func->value.pass_through.operand, 0);
286 fprintf (dump_file, "\n");
288 else if (type == IPA_JF_ANCESTOR)
290 fprintf (f, "ANCESTOR: ");
291 fprintf (f, "%d, offset "HOST_WIDE_INT_PRINT_DEC", ",
292 jump_func->value.ancestor.formal_id,
293 jump_func->value.ancestor.offset);
294 print_generic_expr (f, jump_func->value.ancestor.type, 0);
295 fprintf (dump_file, "\n");
301 /* Print the jump functions of all arguments on all call graph edges going from
305 ipa_print_node_jump_functions (FILE *f, struct cgraph_node *node)
307 struct cgraph_edge *cs;
310 fprintf (f, " Jump functions of caller %s:\n", cgraph_node_name (node));
311 for (cs = node->callees; cs; cs = cs->next_callee)
313 if (!ipa_edge_args_info_available_for_edge_p (cs))
316 fprintf (f, " callsite %s/%i -> %s/%i : \n",
317 cgraph_node_name (node), node->uid,
318 cgraph_node_name (cs->callee), cs->callee->uid);
319 ipa_print_node_jump_functions_for_edge (f, cs);
322 for (cs = node->indirect_calls, i = 0; cs; cs = cs->next_callee, i++)
324 if (!ipa_edge_args_info_available_for_edge_p (cs))
329 fprintf (f, " indirect callsite %d for stmt ", i);
330 print_gimple_stmt (f, cs->call_stmt, 0, TDF_SLIM);
333 fprintf (f, " indirect callsite %d :\n", i);
334 ipa_print_node_jump_functions_for_edge (f, cs);
339 /* Print ipa_jump_func data structures of all nodes in the call graph to F. */
342 ipa_print_all_jump_functions (FILE *f)
344 struct cgraph_node *node;
346 fprintf (f, "\nJump functions:\n");
347 for (node = cgraph_nodes; node; node = node->next)
349 ipa_print_node_jump_functions (f, node);
353 /* Structure to be passed in between detect_type_change and
354 check_stmt_for_type_change. */
356 struct type_change_info
358 /* Set to true if dynamic type change has been detected. */
359 bool type_maybe_changed;
362 /* Return true if STMT can modify a virtual method table pointer.
364 This function makes special assumptions about both constructors and
365 destructors which are all the functions that are allowed to alter the VMT
366 pointers. It assumes that destructors begin with assignment into all VMT
367 pointers and that constructors essentially look in the following way:
369 1) The very first thing they do is that they call constructors of ancestor
370 sub-objects that have them.
372 2) Then VMT pointers of this and all its ancestors is set to new values
373 corresponding to the type corresponding to the constructor.
375 3) Only afterwards, other stuff such as constructor of member sub-objects
376 and the code written by the user is run. Only this may include calling
377 virtual functions, directly or indirectly.
379 There is no way to call a constructor of an ancestor sub-object in any
382 This means that we do not have to care whether constructors get the correct
383 type information because they will always change it (in fact, if we define
384 the type to be given by the VMT pointer, it is undefined).
386 The most important fact to derive from the above is that if, for some
387 statement in the section 3, we try to detect whether the dynamic type has
388 changed, we can safely ignore all calls as we examine the function body
389 backwards until we reach statements in section 2 because these calls cannot
390 be ancestor constructors or destructors (if the input is not bogus) and so
391 do not change the dynamic type (this holds true only for automatically
392 allocated objects but at the moment we devirtualize only these). We then
393 must detect that statements in section 2 change the dynamic type and can try
394 to derive the new type. That is enough and we can stop, we will never see
395 the calls into constructors of sub-objects in this code. Therefore we can
396 safely ignore all call statements that we traverse.
400 stmt_may_be_vtbl_ptr_store (gimple stmt)
402 if (is_gimple_call (stmt))
404 else if (is_gimple_assign (stmt))
406 tree lhs = gimple_assign_lhs (stmt);
408 if (TREE_CODE (lhs) == COMPONENT_REF
409 && !DECL_VIRTUAL_P (TREE_OPERAND (lhs, 1))
410 && !AGGREGATE_TYPE_P (TREE_TYPE (lhs)))
412 /* In the future we might want to use get_base_ref_and_offset to find
413 if there is a field corresponding to the offset and if so, proceed
414 almost like if it was a component ref. */
419 /* Callback of walk_aliased_vdefs and a helper function for
420 detect_type_change to check whether a particular statement may modify
421 the virtual table pointer, and if possible also determine the new type of
422 the (sub-)object. It stores its result into DATA, which points to a
423 type_change_info structure. */
426 check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
428 gimple stmt = SSA_NAME_DEF_STMT (vdef);
429 struct type_change_info *tci = (struct type_change_info *) data;
431 if (stmt_may_be_vtbl_ptr_store (stmt))
433 tci->type_maybe_changed = true;
440 /* Detect whether the dynamic type of ARG has changed (before callsite CALL) by
441 looking for assignments to its virtual table pointer. If it is, return true
442 and fill in the jump function JFUNC with relevant type information or set it
443 to unknown. ARG is the object itself (not a pointer to it, unless
444 dereferenced). BASE is the base of the memory access as returned by
445 get_ref_base_and_extent, as is the offset. */
448 detect_type_change (tree arg, tree base, gimple call,
449 struct ipa_jump_func *jfunc, HOST_WIDE_INT offset)
451 struct type_change_info tci;
454 gcc_checking_assert (DECL_P (arg)
455 || TREE_CODE (arg) == MEM_REF
456 || handled_component_p (arg));
457 /* Const calls cannot call virtual methods through VMT and so type changes do
459 if (!flag_devirtualize || !gimple_vuse (call))
462 tci.type_maybe_changed = false;
467 ao.size = POINTER_SIZE;
468 ao.max_size = ao.size;
469 ao.ref_alias_set = -1;
470 ao.base_alias_set = -1;
472 walk_aliased_vdefs (&ao, gimple_vuse (call), check_stmt_for_type_change,
474 if (!tci.type_maybe_changed)
477 jfunc->type = IPA_JF_UNKNOWN;
481 /* Like detect_type_change but ARG is supposed to be a non-dereferenced pointer
482 SSA name (its dereference will become the base and the offset is assumed to
486 detect_type_change_ssa (tree arg, gimple call, struct ipa_jump_func *jfunc)
488 gcc_checking_assert (TREE_CODE (arg) == SSA_NAME);
489 if (!flag_devirtualize
490 || !POINTER_TYPE_P (TREE_TYPE (arg))
491 || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != RECORD_TYPE)
494 arg = build2 (MEM_REF, ptr_type_node, arg,
495 build_int_cst (ptr_type_node, 0));
497 return detect_type_change (arg, arg, call, jfunc, 0);
501 /* Given that an actual argument is an SSA_NAME (given in NAME) and is a result
502 of an assignment statement STMT, try to find out whether NAME can be
503 described by a (possibly polynomial) pass-through jump-function or an
504 ancestor jump function and if so, write the appropriate function into
508 compute_complex_assign_jump_func (struct ipa_node_params *info,
509 struct ipa_jump_func *jfunc,
510 gimple call, gimple stmt, tree name)
512 HOST_WIDE_INT offset, size, max_size;
513 tree op1, op2, base, ssa;
516 op1 = gimple_assign_rhs1 (stmt);
517 op2 = gimple_assign_rhs2 (stmt);
519 if (TREE_CODE (op1) == SSA_NAME
520 && SSA_NAME_IS_DEFAULT_DEF (op1))
522 index = ipa_get_param_decl_index (info, SSA_NAME_VAR (op1));
528 if (!is_gimple_ip_invariant (op2)
529 || (TREE_CODE_CLASS (gimple_expr_code (stmt)) != tcc_comparison
530 && !useless_type_conversion_p (TREE_TYPE (name),
534 jfunc->type = IPA_JF_PASS_THROUGH;
535 jfunc->value.pass_through.formal_id = index;
536 jfunc->value.pass_through.operation = gimple_assign_rhs_code (stmt);
537 jfunc->value.pass_through.operand = op2;
539 else if (gimple_assign_unary_nop_p (stmt)
540 && !detect_type_change_ssa (op1, call, jfunc))
542 jfunc->type = IPA_JF_PASS_THROUGH;
543 jfunc->value.pass_through.formal_id = index;
544 jfunc->value.pass_through.operation = NOP_EXPR;
549 if (TREE_CODE (op1) != ADDR_EXPR)
551 op1 = TREE_OPERAND (op1, 0);
552 if (TREE_CODE (TREE_TYPE (op1)) != RECORD_TYPE)
554 base = get_ref_base_and_extent (op1, &offset, &size, &max_size);
555 if (TREE_CODE (base) != MEM_REF
556 /* If this is a varying address, punt. */
560 offset += mem_ref_offset (base).low * BITS_PER_UNIT;
561 ssa = TREE_OPERAND (base, 0);
562 if (TREE_CODE (ssa) != SSA_NAME
563 || !SSA_NAME_IS_DEFAULT_DEF (ssa)
567 /* Dynamic types are changed only in constructors and destructors and */
568 index = ipa_get_param_decl_index (info, SSA_NAME_VAR (ssa));
570 && !detect_type_change (op1, base, call, jfunc, offset))
572 jfunc->type = IPA_JF_ANCESTOR;
573 jfunc->value.ancestor.formal_id = index;
574 jfunc->value.ancestor.offset = offset;
575 jfunc->value.ancestor.type = TREE_TYPE (op1);
580 /* Given that an actual argument is an SSA_NAME that is a result of a phi
581 statement PHI, try to find out whether NAME is in fact a
582 multiple-inheritance typecast from a descendant into an ancestor of a formal
583 parameter and thus can be described by an ancestor jump function and if so,
584 write the appropriate function into JFUNC.
586 Essentially we want to match the following pattern:
594 iftmp.1_3 = &obj_2(D)->D.1762;
597 # iftmp.1_1 = PHI <iftmp.1_3(3), 0B(2)>
598 D.1879_6 = middleman_1 (iftmp.1_1, i_5(D));
602 compute_complex_ancestor_jump_func (struct ipa_node_params *info,
603 struct ipa_jump_func *jfunc,
604 gimple call, gimple phi)
606 HOST_WIDE_INT offset, size, max_size;
608 basic_block phi_bb, assign_bb, cond_bb;
609 tree tmp, parm, expr, obj;
612 if (gimple_phi_num_args (phi) != 2)
615 if (integer_zerop (PHI_ARG_DEF (phi, 1)))
616 tmp = PHI_ARG_DEF (phi, 0);
617 else if (integer_zerop (PHI_ARG_DEF (phi, 0)))
618 tmp = PHI_ARG_DEF (phi, 1);
621 if (TREE_CODE (tmp) != SSA_NAME
622 || SSA_NAME_IS_DEFAULT_DEF (tmp)
623 || !POINTER_TYPE_P (TREE_TYPE (tmp))
624 || TREE_CODE (TREE_TYPE (TREE_TYPE (tmp))) != RECORD_TYPE)
627 assign = SSA_NAME_DEF_STMT (tmp);
628 assign_bb = gimple_bb (assign);
629 if (!single_pred_p (assign_bb)
630 || !gimple_assign_single_p (assign))
632 expr = gimple_assign_rhs1 (assign);
634 if (TREE_CODE (expr) != ADDR_EXPR)
636 expr = TREE_OPERAND (expr, 0);
638 expr = get_ref_base_and_extent (expr, &offset, &size, &max_size);
640 if (TREE_CODE (expr) != MEM_REF
641 /* If this is a varying address, punt. */
645 offset += mem_ref_offset (expr).low * BITS_PER_UNIT;
646 parm = TREE_OPERAND (expr, 0);
647 if (TREE_CODE (parm) != SSA_NAME
648 || !SSA_NAME_IS_DEFAULT_DEF (parm)
652 index = ipa_get_param_decl_index (info, SSA_NAME_VAR (parm));
656 cond_bb = single_pred (assign_bb);
657 cond = last_stmt (cond_bb);
659 || gimple_code (cond) != GIMPLE_COND
660 || gimple_cond_code (cond) != NE_EXPR
661 || gimple_cond_lhs (cond) != parm
662 || !integer_zerop (gimple_cond_rhs (cond)))
665 phi_bb = gimple_bb (phi);
666 for (i = 0; i < 2; i++)
668 basic_block pred = EDGE_PRED (phi_bb, i)->src;
669 if (pred != assign_bb && pred != cond_bb)
673 if (!detect_type_change (obj, expr, call, jfunc, offset))
675 jfunc->type = IPA_JF_ANCESTOR;
676 jfunc->value.ancestor.formal_id = index;
677 jfunc->value.ancestor.offset = offset;
678 jfunc->value.ancestor.type = TREE_TYPE (obj);;
682 /* Given OP which is passed as an actual argument to a called function,
683 determine if it is possible to construct a KNOWN_TYPE jump function for it
684 and if so, create one and store it to JFUNC. */
687 compute_known_type_jump_func (tree op, struct ipa_jump_func *jfunc,
690 HOST_WIDE_INT offset, size, max_size;
693 if (!flag_devirtualize
694 || TREE_CODE (op) != ADDR_EXPR
695 || TREE_CODE (TREE_TYPE (TREE_TYPE (op))) != RECORD_TYPE)
698 op = TREE_OPERAND (op, 0);
699 base = get_ref_base_and_extent (op, &offset, &size, &max_size);
703 || TREE_CODE (TREE_TYPE (base)) != RECORD_TYPE
704 || is_global_var (base))
707 binfo = TYPE_BINFO (TREE_TYPE (base));
709 || detect_type_change (op, base, call, jfunc, offset))
712 binfo = get_binfo_at_offset (binfo, offset, TREE_TYPE (op));
715 jfunc->type = IPA_JF_KNOWN_TYPE;
716 jfunc->value.base_binfo = binfo;
721 /* Determine the jump functions of scalar arguments. Scalar means SSA names
722 and constants of a number of selected types. INFO is the ipa_node_params
723 structure associated with the caller, FUNCTIONS is a pointer to an array of
724 jump function structures associated with CALL which is the call statement
728 compute_scalar_jump_functions (struct ipa_node_params *info,
729 struct ipa_jump_func *functions,
735 for (num = 0; num < gimple_call_num_args (call); num++)
737 arg = gimple_call_arg (call, num);
739 if (is_gimple_ip_invariant (arg))
741 functions[num].type = IPA_JF_CONST;
742 functions[num].value.constant = arg;
744 else if (TREE_CODE (arg) == SSA_NAME)
746 if (SSA_NAME_IS_DEFAULT_DEF (arg))
748 int index = ipa_get_param_decl_index (info, SSA_NAME_VAR (arg));
751 && !detect_type_change_ssa (arg, call, &functions[num]))
753 functions[num].type = IPA_JF_PASS_THROUGH;
754 functions[num].value.pass_through.formal_id = index;
755 functions[num].value.pass_through.operation = NOP_EXPR;
760 gimple stmt = SSA_NAME_DEF_STMT (arg);
761 if (is_gimple_assign (stmt))
762 compute_complex_assign_jump_func (info, &functions[num],
764 else if (gimple_code (stmt) == GIMPLE_PHI)
765 compute_complex_ancestor_jump_func (info, &functions[num],
770 compute_known_type_jump_func (arg, &functions[num], call);
774 /* Inspect the given TYPE and return true iff it has the same structure (the
775 same number of fields of the same types) as a C++ member pointer. If
776 METHOD_PTR and DELTA are non-NULL, store the trees representing the
777 corresponding fields there. */
780 type_like_member_ptr_p (tree type, tree *method_ptr, tree *delta)
784 if (TREE_CODE (type) != RECORD_TYPE)
787 fld = TYPE_FIELDS (type);
788 if (!fld || !POINTER_TYPE_P (TREE_TYPE (fld))
789 || TREE_CODE (TREE_TYPE (TREE_TYPE (fld))) != METHOD_TYPE)
795 fld = DECL_CHAIN (fld);
796 if (!fld || INTEGRAL_TYPE_P (fld))
801 if (DECL_CHAIN (fld))
807 /* Callback of walk_aliased_vdefs. Flags that it has been invoked to the
808 boolean variable pointed to by DATA. */
811 mark_modified (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef ATTRIBUTE_UNUSED,
814 bool *b = (bool *) data;
819 /* Return true if the formal parameter PARM might have been modified in this
820 function before reaching the statement CALL. PARM_INFO is a pointer to a
821 structure containing intermediate information about PARM. */
824 is_parm_modified_before_call (struct param_analysis_info *parm_info,
825 gimple call, tree parm)
827 bool modified = false;
830 if (parm_info->modified)
833 ao_ref_init (&refd, parm);
834 walk_aliased_vdefs (&refd, gimple_vuse (call), mark_modified,
835 &modified, &parm_info->visited_statements);
838 parm_info->modified = true;
844 /* Go through arguments of the CALL and for every one that looks like a member
845 pointer, check whether it can be safely declared pass-through and if so,
846 mark that to the corresponding item of jump FUNCTIONS. Return true iff
847 there are non-pass-through member pointers within the arguments. INFO
848 describes formal parameters of the caller. PARMS_INFO is a pointer to a
849 vector containing intermediate information about each formal parameter. */
852 compute_pass_through_member_ptrs (struct ipa_node_params *info,
853 struct param_analysis_info *parms_info,
854 struct ipa_jump_func *functions,
857 bool undecided_members = false;
861 for (num = 0; num < gimple_call_num_args (call); num++)
863 arg = gimple_call_arg (call, num);
865 if (type_like_member_ptr_p (TREE_TYPE (arg), NULL, NULL))
867 if (TREE_CODE (arg) == PARM_DECL)
869 int index = ipa_get_param_decl_index (info, arg);
871 gcc_assert (index >=0);
872 if (!is_parm_modified_before_call (&parms_info[index], call, arg))
874 functions[num].type = IPA_JF_PASS_THROUGH;
875 functions[num].value.pass_through.formal_id = index;
876 functions[num].value.pass_through.operation = NOP_EXPR;
879 undecided_members = true;
882 undecided_members = true;
886 return undecided_members;
889 /* Simple function filling in a member pointer constant jump function (with PFN
890 and DELTA as the constant value) into JFUNC. */
893 fill_member_ptr_cst_jump_function (struct ipa_jump_func *jfunc,
894 tree pfn, tree delta)
896 jfunc->type = IPA_JF_CONST_MEMBER_PTR;
897 jfunc->value.member_cst.pfn = pfn;
898 jfunc->value.member_cst.delta = delta;
901 /* If RHS is an SSA_NAME and it is defined by a simple copy assign statement,
902 return the rhs of its defining statement. */
905 get_ssa_def_if_simple_copy (tree rhs)
907 while (TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_IS_DEFAULT_DEF (rhs))
909 gimple def_stmt = SSA_NAME_DEF_STMT (rhs);
911 if (gimple_assign_single_p (def_stmt))
912 rhs = gimple_assign_rhs1 (def_stmt);
919 /* Traverse statements from CALL backwards, scanning whether the argument ARG
920 which is a member pointer is filled in with constant values. If it is, fill
921 the jump function JFUNC in appropriately. METHOD_FIELD and DELTA_FIELD are
922 fields of the record type of the member pointer. To give an example, we
923 look for a pattern looking like the following:
925 D.2515.__pfn ={v} printStuff;
926 D.2515.__delta ={v} 0;
927 i_1 = doprinting (D.2515); */
930 determine_cst_member_ptr (gimple call, tree arg, tree method_field,
931 tree delta_field, struct ipa_jump_func *jfunc)
933 gimple_stmt_iterator gsi;
934 tree method = NULL_TREE;
935 tree delta = NULL_TREE;
937 gsi = gsi_for_stmt (call);
940 for (; !gsi_end_p (gsi); gsi_prev (&gsi))
942 gimple stmt = gsi_stmt (gsi);
945 if (!stmt_may_clobber_ref_p (stmt, arg))
947 if (!gimple_assign_single_p (stmt))
950 lhs = gimple_assign_lhs (stmt);
951 rhs = gimple_assign_rhs1 (stmt);
953 if (TREE_CODE (lhs) != COMPONENT_REF
954 || TREE_OPERAND (lhs, 0) != arg)
957 fld = TREE_OPERAND (lhs, 1);
958 if (!method && fld == method_field)
960 rhs = get_ssa_def_if_simple_copy (rhs);
961 if (TREE_CODE (rhs) == ADDR_EXPR
962 && TREE_CODE (TREE_OPERAND (rhs, 0)) == FUNCTION_DECL
963 && TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 0))) == METHOD_TYPE)
965 method = TREE_OPERAND (rhs, 0);
968 fill_member_ptr_cst_jump_function (jfunc, rhs, delta);
976 if (!delta && fld == delta_field)
978 rhs = get_ssa_def_if_simple_copy (rhs);
979 if (TREE_CODE (rhs) == INTEGER_CST)
984 fill_member_ptr_cst_jump_function (jfunc, rhs, delta);
996 /* Go through the arguments of the CALL and for every member pointer within
997 tries determine whether it is a constant. If it is, create a corresponding
998 constant jump function in FUNCTIONS which is an array of jump functions
999 associated with the call. */
1002 compute_cst_member_ptr_arguments (struct ipa_jump_func *functions,
1006 tree arg, method_field, delta_field;
1008 for (num = 0; num < gimple_call_num_args (call); num++)
1010 arg = gimple_call_arg (call, num);
1012 if (functions[num].type == IPA_JF_UNKNOWN
1013 && type_like_member_ptr_p (TREE_TYPE (arg), &method_field,
1015 determine_cst_member_ptr (call, arg, method_field, delta_field,
1020 /* Compute jump function for all arguments of callsite CS and insert the
1021 information in the jump_functions array in the ipa_edge_args corresponding
1022 to this callsite. */
1025 ipa_compute_jump_functions_for_edge (struct param_analysis_info *parms_info,
1026 struct cgraph_edge *cs)
1028 struct ipa_node_params *info = IPA_NODE_REF (cs->caller);
1029 struct ipa_edge_args *arguments = IPA_EDGE_REF (cs);
1032 if (ipa_get_cs_argument_count (arguments) == 0 || arguments->jump_functions)
1034 arguments->jump_functions = ggc_alloc_cleared_vec_ipa_jump_func
1035 (ipa_get_cs_argument_count (arguments));
1037 call = cs->call_stmt;
1038 gcc_assert (is_gimple_call (call));
1040 /* We will deal with constants and SSA scalars first: */
1041 compute_scalar_jump_functions (info, arguments->jump_functions, call);
1043 /* Let's check whether there are any potential member pointers and if so,
1044 whether we can determine their functions as pass_through. */
1045 if (!compute_pass_through_member_ptrs (info, parms_info,
1046 arguments->jump_functions, call))
1049 /* Finally, let's check whether we actually pass a new constant member
1051 compute_cst_member_ptr_arguments (arguments->jump_functions, call);
1054 /* Compute jump functions for all edges - both direct and indirect - outgoing
1055 from NODE. Also count the actual arguments in the process. */
1058 ipa_compute_jump_functions (struct cgraph_node *node,
1059 struct param_analysis_info *parms_info)
1061 struct cgraph_edge *cs;
1063 for (cs = node->callees; cs; cs = cs->next_callee)
1065 /* We do not need to bother analyzing calls to unknown
1066 functions unless they may become known during lto/whopr. */
1067 if (!cs->callee->analyzed && !flag_lto)
1069 ipa_count_arguments (cs);
1070 /* If the descriptor of the callee is not initialized yet, we have to do
1072 if (cs->callee->analyzed)
1073 ipa_initialize_node_params (cs->callee);
1074 if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
1075 != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
1076 ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));
1077 ipa_compute_jump_functions_for_edge (parms_info, cs);
1080 for (cs = node->indirect_calls; cs; cs = cs->next_callee)
1082 ipa_count_arguments (cs);
1083 ipa_compute_jump_functions_for_edge (parms_info, cs);
1087 /* If RHS looks like a rhs of a statement loading pfn from a member
1088 pointer formal parameter, return the parameter, otherwise return
1089 NULL. If USE_DELTA, then we look for a use of the delta field
1090 rather than the pfn. */
1093 ipa_get_member_ptr_load_param (tree rhs, bool use_delta)
1095 tree rec, ref_field, ref_offset, fld, fld_offset, ptr_field, delta_field;
1097 if (TREE_CODE (rhs) == COMPONENT_REF)
1099 ref_field = TREE_OPERAND (rhs, 1);
1100 rhs = TREE_OPERAND (rhs, 0);
1103 ref_field = NULL_TREE;
1104 if (TREE_CODE (rhs) != MEM_REF)
1106 rec = TREE_OPERAND (rhs, 0);
1107 if (TREE_CODE (rec) != ADDR_EXPR)
1109 rec = TREE_OPERAND (rec, 0);
1110 if (TREE_CODE (rec) != PARM_DECL
1111 || !type_like_member_ptr_p (TREE_TYPE (rec), &ptr_field, &delta_field))
1114 ref_offset = TREE_OPERAND (rhs, 1);
1118 if (integer_nonzerop (ref_offset))
1126 return ref_field == fld ? rec : NULL_TREE;
1130 fld_offset = byte_position (delta_field);
1132 fld_offset = byte_position (ptr_field);
1134 return tree_int_cst_equal (ref_offset, fld_offset) ? rec : NULL_TREE;
1137 /* If STMT looks like a statement loading a value from a member pointer formal
1138 parameter, this function returns that parameter. */
1141 ipa_get_stmt_member_ptr_load_param (gimple stmt, bool use_delta)
1145 if (!gimple_assign_single_p (stmt))
1148 rhs = gimple_assign_rhs1 (stmt);
1149 return ipa_get_member_ptr_load_param (rhs, use_delta);
1152 /* Returns true iff T is an SSA_NAME defined by a statement. */
1155 ipa_is_ssa_with_stmt_def (tree t)
1157 if (TREE_CODE (t) == SSA_NAME
1158 && !SSA_NAME_IS_DEFAULT_DEF (t))
1164 /* Find the indirect call graph edge corresponding to STMT and add to it all
1165 information necessary to describe a call to a parameter number PARAM_INDEX.
1166 NODE is the caller. POLYMORPHIC should be set to true iff the call is a
1170 ipa_note_param_call (struct cgraph_node *node, int param_index, gimple stmt,
1173 struct cgraph_edge *cs;
1175 cs = cgraph_edge (node, stmt);
1176 cs->indirect_info->param_index = param_index;
1177 cs->indirect_info->anc_offset = 0;
1178 cs->indirect_info->polymorphic = polymorphic;
1181 tree otr = gimple_call_fn (stmt);
1182 tree type, token = OBJ_TYPE_REF_TOKEN (otr);
1183 cs->indirect_info->otr_token = tree_low_cst (token, 1);
1184 type = TREE_TYPE (TREE_TYPE (OBJ_TYPE_REF_OBJECT (otr)));
1185 cs->indirect_info->otr_type = type;
1189 /* Analyze the CALL and examine uses of formal parameters of the caller NODE
1190 (described by INFO). PARMS_INFO is a pointer to a vector containing
1191 intermediate information about each formal parameter. Currently it checks
1192 whether the call calls a pointer that is a formal parameter and if so, the
1193 parameter is marked with the called flag and an indirect call graph edge
1194 describing the call is created. This is very simple for ordinary pointers
1195 represented in SSA but not-so-nice when it comes to member pointers. The
1196 ugly part of this function does nothing more than trying to match the
1197 pattern of such a call. An example of such a pattern is the gimple dump
1198 below, the call is on the last line:
1201 f$__delta_5 = f.__delta;
1202 f$__pfn_24 = f.__pfn;
1206 f$__delta_5 = MEM[(struct *)&f];
1207 f$__pfn_24 = MEM[(struct *)&f + 4B];
1209 and a few lines below:
1212 D.2496_3 = (int) f$__pfn_24;
1213 D.2497_4 = D.2496_3 & 1;
1220 D.2500_7 = (unsigned int) f$__delta_5;
1221 D.2501_8 = &S + D.2500_7;
1222 D.2502_9 = (int (*__vtbl_ptr_type) (void) * *) D.2501_8;
1223 D.2503_10 = *D.2502_9;
1224 D.2504_12 = f$__pfn_24 + -1;
1225 D.2505_13 = (unsigned int) D.2504_12;
1226 D.2506_14 = D.2503_10 + D.2505_13;
1227 D.2507_15 = *D.2506_14;
1228 iftmp.11_16 = (String:: *) D.2507_15;
1231 # iftmp.11_1 = PHI <iftmp.11_16(3), f$__pfn_24(2)>
1232 D.2500_19 = (unsigned int) f$__delta_5;
1233 D.2508_20 = &S + D.2500_19;
1234 D.2493_21 = iftmp.11_1 (D.2508_20, 4);
1236 Such patterns are results of simple calls to a member pointer:
1238 int doprinting (int (MyString::* f)(int) const)
1240 MyString S ("somestring");
1247 ipa_analyze_indirect_call_uses (struct cgraph_node *node,
1248 struct ipa_node_params *info,
1249 struct param_analysis_info *parms_info,
1250 gimple call, tree target)
1255 tree rec, rec2, cond;
1258 basic_block bb, virt_bb, join;
1260 if (SSA_NAME_IS_DEFAULT_DEF (target))
1262 tree var = SSA_NAME_VAR (target);
1263 index = ipa_get_param_decl_index (info, var);
1265 ipa_note_param_call (node, index, call, false);
1269 /* Now we need to try to match the complex pattern of calling a member
1272 if (!POINTER_TYPE_P (TREE_TYPE (target))
1273 || TREE_CODE (TREE_TYPE (TREE_TYPE (target))) != METHOD_TYPE)
1276 def = SSA_NAME_DEF_STMT (target);
1277 if (gimple_code (def) != GIMPLE_PHI)
1280 if (gimple_phi_num_args (def) != 2)
1283 /* First, we need to check whether one of these is a load from a member
1284 pointer that is a parameter to this function. */
1285 n1 = PHI_ARG_DEF (def, 0);
1286 n2 = PHI_ARG_DEF (def, 1);
1287 if (!ipa_is_ssa_with_stmt_def (n1) || !ipa_is_ssa_with_stmt_def (n2))
1289 d1 = SSA_NAME_DEF_STMT (n1);
1290 d2 = SSA_NAME_DEF_STMT (n2);
1292 join = gimple_bb (def);
1293 if ((rec = ipa_get_stmt_member_ptr_load_param (d1, false)))
1295 if (ipa_get_stmt_member_ptr_load_param (d2, false))
1298 bb = EDGE_PRED (join, 0)->src;
1299 virt_bb = gimple_bb (d2);
1301 else if ((rec = ipa_get_stmt_member_ptr_load_param (d2, false)))
1303 bb = EDGE_PRED (join, 1)->src;
1304 virt_bb = gimple_bb (d1);
1309 /* Second, we need to check that the basic blocks are laid out in the way
1310 corresponding to the pattern. */
1312 if (!single_pred_p (virt_bb) || !single_succ_p (virt_bb)
1313 || single_pred (virt_bb) != bb
1314 || single_succ (virt_bb) != join)
1317 /* Third, let's see that the branching is done depending on the least
1318 significant bit of the pfn. */
1320 branch = last_stmt (bb);
1321 if (!branch || gimple_code (branch) != GIMPLE_COND)
1324 if (gimple_cond_code (branch) != NE_EXPR
1325 || !integer_zerop (gimple_cond_rhs (branch)))
1328 cond = gimple_cond_lhs (branch);
1329 if (!ipa_is_ssa_with_stmt_def (cond))
1332 def = SSA_NAME_DEF_STMT (cond);
1333 if (!is_gimple_assign (def)
1334 || gimple_assign_rhs_code (def) != BIT_AND_EXPR
1335 || !integer_onep (gimple_assign_rhs2 (def)))
1338 cond = gimple_assign_rhs1 (def);
1339 if (!ipa_is_ssa_with_stmt_def (cond))
1342 def = SSA_NAME_DEF_STMT (cond);
1344 if (is_gimple_assign (def)
1345 && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def)))
1347 cond = gimple_assign_rhs1 (def);
1348 if (!ipa_is_ssa_with_stmt_def (cond))
1350 def = SSA_NAME_DEF_STMT (cond);
1353 rec2 = ipa_get_stmt_member_ptr_load_param (def,
1354 (TARGET_PTRMEMFUNC_VBIT_LOCATION
1355 == ptrmemfunc_vbit_in_delta));
1360 index = ipa_get_param_decl_index (info, rec);
1361 if (index >= 0 && !is_parm_modified_before_call (&parms_info[index],
1363 ipa_note_param_call (node, index, call, false);
1368 /* Analyze a CALL to an OBJ_TYPE_REF which is passed in TARGET and if the
1369 object referenced in the expression is a formal parameter of the caller
1370 (described by INFO), create a call note for the statement. */
1373 ipa_analyze_virtual_call_uses (struct cgraph_node *node,
1374 struct ipa_node_params *info, gimple call,
1377 struct ipa_jump_func jfunc;
1378 tree obj = OBJ_TYPE_REF_OBJECT (target);
1382 if (!flag_devirtualize)
1385 if (TREE_CODE (obj) == ADDR_EXPR)
1389 obj = TREE_OPERAND (obj, 0);
1391 while (TREE_CODE (obj) == COMPONENT_REF);
1392 if (TREE_CODE (obj) != MEM_REF)
1394 obj = TREE_OPERAND (obj, 0);
1397 if (TREE_CODE (obj) != SSA_NAME
1398 || !SSA_NAME_IS_DEFAULT_DEF (obj))
1401 var = SSA_NAME_VAR (obj);
1402 index = ipa_get_param_decl_index (info, var);
1405 && !detect_type_change_ssa (obj, call, &jfunc))
1406 ipa_note_param_call (node, index, call, true);
1409 /* Analyze a call statement CALL whether and how it utilizes formal parameters
1410 of the caller (described by INFO). PARMS_INFO is a pointer to a vector
1411 containing intermediate information about each formal parameter. */
1414 ipa_analyze_call_uses (struct cgraph_node *node,
1415 struct ipa_node_params *info,
1416 struct param_analysis_info *parms_info, gimple call)
1418 tree target = gimple_call_fn (call);
1420 if (TREE_CODE (target) == SSA_NAME)
1421 ipa_analyze_indirect_call_uses (node, info, parms_info, call, target);
1422 else if (TREE_CODE (target) == OBJ_TYPE_REF)
1423 ipa_analyze_virtual_call_uses (node, info, call, target);
1427 /* Analyze the call statement STMT with respect to formal parameters (described
1428 in INFO) of caller given by NODE. Currently it only checks whether formal
1429 parameters are called. PARMS_INFO is a pointer to a vector containing
1430 intermediate information about each formal parameter. */
1433 ipa_analyze_stmt_uses (struct cgraph_node *node, struct ipa_node_params *info,
1434 struct param_analysis_info *parms_info, gimple stmt)
1436 if (is_gimple_call (stmt))
1437 ipa_analyze_call_uses (node, info, parms_info, stmt);
1440 /* Callback of walk_stmt_load_store_addr_ops for the visit_load.
1441 If OP is a parameter declaration, mark it as used in the info structure
1445 visit_ref_for_mod_analysis (gimple stmt ATTRIBUTE_UNUSED,
1446 tree op, void *data)
1448 struct ipa_node_params *info = (struct ipa_node_params *) data;
1450 op = get_base_address (op);
1452 && TREE_CODE (op) == PARM_DECL)
1454 int index = ipa_get_param_decl_index (info, op);
1455 gcc_assert (index >= 0);
1456 info->params[index].used = true;
1462 /* Scan the function body of NODE and inspect the uses of formal parameters.
1463 Store the findings in various structures of the associated ipa_node_params
1464 structure, such as parameter flags, notes etc. PARMS_INFO is a pointer to a
1465 vector containing intermediate information about each formal parameter. */
1468 ipa_analyze_params_uses (struct cgraph_node *node,
1469 struct param_analysis_info *parms_info)
1471 tree decl = node->decl;
1473 struct function *func;
1474 gimple_stmt_iterator gsi;
1475 struct ipa_node_params *info = IPA_NODE_REF (node);
1478 if (ipa_get_param_count (info) == 0 || info->uses_analysis_done)
1481 for (i = 0; i < ipa_get_param_count (info); i++)
1483 tree parm = ipa_get_param (info, i);
1484 /* For SSA regs see if parameter is used. For non-SSA we compute
1485 the flag during modification analysis. */
1486 if (is_gimple_reg (parm)
1487 && gimple_default_def (DECL_STRUCT_FUNCTION (node->decl), parm))
1488 info->params[i].used = true;
1491 func = DECL_STRUCT_FUNCTION (decl);
1492 FOR_EACH_BB_FN (bb, func)
1494 for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
1496 gimple stmt = gsi_stmt (gsi);
1498 if (is_gimple_debug (stmt))
1501 ipa_analyze_stmt_uses (node, info, parms_info, stmt);
1502 walk_stmt_load_store_addr_ops (stmt, info,
1503 visit_ref_for_mod_analysis,
1504 visit_ref_for_mod_analysis,
1505 visit_ref_for_mod_analysis);
1507 for (gsi = gsi_start (phi_nodes (bb)); !gsi_end_p (gsi); gsi_next (&gsi))
1508 walk_stmt_load_store_addr_ops (gsi_stmt (gsi), info,
1509 visit_ref_for_mod_analysis,
1510 visit_ref_for_mod_analysis,
1511 visit_ref_for_mod_analysis);
1514 info->uses_analysis_done = 1;
1517 /* Initialize the array describing properties of of formal parameters of NODE,
1518 analyze their uses and and compute jump functions associated with actual
1519 arguments of calls from within NODE. */
1522 ipa_analyze_node (struct cgraph_node *node)
1524 struct ipa_node_params *info;
1525 struct param_analysis_info *parms_info;
1528 ipa_check_create_node_params ();
1529 ipa_check_create_edge_args ();
1530 info = IPA_NODE_REF (node);
1531 push_cfun (DECL_STRUCT_FUNCTION (node->decl));
1532 current_function_decl = node->decl;
1533 ipa_initialize_node_params (node);
1535 param_count = ipa_get_param_count (info);
1536 parms_info = XALLOCAVEC (struct param_analysis_info, param_count);
1537 memset (parms_info, 0, sizeof (struct param_analysis_info) * param_count);
1539 ipa_analyze_params_uses (node, parms_info);
1540 ipa_compute_jump_functions (node, parms_info);
1542 for (i = 0; i < param_count; i++)
1543 if (parms_info[i].visited_statements)
1544 BITMAP_FREE (parms_info[i].visited_statements);
1546 current_function_decl = NULL;
1551 /* Update the jump function DST when the call graph edge corresponding to SRC is
1552 is being inlined, knowing that DST is of type ancestor and src of known
1556 combine_known_type_and_ancestor_jfs (struct ipa_jump_func *src,
1557 struct ipa_jump_func *dst)
1561 new_binfo = get_binfo_at_offset (src->value.base_binfo,
1562 dst->value.ancestor.offset,
1563 dst->value.ancestor.type);
1566 dst->type = IPA_JF_KNOWN_TYPE;
1567 dst->value.base_binfo = new_binfo;
1570 dst->type = IPA_JF_UNKNOWN;
1573 /* Update the jump functions associated with call graph edge E when the call
1574 graph edge CS is being inlined, assuming that E->caller is already (possibly
1575 indirectly) inlined into CS->callee and that E has not been inlined. */
1578 update_jump_functions_after_inlining (struct cgraph_edge *cs,
1579 struct cgraph_edge *e)
1581 struct ipa_edge_args *top = IPA_EDGE_REF (cs);
1582 struct ipa_edge_args *args = IPA_EDGE_REF (e);
1583 int count = ipa_get_cs_argument_count (args);
1586 for (i = 0; i < count; i++)
1588 struct ipa_jump_func *dst = ipa_get_ith_jump_func (args, i);
1590 if (dst->type == IPA_JF_ANCESTOR)
1592 struct ipa_jump_func *src;
1594 /* Variable number of arguments can cause havoc if we try to access
1595 one that does not exist in the inlined edge. So make sure we
1597 if (dst->value.ancestor.formal_id >= ipa_get_cs_argument_count (top))
1599 dst->type = IPA_JF_UNKNOWN;
1603 src = ipa_get_ith_jump_func (top, dst->value.ancestor.formal_id);
1604 if (src->type == IPA_JF_KNOWN_TYPE)
1605 combine_known_type_and_ancestor_jfs (src, dst);
1606 else if (src->type == IPA_JF_PASS_THROUGH
1607 && src->value.pass_through.operation == NOP_EXPR)
1608 dst->value.ancestor.formal_id = src->value.pass_through.formal_id;
1609 else if (src->type == IPA_JF_ANCESTOR)
1611 dst->value.ancestor.formal_id = src->value.ancestor.formal_id;
1612 dst->value.ancestor.offset += src->value.ancestor.offset;
1615 dst->type = IPA_JF_UNKNOWN;
1617 else if (dst->type == IPA_JF_PASS_THROUGH)
1619 struct ipa_jump_func *src;
1620 /* We must check range due to calls with variable number of arguments
1621 and we cannot combine jump functions with operations. */
1622 if (dst->value.pass_through.operation == NOP_EXPR
1623 && (dst->value.pass_through.formal_id
1624 < ipa_get_cs_argument_count (top)))
1626 src = ipa_get_ith_jump_func (top,
1627 dst->value.pass_through.formal_id);
1631 dst->type = IPA_JF_UNKNOWN;
1636 /* If TARGET is an addr_expr of a function declaration, make it the destination
1637 of an indirect edge IE and return the edge. Otherwise, return NULL. Delta,
1638 if non-NULL, is an integer constant that must be added to this pointer
1639 (first parameter). */
1641 struct cgraph_edge *
1642 ipa_make_edge_direct_to_target (struct cgraph_edge *ie, tree target, tree delta)
1644 struct cgraph_node *callee;
1646 if (TREE_CODE (target) == ADDR_EXPR)
1647 target = TREE_OPERAND (target, 0);
1648 if (TREE_CODE (target) != FUNCTION_DECL)
1650 callee = cgraph_node (target);
1653 ipa_check_create_node_params ();
1655 /* We can not make edges to inline clones. It is bug that someone removed the cgraph
1657 gcc_assert (!callee->global.inlined_to);
1659 cgraph_make_edge_direct (ie, callee, delta ? tree_low_cst (delta, 0) : 0);
1662 fprintf (dump_file, "ipa-prop: Discovered %s call to a known target "
1663 "(%s/%i -> %s/%i), for stmt ",
1664 ie->indirect_info->polymorphic ? "a virtual" : "an indirect",
1665 cgraph_node_name (ie->caller), ie->caller->uid,
1666 cgraph_node_name (ie->callee), ie->callee->uid);
1668 print_gimple_stmt (dump_file, ie->call_stmt, 2, TDF_SLIM);
1670 fprintf (dump_file, "with uid %i\n", ie->lto_stmt_uid);
1674 fprintf (dump_file, " Thunk delta is ");
1675 print_generic_expr (dump_file, delta, 0);
1676 fprintf (dump_file, "\n");
1680 if (ipa_get_cs_argument_count (IPA_EDGE_REF (ie))
1681 != ipa_get_param_count (IPA_NODE_REF (callee)))
1682 ipa_set_called_with_variable_arg (IPA_NODE_REF (callee));
1687 /* Try to find a destination for indirect edge IE that corresponds to a simple
1688 call or a call of a member function pointer and where the destination is a
1689 pointer formal parameter described by jump function JFUNC. If it can be
1690 determined, return the newly direct edge, otherwise return NULL. */
1692 static struct cgraph_edge *
1693 try_make_edge_direct_simple_call (struct cgraph_edge *ie,
1694 struct ipa_jump_func *jfunc)
1698 if (jfunc->type == IPA_JF_CONST)
1699 target = jfunc->value.constant;
1700 else if (jfunc->type == IPA_JF_CONST_MEMBER_PTR)
1701 target = jfunc->value.member_cst.pfn;
1705 return ipa_make_edge_direct_to_target (ie, target, NULL_TREE);
1708 /* Try to find a destination for indirect edge IE that corresponds to a
1709 virtual call based on a formal parameter which is described by jump
1710 function JFUNC and if it can be determined, make it direct and return the
1711 direct edge. Otherwise, return NULL. */
1713 static struct cgraph_edge *
1714 try_make_edge_direct_virtual_call (struct cgraph_edge *ie,
1715 struct ipa_jump_func *jfunc)
1717 tree binfo, type, target, delta;
1718 HOST_WIDE_INT token;
1720 if (jfunc->type == IPA_JF_KNOWN_TYPE)
1721 binfo = jfunc->value.base_binfo;
1728 token = ie->indirect_info->otr_token;
1729 type = ie->indirect_info->otr_type;
1730 binfo = get_binfo_at_offset (binfo, ie->indirect_info->anc_offset, type);
1732 target = gimple_get_virt_method_for_binfo (token, binfo, &delta, true);
1737 return ipa_make_edge_direct_to_target (ie, target, delta);
1742 /* Update the param called notes associated with NODE when CS is being inlined,
1743 assuming NODE is (potentially indirectly) inlined into CS->callee.
1744 Moreover, if the callee is discovered to be constant, create a new cgraph
1745 edge for it. Newly discovered indirect edges will be added to *NEW_EDGES,
1746 unless NEW_EDGES is NULL. Return true iff a new edge(s) were created. */
1749 update_indirect_edges_after_inlining (struct cgraph_edge *cs,
1750 struct cgraph_node *node,
1751 VEC (cgraph_edge_p, heap) **new_edges)
1753 struct ipa_edge_args *top;
1754 struct cgraph_edge *ie, *next_ie, *new_direct_edge;
1757 ipa_check_create_edge_args ();
1758 top = IPA_EDGE_REF (cs);
1760 for (ie = node->indirect_calls; ie; ie = next_ie)
1762 struct cgraph_indirect_call_info *ici = ie->indirect_info;
1763 struct ipa_jump_func *jfunc;
1765 next_ie = ie->next_callee;
1766 if (bitmap_bit_p (iinlining_processed_edges, ie->uid))
1769 /* If we ever use indirect edges for anything other than indirect
1770 inlining, we will need to skip those with negative param_indices. */
1771 if (ici->param_index == -1)
1774 /* We must check range due to calls with variable number of arguments: */
1775 if (ici->param_index >= ipa_get_cs_argument_count (top))
1777 bitmap_set_bit (iinlining_processed_edges, ie->uid);
1781 jfunc = ipa_get_ith_jump_func (top, ici->param_index);
1782 if (jfunc->type == IPA_JF_PASS_THROUGH
1783 && jfunc->value.pass_through.operation == NOP_EXPR)
1784 ici->param_index = jfunc->value.pass_through.formal_id;
1785 else if (jfunc->type == IPA_JF_ANCESTOR)
1787 ici->param_index = jfunc->value.ancestor.formal_id;
1788 ici->anc_offset += jfunc->value.ancestor.offset;
1791 /* Either we can find a destination for this edge now or never. */
1792 bitmap_set_bit (iinlining_processed_edges, ie->uid);
1794 if (ici->polymorphic)
1795 new_direct_edge = try_make_edge_direct_virtual_call (ie, jfunc);
1797 new_direct_edge = try_make_edge_direct_simple_call (ie, jfunc);
1799 if (new_direct_edge)
1801 new_direct_edge->indirect_inlining_edge = 1;
1804 VEC_safe_push (cgraph_edge_p, heap, *new_edges,
1806 top = IPA_EDGE_REF (cs);
1815 /* Recursively traverse subtree of NODE (including node) made of inlined
1816 cgraph_edges when CS has been inlined and invoke
1817 update_indirect_edges_after_inlining on all nodes and
1818 update_jump_functions_after_inlining on all non-inlined edges that lead out
1819 of this subtree. Newly discovered indirect edges will be added to
1820 *NEW_EDGES, unless NEW_EDGES is NULL. Return true iff a new edge(s) were
1824 propagate_info_to_inlined_callees (struct cgraph_edge *cs,
1825 struct cgraph_node *node,
1826 VEC (cgraph_edge_p, heap) **new_edges)
1828 struct cgraph_edge *e;
1831 res = update_indirect_edges_after_inlining (cs, node, new_edges);
1833 for (e = node->callees; e; e = e->next_callee)
1834 if (!e->inline_failed)
1835 res |= propagate_info_to_inlined_callees (cs, e->callee, new_edges);
1837 update_jump_functions_after_inlining (cs, e);
1842 /* Update jump functions and call note functions on inlining the call site CS.
1843 CS is expected to lead to a node already cloned by
1844 cgraph_clone_inline_nodes. Newly discovered indirect edges will be added to
1845 *NEW_EDGES, unless NEW_EDGES is NULL. Return true iff a new edge(s) were +
1849 ipa_propagate_indirect_call_infos (struct cgraph_edge *cs,
1850 VEC (cgraph_edge_p, heap) **new_edges)
1852 /* FIXME lto: We do not stream out indirect call information. */
1856 /* Do nothing if the preparation phase has not been carried out yet
1857 (i.e. during early inlining). */
1858 if (!ipa_node_params_vector)
1860 gcc_assert (ipa_edge_args_vector);
1862 return propagate_info_to_inlined_callees (cs, cs->callee, new_edges);
1865 /* Frees all dynamically allocated structures that the argument info points
1869 ipa_free_edge_args_substructures (struct ipa_edge_args *args)
1871 if (args->jump_functions)
1872 ggc_free (args->jump_functions);
1874 memset (args, 0, sizeof (*args));
1877 /* Free all ipa_edge structures. */
1880 ipa_free_all_edge_args (void)
1883 struct ipa_edge_args *args;
1885 FOR_EACH_VEC_ELT (ipa_edge_args_t, ipa_edge_args_vector, i, args)
1886 ipa_free_edge_args_substructures (args);
1888 VEC_free (ipa_edge_args_t, gc, ipa_edge_args_vector);
1889 ipa_edge_args_vector = NULL;
1892 /* Frees all dynamically allocated structures that the param info points
1896 ipa_free_node_params_substructures (struct ipa_node_params *info)
1899 free (info->params);
1901 memset (info, 0, sizeof (*info));
1904 /* Free all ipa_node_params structures. */
1907 ipa_free_all_node_params (void)
1910 struct ipa_node_params *info;
1912 FOR_EACH_VEC_ELT (ipa_node_params_t, ipa_node_params_vector, i, info)
1913 ipa_free_node_params_substructures (info);
1915 VEC_free (ipa_node_params_t, heap, ipa_node_params_vector);
1916 ipa_node_params_vector = NULL;
1919 /* Hook that is called by cgraph.c when an edge is removed. */
1922 ipa_edge_removal_hook (struct cgraph_edge *cs, void *data ATTRIBUTE_UNUSED)
1924 /* During IPA-CP updating we can be called on not-yet analyze clones. */
1925 if (VEC_length (ipa_edge_args_t, ipa_edge_args_vector)
1926 <= (unsigned)cs->uid)
1928 ipa_free_edge_args_substructures (IPA_EDGE_REF (cs));
1931 /* Hook that is called by cgraph.c when a node is removed. */
1934 ipa_node_removal_hook (struct cgraph_node *node, void *data ATTRIBUTE_UNUSED)
1936 /* During IPA-CP updating we can be called on not-yet analyze clones. */
1937 if (VEC_length (ipa_node_params_t, ipa_node_params_vector)
1938 <= (unsigned)node->uid)
1940 ipa_free_node_params_substructures (IPA_NODE_REF (node));
1943 /* Helper function to duplicate an array of size N that is at SRC and store a
1944 pointer to it to DST. Nothing is done if SRC is NULL. */
1947 duplicate_array (void *src, size_t n)
1959 static struct ipa_jump_func *
1960 duplicate_ipa_jump_func_array (const struct ipa_jump_func * src, size_t n)
1962 struct ipa_jump_func *p;
1967 p = ggc_alloc_vec_ipa_jump_func (n);
1968 memcpy (p, src, n * sizeof (struct ipa_jump_func));
1972 /* Hook that is called by cgraph.c when a node is duplicated. */
1975 ipa_edge_duplication_hook (struct cgraph_edge *src, struct cgraph_edge *dst,
1976 __attribute__((unused)) void *data)
1978 struct ipa_edge_args *old_args, *new_args;
1981 ipa_check_create_edge_args ();
1983 old_args = IPA_EDGE_REF (src);
1984 new_args = IPA_EDGE_REF (dst);
1986 arg_count = ipa_get_cs_argument_count (old_args);
1987 ipa_set_cs_argument_count (new_args, arg_count);
1988 new_args->jump_functions =
1989 duplicate_ipa_jump_func_array (old_args->jump_functions, arg_count);
1991 if (iinlining_processed_edges
1992 && bitmap_bit_p (iinlining_processed_edges, src->uid))
1993 bitmap_set_bit (iinlining_processed_edges, dst->uid);
1996 /* Hook that is called by cgraph.c when a node is duplicated. */
1999 ipa_node_duplication_hook (struct cgraph_node *src, struct cgraph_node *dst,
2000 __attribute__((unused)) void *data)
2002 struct ipa_node_params *old_info, *new_info;
2005 ipa_check_create_node_params ();
2006 old_info = IPA_NODE_REF (src);
2007 new_info = IPA_NODE_REF (dst);
2008 param_count = ipa_get_param_count (old_info);
2010 ipa_set_param_count (new_info, param_count);
2011 new_info->params = (struct ipa_param_descriptor *)
2012 duplicate_array (old_info->params,
2013 sizeof (struct ipa_param_descriptor) * param_count);
2014 for (i = 0; i < param_count; i++)
2015 new_info->params[i].types = VEC_copy (tree, heap,
2016 old_info->params[i].types);
2017 new_info->ipcp_orig_node = old_info->ipcp_orig_node;
2018 new_info->count_scale = old_info->count_scale;
2020 new_info->called_with_var_arguments = old_info->called_with_var_arguments;
2021 new_info->uses_analysis_done = old_info->uses_analysis_done;
2022 new_info->node_enqueued = old_info->node_enqueued;
2025 /* Register our cgraph hooks if they are not already there. */
2028 ipa_register_cgraph_hooks (void)
2030 if (!edge_removal_hook_holder)
2031 edge_removal_hook_holder =
2032 cgraph_add_edge_removal_hook (&ipa_edge_removal_hook, NULL);
2033 if (!node_removal_hook_holder)
2034 node_removal_hook_holder =
2035 cgraph_add_node_removal_hook (&ipa_node_removal_hook, NULL);
2036 if (!edge_duplication_hook_holder)
2037 edge_duplication_hook_holder =
2038 cgraph_add_edge_duplication_hook (&ipa_edge_duplication_hook, NULL);
2039 if (!node_duplication_hook_holder)
2040 node_duplication_hook_holder =
2041 cgraph_add_node_duplication_hook (&ipa_node_duplication_hook, NULL);
2044 /* Unregister our cgraph hooks if they are not already there. */
2047 ipa_unregister_cgraph_hooks (void)
2049 cgraph_remove_edge_removal_hook (edge_removal_hook_holder);
2050 edge_removal_hook_holder = NULL;
2051 cgraph_remove_node_removal_hook (node_removal_hook_holder);
2052 node_removal_hook_holder = NULL;
2053 cgraph_remove_edge_duplication_hook (edge_duplication_hook_holder);
2054 edge_duplication_hook_holder = NULL;
2055 cgraph_remove_node_duplication_hook (node_duplication_hook_holder);
2056 node_duplication_hook_holder = NULL;
2059 /* Allocate all necessary data structures necessary for indirect inlining. */
2062 ipa_create_all_structures_for_iinln (void)
2064 iinlining_processed_edges = BITMAP_ALLOC (NULL);
2067 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
2068 longer needed after ipa-cp. */
2071 ipa_free_all_structures_after_ipa_cp (void)
2073 if (!flag_indirect_inlining)
2075 ipa_free_all_edge_args ();
2076 ipa_free_all_node_params ();
2077 ipa_unregister_cgraph_hooks ();
2081 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
2082 longer needed after indirect inlining. */
2085 ipa_free_all_structures_after_iinln (void)
2087 BITMAP_FREE (iinlining_processed_edges);
2089 ipa_free_all_edge_args ();
2090 ipa_free_all_node_params ();
2091 ipa_unregister_cgraph_hooks ();
2094 /* Print ipa_tree_map data structures of all functions in the
2098 ipa_print_node_params (FILE * f, struct cgraph_node *node)
2102 struct ipa_node_params *info;
2104 if (!node->analyzed)
2106 info = IPA_NODE_REF (node);
2107 fprintf (f, " function %s parameter descriptors:\n",
2108 cgraph_node_name (node));
2109 count = ipa_get_param_count (info);
2110 for (i = 0; i < count; i++)
2112 temp = ipa_get_param (info, i);
2113 if (TREE_CODE (temp) == PARM_DECL)
2114 fprintf (f, " param %d : %s", i,
2116 ? (*lang_hooks.decl_printable_name) (temp, 2)
2118 if (ipa_is_param_used (info, i))
2119 fprintf (f, " used");
2124 /* Print ipa_tree_map data structures of all functions in the
2128 ipa_print_all_params (FILE * f)
2130 struct cgraph_node *node;
2132 fprintf (f, "\nFunction parameters:\n");
2133 for (node = cgraph_nodes; node; node = node->next)
2134 ipa_print_node_params (f, node);
2137 /* Return a heap allocated vector containing formal parameters of FNDECL. */
2140 ipa_get_vector_of_formal_parms (tree fndecl)
2142 VEC(tree, heap) *args;
2146 count = count_formal_params_1 (fndecl);
2147 args = VEC_alloc (tree, heap, count);
2148 for (parm = DECL_ARGUMENTS (fndecl); parm; parm = DECL_CHAIN (parm))
2149 VEC_quick_push (tree, args, parm);
2154 /* Return a heap allocated vector containing types of formal parameters of
2155 function type FNTYPE. */
2157 static inline VEC(tree, heap) *
2158 get_vector_of_formal_parm_types (tree fntype)
2160 VEC(tree, heap) *types;
2164 for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
2167 types = VEC_alloc (tree, heap, count);
2168 for (t = TYPE_ARG_TYPES (fntype); t; t = TREE_CHAIN (t))
2169 VEC_quick_push (tree, types, TREE_VALUE (t));
2174 /* Modify the function declaration FNDECL and its type according to the plan in
2175 ADJUSTMENTS. It also sets base fields of individual adjustments structures
2176 to reflect the actual parameters being modified which are determined by the
2177 base_index field. */
2180 ipa_modify_formal_parameters (tree fndecl, ipa_parm_adjustment_vec adjustments,
2181 const char *synth_parm_prefix)
2183 VEC(tree, heap) *oparms, *otypes;
2184 tree orig_type, new_type = NULL;
2185 tree old_arg_types, t, new_arg_types = NULL;
2186 tree parm, *link = &DECL_ARGUMENTS (fndecl);
2187 int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
2188 tree new_reversed = NULL;
2189 bool care_for_types, last_parm_void;
2191 if (!synth_parm_prefix)
2192 synth_parm_prefix = "SYNTH";
2194 oparms = ipa_get_vector_of_formal_parms (fndecl);
2195 orig_type = TREE_TYPE (fndecl);
2196 old_arg_types = TYPE_ARG_TYPES (orig_type);
2198 /* The following test is an ugly hack, some functions simply don't have any
2199 arguments in their type. This is probably a bug but well... */
2200 care_for_types = (old_arg_types != NULL_TREE);
2203 last_parm_void = (TREE_VALUE (tree_last (old_arg_types))
2205 otypes = get_vector_of_formal_parm_types (orig_type);
2207 gcc_assert (VEC_length (tree, oparms) + 1 == VEC_length (tree, otypes));
2209 gcc_assert (VEC_length (tree, oparms) == VEC_length (tree, otypes));
2213 last_parm_void = false;
2217 for (i = 0; i < len; i++)
2219 struct ipa_parm_adjustment *adj;
2222 adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2223 parm = VEC_index (tree, oparms, adj->base_index);
2226 if (adj->copy_param)
2229 new_arg_types = tree_cons (NULL_TREE, VEC_index (tree, otypes,
2233 link = &DECL_CHAIN (parm);
2235 else if (!adj->remove_param)
2241 ptype = build_pointer_type (adj->type);
2246 new_arg_types = tree_cons (NULL_TREE, ptype, new_arg_types);
2248 new_parm = build_decl (UNKNOWN_LOCATION, PARM_DECL, NULL_TREE,
2250 DECL_NAME (new_parm) = create_tmp_var_name (synth_parm_prefix);
2252 DECL_ARTIFICIAL (new_parm) = 1;
2253 DECL_ARG_TYPE (new_parm) = ptype;
2254 DECL_CONTEXT (new_parm) = fndecl;
2255 TREE_USED (new_parm) = 1;
2256 DECL_IGNORED_P (new_parm) = 1;
2257 layout_decl (new_parm, 0);
2259 add_referenced_var (new_parm);
2260 mark_sym_for_renaming (new_parm);
2262 adj->reduction = new_parm;
2266 link = &DECL_CHAIN (new_parm);
2274 new_reversed = nreverse (new_arg_types);
2278 TREE_CHAIN (new_arg_types) = void_list_node;
2280 new_reversed = void_list_node;
2284 /* Use copy_node to preserve as much as possible from original type
2285 (debug info, attribute lists etc.)
2286 Exception is METHOD_TYPEs must have THIS argument.
2287 When we are asked to remove it, we need to build new FUNCTION_TYPE
2289 if (TREE_CODE (orig_type) != METHOD_TYPE
2290 || (VEC_index (ipa_parm_adjustment_t, adjustments, 0)->copy_param
2291 && VEC_index (ipa_parm_adjustment_t, adjustments, 0)->base_index == 0))
2293 new_type = build_distinct_type_copy (orig_type);
2294 TYPE_ARG_TYPES (new_type) = new_reversed;
2299 = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
2301 TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
2302 DECL_VINDEX (fndecl) = NULL_TREE;
2305 /* When signature changes, we need to clear builtin info. */
2306 if (DECL_BUILT_IN (fndecl))
2308 DECL_BUILT_IN_CLASS (fndecl) = NOT_BUILT_IN;
2309 DECL_FUNCTION_CODE (fndecl) = (enum built_in_function) 0;
2312 /* This is a new type, not a copy of an old type. Need to reassociate
2313 variants. We can handle everything except the main variant lazily. */
2314 t = TYPE_MAIN_VARIANT (orig_type);
2317 TYPE_MAIN_VARIANT (new_type) = t;
2318 TYPE_NEXT_VARIANT (new_type) = TYPE_NEXT_VARIANT (t);
2319 TYPE_NEXT_VARIANT (t) = new_type;
2323 TYPE_MAIN_VARIANT (new_type) = new_type;
2324 TYPE_NEXT_VARIANT (new_type) = NULL;
2327 TREE_TYPE (fndecl) = new_type;
2328 DECL_VIRTUAL_P (fndecl) = 0;
2330 VEC_free (tree, heap, otypes);
2331 VEC_free (tree, heap, oparms);
2334 /* Modify actual arguments of a function call CS as indicated in ADJUSTMENTS.
2335 If this is a directly recursive call, CS must be NULL. Otherwise it must
2336 contain the corresponding call graph edge. */
2339 ipa_modify_call_arguments (struct cgraph_edge *cs, gimple stmt,
2340 ipa_parm_adjustment_vec adjustments)
2342 VEC(tree, heap) *vargs;
2344 gimple_stmt_iterator gsi;
2348 len = VEC_length (ipa_parm_adjustment_t, adjustments);
2349 vargs = VEC_alloc (tree, heap, len);
2351 gsi = gsi_for_stmt (stmt);
2352 for (i = 0; i < len; i++)
2354 struct ipa_parm_adjustment *adj;
2356 adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2358 if (adj->copy_param)
2360 tree arg = gimple_call_arg (stmt, adj->base_index);
2362 VEC_quick_push (tree, vargs, arg);
2364 else if (!adj->remove_param)
2366 tree expr, base, off;
2369 /* We create a new parameter out of the value of the old one, we can
2370 do the following kind of transformations:
2372 - A scalar passed by reference is converted to a scalar passed by
2373 value. (adj->by_ref is false and the type of the original
2374 actual argument is a pointer to a scalar).
2376 - A part of an aggregate is passed instead of the whole aggregate.
2377 The part can be passed either by value or by reference, this is
2378 determined by value of adj->by_ref. Moreover, the code below
2379 handles both situations when the original aggregate is passed by
2380 value (its type is not a pointer) and when it is passed by
2381 reference (it is a pointer to an aggregate).
2383 When the new argument is passed by reference (adj->by_ref is true)
2384 it must be a part of an aggregate and therefore we form it by
2385 simply taking the address of a reference inside the original
2388 gcc_checking_assert (adj->offset % BITS_PER_UNIT == 0);
2389 base = gimple_call_arg (stmt, adj->base_index);
2390 loc = EXPR_LOCATION (base);
2392 if (TREE_CODE (base) != ADDR_EXPR
2393 && POINTER_TYPE_P (TREE_TYPE (base)))
2394 off = build_int_cst (adj->alias_ptr_type,
2395 adj->offset / BITS_PER_UNIT);
2398 HOST_WIDE_INT base_offset;
2401 if (TREE_CODE (base) == ADDR_EXPR)
2402 base = TREE_OPERAND (base, 0);
2404 base = get_addr_base_and_unit_offset (base, &base_offset);
2405 /* Aggregate arguments can have non-invariant addresses. */
2408 base = build_fold_addr_expr (prev_base);
2409 off = build_int_cst (adj->alias_ptr_type,
2410 adj->offset / BITS_PER_UNIT);
2412 else if (TREE_CODE (base) == MEM_REF)
2414 off = build_int_cst (adj->alias_ptr_type,
2416 + adj->offset / BITS_PER_UNIT);
2417 off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
2419 base = TREE_OPERAND (base, 0);
2423 off = build_int_cst (adj->alias_ptr_type,
2425 + adj->offset / BITS_PER_UNIT);
2426 base = build_fold_addr_expr (base);
2430 expr = fold_build2_loc (loc, MEM_REF, adj->type, base, off);
2432 expr = build_fold_addr_expr (expr);
2434 expr = force_gimple_operand_gsi (&gsi, expr,
2436 || is_gimple_reg_type (adj->type),
2437 NULL, true, GSI_SAME_STMT);
2438 VEC_quick_push (tree, vargs, expr);
2442 if (dump_file && (dump_flags & TDF_DETAILS))
2444 fprintf (dump_file, "replacing stmt:");
2445 print_gimple_stmt (dump_file, gsi_stmt (gsi), 0, 0);
2448 callee_decl = !cs ? gimple_call_fndecl (stmt) : cs->callee->decl;
2449 new_stmt = gimple_build_call_vec (callee_decl, vargs);
2450 VEC_free (tree, heap, vargs);
2451 if (gimple_call_lhs (stmt))
2452 gimple_call_set_lhs (new_stmt, gimple_call_lhs (stmt));
2454 gimple_set_block (new_stmt, gimple_block (stmt));
2455 if (gimple_has_location (stmt))
2456 gimple_set_location (new_stmt, gimple_location (stmt));
2457 gimple_call_copy_flags (new_stmt, stmt);
2458 gimple_call_set_chain (new_stmt, gimple_call_chain (stmt));
2460 if (dump_file && (dump_flags & TDF_DETAILS))
2462 fprintf (dump_file, "with stmt:");
2463 print_gimple_stmt (dump_file, new_stmt, 0, 0);
2464 fprintf (dump_file, "\n");
2466 gsi_replace (&gsi, new_stmt, true);
2468 cgraph_set_call_stmt (cs, new_stmt);
2469 update_ssa (TODO_update_ssa);
2470 free_dominance_info (CDI_DOMINATORS);
2473 /* Return true iff BASE_INDEX is in ADJUSTMENTS more than once. */
2476 index_in_adjustments_multiple_times_p (int base_index,
2477 ipa_parm_adjustment_vec adjustments)
2479 int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
2482 for (i = 0; i < len; i++)
2484 struct ipa_parm_adjustment *adj;
2485 adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2487 if (adj->base_index == base_index)
2499 /* Return adjustments that should have the same effect on function parameters
2500 and call arguments as if they were first changed according to adjustments in
2501 INNER and then by adjustments in OUTER. */
2503 ipa_parm_adjustment_vec
2504 ipa_combine_adjustments (ipa_parm_adjustment_vec inner,
2505 ipa_parm_adjustment_vec outer)
2507 int i, outlen = VEC_length (ipa_parm_adjustment_t, outer);
2508 int inlen = VEC_length (ipa_parm_adjustment_t, inner);
2510 ipa_parm_adjustment_vec adjustments, tmp;
2512 tmp = VEC_alloc (ipa_parm_adjustment_t, heap, inlen);
2513 for (i = 0; i < inlen; i++)
2515 struct ipa_parm_adjustment *n;
2516 n = VEC_index (ipa_parm_adjustment_t, inner, i);
2518 if (n->remove_param)
2521 VEC_quick_push (ipa_parm_adjustment_t, tmp, n);
2524 adjustments = VEC_alloc (ipa_parm_adjustment_t, heap, outlen + removals);
2525 for (i = 0; i < outlen; i++)
2527 struct ipa_parm_adjustment *r;
2528 struct ipa_parm_adjustment *out = VEC_index (ipa_parm_adjustment_t,
2530 struct ipa_parm_adjustment *in = VEC_index (ipa_parm_adjustment_t, tmp,
2533 gcc_assert (!in->remove_param);
2534 if (out->remove_param)
2536 if (!index_in_adjustments_multiple_times_p (in->base_index, tmp))
2538 r = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
2539 memset (r, 0, sizeof (*r));
2540 r->remove_param = true;
2545 r = VEC_quick_push (ipa_parm_adjustment_t, adjustments, NULL);
2546 memset (r, 0, sizeof (*r));
2547 r->base_index = in->base_index;
2548 r->type = out->type;
2550 /* FIXME: Create nonlocal value too. */
2552 if (in->copy_param && out->copy_param)
2553 r->copy_param = true;
2554 else if (in->copy_param)
2555 r->offset = out->offset;
2556 else if (out->copy_param)
2557 r->offset = in->offset;
2559 r->offset = in->offset + out->offset;
2562 for (i = 0; i < inlen; i++)
2564 struct ipa_parm_adjustment *n = VEC_index (ipa_parm_adjustment_t,
2567 if (n->remove_param)
2568 VEC_quick_push (ipa_parm_adjustment_t, adjustments, n);
2571 VEC_free (ipa_parm_adjustment_t, heap, tmp);
2575 /* Dump the adjustments in the vector ADJUSTMENTS to dump_file in a human
2576 friendly way, assuming they are meant to be applied to FNDECL. */
2579 ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
2582 int i, len = VEC_length (ipa_parm_adjustment_t, adjustments);
2584 VEC(tree, heap) *parms = ipa_get_vector_of_formal_parms (fndecl);
2586 fprintf (file, "IPA param adjustments: ");
2587 for (i = 0; i < len; i++)
2589 struct ipa_parm_adjustment *adj;
2590 adj = VEC_index (ipa_parm_adjustment_t, adjustments, i);
2593 fprintf (file, " ");
2597 fprintf (file, "%i. base_index: %i - ", i, adj->base_index);
2598 print_generic_expr (file, VEC_index (tree, parms, adj->base_index), 0);
2601 fprintf (file, ", base: ");
2602 print_generic_expr (file, adj->base, 0);
2606 fprintf (file, ", reduction: ");
2607 print_generic_expr (file, adj->reduction, 0);
2609 if (adj->new_ssa_base)
2611 fprintf (file, ", new_ssa_base: ");
2612 print_generic_expr (file, adj->new_ssa_base, 0);
2615 if (adj->copy_param)
2616 fprintf (file, ", copy_param");
2617 else if (adj->remove_param)
2618 fprintf (file, ", remove_param");
2620 fprintf (file, ", offset %li", (long) adj->offset);
2622 fprintf (file, ", by_ref");
2623 print_node_brief (file, ", type: ", adj->type, 0);
2624 fprintf (file, "\n");
2626 VEC_free (tree, heap, parms);
2629 /* Stream out jump function JUMP_FUNC to OB. */
2632 ipa_write_jump_function (struct output_block *ob,
2633 struct ipa_jump_func *jump_func)
2635 lto_output_uleb128_stream (ob->main_stream,
2638 switch (jump_func->type)
2640 case IPA_JF_UNKNOWN:
2642 case IPA_JF_KNOWN_TYPE:
2643 lto_output_tree (ob, jump_func->value.base_binfo, true);
2646 lto_output_tree (ob, jump_func->value.constant, true);
2648 case IPA_JF_PASS_THROUGH:
2649 lto_output_tree (ob, jump_func->value.pass_through.operand, true);
2650 lto_output_uleb128_stream (ob->main_stream,
2651 jump_func->value.pass_through.formal_id);
2652 lto_output_uleb128_stream (ob->main_stream,
2653 jump_func->value.pass_through.operation);
2655 case IPA_JF_ANCESTOR:
2656 lto_output_uleb128_stream (ob->main_stream,
2657 jump_func->value.ancestor.offset);
2658 lto_output_tree (ob, jump_func->value.ancestor.type, true);
2659 lto_output_uleb128_stream (ob->main_stream,
2660 jump_func->value.ancestor.formal_id);
2662 case IPA_JF_CONST_MEMBER_PTR:
2663 lto_output_tree (ob, jump_func->value.member_cst.pfn, true);
2664 lto_output_tree (ob, jump_func->value.member_cst.delta, false);
2669 /* Read in jump function JUMP_FUNC from IB. */
2672 ipa_read_jump_function (struct lto_input_block *ib,
2673 struct ipa_jump_func *jump_func,
2674 struct data_in *data_in)
2676 jump_func->type = (enum jump_func_type) lto_input_uleb128 (ib);
2678 switch (jump_func->type)
2680 case IPA_JF_UNKNOWN:
2682 case IPA_JF_KNOWN_TYPE:
2683 jump_func->value.base_binfo = lto_input_tree (ib, data_in);
2686 jump_func->value.constant = lto_input_tree (ib, data_in);
2688 case IPA_JF_PASS_THROUGH:
2689 jump_func->value.pass_through.operand = lto_input_tree (ib, data_in);
2690 jump_func->value.pass_through.formal_id = lto_input_uleb128 (ib);
2691 jump_func->value.pass_through.operation = (enum tree_code) lto_input_uleb128 (ib);
2693 case IPA_JF_ANCESTOR:
2694 jump_func->value.ancestor.offset = lto_input_uleb128 (ib);
2695 jump_func->value.ancestor.type = lto_input_tree (ib, data_in);
2696 jump_func->value.ancestor.formal_id = lto_input_uleb128 (ib);
2698 case IPA_JF_CONST_MEMBER_PTR:
2699 jump_func->value.member_cst.pfn = lto_input_tree (ib, data_in);
2700 jump_func->value.member_cst.delta = lto_input_tree (ib, data_in);
2705 /* Stream out parts of cgraph_indirect_call_info corresponding to CS that are
2706 relevant to indirect inlining to OB. */
2709 ipa_write_indirect_edge_info (struct output_block *ob,
2710 struct cgraph_edge *cs)
2712 struct cgraph_indirect_call_info *ii = cs->indirect_info;
2713 struct bitpack_d bp;
2715 lto_output_sleb128_stream (ob->main_stream, ii->param_index);
2716 lto_output_sleb128_stream (ob->main_stream, ii->anc_offset);
2717 bp = bitpack_create (ob->main_stream);
2718 bp_pack_value (&bp, ii->polymorphic, 1);
2719 lto_output_bitpack (&bp);
2721 if (ii->polymorphic)
2723 lto_output_sleb128_stream (ob->main_stream, ii->otr_token);
2724 lto_output_tree (ob, ii->otr_type, true);
2728 /* Read in parts of cgraph_indirect_call_info corresponding to CS that are
2729 relevant to indirect inlining from IB. */
2732 ipa_read_indirect_edge_info (struct lto_input_block *ib,
2733 struct data_in *data_in ATTRIBUTE_UNUSED,
2734 struct cgraph_edge *cs)
2736 struct cgraph_indirect_call_info *ii = cs->indirect_info;
2737 struct bitpack_d bp;
2739 ii->param_index = (int) lto_input_sleb128 (ib);
2740 ii->anc_offset = (HOST_WIDE_INT) lto_input_sleb128 (ib);
2741 bp = lto_input_bitpack (ib);
2742 ii->polymorphic = bp_unpack_value (&bp, 1);
2743 if (ii->polymorphic)
2745 ii->otr_token = (HOST_WIDE_INT) lto_input_sleb128 (ib);
2746 ii->otr_type = lto_input_tree (ib, data_in);
2750 /* Stream out NODE info to OB. */
2753 ipa_write_node_info (struct output_block *ob, struct cgraph_node *node)
2756 lto_cgraph_encoder_t encoder;
2757 struct ipa_node_params *info = IPA_NODE_REF (node);
2759 struct cgraph_edge *e;
2760 struct bitpack_d bp;
2762 encoder = ob->decl_state->cgraph_node_encoder;
2763 node_ref = lto_cgraph_encoder_encode (encoder, node);
2764 lto_output_uleb128_stream (ob->main_stream, node_ref);
2766 bp = bitpack_create (ob->main_stream);
2767 bp_pack_value (&bp, info->called_with_var_arguments, 1);
2768 gcc_assert (info->uses_analysis_done
2769 || ipa_get_param_count (info) == 0);
2770 gcc_assert (!info->node_enqueued);
2771 gcc_assert (!info->ipcp_orig_node);
2772 for (j = 0; j < ipa_get_param_count (info); j++)
2773 bp_pack_value (&bp, info->params[j].used, 1);
2774 lto_output_bitpack (&bp);
2775 for (e = node->callees; e; e = e->next_callee)
2777 struct ipa_edge_args *args = IPA_EDGE_REF (e);
2779 lto_output_uleb128_stream (ob->main_stream,
2780 ipa_get_cs_argument_count (args));
2781 for (j = 0; j < ipa_get_cs_argument_count (args); j++)
2782 ipa_write_jump_function (ob, ipa_get_ith_jump_func (args, j));
2784 for (e = node->indirect_calls; e; e = e->next_callee)
2785 ipa_write_indirect_edge_info (ob, e);
2788 /* Stream in NODE info from IB. */
2791 ipa_read_node_info (struct lto_input_block *ib, struct cgraph_node *node,
2792 struct data_in *data_in)
2794 struct ipa_node_params *info = IPA_NODE_REF (node);
2796 struct cgraph_edge *e;
2797 struct bitpack_d bp;
2799 ipa_initialize_node_params (node);
2801 bp = lto_input_bitpack (ib);
2802 info->called_with_var_arguments = bp_unpack_value (&bp, 1);
2803 if (ipa_get_param_count (info) != 0)
2804 info->uses_analysis_done = true;
2805 info->node_enqueued = false;
2806 for (k = 0; k < ipa_get_param_count (info); k++)
2807 info->params[k].used = bp_unpack_value (&bp, 1);
2808 for (e = node->callees; e; e = e->next_callee)
2810 struct ipa_edge_args *args = IPA_EDGE_REF (e);
2811 int count = lto_input_uleb128 (ib);
2813 ipa_set_cs_argument_count (args, count);
2817 args->jump_functions = ggc_alloc_cleared_vec_ipa_jump_func
2818 (ipa_get_cs_argument_count (args));
2819 for (k = 0; k < ipa_get_cs_argument_count (args); k++)
2820 ipa_read_jump_function (ib, ipa_get_ith_jump_func (args, k), data_in);
2822 for (e = node->indirect_calls; e; e = e->next_callee)
2823 ipa_read_indirect_edge_info (ib, data_in, e);
2826 /* Write jump functions for nodes in SET. */
2829 ipa_prop_write_jump_functions (cgraph_node_set set)
2831 struct cgraph_node *node;
2832 struct output_block *ob;
2833 unsigned int count = 0;
2834 cgraph_node_set_iterator csi;
2836 if (!ipa_node_params_vector)
2839 ob = create_output_block (LTO_section_jump_functions);
2840 ob->cgraph_node = NULL;
2841 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
2843 node = csi_node (csi);
2844 if (node->analyzed && IPA_NODE_REF (node) != NULL)
2848 lto_output_uleb128_stream (ob->main_stream, count);
2850 /* Process all of the functions. */
2851 for (csi = csi_start (set); !csi_end_p (csi); csi_next (&csi))
2853 node = csi_node (csi);
2854 if (node->analyzed && IPA_NODE_REF (node) != NULL)
2855 ipa_write_node_info (ob, node);
2857 lto_output_1_stream (ob->main_stream, 0);
2858 produce_asm (ob, NULL);
2859 destroy_output_block (ob);
2862 /* Read section in file FILE_DATA of length LEN with data DATA. */
2865 ipa_prop_read_section (struct lto_file_decl_data *file_data, const char *data,
2868 const struct lto_function_header *header =
2869 (const struct lto_function_header *) data;
2870 const int cfg_offset = sizeof (struct lto_function_header);
2871 const int main_offset = cfg_offset + header->cfg_size;
2872 const int string_offset = main_offset + header->main_size;
2873 struct data_in *data_in;
2874 struct lto_input_block ib_main;
2878 LTO_INIT_INPUT_BLOCK (ib_main, (const char *) data + main_offset, 0,
2882 lto_data_in_create (file_data, (const char *) data + string_offset,
2883 header->string_size, NULL);
2884 count = lto_input_uleb128 (&ib_main);
2886 for (i = 0; i < count; i++)
2889 struct cgraph_node *node;
2890 lto_cgraph_encoder_t encoder;
2892 index = lto_input_uleb128 (&ib_main);
2893 encoder = file_data->cgraph_node_encoder;
2894 node = lto_cgraph_encoder_deref (encoder, index);
2895 gcc_assert (node->analyzed);
2896 ipa_read_node_info (&ib_main, node, data_in);
2898 lto_free_section_data (file_data, LTO_section_jump_functions, NULL, data,
2900 lto_data_in_delete (data_in);
2903 /* Read ipcp jump functions. */
2906 ipa_prop_read_jump_functions (void)
2908 struct lto_file_decl_data **file_data_vec = lto_get_file_decl_data ();
2909 struct lto_file_decl_data *file_data;
2912 ipa_check_create_node_params ();
2913 ipa_check_create_edge_args ();
2914 ipa_register_cgraph_hooks ();
2916 while ((file_data = file_data_vec[j++]))
2919 const char *data = lto_get_section_data (file_data, LTO_section_jump_functions, NULL, &len);
2922 ipa_prop_read_section (file_data, data, len);
2926 /* After merging units, we can get mismatch in argument counts.
2927 Also decl merging might've rendered parameter lists obsolete.
2928 Also compute called_with_variable_arg info. */
2931 ipa_update_after_lto_read (void)
2933 struct cgraph_node *node;
2934 struct cgraph_edge *cs;
2936 ipa_check_create_node_params ();
2937 ipa_check_create_edge_args ();
2939 for (node = cgraph_nodes; node; node = node->next)
2941 ipa_initialize_node_params (node);
2943 for (node = cgraph_nodes; node; node = node->next)
2945 for (cs = node->callees; cs; cs = cs->next_callee)
2947 if (ipa_get_cs_argument_count (IPA_EDGE_REF (cs))
2948 != ipa_get_param_count (IPA_NODE_REF (cs->callee)))
2949 ipa_set_called_with_variable_arg (IPA_NODE_REF (cs->callee));