1 /* Interprocedural analyses.
2 Copyright (C) 2005-2017 Free Software Foundation, Inc.
4 This file is part of GCC.
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
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
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/>. */
22 #include "coretypes.h"
27 #include "alloc-pool.h"
28 #include "tree-pass.h"
30 #include "tree-streamer.h"
32 #include "diagnostic.h"
33 #include "fold-const.h"
34 #include "gimple-fold.h"
37 #include "stor-layout.h"
38 #include "print-tree.h"
40 #include "gimple-iterator.h"
41 #include "gimplify-me.h"
42 #include "gimple-walk.h"
43 #include "symbol-summary.h"
47 #include "tree-inline.h"
48 #include "ipa-inline.h"
49 #include "gimple-pretty-print.h"
51 #include "ipa-utils.h"
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
;
63 /* Traits for a hash table for reusing already existing ipa_bits. */
65 struct ipa_bit_ggc_hash_traits
: public ggc_cache_remove
<ipa_bits
*>
67 typedef ipa_bits
*value_type
;
68 typedef ipa_bits
*compare_type
;
70 hash (const ipa_bits
*p
)
72 hashval_t t
= (hashval_t
) p
->value
.to_shwi ();
73 return iterative_hash_host_wide_int (p
->mask
.to_shwi (), t
);
76 equal (const ipa_bits
*a
, const ipa_bits
*b
)
78 return a
->value
== b
->value
&& a
->mask
== b
->mask
;
81 mark_empty (ipa_bits
*&p
)
86 is_empty (const ipa_bits
*p
)
91 is_deleted (const ipa_bits
*p
)
93 return p
== reinterpret_cast<const ipa_bits
*> (1);
96 mark_deleted (ipa_bits
*&p
)
98 p
= reinterpret_cast<ipa_bits
*> (1);
102 /* Hash table for avoid repeated allocations of equal ipa_bits. */
103 static GTY ((cache
)) hash_table
<ipa_bit_ggc_hash_traits
> *ipa_bits_hash_table
;
105 /* Traits for a hash table for reusing value_ranges used for IPA. Note that
106 the equiv bitmap is not hashed and is expected to be NULL. */
108 struct ipa_vr_ggc_hash_traits
: public ggc_cache_remove
<value_range
*>
110 typedef value_range
*value_type
;
111 typedef value_range
*compare_type
;
113 hash (const value_range
*p
)
115 gcc_checking_assert (!p
->equiv
);
116 hashval_t t
= (hashval_t
) p
->type
;
117 t
= iterative_hash_expr (p
->min
, t
);
118 return iterative_hash_expr (p
->max
, t
);
121 equal (const value_range
*a
, const value_range
*b
)
123 return a
->type
== b
->type
&& a
->min
== b
->min
&& a
->max
== b
->max
;
126 mark_empty (value_range
*&p
)
131 is_empty (const value_range
*p
)
136 is_deleted (const value_range
*p
)
138 return p
== reinterpret_cast<const value_range
*> (1);
141 mark_deleted (value_range
*&p
)
143 p
= reinterpret_cast<value_range
*> (1);
147 /* Hash table for avoid repeated allocations of equal value_ranges. */
148 static GTY ((cache
)) hash_table
<ipa_vr_ggc_hash_traits
> *ipa_vr_hash_table
;
150 /* Holders of ipa cgraph hooks: */
151 static struct cgraph_edge_hook_list
*edge_removal_hook_holder
;
152 static struct cgraph_2edge_hook_list
*edge_duplication_hook_holder
;
153 static struct cgraph_node_hook_list
*function_insertion_hook_holder
;
155 /* Description of a reference to an IPA constant. */
156 struct ipa_cst_ref_desc
158 /* Edge that corresponds to the statement which took the reference. */
159 struct cgraph_edge
*cs
;
160 /* Linked list of duplicates created when call graph edges are cloned. */
161 struct ipa_cst_ref_desc
*next_duplicate
;
162 /* Number of references in IPA structures, IPA_UNDESCRIBED_USE if the value
163 if out of control. */
167 /* Allocation pool for reference descriptions. */
169 static object_allocator
<ipa_cst_ref_desc
> ipa_refdesc_pool
170 ("IPA-PROP ref descriptions");
172 /* Return true if DECL_FUNCTION_SPECIFIC_OPTIMIZATION of the decl associated
173 with NODE should prevent us from analyzing it for the purposes of IPA-CP. */
176 ipa_func_spec_opts_forbid_analysis_p (struct cgraph_node
*node
)
178 tree fs_opts
= DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node
->decl
);
182 return !opt_for_fn (node
->decl
, optimize
) || !opt_for_fn (node
->decl
, flag_ipa_cp
);
185 /* Return index of the formal whose tree is PTREE in function which corresponds
189 ipa_get_param_decl_index_1 (vec
<ipa_param_descriptor
, va_gc
> *descriptors
,
194 count
= vec_safe_length (descriptors
);
195 for (i
= 0; i
< count
; i
++)
196 if ((*descriptors
)[i
].decl_or_type
== ptree
)
202 /* Return index of the formal whose tree is PTREE in function which corresponds
206 ipa_get_param_decl_index (struct ipa_node_params
*info
, tree ptree
)
208 return ipa_get_param_decl_index_1 (info
->descriptors
, ptree
);
211 /* Populate the param_decl field in parameter DESCRIPTORS that correspond to
215 ipa_populate_param_decls (struct cgraph_node
*node
,
216 vec
<ipa_param_descriptor
, va_gc
> &descriptors
)
224 gcc_assert (gimple_has_body_p (fndecl
));
225 fnargs
= DECL_ARGUMENTS (fndecl
);
227 for (parm
= fnargs
; parm
; parm
= DECL_CHAIN (parm
))
229 descriptors
[param_num
].decl_or_type
= parm
;
230 descriptors
[param_num
].move_cost
= estimate_move_cost (TREE_TYPE (parm
),
236 /* Return how many formal parameters FNDECL has. */
239 count_formal_params (tree fndecl
)
243 gcc_assert (gimple_has_body_p (fndecl
));
245 for (parm
= DECL_ARGUMENTS (fndecl
); parm
; parm
= DECL_CHAIN (parm
))
251 /* Return the declaration of Ith formal parameter of the function corresponding
252 to INFO. Note there is no setter function as this array is built just once
253 using ipa_initialize_node_params. */
256 ipa_dump_param (FILE *file
, struct ipa_node_params
*info
, int i
)
258 fprintf (file
, "param #%i", i
);
259 if ((*info
->descriptors
)[i
].decl_or_type
)
262 print_generic_expr (file
, (*info
->descriptors
)[i
].decl_or_type
, 0);
266 /* If necessary, allocate vector of parameter descriptors in info of NODE.
267 Return true if they were allocated, false if not. */
270 ipa_alloc_node_params (struct cgraph_node
*node
, int param_count
)
272 struct ipa_node_params
*info
= IPA_NODE_REF (node
);
274 if (!info
->descriptors
&& param_count
)
276 vec_safe_grow_cleared (info
->descriptors
, param_count
);
283 /* Initialize the ipa_node_params structure associated with NODE by counting
284 the function parameters, creating the descriptors and populating their
288 ipa_initialize_node_params (struct cgraph_node
*node
)
290 struct ipa_node_params
*info
= IPA_NODE_REF (node
);
292 if (!info
->descriptors
293 && ipa_alloc_node_params (node
, count_formal_params (node
->decl
)))
294 ipa_populate_param_decls (node
, *info
->descriptors
);
297 /* Print the jump functions associated with call graph edge CS to file F. */
300 ipa_print_node_jump_functions_for_edge (FILE *f
, struct cgraph_edge
*cs
)
304 count
= ipa_get_cs_argument_count (IPA_EDGE_REF (cs
));
305 for (i
= 0; i
< count
; i
++)
307 struct ipa_jump_func
*jump_func
;
308 enum jump_func_type type
;
310 jump_func
= ipa_get_ith_jump_func (IPA_EDGE_REF (cs
), i
);
311 type
= jump_func
->type
;
313 fprintf (f
, " param %d: ", i
);
314 if (type
== IPA_JF_UNKNOWN
)
315 fprintf (f
, "UNKNOWN\n");
316 else if (type
== IPA_JF_CONST
)
318 tree val
= jump_func
->value
.constant
.value
;
319 fprintf (f
, "CONST: ");
320 print_generic_expr (f
, val
, 0);
321 if (TREE_CODE (val
) == ADDR_EXPR
322 && TREE_CODE (TREE_OPERAND (val
, 0)) == CONST_DECL
)
325 print_generic_expr (f
, DECL_INITIAL (TREE_OPERAND (val
, 0)),
330 else if (type
== IPA_JF_PASS_THROUGH
)
332 fprintf (f
, "PASS THROUGH: ");
333 fprintf (f
, "%d, op %s",
334 jump_func
->value
.pass_through
.formal_id
,
335 get_tree_code_name(jump_func
->value
.pass_through
.operation
));
336 if (jump_func
->value
.pass_through
.operation
!= NOP_EXPR
)
339 print_generic_expr (f
,
340 jump_func
->value
.pass_through
.operand
, 0);
342 if (jump_func
->value
.pass_through
.agg_preserved
)
343 fprintf (f
, ", agg_preserved");
346 else if (type
== IPA_JF_ANCESTOR
)
348 fprintf (f
, "ANCESTOR: ");
349 fprintf (f
, "%d, offset " HOST_WIDE_INT_PRINT_DEC
,
350 jump_func
->value
.ancestor
.formal_id
,
351 jump_func
->value
.ancestor
.offset
);
352 if (jump_func
->value
.ancestor
.agg_preserved
)
353 fprintf (f
, ", agg_preserved");
357 if (jump_func
->agg
.items
)
359 struct ipa_agg_jf_item
*item
;
362 fprintf (f
, " Aggregate passed by %s:\n",
363 jump_func
->agg
.by_ref
? "reference" : "value");
364 FOR_EACH_VEC_SAFE_ELT (jump_func
->agg
.items
, j
, item
)
366 fprintf (f
, " offset: " HOST_WIDE_INT_PRINT_DEC
", ",
368 if (TYPE_P (item
->value
))
369 fprintf (f
, "clobber of " HOST_WIDE_INT_PRINT_DEC
" bits",
370 tree_to_uhwi (TYPE_SIZE (item
->value
)));
373 fprintf (f
, "cst: ");
374 print_generic_expr (f
, item
->value
, 0);
380 struct ipa_polymorphic_call_context
*ctx
381 = ipa_get_ith_polymorhic_call_context (IPA_EDGE_REF (cs
), i
);
382 if (ctx
&& !ctx
->useless_p ())
384 fprintf (f
, " Context: ");
385 ctx
->dump (dump_file
);
390 fprintf (f
, " value: ");
391 print_hex (jump_func
->bits
->value
, f
);
392 fprintf (f
, ", mask: ");
393 print_hex (jump_func
->bits
->mask
, f
);
397 fprintf (f
, " Unknown bits\n");
403 (jump_func
->m_vr
->type
== VR_ANTI_RANGE
) ? "~" : "");
404 print_decs (jump_func
->m_vr
->min
, f
);
406 print_decs (jump_func
->m_vr
->max
, f
);
410 fprintf (f
, " Unknown VR\n");
415 /* Print the jump functions of all arguments on all call graph edges going from
419 ipa_print_node_jump_functions (FILE *f
, struct cgraph_node
*node
)
421 struct cgraph_edge
*cs
;
423 fprintf (f
, " Jump functions of caller %s/%i:\n", node
->name (),
425 for (cs
= node
->callees
; cs
; cs
= cs
->next_callee
)
427 if (!ipa_edge_args_info_available_for_edge_p (cs
))
430 fprintf (f
, " callsite %s/%i -> %s/%i : \n",
431 xstrdup_for_dump (node
->name ()), node
->order
,
432 xstrdup_for_dump (cs
->callee
->name ()),
434 ipa_print_node_jump_functions_for_edge (f
, cs
);
437 for (cs
= node
->indirect_calls
; cs
; cs
= cs
->next_callee
)
439 struct cgraph_indirect_call_info
*ii
;
440 if (!ipa_edge_args_info_available_for_edge_p (cs
))
443 ii
= cs
->indirect_info
;
444 if (ii
->agg_contents
)
445 fprintf (f
, " indirect %s callsite, calling param %i, "
446 "offset " HOST_WIDE_INT_PRINT_DEC
", %s",
447 ii
->member_ptr
? "member ptr" : "aggregate",
448 ii
->param_index
, ii
->offset
,
449 ii
->by_ref
? "by reference" : "by_value");
451 fprintf (f
, " indirect %s callsite, calling param %i, "
452 "offset " HOST_WIDE_INT_PRINT_DEC
,
453 ii
->polymorphic
? "polymorphic" : "simple", ii
->param_index
,
458 fprintf (f
, ", for stmt ");
459 print_gimple_stmt (f
, cs
->call_stmt
, 0, TDF_SLIM
);
464 ii
->context
.dump (f
);
465 ipa_print_node_jump_functions_for_edge (f
, cs
);
469 /* Print ipa_jump_func data structures of all nodes in the call graph to F. */
472 ipa_print_all_jump_functions (FILE *f
)
474 struct cgraph_node
*node
;
476 fprintf (f
, "\nJump functions:\n");
477 FOR_EACH_FUNCTION (node
)
479 ipa_print_node_jump_functions (f
, node
);
483 /* Set jfunc to be a know-really nothing jump function. */
486 ipa_set_jf_unknown (struct ipa_jump_func
*jfunc
)
488 jfunc
->type
= IPA_JF_UNKNOWN
;
493 /* Set JFUNC to be a copy of another jmp (to be used by jump function
494 combination code). The two functions will share their rdesc. */
497 ipa_set_jf_cst_copy (struct ipa_jump_func
*dst
,
498 struct ipa_jump_func
*src
)
501 gcc_checking_assert (src
->type
== IPA_JF_CONST
);
502 dst
->type
= IPA_JF_CONST
;
503 dst
->value
.constant
= src
->value
.constant
;
506 /* Set JFUNC to be a constant jmp function. */
509 ipa_set_jf_constant (struct ipa_jump_func
*jfunc
, tree constant
,
510 struct cgraph_edge
*cs
)
512 jfunc
->type
= IPA_JF_CONST
;
513 jfunc
->value
.constant
.value
= unshare_expr_without_location (constant
);
515 if (TREE_CODE (constant
) == ADDR_EXPR
516 && TREE_CODE (TREE_OPERAND (constant
, 0)) == FUNCTION_DECL
)
518 struct ipa_cst_ref_desc
*rdesc
;
520 rdesc
= ipa_refdesc_pool
.allocate ();
522 rdesc
->next_duplicate
= NULL
;
524 jfunc
->value
.constant
.rdesc
= rdesc
;
527 jfunc
->value
.constant
.rdesc
= NULL
;
530 /* Set JFUNC to be a simple pass-through jump function. */
532 ipa_set_jf_simple_pass_through (struct ipa_jump_func
*jfunc
, int formal_id
,
535 jfunc
->type
= IPA_JF_PASS_THROUGH
;
536 jfunc
->value
.pass_through
.operand
= NULL_TREE
;
537 jfunc
->value
.pass_through
.formal_id
= formal_id
;
538 jfunc
->value
.pass_through
.operation
= NOP_EXPR
;
539 jfunc
->value
.pass_through
.agg_preserved
= agg_preserved
;
542 /* Set JFUNC to be an unary pass through jump function. */
545 ipa_set_jf_unary_pass_through (struct ipa_jump_func
*jfunc
, int formal_id
,
546 enum tree_code operation
)
548 jfunc
->type
= IPA_JF_PASS_THROUGH
;
549 jfunc
->value
.pass_through
.operand
= NULL_TREE
;
550 jfunc
->value
.pass_through
.formal_id
= formal_id
;
551 jfunc
->value
.pass_through
.operation
= operation
;
552 jfunc
->value
.pass_through
.agg_preserved
= false;
554 /* Set JFUNC to be an arithmetic pass through jump function. */
557 ipa_set_jf_arith_pass_through (struct ipa_jump_func
*jfunc
, int formal_id
,
558 tree operand
, enum tree_code operation
)
560 jfunc
->type
= IPA_JF_PASS_THROUGH
;
561 jfunc
->value
.pass_through
.operand
= unshare_expr_without_location (operand
);
562 jfunc
->value
.pass_through
.formal_id
= formal_id
;
563 jfunc
->value
.pass_through
.operation
= operation
;
564 jfunc
->value
.pass_through
.agg_preserved
= false;
567 /* Set JFUNC to be an ancestor jump function. */
570 ipa_set_ancestor_jf (struct ipa_jump_func
*jfunc
, HOST_WIDE_INT offset
,
571 int formal_id
, bool agg_preserved
)
573 jfunc
->type
= IPA_JF_ANCESTOR
;
574 jfunc
->value
.ancestor
.formal_id
= formal_id
;
575 jfunc
->value
.ancestor
.offset
= offset
;
576 jfunc
->value
.ancestor
.agg_preserved
= agg_preserved
;
579 /* Get IPA BB information about the given BB. FBI is the context of analyzis
580 of this function body. */
582 static struct ipa_bb_info
*
583 ipa_get_bb_info (struct ipa_func_body_info
*fbi
, basic_block bb
)
585 gcc_checking_assert (fbi
);
586 return &fbi
->bb_infos
[bb
->index
];
589 /* Structure to be passed in between detect_type_change and
590 check_stmt_for_type_change. */
592 struct prop_type_change_info
594 /* Offset into the object where there is the virtual method pointer we are
596 HOST_WIDE_INT offset
;
597 /* The declaration or SSA_NAME pointer of the base that we are checking for
600 /* Set to true if dynamic type change has been detected. */
601 bool type_maybe_changed
;
604 /* Return true if STMT can modify a virtual method table pointer.
606 This function makes special assumptions about both constructors and
607 destructors which are all the functions that are allowed to alter the VMT
608 pointers. It assumes that destructors begin with assignment into all VMT
609 pointers and that constructors essentially look in the following way:
611 1) The very first thing they do is that they call constructors of ancestor
612 sub-objects that have them.
614 2) Then VMT pointers of this and all its ancestors is set to new values
615 corresponding to the type corresponding to the constructor.
617 3) Only afterwards, other stuff such as constructor of member sub-objects
618 and the code written by the user is run. Only this may include calling
619 virtual functions, directly or indirectly.
621 There is no way to call a constructor of an ancestor sub-object in any
624 This means that we do not have to care whether constructors get the correct
625 type information because they will always change it (in fact, if we define
626 the type to be given by the VMT pointer, it is undefined).
628 The most important fact to derive from the above is that if, for some
629 statement in the section 3, we try to detect whether the dynamic type has
630 changed, we can safely ignore all calls as we examine the function body
631 backwards until we reach statements in section 2 because these calls cannot
632 be ancestor constructors or destructors (if the input is not bogus) and so
633 do not change the dynamic type (this holds true only for automatically
634 allocated objects but at the moment we devirtualize only these). We then
635 must detect that statements in section 2 change the dynamic type and can try
636 to derive the new type. That is enough and we can stop, we will never see
637 the calls into constructors of sub-objects in this code. Therefore we can
638 safely ignore all call statements that we traverse.
642 stmt_may_be_vtbl_ptr_store (gimple
*stmt
)
644 if (is_gimple_call (stmt
))
646 if (gimple_clobber_p (stmt
))
648 else if (is_gimple_assign (stmt
))
650 tree lhs
= gimple_assign_lhs (stmt
);
652 if (!AGGREGATE_TYPE_P (TREE_TYPE (lhs
)))
654 if (flag_strict_aliasing
655 && !POINTER_TYPE_P (TREE_TYPE (lhs
)))
658 if (TREE_CODE (lhs
) == COMPONENT_REF
659 && !DECL_VIRTUAL_P (TREE_OPERAND (lhs
, 1)))
661 /* In the future we might want to use get_base_ref_and_offset to find
662 if there is a field corresponding to the offset and if so, proceed
663 almost like if it was a component ref. */
669 /* Callback of walk_aliased_vdefs and a helper function for detect_type_change
670 to check whether a particular statement may modify the virtual table
671 pointerIt stores its result into DATA, which points to a
672 prop_type_change_info structure. */
675 check_stmt_for_type_change (ao_ref
*ao ATTRIBUTE_UNUSED
, tree vdef
, void *data
)
677 gimple
*stmt
= SSA_NAME_DEF_STMT (vdef
);
678 struct prop_type_change_info
*tci
= (struct prop_type_change_info
*) data
;
680 if (stmt_may_be_vtbl_ptr_store (stmt
))
682 tci
->type_maybe_changed
= true;
689 /* See if ARG is PARAM_DECl describing instance passed by pointer
690 or reference in FUNCTION. Return false if the dynamic type may change
691 in between beggining of the function until CALL is invoked.
693 Generally functions are not allowed to change type of such instances,
694 but they call destructors. We assume that methods can not destroy the THIS
695 pointer. Also as a special cases, constructor and destructors may change
696 type of the THIS pointer. */
699 param_type_may_change_p (tree function
, tree arg
, gimple
*call
)
701 /* Pure functions can not do any changes on the dynamic type;
702 that require writting to memory. */
703 if (flags_from_decl_or_type (function
) & (ECF_PURE
| ECF_CONST
))
705 /* We need to check if we are within inlined consturctor
706 or destructor (ideally we would have way to check that the
707 inline cdtor is actually working on ARG, but we don't have
708 easy tie on this, so punt on all non-pure cdtors.
709 We may also record the types of cdtors and once we know type
710 of the instance match them.
712 Also code unification optimizations may merge calls from
713 different blocks making return values unreliable. So
714 do nothing during late optimization. */
715 if (DECL_STRUCT_FUNCTION (function
)->after_inlining
)
717 if (TREE_CODE (arg
) == SSA_NAME
718 && SSA_NAME_IS_DEFAULT_DEF (arg
)
719 && TREE_CODE (SSA_NAME_VAR (arg
)) == PARM_DECL
)
721 /* Normal (non-THIS) argument. */
722 if ((SSA_NAME_VAR (arg
) != DECL_ARGUMENTS (function
)
723 || TREE_CODE (TREE_TYPE (function
)) != METHOD_TYPE
)
724 /* THIS pointer of an method - here we want to watch constructors
725 and destructors as those definitely may change the dynamic
727 || (TREE_CODE (TREE_TYPE (function
)) == METHOD_TYPE
728 && !DECL_CXX_CONSTRUCTOR_P (function
)
729 && !DECL_CXX_DESTRUCTOR_P (function
)
730 && (SSA_NAME_VAR (arg
) == DECL_ARGUMENTS (function
))))
732 /* Walk the inline stack and watch out for ctors/dtors. */
733 for (tree block
= gimple_block (call
); block
&& TREE_CODE (block
) == BLOCK
;
734 block
= BLOCK_SUPERCONTEXT (block
))
735 if (inlined_polymorphic_ctor_dtor_block_p (block
, false))
743 /* Detect whether the dynamic type of ARG of COMP_TYPE has changed (before
744 callsite CALL) by looking for assignments to its virtual table pointer. If
745 it is, return true and fill in the jump function JFUNC with relevant type
746 information or set it to unknown. ARG is the object itself (not a pointer
747 to it, unless dereferenced). BASE is the base of the memory access as
748 returned by get_ref_base_and_extent, as is the offset.
750 This is helper function for detect_type_change and detect_type_change_ssa
751 that does the heavy work which is usually unnecesary. */
754 detect_type_change_from_memory_writes (tree arg
, tree base
, tree comp_type
,
755 gcall
*call
, struct ipa_jump_func
*jfunc
,
756 HOST_WIDE_INT offset
)
758 struct prop_type_change_info tci
;
760 bool entry_reached
= false;
762 gcc_checking_assert (DECL_P (arg
)
763 || TREE_CODE (arg
) == MEM_REF
764 || handled_component_p (arg
));
766 comp_type
= TYPE_MAIN_VARIANT (comp_type
);
768 /* Const calls cannot call virtual methods through VMT and so type changes do
770 if (!flag_devirtualize
|| !gimple_vuse (call
)
771 /* Be sure expected_type is polymorphic. */
773 || TREE_CODE (comp_type
) != RECORD_TYPE
774 || !TYPE_BINFO (TYPE_MAIN_VARIANT (comp_type
))
775 || !BINFO_VTABLE (TYPE_BINFO (TYPE_MAIN_VARIANT (comp_type
))))
778 ao_ref_init (&ao
, arg
);
781 ao
.size
= POINTER_SIZE
;
782 ao
.max_size
= ao
.size
;
785 tci
.object
= get_base_address (arg
);
786 tci
.type_maybe_changed
= false;
788 walk_aliased_vdefs (&ao
, gimple_vuse (call
), check_stmt_for_type_change
,
789 &tci
, NULL
, &entry_reached
);
790 if (!tci
.type_maybe_changed
)
793 ipa_set_jf_unknown (jfunc
);
797 /* Detect whether the dynamic type of ARG of COMP_TYPE may have changed.
798 If it is, return true and fill in the jump function JFUNC with relevant type
799 information or set it to unknown. ARG is the object itself (not a pointer
800 to it, unless dereferenced). BASE is the base of the memory access as
801 returned by get_ref_base_and_extent, as is the offset. */
804 detect_type_change (tree arg
, tree base
, tree comp_type
, gcall
*call
,
805 struct ipa_jump_func
*jfunc
, HOST_WIDE_INT offset
)
807 if (!flag_devirtualize
)
810 if (TREE_CODE (base
) == MEM_REF
811 && !param_type_may_change_p (current_function_decl
,
812 TREE_OPERAND (base
, 0),
815 return detect_type_change_from_memory_writes (arg
, base
, comp_type
,
816 call
, jfunc
, offset
);
819 /* Like detect_type_change but ARG is supposed to be a non-dereferenced pointer
820 SSA name (its dereference will become the base and the offset is assumed to
824 detect_type_change_ssa (tree arg
, tree comp_type
,
825 gcall
*call
, struct ipa_jump_func
*jfunc
)
827 gcc_checking_assert (TREE_CODE (arg
) == SSA_NAME
);
828 if (!flag_devirtualize
829 || !POINTER_TYPE_P (TREE_TYPE (arg
)))
832 if (!param_type_may_change_p (current_function_decl
, arg
, call
))
835 arg
= build2 (MEM_REF
, ptr_type_node
, arg
,
836 build_int_cst (ptr_type_node
, 0));
838 return detect_type_change_from_memory_writes (arg
, arg
, comp_type
,
842 /* Callback of walk_aliased_vdefs. Flags that it has been invoked to the
843 boolean variable pointed to by DATA. */
846 mark_modified (ao_ref
*ao ATTRIBUTE_UNUSED
, tree vdef ATTRIBUTE_UNUSED
,
849 bool *b
= (bool *) data
;
854 /* Return true if we have already walked so many statements in AA that we
855 should really just start giving up. */
858 aa_overwalked (struct ipa_func_body_info
*fbi
)
860 gcc_checking_assert (fbi
);
861 return fbi
->aa_walked
> (unsigned) PARAM_VALUE (PARAM_IPA_MAX_AA_STEPS
);
864 /* Find the nearest valid aa status for parameter specified by INDEX that
867 static struct ipa_param_aa_status
*
868 find_dominating_aa_status (struct ipa_func_body_info
*fbi
, basic_block bb
,
873 bb
= get_immediate_dominator (CDI_DOMINATORS
, bb
);
876 struct ipa_bb_info
*bi
= ipa_get_bb_info (fbi
, bb
);
877 if (!bi
->param_aa_statuses
.is_empty ()
878 && bi
->param_aa_statuses
[index
].valid
)
879 return &bi
->param_aa_statuses
[index
];
883 /* Get AA status structure for the given BB and parameter with INDEX. Allocate
884 structures and/or intialize the result with a dominating description as
887 static struct ipa_param_aa_status
*
888 parm_bb_aa_status_for_bb (struct ipa_func_body_info
*fbi
, basic_block bb
,
891 gcc_checking_assert (fbi
);
892 struct ipa_bb_info
*bi
= ipa_get_bb_info (fbi
, bb
);
893 if (bi
->param_aa_statuses
.is_empty ())
894 bi
->param_aa_statuses
.safe_grow_cleared (fbi
->param_count
);
895 struct ipa_param_aa_status
*paa
= &bi
->param_aa_statuses
[index
];
898 gcc_checking_assert (!paa
->parm_modified
899 && !paa
->ref_modified
900 && !paa
->pt_modified
);
901 struct ipa_param_aa_status
*dom_paa
;
902 dom_paa
= find_dominating_aa_status (fbi
, bb
, index
);
912 /* Return true if a load from a formal parameter PARM_LOAD is known to retrieve
913 a value known not to be modified in this function before reaching the
914 statement STMT. FBI holds information about the function we have so far
915 gathered but do not survive the summary building stage. */
918 parm_preserved_before_stmt_p (struct ipa_func_body_info
*fbi
, int index
,
919 gimple
*stmt
, tree parm_load
)
921 struct ipa_param_aa_status
*paa
;
922 bool modified
= false;
925 tree base
= get_base_address (parm_load
);
926 gcc_assert (TREE_CODE (base
) == PARM_DECL
);
927 if (TREE_READONLY (base
))
930 /* FIXME: FBI can be NULL if we are being called from outside
931 ipa_node_analysis or ipcp_transform_function, which currently happens
932 during inlining analysis. It would be great to extend fbi's lifetime and
933 always have it. Currently, we are just not afraid of too much walking in
937 if (aa_overwalked (fbi
))
939 paa
= parm_bb_aa_status_for_bb (fbi
, gimple_bb (stmt
), index
);
940 if (paa
->parm_modified
)
946 gcc_checking_assert (gimple_vuse (stmt
) != NULL_TREE
);
947 ao_ref_init (&refd
, parm_load
);
948 int walked
= walk_aliased_vdefs (&refd
, gimple_vuse (stmt
), mark_modified
,
951 fbi
->aa_walked
+= walked
;
953 paa
->parm_modified
= true;
957 /* If STMT is an assignment that loads a value from an parameter declaration,
958 return the index of the parameter in ipa_node_params which has not been
959 modified. Otherwise return -1. */
962 load_from_unmodified_param (struct ipa_func_body_info
*fbi
,
963 vec
<ipa_param_descriptor
, va_gc
> *descriptors
,
969 if (!gimple_assign_single_p (stmt
))
972 op1
= gimple_assign_rhs1 (stmt
);
973 if (TREE_CODE (op1
) != PARM_DECL
)
976 index
= ipa_get_param_decl_index_1 (descriptors
, op1
);
978 || !parm_preserved_before_stmt_p (fbi
, index
, stmt
, op1
))
984 /* Return true if memory reference REF (which must be a load through parameter
985 with INDEX) loads data that are known to be unmodified in this function
986 before reaching statement STMT. */
989 parm_ref_data_preserved_p (struct ipa_func_body_info
*fbi
,
990 int index
, gimple
*stmt
, tree ref
)
992 struct ipa_param_aa_status
*paa
;
993 bool modified
= false;
996 /* FIXME: FBI can be NULL if we are being called from outside
997 ipa_node_analysis or ipcp_transform_function, which currently happens
998 during inlining analysis. It would be great to extend fbi's lifetime and
999 always have it. Currently, we are just not afraid of too much walking in
1003 if (aa_overwalked (fbi
))
1005 paa
= parm_bb_aa_status_for_bb (fbi
, gimple_bb (stmt
), index
);
1006 if (paa
->ref_modified
)
1012 gcc_checking_assert (gimple_vuse (stmt
));
1013 ao_ref_init (&refd
, ref
);
1014 int walked
= walk_aliased_vdefs (&refd
, gimple_vuse (stmt
), mark_modified
,
1017 fbi
->aa_walked
+= walked
;
1018 if (paa
&& modified
)
1019 paa
->ref_modified
= true;
1023 /* Return true if the data pointed to by PARM (which is a parameter with INDEX)
1024 is known to be unmodified in this function before reaching call statement
1025 CALL into which it is passed. FBI describes the function body. */
1028 parm_ref_data_pass_through_p (struct ipa_func_body_info
*fbi
, int index
,
1029 gimple
*call
, tree parm
)
1031 bool modified
= false;
1034 /* It's unnecessary to calculate anything about memory contnets for a const
1035 function because it is not goin to use it. But do not cache the result
1036 either. Also, no such calculations for non-pointers. */
1037 if (!gimple_vuse (call
)
1038 || !POINTER_TYPE_P (TREE_TYPE (parm
))
1039 || aa_overwalked (fbi
))
1042 struct ipa_param_aa_status
*paa
= parm_bb_aa_status_for_bb (fbi
,
1045 if (paa
->pt_modified
)
1048 ao_ref_init_from_ptr_and_size (&refd
, parm
, NULL_TREE
);
1049 int walked
= walk_aliased_vdefs (&refd
, gimple_vuse (call
), mark_modified
,
1051 fbi
->aa_walked
+= walked
;
1053 paa
->pt_modified
= true;
1057 /* Return true if we can prove that OP is a memory reference loading
1058 data from an aggregate passed as a parameter.
1060 The function works in two modes. If GUARANTEED_UNMODIFIED is NULL, it return
1061 false if it cannot prove that the value has not been modified before the
1062 load in STMT. If GUARANTEED_UNMODIFIED is not NULL, it will return true even
1063 if it cannot prove the value has not been modified, in that case it will
1064 store false to *GUARANTEED_UNMODIFIED, otherwise it will store true there.
1066 INFO and PARMS_AINFO describe parameters of the current function (but the
1067 latter can be NULL), STMT is the load statement. If function returns true,
1068 *INDEX_P, *OFFSET_P and *BY_REF is filled with the parameter index, offset
1069 within the aggregate and whether it is a load from a value passed by
1070 reference respectively. */
1073 ipa_load_from_parm_agg (struct ipa_func_body_info
*fbi
,
1074 vec
<ipa_param_descriptor
, va_gc
> *descriptors
,
1075 gimple
*stmt
, tree op
, int *index_p
,
1076 HOST_WIDE_INT
*offset_p
, HOST_WIDE_INT
*size_p
,
1077 bool *by_ref_p
, bool *guaranteed_unmodified
)
1080 HOST_WIDE_INT size
, max_size
;
1083 = get_ref_base_and_extent (op
, offset_p
, &size
, &max_size
, &reverse
);
1085 if (max_size
== -1 || max_size
!= size
|| *offset_p
< 0)
1090 int index
= ipa_get_param_decl_index_1 (descriptors
, base
);
1092 && parm_preserved_before_stmt_p (fbi
, index
, stmt
, op
))
1098 if (guaranteed_unmodified
)
1099 *guaranteed_unmodified
= true;
1105 if (TREE_CODE (base
) != MEM_REF
1106 || TREE_CODE (TREE_OPERAND (base
, 0)) != SSA_NAME
1107 || !integer_zerop (TREE_OPERAND (base
, 1)))
1110 if (SSA_NAME_IS_DEFAULT_DEF (TREE_OPERAND (base
, 0)))
1112 tree parm
= SSA_NAME_VAR (TREE_OPERAND (base
, 0));
1113 index
= ipa_get_param_decl_index_1 (descriptors
, parm
);
1117 /* This branch catches situations where a pointer parameter is not a
1118 gimple register, for example:
1120 void hip7(S*) (struct S * p)
1122 void (*<T2e4>) (struct S *) D.1867;
1127 D.1867_2 = p.1_1->f;
1132 gimple
*def
= SSA_NAME_DEF_STMT (TREE_OPERAND (base
, 0));
1133 index
= load_from_unmodified_param (fbi
, descriptors
, def
);
1138 bool data_preserved
= parm_ref_data_preserved_p (fbi
, index
, stmt
, op
);
1139 if (!data_preserved
&& !guaranteed_unmodified
)
1146 if (guaranteed_unmodified
)
1147 *guaranteed_unmodified
= data_preserved
;
1153 /* Given that an actual argument is an SSA_NAME (given in NAME) and is a result
1154 of an assignment statement STMT, try to determine whether we are actually
1155 handling any of the following cases and construct an appropriate jump
1156 function into JFUNC if so:
1158 1) The passed value is loaded from a formal parameter which is not a gimple
1159 register (most probably because it is addressable, the value has to be
1160 scalar) and we can guarantee the value has not changed. This case can
1161 therefore be described by a simple pass-through jump function. For example:
1170 2) The passed value can be described by a simple arithmetic pass-through
1177 D.2064_4 = a.1(D) + 4;
1180 This case can also occur in combination of the previous one, e.g.:
1188 D.2064_4 = a.0_3 + 4;
1191 3) The passed value is an address of an object within another one (which
1192 also passed by reference). Such situations are described by an ancestor
1193 jump function and describe situations such as:
1195 B::foo() (struct B * const this)
1199 D.1845_2 = &this_1(D)->D.1748;
1202 INFO is the structure describing individual parameters access different
1203 stages of IPA optimizations. PARMS_AINFO contains the information that is
1204 only needed for intraprocedural analysis. */
1207 compute_complex_assign_jump_func (struct ipa_func_body_info
*fbi
,
1208 struct ipa_node_params
*info
,
1209 struct ipa_jump_func
*jfunc
,
1210 gcall
*call
, gimple
*stmt
, tree name
,
1213 HOST_WIDE_INT offset
, size
, max_size
;
1214 tree op1
, tc_ssa
, base
, ssa
;
1218 op1
= gimple_assign_rhs1 (stmt
);
1220 if (TREE_CODE (op1
) == SSA_NAME
)
1222 if (SSA_NAME_IS_DEFAULT_DEF (op1
))
1223 index
= ipa_get_param_decl_index (info
, SSA_NAME_VAR (op1
));
1225 index
= load_from_unmodified_param (fbi
, info
->descriptors
,
1226 SSA_NAME_DEF_STMT (op1
));
1231 index
= load_from_unmodified_param (fbi
, info
->descriptors
, stmt
);
1232 tc_ssa
= gimple_assign_lhs (stmt
);
1237 switch (gimple_assign_rhs_class (stmt
))
1239 case GIMPLE_BINARY_RHS
:
1241 tree op2
= gimple_assign_rhs2 (stmt
);
1242 if (!is_gimple_ip_invariant (op2
)
1243 || ((TREE_CODE_CLASS (gimple_assign_rhs_code (stmt
))
1245 && !useless_type_conversion_p (TREE_TYPE (name
),
1249 ipa_set_jf_arith_pass_through (jfunc
, index
, op2
,
1250 gimple_assign_rhs_code (stmt
));
1253 case GIMPLE_SINGLE_RHS
:
1255 bool agg_p
= parm_ref_data_pass_through_p (fbi
, index
, call
,
1257 ipa_set_jf_simple_pass_through (jfunc
, index
, agg_p
);
1260 case GIMPLE_UNARY_RHS
:
1261 if (is_gimple_assign (stmt
)
1262 && gimple_assign_rhs_class (stmt
) == GIMPLE_UNARY_RHS
1263 && ! CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (stmt
)))
1264 ipa_set_jf_unary_pass_through (jfunc
, index
,
1265 gimple_assign_rhs_code (stmt
));
1271 if (TREE_CODE (op1
) != ADDR_EXPR
)
1273 op1
= TREE_OPERAND (op1
, 0);
1274 if (TREE_CODE (TREE_TYPE (op1
)) != RECORD_TYPE
)
1276 base
= get_ref_base_and_extent (op1
, &offset
, &size
, &max_size
, &reverse
);
1277 if (TREE_CODE (base
) != MEM_REF
1278 /* If this is a varying address, punt. */
1280 || max_size
!= size
)
1282 offset
+= mem_ref_offset (base
).to_short_addr () * BITS_PER_UNIT
;
1283 ssa
= TREE_OPERAND (base
, 0);
1284 if (TREE_CODE (ssa
) != SSA_NAME
1285 || !SSA_NAME_IS_DEFAULT_DEF (ssa
)
1289 /* Dynamic types are changed in constructors and destructors. */
1290 index
= ipa_get_param_decl_index (info
, SSA_NAME_VAR (ssa
));
1291 if (index
>= 0 && param_type
&& POINTER_TYPE_P (param_type
))
1292 ipa_set_ancestor_jf (jfunc
, offset
, index
,
1293 parm_ref_data_pass_through_p (fbi
, index
, call
, ssa
));
1296 /* Extract the base, offset and MEM_REF expression from a statement ASSIGN if
1299 iftmp.1_3 = &obj_2(D)->D.1762;
1301 The base of the MEM_REF must be a default definition SSA NAME of a
1302 parameter. Return NULL_TREE if it looks otherwise. If case of success, the
1303 whole MEM_REF expression is returned and the offset calculated from any
1304 handled components and the MEM_REF itself is stored into *OFFSET. The whole
1305 RHS stripped off the ADDR_EXPR is stored into *OBJ_P. */
1308 get_ancestor_addr_info (gimple
*assign
, tree
*obj_p
, HOST_WIDE_INT
*offset
)
1310 HOST_WIDE_INT size
, max_size
;
1311 tree expr
, parm
, obj
;
1314 if (!gimple_assign_single_p (assign
))
1316 expr
= gimple_assign_rhs1 (assign
);
1318 if (TREE_CODE (expr
) != ADDR_EXPR
)
1320 expr
= TREE_OPERAND (expr
, 0);
1322 expr
= get_ref_base_and_extent (expr
, offset
, &size
, &max_size
, &reverse
);
1324 if (TREE_CODE (expr
) != MEM_REF
1325 /* If this is a varying address, punt. */
1330 parm
= TREE_OPERAND (expr
, 0);
1331 if (TREE_CODE (parm
) != SSA_NAME
1332 || !SSA_NAME_IS_DEFAULT_DEF (parm
)
1333 || TREE_CODE (SSA_NAME_VAR (parm
)) != PARM_DECL
)
1336 *offset
+= mem_ref_offset (expr
).to_short_addr () * BITS_PER_UNIT
;
1342 /* Given that an actual argument is an SSA_NAME that is a result of a phi
1343 statement PHI, try to find out whether NAME is in fact a
1344 multiple-inheritance typecast from a descendant into an ancestor of a formal
1345 parameter and thus can be described by an ancestor jump function and if so,
1346 write the appropriate function into JFUNC.
1348 Essentially we want to match the following pattern:
1356 iftmp.1_3 = &obj_2(D)->D.1762;
1359 # iftmp.1_1 = PHI <iftmp.1_3(3), 0B(2)>
1360 D.1879_6 = middleman_1 (iftmp.1_1, i_5(D));
1364 compute_complex_ancestor_jump_func (struct ipa_func_body_info
*fbi
,
1365 struct ipa_node_params
*info
,
1366 struct ipa_jump_func
*jfunc
,
1367 gcall
*call
, gphi
*phi
)
1369 HOST_WIDE_INT offset
;
1370 gimple
*assign
, *cond
;
1371 basic_block phi_bb
, assign_bb
, cond_bb
;
1372 tree tmp
, parm
, expr
, obj
;
1375 if (gimple_phi_num_args (phi
) != 2)
1378 if (integer_zerop (PHI_ARG_DEF (phi
, 1)))
1379 tmp
= PHI_ARG_DEF (phi
, 0);
1380 else if (integer_zerop (PHI_ARG_DEF (phi
, 0)))
1381 tmp
= PHI_ARG_DEF (phi
, 1);
1384 if (TREE_CODE (tmp
) != SSA_NAME
1385 || SSA_NAME_IS_DEFAULT_DEF (tmp
)
1386 || !POINTER_TYPE_P (TREE_TYPE (tmp
))
1387 || TREE_CODE (TREE_TYPE (TREE_TYPE (tmp
))) != RECORD_TYPE
)
1390 assign
= SSA_NAME_DEF_STMT (tmp
);
1391 assign_bb
= gimple_bb (assign
);
1392 if (!single_pred_p (assign_bb
))
1394 expr
= get_ancestor_addr_info (assign
, &obj
, &offset
);
1397 parm
= TREE_OPERAND (expr
, 0);
1398 index
= ipa_get_param_decl_index (info
, SSA_NAME_VAR (parm
));
1402 cond_bb
= single_pred (assign_bb
);
1403 cond
= last_stmt (cond_bb
);
1405 || gimple_code (cond
) != GIMPLE_COND
1406 || gimple_cond_code (cond
) != NE_EXPR
1407 || gimple_cond_lhs (cond
) != parm
1408 || !integer_zerop (gimple_cond_rhs (cond
)))
1411 phi_bb
= gimple_bb (phi
);
1412 for (i
= 0; i
< 2; i
++)
1414 basic_block pred
= EDGE_PRED (phi_bb
, i
)->src
;
1415 if (pred
!= assign_bb
&& pred
!= cond_bb
)
1419 ipa_set_ancestor_jf (jfunc
, offset
, index
,
1420 parm_ref_data_pass_through_p (fbi
, index
, call
, parm
));
1423 /* Inspect the given TYPE and return true iff it has the same structure (the
1424 same number of fields of the same types) as a C++ member pointer. If
1425 METHOD_PTR and DELTA are non-NULL, store the trees representing the
1426 corresponding fields there. */
1429 type_like_member_ptr_p (tree type
, tree
*method_ptr
, tree
*delta
)
1433 if (TREE_CODE (type
) != RECORD_TYPE
)
1436 fld
= TYPE_FIELDS (type
);
1437 if (!fld
|| !POINTER_TYPE_P (TREE_TYPE (fld
))
1438 || TREE_CODE (TREE_TYPE (TREE_TYPE (fld
))) != METHOD_TYPE
1439 || !tree_fits_uhwi_p (DECL_FIELD_OFFSET (fld
)))
1445 fld
= DECL_CHAIN (fld
);
1446 if (!fld
|| INTEGRAL_TYPE_P (fld
)
1447 || !tree_fits_uhwi_p (DECL_FIELD_OFFSET (fld
)))
1452 if (DECL_CHAIN (fld
))
1458 /* If RHS is an SSA_NAME and it is defined by a simple copy assign statement,
1459 return the rhs of its defining statement. Otherwise return RHS as it
1463 get_ssa_def_if_simple_copy (tree rhs
)
1465 while (TREE_CODE (rhs
) == SSA_NAME
&& !SSA_NAME_IS_DEFAULT_DEF (rhs
))
1467 gimple
*def_stmt
= SSA_NAME_DEF_STMT (rhs
);
1469 if (gimple_assign_single_p (def_stmt
))
1470 rhs
= gimple_assign_rhs1 (def_stmt
);
1477 /* Simple linked list, describing known contents of an aggregate beforere
1480 struct ipa_known_agg_contents_list
1482 /* Offset and size of the described part of the aggregate. */
1483 HOST_WIDE_INT offset
, size
;
1484 /* Known constant value or NULL if the contents is known to be unknown. */
1486 /* Pointer to the next structure in the list. */
1487 struct ipa_known_agg_contents_list
*next
;
1490 /* Find the proper place in linked list of ipa_known_agg_contents_list
1491 structures where to put a new one with the given LHS_OFFSET and LHS_SIZE,
1492 unless there is a partial overlap, in which case return NULL, or such
1493 element is already there, in which case set *ALREADY_THERE to true. */
1495 static struct ipa_known_agg_contents_list
**
1496 get_place_in_agg_contents_list (struct ipa_known_agg_contents_list
**list
,
1497 HOST_WIDE_INT lhs_offset
,
1498 HOST_WIDE_INT lhs_size
,
1499 bool *already_there
)
1501 struct ipa_known_agg_contents_list
**p
= list
;
1502 while (*p
&& (*p
)->offset
< lhs_offset
)
1504 if ((*p
)->offset
+ (*p
)->size
> lhs_offset
)
1509 if (*p
&& (*p
)->offset
< lhs_offset
+ lhs_size
)
1511 if ((*p
)->offset
== lhs_offset
&& (*p
)->size
== lhs_size
)
1512 /* We already know this value is subsequently overwritten with
1514 *already_there
= true;
1516 /* Otherwise this is a partial overlap which we cannot
1523 /* Build aggregate jump function from LIST, assuming there are exactly
1524 CONST_COUNT constant entries there and that th offset of the passed argument
1525 is ARG_OFFSET and store it into JFUNC. */
1528 build_agg_jump_func_from_list (struct ipa_known_agg_contents_list
*list
,
1529 int const_count
, HOST_WIDE_INT arg_offset
,
1530 struct ipa_jump_func
*jfunc
)
1532 vec_alloc (jfunc
->agg
.items
, const_count
);
1537 struct ipa_agg_jf_item item
;
1538 item
.offset
= list
->offset
- arg_offset
;
1539 gcc_assert ((item
.offset
% BITS_PER_UNIT
) == 0);
1540 item
.value
= unshare_expr_without_location (list
->constant
);
1541 jfunc
->agg
.items
->quick_push (item
);
1547 /* Traverse statements from CALL backwards, scanning whether an aggregate given
1548 in ARG is filled in with constant values. ARG can either be an aggregate
1549 expression or a pointer to an aggregate. ARG_TYPE is the type of the
1550 aggregate. JFUNC is the jump function into which the constants are
1551 subsequently stored. */
1554 determine_locally_known_aggregate_parts (gcall
*call
, tree arg
,
1556 struct ipa_jump_func
*jfunc
)
1558 struct ipa_known_agg_contents_list
*list
= NULL
;
1559 int item_count
= 0, const_count
= 0;
1560 HOST_WIDE_INT arg_offset
, arg_size
;
1561 gimple_stmt_iterator gsi
;
1563 bool check_ref
, by_ref
;
1566 if (PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS
) == 0)
1569 /* The function operates in three stages. First, we prepare check_ref, r,
1570 arg_base and arg_offset based on what is actually passed as an actual
1573 if (POINTER_TYPE_P (arg_type
))
1576 if (TREE_CODE (arg
) == SSA_NAME
)
1579 if (!tree_fits_uhwi_p (TYPE_SIZE (TREE_TYPE (arg_type
))))
1584 type_size
= TYPE_SIZE (TREE_TYPE (arg_type
));
1585 arg_size
= tree_to_uhwi (type_size
);
1586 ao_ref_init_from_ptr_and_size (&r
, arg_base
, NULL_TREE
);
1588 else if (TREE_CODE (arg
) == ADDR_EXPR
)
1590 HOST_WIDE_INT arg_max_size
;
1593 arg
= TREE_OPERAND (arg
, 0);
1594 arg_base
= get_ref_base_and_extent (arg
, &arg_offset
, &arg_size
,
1595 &arg_max_size
, &reverse
);
1596 if (arg_max_size
== -1
1597 || arg_max_size
!= arg_size
1600 if (DECL_P (arg_base
))
1603 ao_ref_init (&r
, arg_base
);
1613 HOST_WIDE_INT arg_max_size
;
1616 gcc_checking_assert (AGGREGATE_TYPE_P (TREE_TYPE (arg
)));
1620 arg_base
= get_ref_base_and_extent (arg
, &arg_offset
, &arg_size
,
1621 &arg_max_size
, &reverse
);
1622 if (arg_max_size
== -1
1623 || arg_max_size
!= arg_size
1627 ao_ref_init (&r
, arg
);
1630 /* Second stage walks back the BB, looks at individual statements and as long
1631 as it is confident of how the statements affect contents of the
1632 aggregates, it builds a sorted linked list of ipa_agg_jf_list structures
1634 gsi
= gsi_for_stmt (call
);
1636 for (; !gsi_end_p (gsi
); gsi_prev (&gsi
))
1638 struct ipa_known_agg_contents_list
*n
, **p
;
1639 gimple
*stmt
= gsi_stmt (gsi
);
1640 HOST_WIDE_INT lhs_offset
, lhs_size
, lhs_max_size
;
1641 tree lhs
, rhs
, lhs_base
;
1644 if (!stmt_may_clobber_ref_p_1 (stmt
, &r
))
1646 if (!gimple_assign_single_p (stmt
))
1649 lhs
= gimple_assign_lhs (stmt
);
1650 rhs
= gimple_assign_rhs1 (stmt
);
1651 if (!is_gimple_reg_type (TREE_TYPE (rhs
))
1652 || TREE_CODE (lhs
) == BIT_FIELD_REF
1653 || contains_bitfld_component_ref_p (lhs
))
1656 lhs_base
= get_ref_base_and_extent (lhs
, &lhs_offset
, &lhs_size
,
1657 &lhs_max_size
, &reverse
);
1658 if (lhs_max_size
== -1
1659 || lhs_max_size
!= lhs_size
)
1664 if (TREE_CODE (lhs_base
) != MEM_REF
1665 || TREE_OPERAND (lhs_base
, 0) != arg_base
1666 || !integer_zerop (TREE_OPERAND (lhs_base
, 1)))
1669 else if (lhs_base
!= arg_base
)
1671 if (DECL_P (lhs_base
))
1677 bool already_there
= false;
1678 p
= get_place_in_agg_contents_list (&list
, lhs_offset
, lhs_size
,
1685 rhs
= get_ssa_def_if_simple_copy (rhs
);
1686 n
= XALLOCA (struct ipa_known_agg_contents_list
);
1688 n
->offset
= lhs_offset
;
1689 if (is_gimple_ip_invariant (rhs
))
1695 n
->constant
= NULL_TREE
;
1700 if (const_count
== PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS
)
1701 || item_count
== 2 * PARAM_VALUE (PARAM_IPA_MAX_AGG_ITEMS
))
1705 /* Third stage just goes over the list and creates an appropriate vector of
1706 ipa_agg_jf_item structures out of it, of sourse only if there are
1707 any known constants to begin with. */
1711 jfunc
->agg
.by_ref
= by_ref
;
1712 build_agg_jump_func_from_list (list
, const_count
, arg_offset
, jfunc
);
1716 /* Return the Ith param type of callee associated with call graph
1720 ipa_get_callee_param_type (struct cgraph_edge
*e
, int i
)
1723 tree type
= (e
->callee
1724 ? TREE_TYPE (e
->callee
->decl
)
1725 : gimple_call_fntype (e
->call_stmt
));
1726 tree t
= TYPE_ARG_TYPES (type
);
1728 for (n
= 0; n
< i
; n
++)
1735 return TREE_VALUE (t
);
1738 t
= DECL_ARGUMENTS (e
->callee
->decl
);
1739 for (n
= 0; n
< i
; n
++)
1746 return TREE_TYPE (t
);
1750 /* Return ipa_bits with VALUE and MASK values, which can be either a newly
1751 allocated structure or a previously existing one shared with other jump
1752 functions and/or transformation summaries. */
1755 ipa_get_ipa_bits_for_value (const widest_int
&value
, const widest_int
&mask
)
1761 ipa_bits
**slot
= ipa_bits_hash_table
->find_slot (&tmp
, INSERT
);
1765 ipa_bits
*res
= ggc_alloc
<ipa_bits
> ();
1773 /* Assign to JF a pointer to ipa_bits structure with VALUE and MASK. Use hash
1774 table in order to avoid creating multiple same ipa_bits structures. */
1777 ipa_set_jfunc_bits (ipa_jump_func
*jf
, const widest_int
&value
,
1778 const widest_int
&mask
)
1780 jf
->bits
= ipa_get_ipa_bits_for_value (value
, mask
);
1783 /* Return a pointer to a value_range just like *TMP, but either find it in
1784 ipa_vr_hash_table or allocate it in GC memory. TMP->equiv must be NULL. */
1786 static value_range
*
1787 ipa_get_value_range (value_range
*tmp
)
1789 value_range
**slot
= ipa_vr_hash_table
->find_slot (tmp
, INSERT
);
1793 value_range
*vr
= ggc_alloc
<value_range
> ();
1800 /* Return a pointer to a value range consisting of TYPE, MIN, MAX and an empty
1801 equiv set. Use hash table in order to avoid creating multiple same copies of
1804 static value_range
*
1805 ipa_get_value_range (enum value_range_type type
, tree min
, tree max
)
1812 return ipa_get_value_range (&tmp
);
1815 /* Assign to JF a pointer to a value_range structure with TYPE, MIN and MAX and
1816 a NULL equiv bitmap. Use hash table in order to avoid creating multiple
1817 same value_range structures. */
1820 ipa_set_jfunc_vr (ipa_jump_func
*jf
, enum value_range_type type
,
1823 jf
->m_vr
= ipa_get_value_range (type
, min
, max
);
1826 /* Assign to JF a pointer to a value_range just liek TMP but either fetch a
1827 copy from ipa_vr_hash_table or allocate a new on in GC memory. */
1830 ipa_set_jfunc_vr (ipa_jump_func
*jf
, value_range
*tmp
)
1832 jf
->m_vr
= ipa_get_value_range (tmp
);
1835 /* Compute jump function for all arguments of callsite CS and insert the
1836 information in the jump_functions array in the ipa_edge_args corresponding
1837 to this callsite. */
1840 ipa_compute_jump_functions_for_edge (struct ipa_func_body_info
*fbi
,
1841 struct cgraph_edge
*cs
)
1843 struct ipa_node_params
*info
= IPA_NODE_REF (cs
->caller
);
1844 struct ipa_edge_args
*args
= IPA_EDGE_REF (cs
);
1845 gcall
*call
= cs
->call_stmt
;
1846 int n
, arg_num
= gimple_call_num_args (call
);
1847 bool useful_context
= false;
1849 if (arg_num
== 0 || args
->jump_functions
)
1851 vec_safe_grow_cleared (args
->jump_functions
, arg_num
);
1852 if (flag_devirtualize
)
1853 vec_safe_grow_cleared (args
->polymorphic_call_contexts
, arg_num
);
1855 if (gimple_call_internal_p (call
))
1857 if (ipa_func_spec_opts_forbid_analysis_p (cs
->caller
))
1860 for (n
= 0; n
< arg_num
; n
++)
1862 struct ipa_jump_func
*jfunc
= ipa_get_ith_jump_func (args
, n
);
1863 tree arg
= gimple_call_arg (call
, n
);
1864 tree param_type
= ipa_get_callee_param_type (cs
, n
);
1865 if (flag_devirtualize
&& POINTER_TYPE_P (TREE_TYPE (arg
)))
1868 struct ipa_polymorphic_call_context
context (cs
->caller
->decl
,
1871 context
.get_dynamic_type (instance
, arg
, NULL
, cs
->call_stmt
);
1872 *ipa_get_ith_polymorhic_call_context (args
, n
) = context
;
1873 if (!context
.useless_p ())
1874 useful_context
= true;
1877 if (POINTER_TYPE_P (TREE_TYPE (arg
)))
1879 bool addr_nonzero
= false;
1880 bool strict_overflow
= false;
1882 if (TREE_CODE (arg
) == SSA_NAME
1884 && get_ptr_nonnull (arg
))
1885 addr_nonzero
= true;
1886 else if (tree_single_nonzero_warnv_p (arg
, &strict_overflow
))
1887 addr_nonzero
= true;
1891 tree z
= build_int_cst (TREE_TYPE (arg
), 0);
1892 ipa_set_jfunc_vr (jfunc
, VR_ANTI_RANGE
, z
, z
);
1895 gcc_assert (!jfunc
->m_vr
);
1900 value_range_type type
;
1901 if (TREE_CODE (arg
) == SSA_NAME
1903 && (type
= get_range_info (arg
, &min
, &max
))
1904 && (type
== VR_RANGE
|| type
== VR_ANTI_RANGE
))
1906 value_range tmpvr
,resvr
;
1909 tmpvr
.min
= wide_int_to_tree (TREE_TYPE (arg
), min
);
1910 tmpvr
.max
= wide_int_to_tree (TREE_TYPE (arg
), max
);
1912 memset (&resvr
, 0, sizeof (resvr
));
1913 extract_range_from_unary_expr (&resvr
, NOP_EXPR
, param_type
,
1914 &tmpvr
, TREE_TYPE (arg
));
1915 if (resvr
.type
== VR_RANGE
|| resvr
.type
== VR_ANTI_RANGE
)
1916 ipa_set_jfunc_vr (jfunc
, &resvr
);
1918 gcc_assert (!jfunc
->m_vr
);
1921 gcc_assert (!jfunc
->m_vr
);
1924 if (INTEGRAL_TYPE_P (TREE_TYPE (arg
))
1925 && (TREE_CODE (arg
) == SSA_NAME
|| TREE_CODE (arg
) == INTEGER_CST
))
1927 if (TREE_CODE (arg
) == SSA_NAME
)
1928 ipa_set_jfunc_bits (jfunc
, 0,
1929 widest_int::from (get_nonzero_bits (arg
),
1930 TYPE_SIGN (TREE_TYPE (arg
))));
1932 ipa_set_jfunc_bits (jfunc
, wi::to_widest (arg
), 0);
1934 else if (POINTER_TYPE_P (TREE_TYPE (arg
)))
1936 unsigned HOST_WIDE_INT bitpos
;
1939 get_pointer_alignment_1 (arg
, &align
, &bitpos
);
1941 = wi::mask
<widest_int
>(TYPE_PRECISION (TREE_TYPE (arg
)), false)
1942 .and_not (align
/ BITS_PER_UNIT
- 1);
1943 widest_int value
= bitpos
/ BITS_PER_UNIT
;
1944 ipa_set_jfunc_bits (jfunc
, value
, mask
);
1947 gcc_assert (!jfunc
->bits
);
1949 if (is_gimple_ip_invariant (arg
)
1951 && is_global_var (arg
)
1952 && TREE_READONLY (arg
)))
1953 ipa_set_jf_constant (jfunc
, arg
, cs
);
1954 else if (!is_gimple_reg_type (TREE_TYPE (arg
))
1955 && TREE_CODE (arg
) == PARM_DECL
)
1957 int index
= ipa_get_param_decl_index (info
, arg
);
1959 gcc_assert (index
>=0);
1960 /* Aggregate passed by value, check for pass-through, otherwise we
1961 will attempt to fill in aggregate contents later in this
1963 if (parm_preserved_before_stmt_p (fbi
, index
, call
, arg
))
1965 ipa_set_jf_simple_pass_through (jfunc
, index
, false);
1969 else if (TREE_CODE (arg
) == SSA_NAME
)
1971 if (SSA_NAME_IS_DEFAULT_DEF (arg
))
1973 int index
= ipa_get_param_decl_index (info
, SSA_NAME_VAR (arg
));
1977 agg_p
= parm_ref_data_pass_through_p (fbi
, index
, call
, arg
);
1978 ipa_set_jf_simple_pass_through (jfunc
, index
, agg_p
);
1983 gimple
*stmt
= SSA_NAME_DEF_STMT (arg
);
1984 if (is_gimple_assign (stmt
))
1985 compute_complex_assign_jump_func (fbi
, info
, jfunc
,
1986 call
, stmt
, arg
, param_type
);
1987 else if (gimple_code (stmt
) == GIMPLE_PHI
)
1988 compute_complex_ancestor_jump_func (fbi
, info
, jfunc
,
1990 as_a
<gphi
*> (stmt
));
1994 /* If ARG is pointer, we can not use its type to determine the type of aggregate
1995 passed (because type conversions are ignored in gimple). Usually we can
1996 safely get type from function declaration, but in case of K&R prototypes or
1997 variadic functions we can try our luck with type of the pointer passed.
1998 TODO: Since we look for actual initialization of the memory object, we may better
1999 work out the type based on the memory stores we find. */
2001 param_type
= TREE_TYPE (arg
);
2003 if ((jfunc
->type
!= IPA_JF_PASS_THROUGH
2004 || !ipa_get_jf_pass_through_agg_preserved (jfunc
))
2005 && (jfunc
->type
!= IPA_JF_ANCESTOR
2006 || !ipa_get_jf_ancestor_agg_preserved (jfunc
))
2007 && (AGGREGATE_TYPE_P (TREE_TYPE (arg
))
2008 || POINTER_TYPE_P (param_type
)))
2009 determine_locally_known_aggregate_parts (call
, arg
, param_type
, jfunc
);
2011 if (!useful_context
)
2012 vec_free (args
->polymorphic_call_contexts
);
2015 /* Compute jump functions for all edges - both direct and indirect - outgoing
2019 ipa_compute_jump_functions_for_bb (struct ipa_func_body_info
*fbi
, basic_block bb
)
2021 struct ipa_bb_info
*bi
= ipa_get_bb_info (fbi
, bb
);
2023 struct cgraph_edge
*cs
;
2025 FOR_EACH_VEC_ELT_REVERSE (bi
->cg_edges
, i
, cs
)
2027 struct cgraph_node
*callee
= cs
->callee
;
2031 callee
->ultimate_alias_target ();
2032 /* We do not need to bother analyzing calls to unknown functions
2033 unless they may become known during lto/whopr. */
2034 if (!callee
->definition
&& !flag_lto
)
2037 ipa_compute_jump_functions_for_edge (fbi
, cs
);
2041 /* If STMT looks like a statement loading a value from a member pointer formal
2042 parameter, return that parameter and store the offset of the field to
2043 *OFFSET_P, if it is non-NULL. Otherwise return NULL (but *OFFSET_P still
2044 might be clobbered). If USE_DELTA, then we look for a use of the delta
2045 field rather than the pfn. */
2048 ipa_get_stmt_member_ptr_load_param (gimple
*stmt
, bool use_delta
,
2049 HOST_WIDE_INT
*offset_p
)
2051 tree rhs
, rec
, ref_field
, ref_offset
, fld
, ptr_field
, delta_field
;
2053 if (!gimple_assign_single_p (stmt
))
2056 rhs
= gimple_assign_rhs1 (stmt
);
2057 if (TREE_CODE (rhs
) == COMPONENT_REF
)
2059 ref_field
= TREE_OPERAND (rhs
, 1);
2060 rhs
= TREE_OPERAND (rhs
, 0);
2063 ref_field
= NULL_TREE
;
2064 if (TREE_CODE (rhs
) != MEM_REF
)
2066 rec
= TREE_OPERAND (rhs
, 0);
2067 if (TREE_CODE (rec
) != ADDR_EXPR
)
2069 rec
= TREE_OPERAND (rec
, 0);
2070 if (TREE_CODE (rec
) != PARM_DECL
2071 || !type_like_member_ptr_p (TREE_TYPE (rec
), &ptr_field
, &delta_field
))
2073 ref_offset
= TREE_OPERAND (rhs
, 1);
2080 *offset_p
= int_bit_position (fld
);
2084 if (integer_nonzerop (ref_offset
))
2086 return ref_field
== fld
? rec
: NULL_TREE
;
2089 return tree_int_cst_equal (byte_position (fld
), ref_offset
) ? rec
2093 /* Returns true iff T is an SSA_NAME defined by a statement. */
2096 ipa_is_ssa_with_stmt_def (tree t
)
2098 if (TREE_CODE (t
) == SSA_NAME
2099 && !SSA_NAME_IS_DEFAULT_DEF (t
))
2105 /* Find the indirect call graph edge corresponding to STMT and mark it as a
2106 call to a parameter number PARAM_INDEX. NODE is the caller. Return the
2107 indirect call graph edge. */
2109 static struct cgraph_edge
*
2110 ipa_note_param_call (struct cgraph_node
*node
, int param_index
,
2113 struct cgraph_edge
*cs
;
2115 cs
= node
->get_edge (stmt
);
2116 cs
->indirect_info
->param_index
= param_index
;
2117 cs
->indirect_info
->agg_contents
= 0;
2118 cs
->indirect_info
->member_ptr
= 0;
2119 cs
->indirect_info
->guaranteed_unmodified
= 0;
2123 /* Analyze the CALL and examine uses of formal parameters of the caller NODE
2124 (described by INFO). PARMS_AINFO is a pointer to a vector containing
2125 intermediate information about each formal parameter. Currently it checks
2126 whether the call calls a pointer that is a formal parameter and if so, the
2127 parameter is marked with the called flag and an indirect call graph edge
2128 describing the call is created. This is very simple for ordinary pointers
2129 represented in SSA but not-so-nice when it comes to member pointers. The
2130 ugly part of this function does nothing more than trying to match the
2131 pattern of such a call. An example of such a pattern is the gimple dump
2132 below, the call is on the last line:
2135 f$__delta_5 = f.__delta;
2136 f$__pfn_24 = f.__pfn;
2140 f$__delta_5 = MEM[(struct *)&f];
2141 f$__pfn_24 = MEM[(struct *)&f + 4B];
2143 and a few lines below:
2146 D.2496_3 = (int) f$__pfn_24;
2147 D.2497_4 = D.2496_3 & 1;
2154 D.2500_7 = (unsigned int) f$__delta_5;
2155 D.2501_8 = &S + D.2500_7;
2156 D.2502_9 = (int (*__vtbl_ptr_type) (void) * *) D.2501_8;
2157 D.2503_10 = *D.2502_9;
2158 D.2504_12 = f$__pfn_24 + -1;
2159 D.2505_13 = (unsigned int) D.2504_12;
2160 D.2506_14 = D.2503_10 + D.2505_13;
2161 D.2507_15 = *D.2506_14;
2162 iftmp.11_16 = (String:: *) D.2507_15;
2165 # iftmp.11_1 = PHI <iftmp.11_16(3), f$__pfn_24(2)>
2166 D.2500_19 = (unsigned int) f$__delta_5;
2167 D.2508_20 = &S + D.2500_19;
2168 D.2493_21 = iftmp.11_1 (D.2508_20, 4);
2170 Such patterns are results of simple calls to a member pointer:
2172 int doprinting (int (MyString::* f)(int) const)
2174 MyString S ("somestring");
2179 Moreover, the function also looks for called pointers loaded from aggregates
2180 passed by value or reference. */
2183 ipa_analyze_indirect_call_uses (struct ipa_func_body_info
*fbi
, gcall
*call
,
2186 struct ipa_node_params
*info
= fbi
->info
;
2187 HOST_WIDE_INT offset
;
2190 if (SSA_NAME_IS_DEFAULT_DEF (target
))
2192 tree var
= SSA_NAME_VAR (target
);
2193 int index
= ipa_get_param_decl_index (info
, var
);
2195 ipa_note_param_call (fbi
->node
, index
, call
);
2200 gimple
*def
= SSA_NAME_DEF_STMT (target
);
2201 bool guaranteed_unmodified
;
2202 if (gimple_assign_single_p (def
)
2203 && ipa_load_from_parm_agg (fbi
, info
->descriptors
, def
,
2204 gimple_assign_rhs1 (def
), &index
, &offset
,
2205 NULL
, &by_ref
, &guaranteed_unmodified
))
2207 struct cgraph_edge
*cs
= ipa_note_param_call (fbi
->node
, index
, call
);
2208 cs
->indirect_info
->offset
= offset
;
2209 cs
->indirect_info
->agg_contents
= 1;
2210 cs
->indirect_info
->by_ref
= by_ref
;
2211 cs
->indirect_info
->guaranteed_unmodified
= guaranteed_unmodified
;
2215 /* Now we need to try to match the complex pattern of calling a member
2217 if (gimple_code (def
) != GIMPLE_PHI
2218 || gimple_phi_num_args (def
) != 2
2219 || !POINTER_TYPE_P (TREE_TYPE (target
))
2220 || TREE_CODE (TREE_TYPE (TREE_TYPE (target
))) != METHOD_TYPE
)
2223 /* First, we need to check whether one of these is a load from a member
2224 pointer that is a parameter to this function. */
2225 tree n1
= PHI_ARG_DEF (def
, 0);
2226 tree n2
= PHI_ARG_DEF (def
, 1);
2227 if (!ipa_is_ssa_with_stmt_def (n1
) || !ipa_is_ssa_with_stmt_def (n2
))
2229 gimple
*d1
= SSA_NAME_DEF_STMT (n1
);
2230 gimple
*d2
= SSA_NAME_DEF_STMT (n2
);
2233 basic_block bb
, virt_bb
;
2234 basic_block join
= gimple_bb (def
);
2235 if ((rec
= ipa_get_stmt_member_ptr_load_param (d1
, false, &offset
)))
2237 if (ipa_get_stmt_member_ptr_load_param (d2
, false, NULL
))
2240 bb
= EDGE_PRED (join
, 0)->src
;
2241 virt_bb
= gimple_bb (d2
);
2243 else if ((rec
= ipa_get_stmt_member_ptr_load_param (d2
, false, &offset
)))
2245 bb
= EDGE_PRED (join
, 1)->src
;
2246 virt_bb
= gimple_bb (d1
);
2251 /* Second, we need to check that the basic blocks are laid out in the way
2252 corresponding to the pattern. */
2254 if (!single_pred_p (virt_bb
) || !single_succ_p (virt_bb
)
2255 || single_pred (virt_bb
) != bb
2256 || single_succ (virt_bb
) != join
)
2259 /* Third, let's see that the branching is done depending on the least
2260 significant bit of the pfn. */
2262 gimple
*branch
= last_stmt (bb
);
2263 if (!branch
|| gimple_code (branch
) != GIMPLE_COND
)
2266 if ((gimple_cond_code (branch
) != NE_EXPR
2267 && gimple_cond_code (branch
) != EQ_EXPR
)
2268 || !integer_zerop (gimple_cond_rhs (branch
)))
2271 tree cond
= gimple_cond_lhs (branch
);
2272 if (!ipa_is_ssa_with_stmt_def (cond
))
2275 def
= SSA_NAME_DEF_STMT (cond
);
2276 if (!is_gimple_assign (def
)
2277 || gimple_assign_rhs_code (def
) != BIT_AND_EXPR
2278 || !integer_onep (gimple_assign_rhs2 (def
)))
2281 cond
= gimple_assign_rhs1 (def
);
2282 if (!ipa_is_ssa_with_stmt_def (cond
))
2285 def
= SSA_NAME_DEF_STMT (cond
);
2287 if (is_gimple_assign (def
)
2288 && CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def
)))
2290 cond
= gimple_assign_rhs1 (def
);
2291 if (!ipa_is_ssa_with_stmt_def (cond
))
2293 def
= SSA_NAME_DEF_STMT (cond
);
2297 rec2
= ipa_get_stmt_member_ptr_load_param (def
,
2298 (TARGET_PTRMEMFUNC_VBIT_LOCATION
2299 == ptrmemfunc_vbit_in_delta
),
2304 index
= ipa_get_param_decl_index (info
, rec
);
2306 && parm_preserved_before_stmt_p (fbi
, index
, call
, rec
))
2308 struct cgraph_edge
*cs
= ipa_note_param_call (fbi
->node
, index
, call
);
2309 cs
->indirect_info
->offset
= offset
;
2310 cs
->indirect_info
->agg_contents
= 1;
2311 cs
->indirect_info
->member_ptr
= 1;
2312 cs
->indirect_info
->guaranteed_unmodified
= 1;
2318 /* Analyze a CALL to an OBJ_TYPE_REF which is passed in TARGET and if the
2319 object referenced in the expression is a formal parameter of the caller
2320 FBI->node (described by FBI->info), create a call note for the
2324 ipa_analyze_virtual_call_uses (struct ipa_func_body_info
*fbi
,
2325 gcall
*call
, tree target
)
2327 tree obj
= OBJ_TYPE_REF_OBJECT (target
);
2329 HOST_WIDE_INT anc_offset
;
2331 if (!flag_devirtualize
)
2334 if (TREE_CODE (obj
) != SSA_NAME
)
2337 struct ipa_node_params
*info
= fbi
->info
;
2338 if (SSA_NAME_IS_DEFAULT_DEF (obj
))
2340 struct ipa_jump_func jfunc
;
2341 if (TREE_CODE (SSA_NAME_VAR (obj
)) != PARM_DECL
)
2345 index
= ipa_get_param_decl_index (info
, SSA_NAME_VAR (obj
));
2346 gcc_assert (index
>= 0);
2347 if (detect_type_change_ssa (obj
, obj_type_ref_class (target
),
2353 struct ipa_jump_func jfunc
;
2354 gimple
*stmt
= SSA_NAME_DEF_STMT (obj
);
2357 expr
= get_ancestor_addr_info (stmt
, &obj
, &anc_offset
);
2360 index
= ipa_get_param_decl_index (info
,
2361 SSA_NAME_VAR (TREE_OPERAND (expr
, 0)));
2362 gcc_assert (index
>= 0);
2363 if (detect_type_change (obj
, expr
, obj_type_ref_class (target
),
2364 call
, &jfunc
, anc_offset
))
2368 struct cgraph_edge
*cs
= ipa_note_param_call (fbi
->node
, index
, call
);
2369 struct cgraph_indirect_call_info
*ii
= cs
->indirect_info
;
2370 ii
->offset
= anc_offset
;
2371 ii
->otr_token
= tree_to_uhwi (OBJ_TYPE_REF_TOKEN (target
));
2372 ii
->otr_type
= obj_type_ref_class (target
);
2373 ii
->polymorphic
= 1;
2376 /* Analyze a call statement CALL whether and how it utilizes formal parameters
2377 of the caller (described by INFO). PARMS_AINFO is a pointer to a vector
2378 containing intermediate information about each formal parameter. */
2381 ipa_analyze_call_uses (struct ipa_func_body_info
*fbi
, gcall
*call
)
2383 tree target
= gimple_call_fn (call
);
2386 || (TREE_CODE (target
) != SSA_NAME
2387 && !virtual_method_call_p (target
)))
2390 struct cgraph_edge
*cs
= fbi
->node
->get_edge (call
);
2391 /* If we previously turned the call into a direct call, there is
2392 no need to analyze. */
2393 if (cs
&& !cs
->indirect_unknown_callee
)
2396 if (cs
->indirect_info
->polymorphic
&& flag_devirtualize
)
2399 tree target
= gimple_call_fn (call
);
2400 ipa_polymorphic_call_context
context (current_function_decl
,
2401 target
, call
, &instance
);
2403 gcc_checking_assert (cs
->indirect_info
->otr_type
2404 == obj_type_ref_class (target
));
2405 gcc_checking_assert (cs
->indirect_info
->otr_token
2406 == tree_to_shwi (OBJ_TYPE_REF_TOKEN (target
)));
2408 cs
->indirect_info
->vptr_changed
2409 = !context
.get_dynamic_type (instance
,
2410 OBJ_TYPE_REF_OBJECT (target
),
2411 obj_type_ref_class (target
), call
);
2412 cs
->indirect_info
->context
= context
;
2415 if (TREE_CODE (target
) == SSA_NAME
)
2416 ipa_analyze_indirect_call_uses (fbi
, call
, target
);
2417 else if (virtual_method_call_p (target
))
2418 ipa_analyze_virtual_call_uses (fbi
, call
, target
);
2422 /* Analyze the call statement STMT with respect to formal parameters (described
2423 in INFO) of caller given by FBI->NODE. Currently it only checks whether
2424 formal parameters are called. */
2427 ipa_analyze_stmt_uses (struct ipa_func_body_info
*fbi
, gimple
*stmt
)
2429 if (is_gimple_call (stmt
))
2430 ipa_analyze_call_uses (fbi
, as_a
<gcall
*> (stmt
));
2433 /* Callback of walk_stmt_load_store_addr_ops for the visit_load.
2434 If OP is a parameter declaration, mark it as used in the info structure
2438 visit_ref_for_mod_analysis (gimple
*, tree op
, tree
, void *data
)
2440 struct ipa_node_params
*info
= (struct ipa_node_params
*) data
;
2442 op
= get_base_address (op
);
2444 && TREE_CODE (op
) == PARM_DECL
)
2446 int index
= ipa_get_param_decl_index (info
, op
);
2447 gcc_assert (index
>= 0);
2448 ipa_set_param_used (info
, index
, true);
2454 /* Scan the statements in BB and inspect the uses of formal parameters. Store
2455 the findings in various structures of the associated ipa_node_params
2456 structure, such as parameter flags, notes etc. FBI holds various data about
2457 the function being analyzed. */
2460 ipa_analyze_params_uses_in_bb (struct ipa_func_body_info
*fbi
, basic_block bb
)
2462 gimple_stmt_iterator gsi
;
2463 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
2465 gimple
*stmt
= gsi_stmt (gsi
);
2467 if (is_gimple_debug (stmt
))
2470 ipa_analyze_stmt_uses (fbi
, stmt
);
2471 walk_stmt_load_store_addr_ops (stmt
, fbi
->info
,
2472 visit_ref_for_mod_analysis
,
2473 visit_ref_for_mod_analysis
,
2474 visit_ref_for_mod_analysis
);
2476 for (gsi
= gsi_start_phis (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
2477 walk_stmt_load_store_addr_ops (gsi_stmt (gsi
), fbi
->info
,
2478 visit_ref_for_mod_analysis
,
2479 visit_ref_for_mod_analysis
,
2480 visit_ref_for_mod_analysis
);
2483 /* Calculate controlled uses of parameters of NODE. */
2486 ipa_analyze_controlled_uses (struct cgraph_node
*node
)
2488 struct ipa_node_params
*info
= IPA_NODE_REF (node
);
2490 for (int i
= 0; i
< ipa_get_param_count (info
); i
++)
2492 tree parm
= ipa_get_param (info
, i
);
2493 int controlled_uses
= 0;
2495 /* For SSA regs see if parameter is used. For non-SSA we compute
2496 the flag during modification analysis. */
2497 if (is_gimple_reg (parm
))
2499 tree ddef
= ssa_default_def (DECL_STRUCT_FUNCTION (node
->decl
),
2501 if (ddef
&& !has_zero_uses (ddef
))
2503 imm_use_iterator imm_iter
;
2504 use_operand_p use_p
;
2506 ipa_set_param_used (info
, i
, true);
2507 FOR_EACH_IMM_USE_FAST (use_p
, imm_iter
, ddef
)
2508 if (!is_gimple_call (USE_STMT (use_p
)))
2510 if (!is_gimple_debug (USE_STMT (use_p
)))
2512 controlled_uses
= IPA_UNDESCRIBED_USE
;
2520 controlled_uses
= 0;
2523 controlled_uses
= IPA_UNDESCRIBED_USE
;
2524 ipa_set_controlled_uses (info
, i
, controlled_uses
);
2528 /* Free stuff in BI. */
2531 free_ipa_bb_info (struct ipa_bb_info
*bi
)
2533 bi
->cg_edges
.release ();
2534 bi
->param_aa_statuses
.release ();
2537 /* Dominator walker driving the analysis. */
2539 class analysis_dom_walker
: public dom_walker
2542 analysis_dom_walker (struct ipa_func_body_info
*fbi
)
2543 : dom_walker (CDI_DOMINATORS
), m_fbi (fbi
) {}
2545 virtual edge
before_dom_children (basic_block
);
2548 struct ipa_func_body_info
*m_fbi
;
2552 analysis_dom_walker::before_dom_children (basic_block bb
)
2554 ipa_analyze_params_uses_in_bb (m_fbi
, bb
);
2555 ipa_compute_jump_functions_for_bb (m_fbi
, bb
);
2559 /* Release body info FBI. */
2562 ipa_release_body_info (struct ipa_func_body_info
*fbi
)
2565 struct ipa_bb_info
*bi
;
2567 FOR_EACH_VEC_ELT (fbi
->bb_infos
, i
, bi
)
2568 free_ipa_bb_info (bi
);
2569 fbi
->bb_infos
.release ();
2572 /* Initialize the array describing properties of formal parameters
2573 of NODE, analyze their uses and compute jump functions associated
2574 with actual arguments of calls from within NODE. */
2577 ipa_analyze_node (struct cgraph_node
*node
)
2579 struct ipa_func_body_info fbi
;
2580 struct ipa_node_params
*info
;
2582 ipa_check_create_node_params ();
2583 ipa_check_create_edge_args ();
2584 info
= IPA_NODE_REF (node
);
2586 if (info
->analysis_done
)
2588 info
->analysis_done
= 1;
2590 if (ipa_func_spec_opts_forbid_analysis_p (node
))
2592 for (int i
= 0; i
< ipa_get_param_count (info
); i
++)
2594 ipa_set_param_used (info
, i
, true);
2595 ipa_set_controlled_uses (info
, i
, IPA_UNDESCRIBED_USE
);
2600 struct function
*func
= DECL_STRUCT_FUNCTION (node
->decl
);
2602 calculate_dominance_info (CDI_DOMINATORS
);
2603 ipa_initialize_node_params (node
);
2604 ipa_analyze_controlled_uses (node
);
2607 fbi
.info
= IPA_NODE_REF (node
);
2608 fbi
.bb_infos
= vNULL
;
2609 fbi
.bb_infos
.safe_grow_cleared (last_basic_block_for_fn (cfun
));
2610 fbi
.param_count
= ipa_get_param_count (info
);
2613 for (struct cgraph_edge
*cs
= node
->callees
; cs
; cs
= cs
->next_callee
)
2615 ipa_bb_info
*bi
= ipa_get_bb_info (&fbi
, gimple_bb (cs
->call_stmt
));
2616 bi
->cg_edges
.safe_push (cs
);
2619 for (struct cgraph_edge
*cs
= node
->indirect_calls
; cs
; cs
= cs
->next_callee
)
2621 ipa_bb_info
*bi
= ipa_get_bb_info (&fbi
, gimple_bb (cs
->call_stmt
));
2622 bi
->cg_edges
.safe_push (cs
);
2625 analysis_dom_walker (&fbi
).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun
));
2627 ipa_release_body_info (&fbi
);
2628 free_dominance_info (CDI_DOMINATORS
);
2632 /* Update the jump functions associated with call graph edge E when the call
2633 graph edge CS is being inlined, assuming that E->caller is already (possibly
2634 indirectly) inlined into CS->callee and that E has not been inlined. */
2637 update_jump_functions_after_inlining (struct cgraph_edge
*cs
,
2638 struct cgraph_edge
*e
)
2640 struct ipa_edge_args
*top
= IPA_EDGE_REF (cs
);
2641 struct ipa_edge_args
*args
= IPA_EDGE_REF (e
);
2642 int count
= ipa_get_cs_argument_count (args
);
2645 for (i
= 0; i
< count
; i
++)
2647 struct ipa_jump_func
*dst
= ipa_get_ith_jump_func (args
, i
);
2648 struct ipa_polymorphic_call_context
*dst_ctx
2649 = ipa_get_ith_polymorhic_call_context (args
, i
);
2651 if (dst
->type
== IPA_JF_ANCESTOR
)
2653 struct ipa_jump_func
*src
;
2654 int dst_fid
= dst
->value
.ancestor
.formal_id
;
2655 struct ipa_polymorphic_call_context
*src_ctx
2656 = ipa_get_ith_polymorhic_call_context (top
, dst_fid
);
2658 /* Variable number of arguments can cause havoc if we try to access
2659 one that does not exist in the inlined edge. So make sure we
2661 if (dst_fid
>= ipa_get_cs_argument_count (top
))
2663 ipa_set_jf_unknown (dst
);
2667 src
= ipa_get_ith_jump_func (top
, dst_fid
);
2669 if (src_ctx
&& !src_ctx
->useless_p ())
2671 struct ipa_polymorphic_call_context ctx
= *src_ctx
;
2673 /* TODO: Make type preserved safe WRT contexts. */
2674 if (!ipa_get_jf_ancestor_type_preserved (dst
))
2675 ctx
.possible_dynamic_type_change (e
->in_polymorphic_cdtor
);
2676 ctx
.offset_by (dst
->value
.ancestor
.offset
);
2677 if (!ctx
.useless_p ())
2681 vec_safe_grow_cleared (args
->polymorphic_call_contexts
,
2683 dst_ctx
= ipa_get_ith_polymorhic_call_context (args
, i
);
2686 dst_ctx
->combine_with (ctx
);
2691 && (dst
->value
.ancestor
.agg_preserved
|| !src
->agg
.by_ref
))
2693 struct ipa_agg_jf_item
*item
;
2696 /* Currently we do not produce clobber aggregate jump functions,
2697 replace with merging when we do. */
2698 gcc_assert (!dst
->agg
.items
);
2700 dst
->agg
.items
= vec_safe_copy (src
->agg
.items
);
2701 dst
->agg
.by_ref
= src
->agg
.by_ref
;
2702 FOR_EACH_VEC_SAFE_ELT (dst
->agg
.items
, j
, item
)
2703 item
->offset
-= dst
->value
.ancestor
.offset
;
2706 if (src
->type
== IPA_JF_PASS_THROUGH
2707 && src
->value
.pass_through
.operation
== NOP_EXPR
)
2709 dst
->value
.ancestor
.formal_id
= src
->value
.pass_through
.formal_id
;
2710 dst
->value
.ancestor
.agg_preserved
&=
2711 src
->value
.pass_through
.agg_preserved
;
2713 else if (src
->type
== IPA_JF_PASS_THROUGH
2714 && TREE_CODE_CLASS (src
->value
.pass_through
.operation
) == tcc_unary
)
2716 dst
->value
.ancestor
.formal_id
= src
->value
.pass_through
.formal_id
;
2717 dst
->value
.ancestor
.agg_preserved
= false;
2719 else if (src
->type
== IPA_JF_ANCESTOR
)
2721 dst
->value
.ancestor
.formal_id
= src
->value
.ancestor
.formal_id
;
2722 dst
->value
.ancestor
.offset
+= src
->value
.ancestor
.offset
;
2723 dst
->value
.ancestor
.agg_preserved
&=
2724 src
->value
.ancestor
.agg_preserved
;
2727 ipa_set_jf_unknown (dst
);
2729 else if (dst
->type
== IPA_JF_PASS_THROUGH
)
2731 struct ipa_jump_func
*src
;
2732 /* We must check range due to calls with variable number of arguments
2733 and we cannot combine jump functions with operations. */
2734 if (dst
->value
.pass_through
.operation
== NOP_EXPR
2735 && (dst
->value
.pass_through
.formal_id
2736 < ipa_get_cs_argument_count (top
)))
2738 int dst_fid
= dst
->value
.pass_through
.formal_id
;
2739 src
= ipa_get_ith_jump_func (top
, dst_fid
);
2740 bool dst_agg_p
= ipa_get_jf_pass_through_agg_preserved (dst
);
2741 struct ipa_polymorphic_call_context
*src_ctx
2742 = ipa_get_ith_polymorhic_call_context (top
, dst_fid
);
2744 if (src_ctx
&& !src_ctx
->useless_p ())
2746 struct ipa_polymorphic_call_context ctx
= *src_ctx
;
2748 /* TODO: Make type preserved safe WRT contexts. */
2749 if (!ipa_get_jf_pass_through_type_preserved (dst
))
2750 ctx
.possible_dynamic_type_change (e
->in_polymorphic_cdtor
);
2751 if (!ctx
.useless_p ())
2755 vec_safe_grow_cleared (args
->polymorphic_call_contexts
,
2757 dst_ctx
= ipa_get_ith_polymorhic_call_context (args
, i
);
2759 dst_ctx
->combine_with (ctx
);
2764 case IPA_JF_UNKNOWN
:
2765 ipa_set_jf_unknown (dst
);
2768 ipa_set_jf_cst_copy (dst
, src
);
2771 case IPA_JF_PASS_THROUGH
:
2773 int formal_id
= ipa_get_jf_pass_through_formal_id (src
);
2774 enum tree_code operation
;
2775 operation
= ipa_get_jf_pass_through_operation (src
);
2777 if (operation
== NOP_EXPR
)
2781 && ipa_get_jf_pass_through_agg_preserved (src
);
2782 ipa_set_jf_simple_pass_through (dst
, formal_id
, agg_p
);
2784 else if (TREE_CODE_CLASS (operation
) == tcc_unary
)
2785 ipa_set_jf_unary_pass_through (dst
, formal_id
, operation
);
2788 tree operand
= ipa_get_jf_pass_through_operand (src
);
2789 ipa_set_jf_arith_pass_through (dst
, formal_id
, operand
,
2794 case IPA_JF_ANCESTOR
:
2798 && ipa_get_jf_ancestor_agg_preserved (src
);
2799 ipa_set_ancestor_jf (dst
,
2800 ipa_get_jf_ancestor_offset (src
),
2801 ipa_get_jf_ancestor_formal_id (src
),
2810 && (dst_agg_p
|| !src
->agg
.by_ref
))
2812 /* Currently we do not produce clobber aggregate jump
2813 functions, replace with merging when we do. */
2814 gcc_assert (!dst
->agg
.items
);
2816 dst
->agg
.by_ref
= src
->agg
.by_ref
;
2817 dst
->agg
.items
= vec_safe_copy (src
->agg
.items
);
2821 ipa_set_jf_unknown (dst
);
2826 /* If TARGET is an addr_expr of a function declaration, make it the
2827 (SPECULATIVE)destination of an indirect edge IE and return the edge.
2828 Otherwise, return NULL. */
2830 struct cgraph_edge
*
2831 ipa_make_edge_direct_to_target (struct cgraph_edge
*ie
, tree target
,
2834 struct cgraph_node
*callee
;
2835 struct inline_edge_summary
*es
= inline_edge_summary (ie
);
2836 bool unreachable
= false;
2838 if (TREE_CODE (target
) == ADDR_EXPR
)
2839 target
= TREE_OPERAND (target
, 0);
2840 if (TREE_CODE (target
) != FUNCTION_DECL
)
2842 target
= canonicalize_constructor_val (target
, NULL
);
2843 if (!target
|| TREE_CODE (target
) != FUNCTION_DECL
)
2845 /* Member pointer call that goes through a VMT lookup. */
2846 if (ie
->indirect_info
->member_ptr
2847 /* Or if target is not an invariant expression and we do not
2848 know if it will evaulate to function at runtime.
2849 This can happen when folding through &VAR, where &VAR
2850 is IP invariant, but VAR itself is not.
2852 TODO: Revisit this when GCC 5 is branched. It seems that
2853 member_ptr check is not needed and that we may try to fold
2854 the expression and see if VAR is readonly. */
2855 || !is_gimple_ip_invariant (target
))
2857 if (dump_enabled_p ())
2859 location_t loc
= gimple_location_safe (ie
->call_stmt
);
2860 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
2861 "discovered direct call non-invariant "
2863 ie
->caller
->name (), ie
->caller
->order
);
2869 if (dump_enabled_p ())
2871 location_t loc
= gimple_location_safe (ie
->call_stmt
);
2872 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
2873 "discovered direct call to non-function in %s/%i, "
2874 "making it __builtin_unreachable\n",
2875 ie
->caller
->name (), ie
->caller
->order
);
2878 target
= builtin_decl_implicit (BUILT_IN_UNREACHABLE
);
2879 callee
= cgraph_node::get_create (target
);
2883 callee
= cgraph_node::get (target
);
2886 callee
= cgraph_node::get (target
);
2888 /* Because may-edges are not explicitely represented and vtable may be external,
2889 we may create the first reference to the object in the unit. */
2890 if (!callee
|| callee
->global
.inlined_to
)
2893 /* We are better to ensure we can refer to it.
2894 In the case of static functions we are out of luck, since we already
2895 removed its body. In the case of public functions we may or may
2896 not introduce the reference. */
2897 if (!canonicalize_constructor_val (target
, NULL
)
2898 || !TREE_PUBLIC (target
))
2901 fprintf (dump_file
, "ipa-prop: Discovered call to a known target "
2902 "(%s/%i -> %s/%i) but can not refer to it. Giving up.\n",
2903 xstrdup_for_dump (ie
->caller
->name ()),
2905 xstrdup_for_dump (ie
->callee
->name ()),
2909 callee
= cgraph_node::get_create (target
);
2912 /* If the edge is already speculated. */
2913 if (speculative
&& ie
->speculative
)
2915 struct cgraph_edge
*e2
;
2916 struct ipa_ref
*ref
;
2917 ie
->speculative_call_info (e2
, ie
, ref
);
2918 if (e2
->callee
->ultimate_alias_target ()
2919 != callee
->ultimate_alias_target ())
2922 fprintf (dump_file
, "ipa-prop: Discovered call to a speculative target "
2923 "(%s/%i -> %s/%i) but the call is already speculated to %s/%i. Giving up.\n",
2924 xstrdup_for_dump (ie
->caller
->name ()),
2926 xstrdup_for_dump (callee
->name ()),
2928 xstrdup_for_dump (e2
->callee
->name ()),
2934 fprintf (dump_file
, "ipa-prop: Discovered call to a speculative target "
2935 "(%s/%i -> %s/%i) this agree with previous speculation.\n",
2936 xstrdup_for_dump (ie
->caller
->name ()),
2938 xstrdup_for_dump (callee
->name ()),
2944 if (!dbg_cnt (devirt
))
2947 ipa_check_create_node_params ();
2949 /* We can not make edges to inline clones. It is bug that someone removed
2950 the cgraph node too early. */
2951 gcc_assert (!callee
->global
.inlined_to
);
2953 if (dump_file
&& !unreachable
)
2955 fprintf (dump_file
, "ipa-prop: Discovered %s call to a %s target "
2956 "(%s/%i -> %s/%i), for stmt ",
2957 ie
->indirect_info
->polymorphic
? "a virtual" : "an indirect",
2958 speculative
? "speculative" : "known",
2959 xstrdup_for_dump (ie
->caller
->name ()),
2961 xstrdup_for_dump (callee
->name ()),
2964 print_gimple_stmt (dump_file
, ie
->call_stmt
, 2, TDF_SLIM
);
2966 fprintf (dump_file
, "with uid %i\n", ie
->lto_stmt_uid
);
2968 if (dump_enabled_p ())
2970 location_t loc
= gimple_location_safe (ie
->call_stmt
);
2972 dump_printf_loc (MSG_OPTIMIZED_LOCATIONS
, loc
,
2973 "converting indirect call in %s to direct call to %s\n",
2974 ie
->caller
->name (), callee
->name ());
2978 struct cgraph_edge
*orig
= ie
;
2979 ie
= ie
->make_direct (callee
);
2980 /* If we resolved speculative edge the cost is already up to date
2981 for direct call (adjusted by inline_edge_duplication_hook). */
2984 es
= inline_edge_summary (ie
);
2985 es
->call_stmt_size
-= (eni_size_weights
.indirect_call_cost
2986 - eni_size_weights
.call_cost
);
2987 es
->call_stmt_time
-= (eni_time_weights
.indirect_call_cost
2988 - eni_time_weights
.call_cost
);
2993 if (!callee
->can_be_discarded_p ())
2996 alias
= dyn_cast
<cgraph_node
*> (callee
->noninterposable_alias ());
3000 /* make_speculative will update ie's cost to direct call cost. */
3001 ie
= ie
->make_speculative
3002 (callee
, ie
->count
* 8 / 10, ie
->frequency
* 8 / 10);
3008 /* Attempt to locate an interprocedural constant at a given REQ_OFFSET in
3009 CONSTRUCTOR and return it. Return NULL if the search fails for some
3013 find_constructor_constant_at_offset (tree constructor
, HOST_WIDE_INT req_offset
)
3015 tree type
= TREE_TYPE (constructor
);
3016 if (TREE_CODE (type
) != ARRAY_TYPE
3017 && TREE_CODE (type
) != RECORD_TYPE
)
3022 FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (constructor
), ix
, index
, val
)
3024 HOST_WIDE_INT elt_offset
;
3025 if (TREE_CODE (type
) == ARRAY_TYPE
)
3028 tree unit_size
= TYPE_SIZE_UNIT (TREE_TYPE (type
));
3029 gcc_assert (TREE_CODE (unit_size
) == INTEGER_CST
);
3033 off
= wi::to_offset (index
);
3034 if (TYPE_DOMAIN (type
) && TYPE_MIN_VALUE (TYPE_DOMAIN (type
)))
3036 tree low_bound
= TYPE_MIN_VALUE (TYPE_DOMAIN (type
));
3037 gcc_assert (TREE_CODE (unit_size
) == INTEGER_CST
);
3038 off
= wi::sext (off
- wi::to_offset (low_bound
),
3039 TYPE_PRECISION (TREE_TYPE (index
)));
3041 off
*= wi::to_offset (unit_size
);
3044 off
= wi::to_offset (unit_size
) * ix
;
3046 off
= wi::lshift (off
, LOG2_BITS_PER_UNIT
);
3047 if (!wi::fits_shwi_p (off
) || wi::neg_p (off
))
3049 elt_offset
= off
.to_shwi ();
3051 else if (TREE_CODE (type
) == RECORD_TYPE
)
3053 gcc_checking_assert (index
&& TREE_CODE (index
) == FIELD_DECL
);
3054 if (DECL_BIT_FIELD (index
))
3056 elt_offset
= int_bit_position (index
);
3061 if (elt_offset
> req_offset
)
3064 if (TREE_CODE (val
) == CONSTRUCTOR
)
3065 return find_constructor_constant_at_offset (val
,
3066 req_offset
- elt_offset
);
3068 if (elt_offset
== req_offset
3069 && is_gimple_reg_type (TREE_TYPE (val
))
3070 && is_gimple_ip_invariant (val
))
3076 /* Check whether SCALAR could be used to look up an aggregate interprocedural
3077 invariant from a static constructor and if so, return it. Otherwise return
3081 ipa_find_agg_cst_from_init (tree scalar
, HOST_WIDE_INT offset
, bool by_ref
)
3085 if (TREE_CODE (scalar
) != ADDR_EXPR
)
3087 scalar
= TREE_OPERAND (scalar
, 0);
3091 || !is_global_var (scalar
)
3092 || !TREE_READONLY (scalar
)
3093 || !DECL_INITIAL (scalar
)
3094 || TREE_CODE (DECL_INITIAL (scalar
)) != CONSTRUCTOR
)
3097 return find_constructor_constant_at_offset (DECL_INITIAL (scalar
), offset
);
3100 /* Retrieve value from aggregate jump function AGG or static initializer of
3101 SCALAR (which can be NULL) for the given OFFSET or return NULL if there is
3102 none. BY_REF specifies whether the value has to be passed by reference or
3103 by value. If FROM_GLOBAL_CONSTANT is non-NULL, then the boolean it points
3104 to is set to true if the value comes from an initializer of a constant. */
3107 ipa_find_agg_cst_for_param (struct ipa_agg_jump_function
*agg
, tree scalar
,
3108 HOST_WIDE_INT offset
, bool by_ref
,
3109 bool *from_global_constant
)
3111 struct ipa_agg_jf_item
*item
;
3116 tree res
= ipa_find_agg_cst_from_init (scalar
, offset
, by_ref
);
3119 if (from_global_constant
)
3120 *from_global_constant
= true;
3126 || by_ref
!= agg
->by_ref
)
3129 FOR_EACH_VEC_SAFE_ELT (agg
->items
, i
, item
)
3130 if (item
->offset
== offset
)
3132 /* Currently we do not have clobber values, return NULL for them once
3134 gcc_checking_assert (is_gimple_ip_invariant (item
->value
));
3135 if (from_global_constant
)
3136 *from_global_constant
= false;
3142 /* Remove a reference to SYMBOL from the list of references of a node given by
3143 reference description RDESC. Return true if the reference has been
3144 successfully found and removed. */
3147 remove_described_reference (symtab_node
*symbol
, struct ipa_cst_ref_desc
*rdesc
)
3149 struct ipa_ref
*to_del
;
3150 struct cgraph_edge
*origin
;
3155 to_del
= origin
->caller
->find_reference (symbol
, origin
->call_stmt
,
3156 origin
->lto_stmt_uid
);
3160 to_del
->remove_reference ();
3162 fprintf (dump_file
, "ipa-prop: Removed a reference from %s/%i to %s.\n",
3163 xstrdup_for_dump (origin
->caller
->name ()),
3164 origin
->caller
->order
, xstrdup_for_dump (symbol
->name ()));
3168 /* If JFUNC has a reference description with refcount different from
3169 IPA_UNDESCRIBED_USE, return the reference description, otherwise return
3170 NULL. JFUNC must be a constant jump function. */
3172 static struct ipa_cst_ref_desc
*
3173 jfunc_rdesc_usable (struct ipa_jump_func
*jfunc
)
3175 struct ipa_cst_ref_desc
*rdesc
= ipa_get_jf_constant_rdesc (jfunc
);
3176 if (rdesc
&& rdesc
->refcount
!= IPA_UNDESCRIBED_USE
)
3182 /* If the value of constant jump function JFUNC is an address of a function
3183 declaration, return the associated call graph node. Otherwise return
3186 static cgraph_node
*
3187 cgraph_node_for_jfunc (struct ipa_jump_func
*jfunc
)
3189 gcc_checking_assert (jfunc
->type
== IPA_JF_CONST
);
3190 tree cst
= ipa_get_jf_constant (jfunc
);
3191 if (TREE_CODE (cst
) != ADDR_EXPR
3192 || TREE_CODE (TREE_OPERAND (cst
, 0)) != FUNCTION_DECL
)
3195 return cgraph_node::get (TREE_OPERAND (cst
, 0));
3199 /* If JFUNC is a constant jump function with a usable rdesc, decrement its
3200 refcount and if it hits zero, remove reference to SYMBOL from the caller of
3201 the edge specified in the rdesc. Return false if either the symbol or the
3202 reference could not be found, otherwise return true. */
3205 try_decrement_rdesc_refcount (struct ipa_jump_func
*jfunc
)
3207 struct ipa_cst_ref_desc
*rdesc
;
3208 if (jfunc
->type
== IPA_JF_CONST
3209 && (rdesc
= jfunc_rdesc_usable (jfunc
))
3210 && --rdesc
->refcount
== 0)
3212 symtab_node
*symbol
= cgraph_node_for_jfunc (jfunc
);
3216 return remove_described_reference (symbol
, rdesc
);
3221 /* Try to find a destination for indirect edge IE that corresponds to a simple
3222 call or a call of a member function pointer and where the destination is a
3223 pointer formal parameter described by jump function JFUNC. If it can be
3224 determined, return the newly direct edge, otherwise return NULL.
3225 NEW_ROOT_INFO is the node info that JFUNC lattices are relative to. */
3227 static struct cgraph_edge
*
3228 try_make_edge_direct_simple_call (struct cgraph_edge
*ie
,
3229 struct ipa_jump_func
*jfunc
,
3230 struct ipa_node_params
*new_root_info
)
3232 struct cgraph_edge
*cs
;
3234 bool agg_contents
= ie
->indirect_info
->agg_contents
;
3235 tree scalar
= ipa_value_from_jfunc (new_root_info
, jfunc
);
3238 bool from_global_constant
;
3239 target
= ipa_find_agg_cst_for_param (&jfunc
->agg
, scalar
,
3240 ie
->indirect_info
->offset
,
3241 ie
->indirect_info
->by_ref
,
3242 &from_global_constant
);
3244 && !from_global_constant
3245 && !ie
->indirect_info
->guaranteed_unmodified
)
3252 cs
= ipa_make_edge_direct_to_target (ie
, target
);
3254 if (cs
&& !agg_contents
)
3257 gcc_checking_assert (cs
->callee
3259 || jfunc
->type
!= IPA_JF_CONST
3260 || !cgraph_node_for_jfunc (jfunc
)
3261 || cs
->callee
== cgraph_node_for_jfunc (jfunc
)));
3262 ok
= try_decrement_rdesc_refcount (jfunc
);
3263 gcc_checking_assert (ok
);
3269 /* Return the target to be used in cases of impossible devirtualization. IE
3270 and target (the latter can be NULL) are dumped when dumping is enabled. */
3273 ipa_impossible_devirt_target (struct cgraph_edge
*ie
, tree target
)
3279 "Type inconsistent devirtualization: %s/%i->%s\n",
3280 ie
->caller
->name (), ie
->caller
->order
,
3281 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (target
)));
3284 "No devirtualization target in %s/%i\n",
3285 ie
->caller
->name (), ie
->caller
->order
);
3287 tree new_target
= builtin_decl_implicit (BUILT_IN_UNREACHABLE
);
3288 cgraph_node::get_create (new_target
);
3292 /* Try to find a destination for indirect edge IE that corresponds to a virtual
3293 call based on a formal parameter which is described by jump function JFUNC
3294 and if it can be determined, make it direct and return the direct edge.
3295 Otherwise, return NULL. CTX describes the polymorphic context that the
3296 parameter the call is based on brings along with it. */
3298 static struct cgraph_edge
*
3299 try_make_edge_direct_virtual_call (struct cgraph_edge
*ie
,
3300 struct ipa_jump_func
*jfunc
,
3301 struct ipa_polymorphic_call_context ctx
)
3304 bool speculative
= false;
3306 if (!opt_for_fn (ie
->caller
->decl
, flag_devirtualize
))
3309 gcc_assert (!ie
->indirect_info
->by_ref
);
3311 /* Try to do lookup via known virtual table pointer value. */
3312 if (!ie
->indirect_info
->vptr_changed
3313 || opt_for_fn (ie
->caller
->decl
, flag_devirtualize_speculatively
))
3316 unsigned HOST_WIDE_INT offset
;
3317 tree scalar
= (jfunc
->type
== IPA_JF_CONST
) ? ipa_get_jf_constant (jfunc
)
3319 tree t
= ipa_find_agg_cst_for_param (&jfunc
->agg
, scalar
,
3320 ie
->indirect_info
->offset
,
3322 if (t
&& vtable_pointer_value_to_vtable (t
, &vtable
, &offset
))
3325 t
= gimple_get_virt_method_for_vtable (ie
->indirect_info
->otr_token
,
3326 vtable
, offset
, &can_refer
);
3330 || (TREE_CODE (TREE_TYPE (t
)) == FUNCTION_TYPE
3331 && DECL_FUNCTION_CODE (t
) == BUILT_IN_UNREACHABLE
)
3332 || !possible_polymorphic_call_target_p
3333 (ie
, cgraph_node::get (t
)))
3335 /* Do not speculate builtin_unreachable, it is stupid! */
3336 if (!ie
->indirect_info
->vptr_changed
)
3337 target
= ipa_impossible_devirt_target (ie
, target
);
3344 speculative
= ie
->indirect_info
->vptr_changed
;
3350 ipa_polymorphic_call_context
ie_context (ie
);
3351 vec
<cgraph_node
*>targets
;
3354 ctx
.offset_by (ie
->indirect_info
->offset
);
3355 if (ie
->indirect_info
->vptr_changed
)
3356 ctx
.possible_dynamic_type_change (ie
->in_polymorphic_cdtor
,
3357 ie
->indirect_info
->otr_type
);
3358 ctx
.combine_with (ie_context
, ie
->indirect_info
->otr_type
);
3359 targets
= possible_polymorphic_call_targets
3360 (ie
->indirect_info
->otr_type
,
3361 ie
->indirect_info
->otr_token
,
3363 if (final
&& targets
.length () <= 1)
3365 speculative
= false;
3366 if (targets
.length () == 1)
3367 target
= targets
[0]->decl
;
3369 target
= ipa_impossible_devirt_target (ie
, NULL_TREE
);
3371 else if (!target
&& opt_for_fn (ie
->caller
->decl
, flag_devirtualize_speculatively
)
3372 && !ie
->speculative
&& ie
->maybe_hot_p ())
3375 n
= try_speculative_devirtualization (ie
->indirect_info
->otr_type
,
3376 ie
->indirect_info
->otr_token
,
3377 ie
->indirect_info
->context
);
3387 if (!possible_polymorphic_call_target_p
3388 (ie
, cgraph_node::get_create (target
)))
3392 target
= ipa_impossible_devirt_target (ie
, target
);
3394 return ipa_make_edge_direct_to_target (ie
, target
, speculative
);
3400 /* Update the param called notes associated with NODE when CS is being inlined,
3401 assuming NODE is (potentially indirectly) inlined into CS->callee.
3402 Moreover, if the callee is discovered to be constant, create a new cgraph
3403 edge for it. Newly discovered indirect edges will be added to *NEW_EDGES,
3404 unless NEW_EDGES is NULL. Return true iff a new edge(s) were created. */
3407 update_indirect_edges_after_inlining (struct cgraph_edge
*cs
,
3408 struct cgraph_node
*node
,
3409 vec
<cgraph_edge
*> *new_edges
)
3411 struct ipa_edge_args
*top
;
3412 struct cgraph_edge
*ie
, *next_ie
, *new_direct_edge
;
3413 struct ipa_node_params
*new_root_info
;
3416 ipa_check_create_edge_args ();
3417 top
= IPA_EDGE_REF (cs
);
3418 new_root_info
= IPA_NODE_REF (cs
->caller
->global
.inlined_to
3419 ? cs
->caller
->global
.inlined_to
3422 for (ie
= node
->indirect_calls
; ie
; ie
= next_ie
)
3424 struct cgraph_indirect_call_info
*ici
= ie
->indirect_info
;
3425 struct ipa_jump_func
*jfunc
;
3427 cgraph_node
*spec_target
= NULL
;
3429 next_ie
= ie
->next_callee
;
3431 if (ici
->param_index
== -1)
3434 /* We must check range due to calls with variable number of arguments: */
3435 if (ici
->param_index
>= ipa_get_cs_argument_count (top
))
3437 ici
->param_index
= -1;
3441 param_index
= ici
->param_index
;
3442 jfunc
= ipa_get_ith_jump_func (top
, param_index
);
3444 if (ie
->speculative
)
3446 struct cgraph_edge
*de
;
3447 struct ipa_ref
*ref
;
3448 ie
->speculative_call_info (de
, ie
, ref
);
3449 spec_target
= de
->callee
;
3452 if (!opt_for_fn (node
->decl
, flag_indirect_inlining
))
3453 new_direct_edge
= NULL
;
3454 else if (ici
->polymorphic
)
3456 ipa_polymorphic_call_context ctx
;
3457 ctx
= ipa_context_from_jfunc (new_root_info
, cs
, param_index
, jfunc
);
3458 new_direct_edge
= try_make_edge_direct_virtual_call (ie
, jfunc
, ctx
);
3461 new_direct_edge
= try_make_edge_direct_simple_call (ie
, jfunc
,
3463 /* If speculation was removed, then we need to do nothing. */
3464 if (new_direct_edge
&& new_direct_edge
!= ie
3465 && new_direct_edge
->callee
== spec_target
)
3467 new_direct_edge
->indirect_inlining_edge
= 1;
3468 top
= IPA_EDGE_REF (cs
);
3470 if (!new_direct_edge
->speculative
)
3473 else if (new_direct_edge
)
3475 new_direct_edge
->indirect_inlining_edge
= 1;
3476 if (new_direct_edge
->call_stmt
)
3477 new_direct_edge
->call_stmt_cannot_inline_p
3478 = !gimple_check_call_matching_types (
3479 new_direct_edge
->call_stmt
,
3480 new_direct_edge
->callee
->decl
, false);
3483 new_edges
->safe_push (new_direct_edge
);
3486 top
= IPA_EDGE_REF (cs
);
3487 /* If speculative edge was introduced we still need to update
3488 call info of the indirect edge. */
3489 if (!new_direct_edge
->speculative
)
3492 if (jfunc
->type
== IPA_JF_PASS_THROUGH
3493 && ipa_get_jf_pass_through_operation (jfunc
) == NOP_EXPR
)
3495 if (ici
->agg_contents
3496 && !ipa_get_jf_pass_through_agg_preserved (jfunc
)
3497 && !ici
->polymorphic
)
3498 ici
->param_index
= -1;
3501 ici
->param_index
= ipa_get_jf_pass_through_formal_id (jfunc
);
3502 if (ici
->polymorphic
3503 && !ipa_get_jf_pass_through_type_preserved (jfunc
))
3504 ici
->vptr_changed
= true;
3507 else if (jfunc
->type
== IPA_JF_ANCESTOR
)
3509 if (ici
->agg_contents
3510 && !ipa_get_jf_ancestor_agg_preserved (jfunc
)
3511 && !ici
->polymorphic
)
3512 ici
->param_index
= -1;
3515 ici
->param_index
= ipa_get_jf_ancestor_formal_id (jfunc
);
3516 ici
->offset
+= ipa_get_jf_ancestor_offset (jfunc
);
3517 if (ici
->polymorphic
3518 && !ipa_get_jf_ancestor_type_preserved (jfunc
))
3519 ici
->vptr_changed
= true;
3523 /* Either we can find a destination for this edge now or never. */
3524 ici
->param_index
= -1;
3530 /* Recursively traverse subtree of NODE (including node) made of inlined
3531 cgraph_edges when CS has been inlined and invoke
3532 update_indirect_edges_after_inlining on all nodes and
3533 update_jump_functions_after_inlining on all non-inlined edges that lead out
3534 of this subtree. Newly discovered indirect edges will be added to
3535 *NEW_EDGES, unless NEW_EDGES is NULL. Return true iff a new edge(s) were
3539 propagate_info_to_inlined_callees (struct cgraph_edge
*cs
,
3540 struct cgraph_node
*node
,
3541 vec
<cgraph_edge
*> *new_edges
)
3543 struct cgraph_edge
*e
;
3546 res
= update_indirect_edges_after_inlining (cs
, node
, new_edges
);
3548 for (e
= node
->callees
; e
; e
= e
->next_callee
)
3549 if (!e
->inline_failed
)
3550 res
|= propagate_info_to_inlined_callees (cs
, e
->callee
, new_edges
);
3552 update_jump_functions_after_inlining (cs
, e
);
3553 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
3554 update_jump_functions_after_inlining (cs
, e
);
3559 /* Combine two controlled uses counts as done during inlining. */
3562 combine_controlled_uses_counters (int c
, int d
)
3564 if (c
== IPA_UNDESCRIBED_USE
|| d
== IPA_UNDESCRIBED_USE
)
3565 return IPA_UNDESCRIBED_USE
;
3570 /* Propagate number of controlled users from CS->caleee to the new root of the
3571 tree of inlined nodes. */
3574 propagate_controlled_uses (struct cgraph_edge
*cs
)
3576 struct ipa_edge_args
*args
= IPA_EDGE_REF (cs
);
3577 struct cgraph_node
*new_root
= cs
->caller
->global
.inlined_to
3578 ? cs
->caller
->global
.inlined_to
: cs
->caller
;
3579 struct ipa_node_params
*new_root_info
= IPA_NODE_REF (new_root
);
3580 struct ipa_node_params
*old_root_info
= IPA_NODE_REF (cs
->callee
);
3583 count
= MIN (ipa_get_cs_argument_count (args
),
3584 ipa_get_param_count (old_root_info
));
3585 for (i
= 0; i
< count
; i
++)
3587 struct ipa_jump_func
*jf
= ipa_get_ith_jump_func (args
, i
);
3588 struct ipa_cst_ref_desc
*rdesc
;
3590 if (jf
->type
== IPA_JF_PASS_THROUGH
)
3593 src_idx
= ipa_get_jf_pass_through_formal_id (jf
);
3594 c
= ipa_get_controlled_uses (new_root_info
, src_idx
);
3595 d
= ipa_get_controlled_uses (old_root_info
, i
);
3597 gcc_checking_assert (ipa_get_jf_pass_through_operation (jf
)
3598 == NOP_EXPR
|| c
== IPA_UNDESCRIBED_USE
);
3599 c
= combine_controlled_uses_counters (c
, d
);
3600 ipa_set_controlled_uses (new_root_info
, src_idx
, c
);
3601 if (c
== 0 && new_root_info
->ipcp_orig_node
)
3603 struct cgraph_node
*n
;
3604 struct ipa_ref
*ref
;
3605 tree t
= new_root_info
->known_csts
[src_idx
];
3607 if (t
&& TREE_CODE (t
) == ADDR_EXPR
3608 && TREE_CODE (TREE_OPERAND (t
, 0)) == FUNCTION_DECL
3609 && (n
= cgraph_node::get (TREE_OPERAND (t
, 0)))
3610 && (ref
= new_root
->find_reference (n
, NULL
, 0)))
3613 fprintf (dump_file
, "ipa-prop: Removing cloning-created "
3614 "reference from %s/%i to %s/%i.\n",
3615 xstrdup_for_dump (new_root
->name ()),
3617 xstrdup_for_dump (n
->name ()), n
->order
);
3618 ref
->remove_reference ();
3622 else if (jf
->type
== IPA_JF_CONST
3623 && (rdesc
= jfunc_rdesc_usable (jf
)))
3625 int d
= ipa_get_controlled_uses (old_root_info
, i
);
3626 int c
= rdesc
->refcount
;
3627 rdesc
->refcount
= combine_controlled_uses_counters (c
, d
);
3628 if (rdesc
->refcount
== 0)
3630 tree cst
= ipa_get_jf_constant (jf
);
3631 struct cgraph_node
*n
;
3632 gcc_checking_assert (TREE_CODE (cst
) == ADDR_EXPR
3633 && TREE_CODE (TREE_OPERAND (cst
, 0))
3635 n
= cgraph_node::get (TREE_OPERAND (cst
, 0));
3638 struct cgraph_node
*clone
;
3640 ok
= remove_described_reference (n
, rdesc
);
3641 gcc_checking_assert (ok
);
3644 while (clone
->global
.inlined_to
3645 && clone
!= rdesc
->cs
->caller
3646 && IPA_NODE_REF (clone
)->ipcp_orig_node
)
3648 struct ipa_ref
*ref
;
3649 ref
= clone
->find_reference (n
, NULL
, 0);
3653 fprintf (dump_file
, "ipa-prop: Removing "
3654 "cloning-created reference "
3655 "from %s/%i to %s/%i.\n",
3656 xstrdup_for_dump (clone
->name ()),
3658 xstrdup_for_dump (n
->name ()),
3660 ref
->remove_reference ();
3662 clone
= clone
->callers
->caller
;
3669 for (i
= ipa_get_param_count (old_root_info
);
3670 i
< ipa_get_cs_argument_count (args
);
3673 struct ipa_jump_func
*jf
= ipa_get_ith_jump_func (args
, i
);
3675 if (jf
->type
== IPA_JF_CONST
)
3677 struct ipa_cst_ref_desc
*rdesc
= jfunc_rdesc_usable (jf
);
3679 rdesc
->refcount
= IPA_UNDESCRIBED_USE
;
3681 else if (jf
->type
== IPA_JF_PASS_THROUGH
)
3682 ipa_set_controlled_uses (new_root_info
,
3683 jf
->value
.pass_through
.formal_id
,
3684 IPA_UNDESCRIBED_USE
);
3688 /* Update jump functions and call note functions on inlining the call site CS.
3689 CS is expected to lead to a node already cloned by
3690 cgraph_clone_inline_nodes. Newly discovered indirect edges will be added to
3691 *NEW_EDGES, unless NEW_EDGES is NULL. Return true iff a new edge(s) were +
3695 ipa_propagate_indirect_call_infos (struct cgraph_edge
*cs
,
3696 vec
<cgraph_edge
*> *new_edges
)
3699 /* Do nothing if the preparation phase has not been carried out yet
3700 (i.e. during early inlining). */
3701 if (!ipa_node_params_sum
)
3703 gcc_assert (ipa_edge_args_vector
);
3705 propagate_controlled_uses (cs
);
3706 changed
= propagate_info_to_inlined_callees (cs
, cs
->callee
, new_edges
);
3711 /* Ensure that array of edge arguments infos is big enough to accommodate a
3712 structure for all edges and reallocates it if not. Also, allocate
3713 associated hash tables is they do not already exist. */
3716 ipa_check_create_edge_args (void)
3718 if (vec_safe_length (ipa_edge_args_vector
)
3719 <= (unsigned) symtab
->edges_max_uid
)
3720 vec_safe_grow_cleared (ipa_edge_args_vector
, symtab
->edges_max_uid
+ 1);
3721 if (!ipa_bits_hash_table
)
3722 ipa_bits_hash_table
= hash_table
<ipa_bit_ggc_hash_traits
>::create_ggc (37);
3723 if (!ipa_vr_hash_table
)
3724 ipa_vr_hash_table
= hash_table
<ipa_vr_ggc_hash_traits
>::create_ggc (37);
3727 /* Frees all dynamically allocated structures that the argument info points
3731 ipa_free_edge_args_substructures (struct ipa_edge_args
*args
)
3733 vec_free (args
->jump_functions
);
3734 memset (args
, 0, sizeof (*args
));
3737 /* Free all ipa_edge structures. */
3740 ipa_free_all_edge_args (void)
3743 struct ipa_edge_args
*args
;
3745 if (!ipa_edge_args_vector
)
3748 FOR_EACH_VEC_ELT (*ipa_edge_args_vector
, i
, args
)
3749 ipa_free_edge_args_substructures (args
);
3751 vec_free (ipa_edge_args_vector
);
3754 /* Free all ipa_node_params structures. */
3757 ipa_free_all_node_params (void)
3759 ipa_node_params_sum
->release ();
3760 ipa_node_params_sum
= NULL
;
3763 /* Grow ipcp_transformations if necessary. Also allocate any necessary hash
3764 tables if they do not already exist. */
3767 ipcp_grow_transformations_if_necessary (void)
3769 if (vec_safe_length (ipcp_transformations
)
3770 <= (unsigned) symtab
->cgraph_max_uid
)
3771 vec_safe_grow_cleared (ipcp_transformations
, symtab
->cgraph_max_uid
+ 1);
3772 if (!ipa_bits_hash_table
)
3773 ipa_bits_hash_table
= hash_table
<ipa_bit_ggc_hash_traits
>::create_ggc (37);
3774 if (!ipa_vr_hash_table
)
3775 ipa_vr_hash_table
= hash_table
<ipa_vr_ggc_hash_traits
>::create_ggc (37);
3778 /* Set the aggregate replacements of NODE to be AGGVALS. */
3781 ipa_set_node_agg_value_chain (struct cgraph_node
*node
,
3782 struct ipa_agg_replacement_value
*aggvals
)
3784 ipcp_grow_transformations_if_necessary ();
3785 (*ipcp_transformations
)[node
->uid
].agg_values
= aggvals
;
3788 /* Hook that is called by cgraph.c when an edge is removed. */
3791 ipa_edge_removal_hook (struct cgraph_edge
*cs
, void *data ATTRIBUTE_UNUSED
)
3793 struct ipa_edge_args
*args
;
3795 /* During IPA-CP updating we can be called on not-yet analyzed clones. */
3796 if (vec_safe_length (ipa_edge_args_vector
) <= (unsigned)cs
->uid
)
3799 args
= IPA_EDGE_REF (cs
);
3800 if (args
->jump_functions
)
3802 struct ipa_jump_func
*jf
;
3804 FOR_EACH_VEC_ELT (*args
->jump_functions
, i
, jf
)
3806 struct ipa_cst_ref_desc
*rdesc
;
3807 try_decrement_rdesc_refcount (jf
);
3808 if (jf
->type
== IPA_JF_CONST
3809 && (rdesc
= ipa_get_jf_constant_rdesc (jf
))
3815 ipa_free_edge_args_substructures (IPA_EDGE_REF (cs
));
3818 /* Hook that is called by cgraph.c when an edge is duplicated. */
3821 ipa_edge_duplication_hook (struct cgraph_edge
*src
, struct cgraph_edge
*dst
,
3824 struct ipa_edge_args
*old_args
, *new_args
;
3827 ipa_check_create_edge_args ();
3829 old_args
= IPA_EDGE_REF (src
);
3830 new_args
= IPA_EDGE_REF (dst
);
3832 new_args
->jump_functions
= vec_safe_copy (old_args
->jump_functions
);
3833 if (old_args
->polymorphic_call_contexts
)
3834 new_args
->polymorphic_call_contexts
3835 = vec_safe_copy (old_args
->polymorphic_call_contexts
);
3837 for (i
= 0; i
< vec_safe_length (old_args
->jump_functions
); i
++)
3839 struct ipa_jump_func
*src_jf
= ipa_get_ith_jump_func (old_args
, i
);
3840 struct ipa_jump_func
*dst_jf
= ipa_get_ith_jump_func (new_args
, i
);
3842 dst_jf
->agg
.items
= vec_safe_copy (dst_jf
->agg
.items
);
3844 if (src_jf
->type
== IPA_JF_CONST
)
3846 struct ipa_cst_ref_desc
*src_rdesc
= jfunc_rdesc_usable (src_jf
);
3849 dst_jf
->value
.constant
.rdesc
= NULL
;
3850 else if (src
->caller
== dst
->caller
)
3852 struct ipa_ref
*ref
;
3853 symtab_node
*n
= cgraph_node_for_jfunc (src_jf
);
3854 gcc_checking_assert (n
);
3855 ref
= src
->caller
->find_reference (n
, src
->call_stmt
,
3857 gcc_checking_assert (ref
);
3858 dst
->caller
->clone_reference (ref
, ref
->stmt
);
3860 struct ipa_cst_ref_desc
*dst_rdesc
= ipa_refdesc_pool
.allocate ();
3861 dst_rdesc
->cs
= dst
;
3862 dst_rdesc
->refcount
= src_rdesc
->refcount
;
3863 dst_rdesc
->next_duplicate
= NULL
;
3864 dst_jf
->value
.constant
.rdesc
= dst_rdesc
;
3866 else if (src_rdesc
->cs
== src
)
3868 struct ipa_cst_ref_desc
*dst_rdesc
= ipa_refdesc_pool
.allocate ();
3869 dst_rdesc
->cs
= dst
;
3870 dst_rdesc
->refcount
= src_rdesc
->refcount
;
3871 dst_rdesc
->next_duplicate
= src_rdesc
->next_duplicate
;
3872 src_rdesc
->next_duplicate
= dst_rdesc
;
3873 dst_jf
->value
.constant
.rdesc
= dst_rdesc
;
3877 struct ipa_cst_ref_desc
*dst_rdesc
;
3878 /* This can happen during inlining, when a JFUNC can refer to a
3879 reference taken in a function up in the tree of inline clones.
3880 We need to find the duplicate that refers to our tree of
3883 gcc_assert (dst
->caller
->global
.inlined_to
);
3884 for (dst_rdesc
= src_rdesc
->next_duplicate
;
3886 dst_rdesc
= dst_rdesc
->next_duplicate
)
3888 struct cgraph_node
*top
;
3889 top
= dst_rdesc
->cs
->caller
->global
.inlined_to
3890 ? dst_rdesc
->cs
->caller
->global
.inlined_to
3891 : dst_rdesc
->cs
->caller
;
3892 if (dst
->caller
->global
.inlined_to
== top
)
3895 gcc_assert (dst_rdesc
);
3896 dst_jf
->value
.constant
.rdesc
= dst_rdesc
;
3899 else if (dst_jf
->type
== IPA_JF_PASS_THROUGH
3900 && src
->caller
== dst
->caller
)
3902 struct cgraph_node
*inline_root
= dst
->caller
->global
.inlined_to
3903 ? dst
->caller
->global
.inlined_to
: dst
->caller
;
3904 struct ipa_node_params
*root_info
= IPA_NODE_REF (inline_root
);
3905 int idx
= ipa_get_jf_pass_through_formal_id (dst_jf
);
3907 int c
= ipa_get_controlled_uses (root_info
, idx
);
3908 if (c
!= IPA_UNDESCRIBED_USE
)
3911 ipa_set_controlled_uses (root_info
, idx
, c
);
3917 /* Analyze newly added function into callgraph. */
3920 ipa_add_new_function (cgraph_node
*node
, void *data ATTRIBUTE_UNUSED
)
3922 if (node
->has_gimple_body_p ())
3923 ipa_analyze_node (node
);
3926 /* Hook that is called by summary when a node is duplicated. */
3929 ipa_node_params_t::duplicate(cgraph_node
*src
, cgraph_node
*dst
,
3930 ipa_node_params
*old_info
,
3931 ipa_node_params
*new_info
)
3933 ipa_agg_replacement_value
*old_av
, *new_av
;
3935 new_info
->descriptors
= vec_safe_copy (old_info
->descriptors
);
3936 new_info
->lattices
= NULL
;
3937 new_info
->ipcp_orig_node
= old_info
->ipcp_orig_node
;
3938 new_info
->known_csts
= old_info
->known_csts
.copy ();
3939 new_info
->known_contexts
= old_info
->known_contexts
.copy ();
3941 new_info
->analysis_done
= old_info
->analysis_done
;
3942 new_info
->node_enqueued
= old_info
->node_enqueued
;
3943 new_info
->versionable
= old_info
->versionable
;
3945 old_av
= ipa_get_agg_replacements_for_node (src
);
3951 struct ipa_agg_replacement_value
*v
;
3953 v
= ggc_alloc
<ipa_agg_replacement_value
> ();
3954 memcpy (v
, old_av
, sizeof (*v
));
3957 old_av
= old_av
->next
;
3959 ipa_set_node_agg_value_chain (dst
, new_av
);
3962 ipcp_transformation_summary
*src_trans
3963 = ipcp_get_transformation_summary (src
);
3967 ipcp_grow_transformations_if_necessary ();
3968 src_trans
= ipcp_get_transformation_summary (src
);
3969 ipcp_transformation_summary
*dst_trans
3970 = ipcp_get_transformation_summary (dst
);
3972 dst_trans
->bits
= vec_safe_copy (src_trans
->bits
);
3974 const vec
<ipa_vr
, va_gc
> *src_vr
= src_trans
->m_vr
;
3975 vec
<ipa_vr
, va_gc
> *&dst_vr
3976 = ipcp_get_transformation_summary (dst
)->m_vr
;
3977 if (vec_safe_length (src_trans
->m_vr
) > 0)
3979 vec_safe_reserve_exact (dst_vr
, src_vr
->length ());
3980 for (unsigned i
= 0; i
< src_vr
->length (); ++i
)
3981 dst_vr
->quick_push ((*src_vr
)[i
]);
3986 /* Register our cgraph hooks if they are not already there. */
3989 ipa_register_cgraph_hooks (void)
3991 ipa_check_create_node_params ();
3993 if (!edge_removal_hook_holder
)
3994 edge_removal_hook_holder
=
3995 symtab
->add_edge_removal_hook (&ipa_edge_removal_hook
, NULL
);
3996 if (!edge_duplication_hook_holder
)
3997 edge_duplication_hook_holder
=
3998 symtab
->add_edge_duplication_hook (&ipa_edge_duplication_hook
, NULL
);
3999 function_insertion_hook_holder
=
4000 symtab
->add_cgraph_insertion_hook (&ipa_add_new_function
, NULL
);
4003 /* Unregister our cgraph hooks if they are not already there. */
4006 ipa_unregister_cgraph_hooks (void)
4008 symtab
->remove_edge_removal_hook (edge_removal_hook_holder
);
4009 edge_removal_hook_holder
= NULL
;
4010 symtab
->remove_edge_duplication_hook (edge_duplication_hook_holder
);
4011 edge_duplication_hook_holder
= NULL
;
4012 symtab
->remove_cgraph_insertion_hook (function_insertion_hook_holder
);
4013 function_insertion_hook_holder
= NULL
;
4016 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
4017 longer needed after ipa-cp. */
4020 ipa_free_all_structures_after_ipa_cp (void)
4022 if (!optimize
&& !in_lto_p
)
4024 ipa_free_all_edge_args ();
4025 ipa_free_all_node_params ();
4026 ipcp_sources_pool
.release ();
4027 ipcp_cst_values_pool
.release ();
4028 ipcp_poly_ctx_values_pool
.release ();
4029 ipcp_agg_lattice_pool
.release ();
4030 ipa_unregister_cgraph_hooks ();
4031 ipa_refdesc_pool
.release ();
4035 /* Free all ipa_node_params and all ipa_edge_args structures if they are no
4036 longer needed after indirect inlining. */
4039 ipa_free_all_structures_after_iinln (void)
4041 ipa_free_all_edge_args ();
4042 ipa_free_all_node_params ();
4043 ipa_unregister_cgraph_hooks ();
4044 ipcp_sources_pool
.release ();
4045 ipcp_cst_values_pool
.release ();
4046 ipcp_poly_ctx_values_pool
.release ();
4047 ipcp_agg_lattice_pool
.release ();
4048 ipa_refdesc_pool
.release ();
4051 /* Print ipa_tree_map data structures of all functions in the
4055 ipa_print_node_params (FILE *f
, struct cgraph_node
*node
)
4058 struct ipa_node_params
*info
;
4060 if (!node
->definition
)
4062 info
= IPA_NODE_REF (node
);
4063 fprintf (f
, " function %s/%i parameter descriptors:\n",
4064 node
->name (), node
->order
);
4065 count
= ipa_get_param_count (info
);
4066 for (i
= 0; i
< count
; i
++)
4071 ipa_dump_param (f
, info
, i
);
4072 if (ipa_is_param_used (info
, i
))
4073 fprintf (f
, " used");
4074 c
= ipa_get_controlled_uses (info
, i
);
4075 if (c
== IPA_UNDESCRIBED_USE
)
4076 fprintf (f
, " undescribed_use");
4078 fprintf (f
, " controlled_uses=%i", c
);
4083 /* Print ipa_tree_map data structures of all functions in the
4087 ipa_print_all_params (FILE * f
)
4089 struct cgraph_node
*node
;
4091 fprintf (f
, "\nFunction parameters:\n");
4092 FOR_EACH_FUNCTION (node
)
4093 ipa_print_node_params (f
, node
);
4096 /* Return a heap allocated vector containing formal parameters of FNDECL. */
4099 ipa_get_vector_of_formal_parms (tree fndecl
)
4105 gcc_assert (!flag_wpa
);
4106 count
= count_formal_params (fndecl
);
4107 args
.create (count
);
4108 for (parm
= DECL_ARGUMENTS (fndecl
); parm
; parm
= DECL_CHAIN (parm
))
4109 args
.quick_push (parm
);
4114 /* Return a heap allocated vector containing types of formal parameters of
4115 function type FNTYPE. */
4118 ipa_get_vector_of_formal_parm_types (tree fntype
)
4124 for (t
= TYPE_ARG_TYPES (fntype
); t
; t
= TREE_CHAIN (t
))
4127 types
.create (count
);
4128 for (t
= TYPE_ARG_TYPES (fntype
); t
; t
= TREE_CHAIN (t
))
4129 types
.quick_push (TREE_VALUE (t
));
4134 /* Modify the function declaration FNDECL and its type according to the plan in
4135 ADJUSTMENTS. It also sets base fields of individual adjustments structures
4136 to reflect the actual parameters being modified which are determined by the
4137 base_index field. */
4140 ipa_modify_formal_parameters (tree fndecl
, ipa_parm_adjustment_vec adjustments
)
4142 vec
<tree
> oparms
= ipa_get_vector_of_formal_parms (fndecl
);
4143 tree orig_type
= TREE_TYPE (fndecl
);
4144 tree old_arg_types
= TYPE_ARG_TYPES (orig_type
);
4146 /* The following test is an ugly hack, some functions simply don't have any
4147 arguments in their type. This is probably a bug but well... */
4148 bool care_for_types
= (old_arg_types
!= NULL_TREE
);
4149 bool last_parm_void
;
4153 last_parm_void
= (TREE_VALUE (tree_last (old_arg_types
))
4155 otypes
= ipa_get_vector_of_formal_parm_types (orig_type
);
4157 gcc_assert (oparms
.length () + 1 == otypes
.length ());
4159 gcc_assert (oparms
.length () == otypes
.length ());
4163 last_parm_void
= false;
4167 int len
= adjustments
.length ();
4168 tree
*link
= &DECL_ARGUMENTS (fndecl
);
4169 tree new_arg_types
= NULL
;
4170 for (int i
= 0; i
< len
; i
++)
4172 struct ipa_parm_adjustment
*adj
;
4175 adj
= &adjustments
[i
];
4177 if (adj
->op
== IPA_PARM_OP_NEW
)
4180 parm
= oparms
[adj
->base_index
];
4183 if (adj
->op
== IPA_PARM_OP_COPY
)
4186 new_arg_types
= tree_cons (NULL_TREE
, otypes
[adj
->base_index
],
4189 link
= &DECL_CHAIN (parm
);
4191 else if (adj
->op
!= IPA_PARM_OP_REMOVE
)
4197 ptype
= build_pointer_type (adj
->type
);
4201 if (is_gimple_reg_type (ptype
))
4203 unsigned malign
= GET_MODE_ALIGNMENT (TYPE_MODE (ptype
));
4204 if (TYPE_ALIGN (ptype
) != malign
)
4205 ptype
= build_aligned_type (ptype
, malign
);
4210 new_arg_types
= tree_cons (NULL_TREE
, ptype
, new_arg_types
);
4212 new_parm
= build_decl (UNKNOWN_LOCATION
, PARM_DECL
, NULL_TREE
,
4214 const char *prefix
= adj
->arg_prefix
? adj
->arg_prefix
: "SYNTH";
4215 DECL_NAME (new_parm
) = create_tmp_var_name (prefix
);
4216 DECL_ARTIFICIAL (new_parm
) = 1;
4217 DECL_ARG_TYPE (new_parm
) = ptype
;
4218 DECL_CONTEXT (new_parm
) = fndecl
;
4219 TREE_USED (new_parm
) = 1;
4220 DECL_IGNORED_P (new_parm
) = 1;
4221 layout_decl (new_parm
, 0);
4223 if (adj
->op
== IPA_PARM_OP_NEW
)
4227 adj
->new_decl
= new_parm
;
4230 link
= &DECL_CHAIN (new_parm
);
4236 tree new_reversed
= NULL
;
4239 new_reversed
= nreverse (new_arg_types
);
4243 TREE_CHAIN (new_arg_types
) = void_list_node
;
4245 new_reversed
= void_list_node
;
4249 /* Use copy_node to preserve as much as possible from original type
4250 (debug info, attribute lists etc.)
4251 Exception is METHOD_TYPEs must have THIS argument.
4252 When we are asked to remove it, we need to build new FUNCTION_TYPE
4254 tree new_type
= NULL
;
4255 if (TREE_CODE (orig_type
) != METHOD_TYPE
4256 || (adjustments
[0].op
== IPA_PARM_OP_COPY
4257 && adjustments
[0].base_index
== 0))
4259 new_type
= build_distinct_type_copy (orig_type
);
4260 TYPE_ARG_TYPES (new_type
) = new_reversed
;
4265 = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type
),
4267 TYPE_CONTEXT (new_type
) = TYPE_CONTEXT (orig_type
);
4268 DECL_VINDEX (fndecl
) = NULL_TREE
;
4271 /* When signature changes, we need to clear builtin info. */
4272 if (DECL_BUILT_IN (fndecl
))
4274 DECL_BUILT_IN_CLASS (fndecl
) = NOT_BUILT_IN
;
4275 DECL_FUNCTION_CODE (fndecl
) = (enum built_in_function
) 0;
4278 TREE_TYPE (fndecl
) = new_type
;
4279 DECL_VIRTUAL_P (fndecl
) = 0;
4280 DECL_LANG_SPECIFIC (fndecl
) = NULL
;
4285 /* Modify actual arguments of a function call CS as indicated in ADJUSTMENTS.
4286 If this is a directly recursive call, CS must be NULL. Otherwise it must
4287 contain the corresponding call graph edge. */
4290 ipa_modify_call_arguments (struct cgraph_edge
*cs
, gcall
*stmt
,
4291 ipa_parm_adjustment_vec adjustments
)
4293 struct cgraph_node
*current_node
= cgraph_node::get (current_function_decl
);
4295 vec
<tree
, va_gc
> **debug_args
= NULL
;
4297 gimple_stmt_iterator gsi
, prev_gsi
;
4301 len
= adjustments
.length ();
4303 callee_decl
= !cs
? gimple_call_fndecl (stmt
) : cs
->callee
->decl
;
4304 current_node
->remove_stmt_references (stmt
);
4306 gsi
= gsi_for_stmt (stmt
);
4308 gsi_prev (&prev_gsi
);
4309 for (i
= 0; i
< len
; i
++)
4311 struct ipa_parm_adjustment
*adj
;
4313 adj
= &adjustments
[i
];
4315 if (adj
->op
== IPA_PARM_OP_COPY
)
4317 tree arg
= gimple_call_arg (stmt
, adj
->base_index
);
4319 vargs
.quick_push (arg
);
4321 else if (adj
->op
!= IPA_PARM_OP_REMOVE
)
4323 tree expr
, base
, off
;
4325 unsigned int deref_align
= 0;
4326 bool deref_base
= false;
4328 /* We create a new parameter out of the value of the old one, we can
4329 do the following kind of transformations:
4331 - A scalar passed by reference is converted to a scalar passed by
4332 value. (adj->by_ref is false and the type of the original
4333 actual argument is a pointer to a scalar).
4335 - A part of an aggregate is passed instead of the whole aggregate.
4336 The part can be passed either by value or by reference, this is
4337 determined by value of adj->by_ref. Moreover, the code below
4338 handles both situations when the original aggregate is passed by
4339 value (its type is not a pointer) and when it is passed by
4340 reference (it is a pointer to an aggregate).
4342 When the new argument is passed by reference (adj->by_ref is true)
4343 it must be a part of an aggregate and therefore we form it by
4344 simply taking the address of a reference inside the original
4347 gcc_checking_assert (adj
->offset
% BITS_PER_UNIT
== 0);
4348 base
= gimple_call_arg (stmt
, adj
->base_index
);
4349 loc
= DECL_P (base
) ? DECL_SOURCE_LOCATION (base
)
4350 : EXPR_LOCATION (base
);
4352 if (TREE_CODE (base
) != ADDR_EXPR
4353 && POINTER_TYPE_P (TREE_TYPE (base
)))
4354 off
= build_int_cst (adj
->alias_ptr_type
,
4355 adj
->offset
/ BITS_PER_UNIT
);
4358 HOST_WIDE_INT base_offset
;
4362 if (TREE_CODE (base
) == ADDR_EXPR
)
4364 base
= TREE_OPERAND (base
, 0);
4370 base
= get_addr_base_and_unit_offset (base
, &base_offset
);
4371 /* Aggregate arguments can have non-invariant addresses. */
4374 base
= build_fold_addr_expr (prev_base
);
4375 off
= build_int_cst (adj
->alias_ptr_type
,
4376 adj
->offset
/ BITS_PER_UNIT
);
4378 else if (TREE_CODE (base
) == MEM_REF
)
4383 deref_align
= TYPE_ALIGN (TREE_TYPE (base
));
4385 off
= build_int_cst (adj
->alias_ptr_type
,
4387 + adj
->offset
/ BITS_PER_UNIT
);
4388 off
= int_const_binop (PLUS_EXPR
, TREE_OPERAND (base
, 1),
4390 base
= TREE_OPERAND (base
, 0);
4394 off
= build_int_cst (adj
->alias_ptr_type
,
4396 + adj
->offset
/ BITS_PER_UNIT
);
4397 base
= build_fold_addr_expr (base
);
4403 tree type
= adj
->type
;
4405 unsigned HOST_WIDE_INT misalign
;
4409 align
= deref_align
;
4414 get_pointer_alignment_1 (base
, &align
, &misalign
);
4415 if (TYPE_ALIGN (type
) > align
)
4416 align
= TYPE_ALIGN (type
);
4418 misalign
+= (offset_int::from (off
, SIGNED
).to_short_addr ()
4420 misalign
= misalign
& (align
- 1);
4422 align
= least_bit_hwi (misalign
);
4423 if (align
< TYPE_ALIGN (type
))
4424 type
= build_aligned_type (type
, align
);
4425 base
= force_gimple_operand_gsi (&gsi
, base
,
4426 true, NULL
, true, GSI_SAME_STMT
);
4427 expr
= fold_build2_loc (loc
, MEM_REF
, type
, base
, off
);
4428 REF_REVERSE_STORAGE_ORDER (expr
) = adj
->reverse
;
4429 /* If expr is not a valid gimple call argument emit
4430 a load into a temporary. */
4431 if (is_gimple_reg_type (TREE_TYPE (expr
)))
4433 gimple
*tem
= gimple_build_assign (NULL_TREE
, expr
);
4434 if (gimple_in_ssa_p (cfun
))
4436 gimple_set_vuse (tem
, gimple_vuse (stmt
));
4437 expr
= make_ssa_name (TREE_TYPE (expr
), tem
);
4440 expr
= create_tmp_reg (TREE_TYPE (expr
));
4441 gimple_assign_set_lhs (tem
, expr
);
4442 gsi_insert_before (&gsi
, tem
, GSI_SAME_STMT
);
4447 expr
= fold_build2_loc (loc
, MEM_REF
, adj
->type
, base
, off
);
4448 REF_REVERSE_STORAGE_ORDER (expr
) = adj
->reverse
;
4449 expr
= build_fold_addr_expr (expr
);
4450 expr
= force_gimple_operand_gsi (&gsi
, expr
,
4451 true, NULL
, true, GSI_SAME_STMT
);
4453 vargs
.quick_push (expr
);
4455 if (adj
->op
!= IPA_PARM_OP_COPY
&& MAY_HAVE_DEBUG_STMTS
)
4458 tree ddecl
= NULL_TREE
, origin
= DECL_ORIGIN (adj
->base
), arg
;
4461 arg
= gimple_call_arg (stmt
, adj
->base_index
);
4462 if (!useless_type_conversion_p (TREE_TYPE (origin
), TREE_TYPE (arg
)))
4464 if (!fold_convertible_p (TREE_TYPE (origin
), arg
))
4466 arg
= fold_convert_loc (gimple_location (stmt
),
4467 TREE_TYPE (origin
), arg
);
4469 if (debug_args
== NULL
)
4470 debug_args
= decl_debug_args_insert (callee_decl
);
4471 for (ix
= 0; vec_safe_iterate (*debug_args
, ix
, &ddecl
); ix
+= 2)
4472 if (ddecl
== origin
)
4474 ddecl
= (**debug_args
)[ix
+ 1];
4479 ddecl
= make_node (DEBUG_EXPR_DECL
);
4480 DECL_ARTIFICIAL (ddecl
) = 1;
4481 TREE_TYPE (ddecl
) = TREE_TYPE (origin
);
4482 SET_DECL_MODE (ddecl
, DECL_MODE (origin
));
4484 vec_safe_push (*debug_args
, origin
);
4485 vec_safe_push (*debug_args
, ddecl
);
4487 def_temp
= gimple_build_debug_bind (ddecl
, unshare_expr (arg
), stmt
);
4488 gsi_insert_before (&gsi
, def_temp
, GSI_SAME_STMT
);
4492 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4494 fprintf (dump_file
, "replacing stmt:");
4495 print_gimple_stmt (dump_file
, gsi_stmt (gsi
), 0, 0);
4498 new_stmt
= gimple_build_call_vec (callee_decl
, vargs
);
4500 if (gimple_call_lhs (stmt
))
4501 gimple_call_set_lhs (new_stmt
, gimple_call_lhs (stmt
));
4503 gimple_set_block (new_stmt
, gimple_block (stmt
));
4504 if (gimple_has_location (stmt
))
4505 gimple_set_location (new_stmt
, gimple_location (stmt
));
4506 gimple_call_set_chain (new_stmt
, gimple_call_chain (stmt
));
4507 gimple_call_copy_flags (new_stmt
, stmt
);
4508 if (gimple_in_ssa_p (cfun
))
4510 gimple_set_vuse (new_stmt
, gimple_vuse (stmt
));
4511 if (gimple_vdef (stmt
))
4513 gimple_set_vdef (new_stmt
, gimple_vdef (stmt
));
4514 SSA_NAME_DEF_STMT (gimple_vdef (new_stmt
)) = new_stmt
;
4518 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4520 fprintf (dump_file
, "with stmt:");
4521 print_gimple_stmt (dump_file
, new_stmt
, 0, 0);
4522 fprintf (dump_file
, "\n");
4524 gsi_replace (&gsi
, new_stmt
, true);
4526 cs
->set_call_stmt (new_stmt
);
4529 current_node
->record_stmt_references (gsi_stmt (gsi
));
4532 while (gsi_stmt (gsi
) != gsi_stmt (prev_gsi
));
4535 /* If the expression *EXPR should be replaced by a reduction of a parameter, do
4536 so. ADJUSTMENTS is a pointer to a vector of adjustments. CONVERT
4537 specifies whether the function should care about type incompatibility the
4538 current and new expressions. If it is false, the function will leave
4539 incompatibility issues to the caller. Return true iff the expression
4543 ipa_modify_expr (tree
*expr
, bool convert
,
4544 ipa_parm_adjustment_vec adjustments
)
4546 struct ipa_parm_adjustment
*cand
4547 = ipa_get_adjustment_candidate (&expr
, &convert
, adjustments
, false);
4554 src
= build_simple_mem_ref (cand
->new_decl
);
4555 REF_REVERSE_STORAGE_ORDER (src
) = cand
->reverse
;
4558 src
= cand
->new_decl
;
4560 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
4562 fprintf (dump_file
, "About to replace expr ");
4563 print_generic_expr (dump_file
, *expr
, 0);
4564 fprintf (dump_file
, " with ");
4565 print_generic_expr (dump_file
, src
, 0);
4566 fprintf (dump_file
, "\n");
4569 if (convert
&& !useless_type_conversion_p (TREE_TYPE (*expr
), cand
->type
))
4571 tree vce
= build1 (VIEW_CONVERT_EXPR
, TREE_TYPE (*expr
), src
);
4579 /* If T is an SSA_NAME, return NULL if it is not a default def or
4580 return its base variable if it is. If IGNORE_DEFAULT_DEF is true,
4581 the base variable is always returned, regardless if it is a default
4582 def. Return T if it is not an SSA_NAME. */
4585 get_ssa_base_param (tree t
, bool ignore_default_def
)
4587 if (TREE_CODE (t
) == SSA_NAME
)
4589 if (ignore_default_def
|| SSA_NAME_IS_DEFAULT_DEF (t
))
4590 return SSA_NAME_VAR (t
);
4597 /* Given an expression, return an adjustment entry specifying the
4598 transformation to be done on EXPR. If no suitable adjustment entry
4599 was found, returns NULL.
4601 If IGNORE_DEFAULT_DEF is set, consider SSA_NAMEs which are not a
4602 default def, otherwise bail on them.
4604 If CONVERT is non-NULL, this function will set *CONVERT if the
4605 expression provided is a component reference. ADJUSTMENTS is the
4606 adjustments vector. */
4608 ipa_parm_adjustment
*
4609 ipa_get_adjustment_candidate (tree
**expr
, bool *convert
,
4610 ipa_parm_adjustment_vec adjustments
,
4611 bool ignore_default_def
)
4613 if (TREE_CODE (**expr
) == BIT_FIELD_REF
4614 || TREE_CODE (**expr
) == IMAGPART_EXPR
4615 || TREE_CODE (**expr
) == REALPART_EXPR
)
4617 *expr
= &TREE_OPERAND (**expr
, 0);
4622 HOST_WIDE_INT offset
, size
, max_size
;
4625 = get_ref_base_and_extent (**expr
, &offset
, &size
, &max_size
, &reverse
);
4626 if (!base
|| size
== -1 || max_size
== -1)
4629 if (TREE_CODE (base
) == MEM_REF
)
4631 offset
+= mem_ref_offset (base
).to_short_addr () * BITS_PER_UNIT
;
4632 base
= TREE_OPERAND (base
, 0);
4635 base
= get_ssa_base_param (base
, ignore_default_def
);
4636 if (!base
|| TREE_CODE (base
) != PARM_DECL
)
4639 struct ipa_parm_adjustment
*cand
= NULL
;
4640 unsigned int len
= adjustments
.length ();
4641 for (unsigned i
= 0; i
< len
; i
++)
4643 struct ipa_parm_adjustment
*adj
= &adjustments
[i
];
4645 if (adj
->base
== base
4646 && (adj
->offset
== offset
|| adj
->op
== IPA_PARM_OP_REMOVE
))
4653 if (!cand
|| cand
->op
== IPA_PARM_OP_COPY
|| cand
->op
== IPA_PARM_OP_REMOVE
)
4658 /* Return true iff BASE_INDEX is in ADJUSTMENTS more than once. */
4661 index_in_adjustments_multiple_times_p (int base_index
,
4662 ipa_parm_adjustment_vec adjustments
)
4664 int i
, len
= adjustments
.length ();
4667 for (i
= 0; i
< len
; i
++)
4669 struct ipa_parm_adjustment
*adj
;
4670 adj
= &adjustments
[i
];
4672 if (adj
->base_index
== base_index
)
4684 /* Return adjustments that should have the same effect on function parameters
4685 and call arguments as if they were first changed according to adjustments in
4686 INNER and then by adjustments in OUTER. */
4688 ipa_parm_adjustment_vec
4689 ipa_combine_adjustments (ipa_parm_adjustment_vec inner
,
4690 ipa_parm_adjustment_vec outer
)
4692 int i
, outlen
= outer
.length ();
4693 int inlen
= inner
.length ();
4695 ipa_parm_adjustment_vec adjustments
, tmp
;
4698 for (i
= 0; i
< inlen
; i
++)
4700 struct ipa_parm_adjustment
*n
;
4703 if (n
->op
== IPA_PARM_OP_REMOVE
)
4707 /* FIXME: Handling of new arguments are not implemented yet. */
4708 gcc_assert (n
->op
!= IPA_PARM_OP_NEW
);
4709 tmp
.quick_push (*n
);
4713 adjustments
.create (outlen
+ removals
);
4714 for (i
= 0; i
< outlen
; i
++)
4716 struct ipa_parm_adjustment r
;
4717 struct ipa_parm_adjustment
*out
= &outer
[i
];
4718 struct ipa_parm_adjustment
*in
= &tmp
[out
->base_index
];
4720 memset (&r
, 0, sizeof (r
));
4721 gcc_assert (in
->op
!= IPA_PARM_OP_REMOVE
);
4722 if (out
->op
== IPA_PARM_OP_REMOVE
)
4724 if (!index_in_adjustments_multiple_times_p (in
->base_index
, tmp
))
4726 r
.op
= IPA_PARM_OP_REMOVE
;
4727 adjustments
.quick_push (r
);
4733 /* FIXME: Handling of new arguments are not implemented yet. */
4734 gcc_assert (out
->op
!= IPA_PARM_OP_NEW
);
4737 r
.base_index
= in
->base_index
;
4740 /* FIXME: Create nonlocal value too. */
4742 if (in
->op
== IPA_PARM_OP_COPY
&& out
->op
== IPA_PARM_OP_COPY
)
4743 r
.op
= IPA_PARM_OP_COPY
;
4744 else if (in
->op
== IPA_PARM_OP_COPY
)
4745 r
.offset
= out
->offset
;
4746 else if (out
->op
== IPA_PARM_OP_COPY
)
4747 r
.offset
= in
->offset
;
4749 r
.offset
= in
->offset
+ out
->offset
;
4750 adjustments
.quick_push (r
);
4753 for (i
= 0; i
< inlen
; i
++)
4755 struct ipa_parm_adjustment
*n
= &inner
[i
];
4757 if (n
->op
== IPA_PARM_OP_REMOVE
)
4758 adjustments
.quick_push (*n
);
4765 /* Dump the adjustments in the vector ADJUSTMENTS to dump_file in a human
4766 friendly way, assuming they are meant to be applied to FNDECL. */
4769 ipa_dump_param_adjustments (FILE *file
, ipa_parm_adjustment_vec adjustments
,
4772 int i
, len
= adjustments
.length ();
4774 vec
<tree
> parms
= ipa_get_vector_of_formal_parms (fndecl
);
4776 fprintf (file
, "IPA param adjustments: ");
4777 for (i
= 0; i
< len
; i
++)
4779 struct ipa_parm_adjustment
*adj
;
4780 adj
= &adjustments
[i
];
4783 fprintf (file
, " ");
4787 fprintf (file
, "%i. base_index: %i - ", i
, adj
->base_index
);
4788 print_generic_expr (file
, parms
[adj
->base_index
], 0);
4791 fprintf (file
, ", base: ");
4792 print_generic_expr (file
, adj
->base
, 0);
4796 fprintf (file
, ", new_decl: ");
4797 print_generic_expr (file
, adj
->new_decl
, 0);
4799 if (adj
->new_ssa_base
)
4801 fprintf (file
, ", new_ssa_base: ");
4802 print_generic_expr (file
, adj
->new_ssa_base
, 0);
4805 if (adj
->op
== IPA_PARM_OP_COPY
)
4806 fprintf (file
, ", copy_param");
4807 else if (adj
->op
== IPA_PARM_OP_REMOVE
)
4808 fprintf (file
, ", remove_param");
4810 fprintf (file
, ", offset %li", (long) adj
->offset
);
4812 fprintf (file
, ", by_ref");
4813 print_node_brief (file
, ", type: ", adj
->type
, 0);
4814 fprintf (file
, "\n");
4819 /* Dump the AV linked list. */
4822 ipa_dump_agg_replacement_values (FILE *f
, struct ipa_agg_replacement_value
*av
)
4825 fprintf (f
, " Aggregate replacements:");
4826 for (; av
; av
= av
->next
)
4828 fprintf (f
, "%s %i[" HOST_WIDE_INT_PRINT_DEC
"]=", comma
? "," : "",
4829 av
->index
, av
->offset
);
4830 print_generic_expr (f
, av
->value
, 0);
4836 /* Stream out jump function JUMP_FUNC to OB. */
4839 ipa_write_jump_function (struct output_block
*ob
,
4840 struct ipa_jump_func
*jump_func
)
4842 struct ipa_agg_jf_item
*item
;
4843 struct bitpack_d bp
;
4846 streamer_write_uhwi (ob
, jump_func
->type
);
4847 switch (jump_func
->type
)
4849 case IPA_JF_UNKNOWN
:
4853 EXPR_LOCATION (jump_func
->value
.constant
.value
) == UNKNOWN_LOCATION
);
4854 stream_write_tree (ob
, jump_func
->value
.constant
.value
, true);
4856 case IPA_JF_PASS_THROUGH
:
4857 streamer_write_uhwi (ob
, jump_func
->value
.pass_through
.operation
);
4858 if (jump_func
->value
.pass_through
.operation
== NOP_EXPR
)
4860 streamer_write_uhwi (ob
, jump_func
->value
.pass_through
.formal_id
);
4861 bp
= bitpack_create (ob
->main_stream
);
4862 bp_pack_value (&bp
, jump_func
->value
.pass_through
.agg_preserved
, 1);
4863 streamer_write_bitpack (&bp
);
4865 else if (TREE_CODE_CLASS (jump_func
->value
.pass_through
.operation
)
4867 streamer_write_uhwi (ob
, jump_func
->value
.pass_through
.formal_id
);
4870 stream_write_tree (ob
, jump_func
->value
.pass_through
.operand
, true);
4871 streamer_write_uhwi (ob
, jump_func
->value
.pass_through
.formal_id
);
4874 case IPA_JF_ANCESTOR
:
4875 streamer_write_uhwi (ob
, jump_func
->value
.ancestor
.offset
);
4876 streamer_write_uhwi (ob
, jump_func
->value
.ancestor
.formal_id
);
4877 bp
= bitpack_create (ob
->main_stream
);
4878 bp_pack_value (&bp
, jump_func
->value
.ancestor
.agg_preserved
, 1);
4879 streamer_write_bitpack (&bp
);
4883 count
= vec_safe_length (jump_func
->agg
.items
);
4884 streamer_write_uhwi (ob
, count
);
4887 bp
= bitpack_create (ob
->main_stream
);
4888 bp_pack_value (&bp
, jump_func
->agg
.by_ref
, 1);
4889 streamer_write_bitpack (&bp
);
4892 FOR_EACH_VEC_SAFE_ELT (jump_func
->agg
.items
, i
, item
)
4894 streamer_write_uhwi (ob
, item
->offset
);
4895 stream_write_tree (ob
, item
->value
, true);
4898 bp
= bitpack_create (ob
->main_stream
);
4899 bp_pack_value (&bp
, !!jump_func
->bits
, 1);
4900 streamer_write_bitpack (&bp
);
4901 if (jump_func
->bits
)
4903 streamer_write_widest_int (ob
, jump_func
->bits
->value
);
4904 streamer_write_widest_int (ob
, jump_func
->bits
->mask
);
4906 bp_pack_value (&bp
, !!jump_func
->m_vr
, 1);
4907 streamer_write_bitpack (&bp
);
4908 if (jump_func
->m_vr
)
4910 streamer_write_enum (ob
->main_stream
, value_rang_type
,
4911 VR_LAST
, jump_func
->m_vr
->type
);
4912 stream_write_tree (ob
, jump_func
->m_vr
->min
, true);
4913 stream_write_tree (ob
, jump_func
->m_vr
->max
, true);
4917 /* Read in jump function JUMP_FUNC from IB. */
4920 ipa_read_jump_function (struct lto_input_block
*ib
,
4921 struct ipa_jump_func
*jump_func
,
4922 struct cgraph_edge
*cs
,
4923 struct data_in
*data_in
)
4925 enum jump_func_type jftype
;
4926 enum tree_code operation
;
4929 jftype
= (enum jump_func_type
) streamer_read_uhwi (ib
);
4932 case IPA_JF_UNKNOWN
:
4933 ipa_set_jf_unknown (jump_func
);
4936 ipa_set_jf_constant (jump_func
, stream_read_tree (ib
, data_in
), cs
);
4938 case IPA_JF_PASS_THROUGH
:
4939 operation
= (enum tree_code
) streamer_read_uhwi (ib
);
4940 if (operation
== NOP_EXPR
)
4942 int formal_id
= streamer_read_uhwi (ib
);
4943 struct bitpack_d bp
= streamer_read_bitpack (ib
);
4944 bool agg_preserved
= bp_unpack_value (&bp
, 1);
4945 ipa_set_jf_simple_pass_through (jump_func
, formal_id
, agg_preserved
);
4947 else if (TREE_CODE_CLASS (operation
) == tcc_unary
)
4949 int formal_id
= streamer_read_uhwi (ib
);
4950 ipa_set_jf_unary_pass_through (jump_func
, formal_id
, operation
);
4954 tree operand
= stream_read_tree (ib
, data_in
);
4955 int formal_id
= streamer_read_uhwi (ib
);
4956 ipa_set_jf_arith_pass_through (jump_func
, formal_id
, operand
,
4960 case IPA_JF_ANCESTOR
:
4962 HOST_WIDE_INT offset
= streamer_read_uhwi (ib
);
4963 int formal_id
= streamer_read_uhwi (ib
);
4964 struct bitpack_d bp
= streamer_read_bitpack (ib
);
4965 bool agg_preserved
= bp_unpack_value (&bp
, 1);
4966 ipa_set_ancestor_jf (jump_func
, offset
, formal_id
, agg_preserved
);
4971 count
= streamer_read_uhwi (ib
);
4972 vec_alloc (jump_func
->agg
.items
, count
);
4975 struct bitpack_d bp
= streamer_read_bitpack (ib
);
4976 jump_func
->agg
.by_ref
= bp_unpack_value (&bp
, 1);
4978 for (i
= 0; i
< count
; i
++)
4980 struct ipa_agg_jf_item item
;
4981 item
.offset
= streamer_read_uhwi (ib
);
4982 item
.value
= stream_read_tree (ib
, data_in
);
4983 jump_func
->agg
.items
->quick_push (item
);
4986 struct bitpack_d bp
= streamer_read_bitpack (ib
);
4987 bool bits_known
= bp_unpack_value (&bp
, 1);
4990 widest_int value
= streamer_read_widest_int (ib
);
4991 widest_int mask
= streamer_read_widest_int (ib
);
4992 ipa_set_jfunc_bits (jump_func
, value
, mask
);
4995 jump_func
->bits
= NULL
;
4997 struct bitpack_d vr_bp
= streamer_read_bitpack (ib
);
4998 bool vr_known
= bp_unpack_value (&vr_bp
, 1);
5001 enum value_range_type type
= streamer_read_enum (ib
, value_range_type
,
5003 tree min
= stream_read_tree (ib
, data_in
);
5004 tree max
= stream_read_tree (ib
, data_in
);
5005 ipa_set_jfunc_vr (jump_func
, type
, min
, max
);
5008 jump_func
->m_vr
= NULL
;
5011 /* Stream out parts of cgraph_indirect_call_info corresponding to CS that are
5012 relevant to indirect inlining to OB. */
5015 ipa_write_indirect_edge_info (struct output_block
*ob
,
5016 struct cgraph_edge
*cs
)
5018 struct cgraph_indirect_call_info
*ii
= cs
->indirect_info
;
5019 struct bitpack_d bp
;
5021 streamer_write_hwi (ob
, ii
->param_index
);
5022 bp
= bitpack_create (ob
->main_stream
);
5023 bp_pack_value (&bp
, ii
->polymorphic
, 1);
5024 bp_pack_value (&bp
, ii
->agg_contents
, 1);
5025 bp_pack_value (&bp
, ii
->member_ptr
, 1);
5026 bp_pack_value (&bp
, ii
->by_ref
, 1);
5027 bp_pack_value (&bp
, ii
->guaranteed_unmodified
, 1);
5028 bp_pack_value (&bp
, ii
->vptr_changed
, 1);
5029 streamer_write_bitpack (&bp
);
5030 if (ii
->agg_contents
|| ii
->polymorphic
)
5031 streamer_write_hwi (ob
, ii
->offset
);
5033 gcc_assert (ii
->offset
== 0);
5035 if (ii
->polymorphic
)
5037 streamer_write_hwi (ob
, ii
->otr_token
);
5038 stream_write_tree (ob
, ii
->otr_type
, true);
5039 ii
->context
.stream_out (ob
);
5043 /* Read in parts of cgraph_indirect_call_info corresponding to CS that are
5044 relevant to indirect inlining from IB. */
5047 ipa_read_indirect_edge_info (struct lto_input_block
*ib
,
5048 struct data_in
*data_in
,
5049 struct cgraph_edge
*cs
)
5051 struct cgraph_indirect_call_info
*ii
= cs
->indirect_info
;
5052 struct bitpack_d bp
;
5054 ii
->param_index
= (int) streamer_read_hwi (ib
);
5055 bp
= streamer_read_bitpack (ib
);
5056 ii
->polymorphic
= bp_unpack_value (&bp
, 1);
5057 ii
->agg_contents
= bp_unpack_value (&bp
, 1);
5058 ii
->member_ptr
= bp_unpack_value (&bp
, 1);
5059 ii
->by_ref
= bp_unpack_value (&bp
, 1);
5060 ii
->guaranteed_unmodified
= bp_unpack_value (&bp
, 1);
5061 ii
->vptr_changed
= bp_unpack_value (&bp
, 1);
5062 if (ii
->agg_contents
|| ii
->polymorphic
)
5063 ii
->offset
= (HOST_WIDE_INT
) streamer_read_hwi (ib
);
5066 if (ii
->polymorphic
)
5068 ii
->otr_token
= (HOST_WIDE_INT
) streamer_read_hwi (ib
);
5069 ii
->otr_type
= stream_read_tree (ib
, data_in
);
5070 ii
->context
.stream_in (ib
, data_in
);
5074 /* Stream out NODE info to OB. */
5077 ipa_write_node_info (struct output_block
*ob
, struct cgraph_node
*node
)
5080 lto_symtab_encoder_t encoder
;
5081 struct ipa_node_params
*info
= IPA_NODE_REF (node
);
5083 struct cgraph_edge
*e
;
5084 struct bitpack_d bp
;
5086 encoder
= ob
->decl_state
->symtab_node_encoder
;
5087 node_ref
= lto_symtab_encoder_encode (encoder
, node
);
5088 streamer_write_uhwi (ob
, node_ref
);
5090 streamer_write_uhwi (ob
, ipa_get_param_count (info
));
5091 for (j
= 0; j
< ipa_get_param_count (info
); j
++)
5092 streamer_write_uhwi (ob
, ipa_get_param_move_cost (info
, j
));
5093 bp
= bitpack_create (ob
->main_stream
);
5094 gcc_assert (info
->analysis_done
5095 || ipa_get_param_count (info
) == 0);
5096 gcc_assert (!info
->node_enqueued
);
5097 gcc_assert (!info
->ipcp_orig_node
);
5098 for (j
= 0; j
< ipa_get_param_count (info
); j
++)
5099 bp_pack_value (&bp
, ipa_is_param_used (info
, j
), 1);
5100 streamer_write_bitpack (&bp
);
5101 for (j
= 0; j
< ipa_get_param_count (info
); j
++)
5103 streamer_write_hwi (ob
, ipa_get_controlled_uses (info
, j
));
5104 stream_write_tree (ob
, ipa_get_type (info
, j
), true);
5106 for (e
= node
->callees
; e
; e
= e
->next_callee
)
5108 struct ipa_edge_args
*args
= IPA_EDGE_REF (e
);
5110 streamer_write_uhwi (ob
,
5111 ipa_get_cs_argument_count (args
) * 2
5112 + (args
->polymorphic_call_contexts
!= NULL
));
5113 for (j
= 0; j
< ipa_get_cs_argument_count (args
); j
++)
5115 ipa_write_jump_function (ob
, ipa_get_ith_jump_func (args
, j
));
5116 if (args
->polymorphic_call_contexts
!= NULL
)
5117 ipa_get_ith_polymorhic_call_context (args
, j
)->stream_out (ob
);
5120 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
5122 struct ipa_edge_args
*args
= IPA_EDGE_REF (e
);
5124 streamer_write_uhwi (ob
,
5125 ipa_get_cs_argument_count (args
) * 2
5126 + (args
->polymorphic_call_contexts
!= NULL
));
5127 for (j
= 0; j
< ipa_get_cs_argument_count (args
); j
++)
5129 ipa_write_jump_function (ob
, ipa_get_ith_jump_func (args
, j
));
5130 if (args
->polymorphic_call_contexts
!= NULL
)
5131 ipa_get_ith_polymorhic_call_context (args
, j
)->stream_out (ob
);
5133 ipa_write_indirect_edge_info (ob
, e
);
5137 /* Stream in NODE info from IB. */
5140 ipa_read_node_info (struct lto_input_block
*ib
, struct cgraph_node
*node
,
5141 struct data_in
*data_in
)
5143 struct ipa_node_params
*info
= IPA_NODE_REF (node
);
5145 struct cgraph_edge
*e
;
5146 struct bitpack_d bp
;
5148 ipa_alloc_node_params (node
, streamer_read_uhwi (ib
));
5150 for (k
= 0; k
< ipa_get_param_count (info
); k
++)
5151 (*info
->descriptors
)[k
].move_cost
= streamer_read_uhwi (ib
);
5153 bp
= streamer_read_bitpack (ib
);
5154 if (ipa_get_param_count (info
) != 0)
5155 info
->analysis_done
= true;
5156 info
->node_enqueued
= false;
5157 for (k
= 0; k
< ipa_get_param_count (info
); k
++)
5158 ipa_set_param_used (info
, k
, bp_unpack_value (&bp
, 1));
5159 for (k
= 0; k
< ipa_get_param_count (info
); k
++)
5161 ipa_set_controlled_uses (info
, k
, streamer_read_hwi (ib
));
5162 (*info
->descriptors
)[k
].decl_or_type
= stream_read_tree (ib
, data_in
);
5164 for (e
= node
->callees
; e
; e
= e
->next_callee
)
5166 struct ipa_edge_args
*args
= IPA_EDGE_REF (e
);
5167 int count
= streamer_read_uhwi (ib
);
5168 bool contexts_computed
= count
& 1;
5173 vec_safe_grow_cleared (args
->jump_functions
, count
);
5174 if (contexts_computed
)
5175 vec_safe_grow_cleared (args
->polymorphic_call_contexts
, count
);
5177 for (k
= 0; k
< ipa_get_cs_argument_count (args
); k
++)
5179 ipa_read_jump_function (ib
, ipa_get_ith_jump_func (args
, k
), e
,
5181 if (contexts_computed
)
5182 ipa_get_ith_polymorhic_call_context (args
, k
)->stream_in (ib
, data_in
);
5185 for (e
= node
->indirect_calls
; e
; e
= e
->next_callee
)
5187 struct ipa_edge_args
*args
= IPA_EDGE_REF (e
);
5188 int count
= streamer_read_uhwi (ib
);
5189 bool contexts_computed
= count
& 1;
5194 vec_safe_grow_cleared (args
->jump_functions
, count
);
5195 if (contexts_computed
)
5196 vec_safe_grow_cleared (args
->polymorphic_call_contexts
, count
);
5197 for (k
= 0; k
< ipa_get_cs_argument_count (args
); k
++)
5199 ipa_read_jump_function (ib
, ipa_get_ith_jump_func (args
, k
), e
,
5201 if (contexts_computed
)
5202 ipa_get_ith_polymorhic_call_context (args
, k
)->stream_in (ib
, data_in
);
5205 ipa_read_indirect_edge_info (ib
, data_in
, e
);
5209 /* Write jump functions for nodes in SET. */
5212 ipa_prop_write_jump_functions (void)
5214 struct cgraph_node
*node
;
5215 struct output_block
*ob
;
5216 unsigned int count
= 0;
5217 lto_symtab_encoder_iterator lsei
;
5218 lto_symtab_encoder_t encoder
;
5220 if (!ipa_node_params_sum
|| !ipa_edge_args_vector
)
5223 ob
= create_output_block (LTO_section_jump_functions
);
5224 encoder
= ob
->decl_state
->symtab_node_encoder
;
5226 for (lsei
= lsei_start_function_in_partition (encoder
); !lsei_end_p (lsei
);
5227 lsei_next_function_in_partition (&lsei
))
5229 node
= lsei_cgraph_node (lsei
);
5230 if (node
->has_gimple_body_p ()
5231 && IPA_NODE_REF (node
) != NULL
)
5235 streamer_write_uhwi (ob
, count
);
5237 /* Process all of the functions. */
5238 for (lsei
= lsei_start_function_in_partition (encoder
); !lsei_end_p (lsei
);
5239 lsei_next_function_in_partition (&lsei
))
5241 node
= lsei_cgraph_node (lsei
);
5242 if (node
->has_gimple_body_p ()
5243 && IPA_NODE_REF (node
) != NULL
)
5244 ipa_write_node_info (ob
, node
);
5246 streamer_write_char_stream (ob
->main_stream
, 0);
5247 produce_asm (ob
, NULL
);
5248 destroy_output_block (ob
);
5251 /* Read section in file FILE_DATA of length LEN with data DATA. */
5254 ipa_prop_read_section (struct lto_file_decl_data
*file_data
, const char *data
,
5257 const struct lto_function_header
*header
=
5258 (const struct lto_function_header
*) data
;
5259 const int cfg_offset
= sizeof (struct lto_function_header
);
5260 const int main_offset
= cfg_offset
+ header
->cfg_size
;
5261 const int string_offset
= main_offset
+ header
->main_size
;
5262 struct data_in
*data_in
;
5266 lto_input_block
ib_main ((const char *) data
+ main_offset
,
5267 header
->main_size
, file_data
->mode_table
);
5270 lto_data_in_create (file_data
, (const char *) data
+ string_offset
,
5271 header
->string_size
, vNULL
);
5272 count
= streamer_read_uhwi (&ib_main
);
5274 for (i
= 0; i
< count
; i
++)
5277 struct cgraph_node
*node
;
5278 lto_symtab_encoder_t encoder
;
5280 index
= streamer_read_uhwi (&ib_main
);
5281 encoder
= file_data
->symtab_node_encoder
;
5282 node
= dyn_cast
<cgraph_node
*> (lto_symtab_encoder_deref (encoder
,
5284 gcc_assert (node
->definition
);
5285 ipa_read_node_info (&ib_main
, node
, data_in
);
5287 lto_free_section_data (file_data
, LTO_section_jump_functions
, NULL
, data
,
5289 lto_data_in_delete (data_in
);
5292 /* Read ipcp jump functions. */
5295 ipa_prop_read_jump_functions (void)
5297 struct lto_file_decl_data
**file_data_vec
= lto_get_file_decl_data ();
5298 struct lto_file_decl_data
*file_data
;
5301 ipa_check_create_node_params ();
5302 ipa_check_create_edge_args ();
5303 ipa_register_cgraph_hooks ();
5305 while ((file_data
= file_data_vec
[j
++]))
5308 const char *data
= lto_get_section_data (file_data
, LTO_section_jump_functions
, NULL
, &len
);
5311 ipa_prop_read_section (file_data
, data
, len
);
5315 /* After merging units, we can get mismatch in argument counts.
5316 Also decl merging might've rendered parameter lists obsolete.
5317 Also compute called_with_variable_arg info. */
5320 ipa_update_after_lto_read (void)
5322 ipa_check_create_node_params ();
5323 ipa_check_create_edge_args ();
5327 write_ipcp_transformation_info (output_block
*ob
, cgraph_node
*node
)
5330 unsigned int count
= 0;
5331 lto_symtab_encoder_t encoder
;
5332 struct ipa_agg_replacement_value
*aggvals
, *av
;
5334 aggvals
= ipa_get_agg_replacements_for_node (node
);
5335 encoder
= ob
->decl_state
->symtab_node_encoder
;
5336 node_ref
= lto_symtab_encoder_encode (encoder
, node
);
5337 streamer_write_uhwi (ob
, node_ref
);
5339 for (av
= aggvals
; av
; av
= av
->next
)
5341 streamer_write_uhwi (ob
, count
);
5343 for (av
= aggvals
; av
; av
= av
->next
)
5345 struct bitpack_d bp
;
5347 streamer_write_uhwi (ob
, av
->offset
);
5348 streamer_write_uhwi (ob
, av
->index
);
5349 stream_write_tree (ob
, av
->value
, true);
5351 bp
= bitpack_create (ob
->main_stream
);
5352 bp_pack_value (&bp
, av
->by_ref
, 1);
5353 streamer_write_bitpack (&bp
);
5356 ipcp_transformation_summary
*ts
= ipcp_get_transformation_summary (node
);
5357 if (ts
&& vec_safe_length (ts
->m_vr
) > 0)
5359 count
= ts
->m_vr
->length ();
5360 streamer_write_uhwi (ob
, count
);
5361 for (unsigned i
= 0; i
< count
; ++i
)
5363 struct bitpack_d bp
;
5364 ipa_vr
*parm_vr
= &(*ts
->m_vr
)[i
];
5365 bp
= bitpack_create (ob
->main_stream
);
5366 bp_pack_value (&bp
, parm_vr
->known
, 1);
5367 streamer_write_bitpack (&bp
);
5370 streamer_write_enum (ob
->main_stream
, value_rang_type
,
5371 VR_LAST
, parm_vr
->type
);
5372 streamer_write_wide_int (ob
, parm_vr
->min
);
5373 streamer_write_wide_int (ob
, parm_vr
->max
);
5378 streamer_write_uhwi (ob
, 0);
5380 if (ts
&& vec_safe_length (ts
->bits
) > 0)
5382 count
= ts
->bits
->length ();
5383 streamer_write_uhwi (ob
, count
);
5385 for (unsigned i
= 0; i
< count
; ++i
)
5387 const ipa_bits
*bits_jfunc
= (*ts
->bits
)[i
];
5388 struct bitpack_d bp
= bitpack_create (ob
->main_stream
);
5389 bp_pack_value (&bp
, !!bits_jfunc
, 1);
5390 streamer_write_bitpack (&bp
);
5393 streamer_write_widest_int (ob
, bits_jfunc
->value
);
5394 streamer_write_widest_int (ob
, bits_jfunc
->mask
);
5399 streamer_write_uhwi (ob
, 0);
5402 /* Stream in the aggregate value replacement chain for NODE from IB. */
5405 read_ipcp_transformation_info (lto_input_block
*ib
, cgraph_node
*node
,
5408 struct ipa_agg_replacement_value
*aggvals
= NULL
;
5409 unsigned int count
, i
;
5411 count
= streamer_read_uhwi (ib
);
5412 for (i
= 0; i
<count
; i
++)
5414 struct ipa_agg_replacement_value
*av
;
5415 struct bitpack_d bp
;
5417 av
= ggc_alloc
<ipa_agg_replacement_value
> ();
5418 av
->offset
= streamer_read_uhwi (ib
);
5419 av
->index
= streamer_read_uhwi (ib
);
5420 av
->value
= stream_read_tree (ib
, data_in
);
5421 bp
= streamer_read_bitpack (ib
);
5422 av
->by_ref
= bp_unpack_value (&bp
, 1);
5426 ipa_set_node_agg_value_chain (node
, aggvals
);
5428 count
= streamer_read_uhwi (ib
);
5431 ipcp_grow_transformations_if_necessary ();
5433 ipcp_transformation_summary
*ts
= ipcp_get_transformation_summary (node
);
5434 vec_safe_grow_cleared (ts
->m_vr
, count
);
5435 for (i
= 0; i
< count
; i
++)
5438 parm_vr
= &(*ts
->m_vr
)[i
];
5439 struct bitpack_d bp
;
5440 bp
= streamer_read_bitpack (ib
);
5441 parm_vr
->known
= bp_unpack_value (&bp
, 1);
5444 parm_vr
->type
= streamer_read_enum (ib
, value_range_type
,
5446 parm_vr
->min
= streamer_read_wide_int (ib
);
5447 parm_vr
->max
= streamer_read_wide_int (ib
);
5451 count
= streamer_read_uhwi (ib
);
5454 ipcp_grow_transformations_if_necessary ();
5456 ipcp_transformation_summary
*ts
= ipcp_get_transformation_summary (node
);
5457 vec_safe_grow_cleared (ts
->bits
, count
);
5459 for (i
= 0; i
< count
; i
++)
5461 struct bitpack_d bp
= streamer_read_bitpack (ib
);
5462 bool known
= bp_unpack_value (&bp
, 1);
5466 = ipa_get_ipa_bits_for_value (streamer_read_widest_int (ib
),
5467 streamer_read_widest_int (ib
));
5468 (*ts
->bits
)[i
] = bits
;
5474 /* Write all aggregate replacement for nodes in set. */
5477 ipcp_write_transformation_summaries (void)
5479 struct cgraph_node
*node
;
5480 struct output_block
*ob
;
5481 unsigned int count
= 0;
5482 lto_symtab_encoder_iterator lsei
;
5483 lto_symtab_encoder_t encoder
;
5485 ob
= create_output_block (LTO_section_ipcp_transform
);
5486 encoder
= ob
->decl_state
->symtab_node_encoder
;
5488 for (lsei
= lsei_start_function_in_partition (encoder
); !lsei_end_p (lsei
);
5489 lsei_next_function_in_partition (&lsei
))
5491 node
= lsei_cgraph_node (lsei
);
5492 if (node
->has_gimple_body_p ())
5496 streamer_write_uhwi (ob
, count
);
5498 for (lsei
= lsei_start_function_in_partition (encoder
); !lsei_end_p (lsei
);
5499 lsei_next_function_in_partition (&lsei
))
5501 node
= lsei_cgraph_node (lsei
);
5502 if (node
->has_gimple_body_p ())
5503 write_ipcp_transformation_info (ob
, node
);
5505 streamer_write_char_stream (ob
->main_stream
, 0);
5506 produce_asm (ob
, NULL
);
5507 destroy_output_block (ob
);
5510 /* Read replacements section in file FILE_DATA of length LEN with data
5514 read_replacements_section (struct lto_file_decl_data
*file_data
,
5518 const struct lto_function_header
*header
=
5519 (const struct lto_function_header
*) data
;
5520 const int cfg_offset
= sizeof (struct lto_function_header
);
5521 const int main_offset
= cfg_offset
+ header
->cfg_size
;
5522 const int string_offset
= main_offset
+ header
->main_size
;
5523 struct data_in
*data_in
;
5527 lto_input_block
ib_main ((const char *) data
+ main_offset
,
5528 header
->main_size
, file_data
->mode_table
);
5530 data_in
= lto_data_in_create (file_data
, (const char *) data
+ string_offset
,
5531 header
->string_size
, vNULL
);
5532 count
= streamer_read_uhwi (&ib_main
);
5534 for (i
= 0; i
< count
; i
++)
5537 struct cgraph_node
*node
;
5538 lto_symtab_encoder_t encoder
;
5540 index
= streamer_read_uhwi (&ib_main
);
5541 encoder
= file_data
->symtab_node_encoder
;
5542 node
= dyn_cast
<cgraph_node
*> (lto_symtab_encoder_deref (encoder
,
5544 gcc_assert (node
->definition
);
5545 read_ipcp_transformation_info (&ib_main
, node
, data_in
);
5547 lto_free_section_data (file_data
, LTO_section_jump_functions
, NULL
, data
,
5549 lto_data_in_delete (data_in
);
5552 /* Read IPA-CP aggregate replacements. */
5555 ipcp_read_transformation_summaries (void)
5557 struct lto_file_decl_data
**file_data_vec
= lto_get_file_decl_data ();
5558 struct lto_file_decl_data
*file_data
;
5561 while ((file_data
= file_data_vec
[j
++]))
5564 const char *data
= lto_get_section_data (file_data
,
5565 LTO_section_ipcp_transform
,
5568 read_replacements_section (file_data
, data
, len
);
5572 /* Adjust the aggregate replacements in AGGVAL to reflect parameters skipped in
5576 adjust_agg_replacement_values (struct cgraph_node
*node
,
5577 struct ipa_agg_replacement_value
*aggval
)
5579 struct ipa_agg_replacement_value
*v
;
5580 int i
, c
= 0, d
= 0, *adj
;
5582 if (!node
->clone
.combined_args_to_skip
)
5585 for (v
= aggval
; v
; v
= v
->next
)
5587 gcc_assert (v
->index
>= 0);
5593 adj
= XALLOCAVEC (int, c
);
5594 for (i
= 0; i
< c
; i
++)
5595 if (bitmap_bit_p (node
->clone
.combined_args_to_skip
, i
))
5603 for (v
= aggval
; v
; v
= v
->next
)
5604 v
->index
= adj
[v
->index
];
5607 /* Dominator walker driving the ipcp modification phase. */
5609 class ipcp_modif_dom_walker
: public dom_walker
5612 ipcp_modif_dom_walker (struct ipa_func_body_info
*fbi
,
5613 vec
<ipa_param_descriptor
, va_gc
> *descs
,
5614 struct ipa_agg_replacement_value
*av
,
5616 : dom_walker (CDI_DOMINATORS
), m_fbi (fbi
), m_descriptors (descs
),
5617 m_aggval (av
), m_something_changed (sc
), m_cfg_changed (cc
) {}
5619 virtual edge
before_dom_children (basic_block
);
5622 struct ipa_func_body_info
*m_fbi
;
5623 vec
<ipa_param_descriptor
, va_gc
> *m_descriptors
;
5624 struct ipa_agg_replacement_value
*m_aggval
;
5625 bool *m_something_changed
, *m_cfg_changed
;
5629 ipcp_modif_dom_walker::before_dom_children (basic_block bb
)
5631 gimple_stmt_iterator gsi
;
5632 for (gsi
= gsi_start_bb (bb
); !gsi_end_p (gsi
); gsi_next (&gsi
))
5634 struct ipa_agg_replacement_value
*v
;
5635 gimple
*stmt
= gsi_stmt (gsi
);
5637 HOST_WIDE_INT offset
, size
;
5641 if (!gimple_assign_load_p (stmt
))
5643 rhs
= gimple_assign_rhs1 (stmt
);
5644 if (!is_gimple_reg_type (TREE_TYPE (rhs
)))
5649 while (handled_component_p (t
))
5651 /* V_C_E can do things like convert an array of integers to one
5652 bigger integer and similar things we do not handle below. */
5653 if (TREE_CODE (rhs
) == VIEW_CONVERT_EXPR
)
5658 t
= TREE_OPERAND (t
, 0);
5663 if (!ipa_load_from_parm_agg (m_fbi
, m_descriptors
, stmt
, rhs
, &index
,
5664 &offset
, &size
, &by_ref
))
5666 for (v
= m_aggval
; v
; v
= v
->next
)
5667 if (v
->index
== index
5668 && v
->offset
== offset
)
5671 || v
->by_ref
!= by_ref
5672 || tree_to_shwi (TYPE_SIZE (TREE_TYPE (v
->value
))) != size
)
5675 gcc_checking_assert (is_gimple_ip_invariant (v
->value
));
5676 if (!useless_type_conversion_p (TREE_TYPE (rhs
), TREE_TYPE (v
->value
)))
5678 if (fold_convertible_p (TREE_TYPE (rhs
), v
->value
))
5679 val
= fold_build1 (NOP_EXPR
, TREE_TYPE (rhs
), v
->value
);
5680 else if (TYPE_SIZE (TREE_TYPE (rhs
))
5681 == TYPE_SIZE (TREE_TYPE (v
->value
)))
5682 val
= fold_build1 (VIEW_CONVERT_EXPR
, TREE_TYPE (rhs
), v
->value
);
5687 fprintf (dump_file
, " const ");
5688 print_generic_expr (dump_file
, v
->value
, 0);
5689 fprintf (dump_file
, " can't be converted to type of ");
5690 print_generic_expr (dump_file
, rhs
, 0);
5691 fprintf (dump_file
, "\n");
5699 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
5701 fprintf (dump_file
, "Modifying stmt:\n ");
5702 print_gimple_stmt (dump_file
, stmt
, 0, 0);
5704 gimple_assign_set_rhs_from_tree (&gsi
, val
);
5707 if (dump_file
&& (dump_flags
& TDF_DETAILS
))
5709 fprintf (dump_file
, "into:\n ");
5710 print_gimple_stmt (dump_file
, stmt
, 0, 0);
5711 fprintf (dump_file
, "\n");
5714 *m_something_changed
= true;
5715 if (maybe_clean_eh_stmt (stmt
)
5716 && gimple_purge_dead_eh_edges (gimple_bb (stmt
)))
5717 *m_cfg_changed
= true;
5722 /* Update bits info of formal parameters as described in
5723 ipcp_transformation_summary. */
5726 ipcp_update_bits (struct cgraph_node
*node
)
5728 tree parm
= DECL_ARGUMENTS (node
->decl
);
5729 tree next_parm
= parm
;
5730 ipcp_transformation_summary
*ts
= ipcp_get_transformation_summary (node
);
5732 if (!ts
|| vec_safe_length (ts
->bits
) == 0)
5735 vec
<ipa_bits
*, va_gc
> &bits
= *ts
->bits
;
5736 unsigned count
= bits
.length ();
5738 for (unsigned i
= 0; i
< count
; ++i
, parm
= next_parm
)
5740 if (node
->clone
.combined_args_to_skip
5741 && bitmap_bit_p (node
->clone
.combined_args_to_skip
, i
))
5744 gcc_checking_assert (parm
);
5745 next_parm
= DECL_CHAIN (parm
);
5748 || !(INTEGRAL_TYPE_P (TREE_TYPE (parm
))
5749 || POINTER_TYPE_P (TREE_TYPE (parm
)))
5750 || !is_gimple_reg (parm
))
5753 tree ddef
= ssa_default_def (DECL_STRUCT_FUNCTION (node
->decl
), parm
);
5759 fprintf (dump_file
, "Adjusting mask for param %u to ", i
);
5760 print_hex (bits
[i
]->mask
, dump_file
);
5761 fprintf (dump_file
, "\n");
5764 if (INTEGRAL_TYPE_P (TREE_TYPE (ddef
)))
5766 unsigned prec
= TYPE_PRECISION (TREE_TYPE (ddef
));
5767 signop sgn
= TYPE_SIGN (TREE_TYPE (ddef
));
5769 wide_int nonzero_bits
= wide_int::from (bits
[i
]->mask
, prec
, UNSIGNED
)
5770 | wide_int::from (bits
[i
]->value
, prec
, sgn
);
5771 set_nonzero_bits (ddef
, nonzero_bits
);
5775 unsigned tem
= bits
[i
]->mask
.to_uhwi ();
5776 unsigned HOST_WIDE_INT bitpos
= bits
[i
]->value
.to_uhwi ();
5777 unsigned align
= tem
& -tem
;
5778 unsigned misalign
= bitpos
& (align
- 1);
5783 fprintf (dump_file
, "Adjusting align: %u, misalign: %u\n", align
, misalign
);
5785 unsigned old_align
, old_misalign
;
5786 struct ptr_info_def
*pi
= get_ptr_info (ddef
);
5787 bool old_known
= get_ptr_info_alignment (pi
, &old_align
, &old_misalign
);
5790 && old_align
> align
)
5794 fprintf (dump_file
, "But alignment was already %u.\n", old_align
);
5795 if ((old_misalign
& (align
- 1)) != misalign
)
5796 fprintf (dump_file
, "old_misalign (%u) and misalign (%u) mismatch\n",
5797 old_misalign
, misalign
);
5803 && ((misalign
& (old_align
- 1)) != old_misalign
)
5805 fprintf (dump_file
, "old_misalign (%u) and misalign (%u) mismatch\n",
5806 old_misalign
, misalign
);
5808 set_ptr_info_alignment (pi
, align
, misalign
);
5814 /* Update value range of formal parameters as described in
5815 ipcp_transformation_summary. */
5818 ipcp_update_vr (struct cgraph_node
*node
)
5820 tree fndecl
= node
->decl
;
5821 tree parm
= DECL_ARGUMENTS (fndecl
);
5822 tree next_parm
= parm
;
5823 ipcp_transformation_summary
*ts
= ipcp_get_transformation_summary (node
);
5824 if (!ts
|| vec_safe_length (ts
->m_vr
) == 0)
5826 const vec
<ipa_vr
, va_gc
> &vr
= *ts
->m_vr
;
5827 unsigned count
= vr
.length ();
5829 for (unsigned i
= 0; i
< count
; ++i
, parm
= next_parm
)
5831 if (node
->clone
.combined_args_to_skip
5832 && bitmap_bit_p (node
->clone
.combined_args_to_skip
, i
))
5834 gcc_checking_assert (parm
);
5835 next_parm
= DECL_CHAIN (parm
);
5836 tree ddef
= ssa_default_def (DECL_STRUCT_FUNCTION (node
->decl
), parm
);
5838 if (!ddef
|| !is_gimple_reg (parm
))
5842 && (vr
[i
].type
== VR_RANGE
|| vr
[i
].type
== VR_ANTI_RANGE
))
5844 tree type
= TREE_TYPE (ddef
);
5845 unsigned prec
= TYPE_PRECISION (type
);
5846 if (INTEGRAL_TYPE_P (TREE_TYPE (ddef
)))
5850 fprintf (dump_file
, "Setting value range of param %u ", i
);
5851 fprintf (dump_file
, "%s[",
5852 (vr
[i
].type
== VR_ANTI_RANGE
) ? "~" : "");
5853 print_decs (vr
[i
].min
, dump_file
);
5854 fprintf (dump_file
, ", ");
5855 print_decs (vr
[i
].max
, dump_file
);
5856 fprintf (dump_file
, "]\n");
5858 set_range_info (ddef
, vr
[i
].type
,
5859 wide_int_storage::from (vr
[i
].min
, prec
,
5861 wide_int_storage::from (vr
[i
].max
, prec
,
5864 else if (POINTER_TYPE_P (TREE_TYPE (ddef
))
5865 && vr
[i
].type
== VR_ANTI_RANGE
5866 && wi::eq_p (vr
[i
].min
, 0)
5867 && wi::eq_p (vr
[i
].max
, 0))
5870 fprintf (dump_file
, "Setting nonnull for %u\n", i
);
5871 set_ptr_nonnull (ddef
);
5877 /* IPCP transformation phase doing propagation of aggregate values. */
5880 ipcp_transform_function (struct cgraph_node
*node
)
5882 vec
<ipa_param_descriptor
, va_gc
> *descriptors
= NULL
;
5883 struct ipa_func_body_info fbi
;
5884 struct ipa_agg_replacement_value
*aggval
;
5886 bool cfg_changed
= false, something_changed
= false;
5888 gcc_checking_assert (cfun
);
5889 gcc_checking_assert (current_function_decl
);
5892 fprintf (dump_file
, "Modification phase of node %s/%i\n",
5893 node
->name (), node
->order
);
5895 ipcp_update_bits (node
);
5896 ipcp_update_vr (node
);
5897 aggval
= ipa_get_agg_replacements_for_node (node
);
5900 param_count
= count_formal_params (node
->decl
);
5901 if (param_count
== 0)
5903 adjust_agg_replacement_values (node
, aggval
);
5905 ipa_dump_agg_replacement_values (dump_file
, aggval
);
5909 fbi
.bb_infos
= vNULL
;
5910 fbi
.bb_infos
.safe_grow_cleared (last_basic_block_for_fn (cfun
));
5911 fbi
.param_count
= param_count
;
5914 vec_safe_grow_cleared (descriptors
, param_count
);
5915 ipa_populate_param_decls (node
, *descriptors
);
5916 calculate_dominance_info (CDI_DOMINATORS
);
5917 ipcp_modif_dom_walker (&fbi
, descriptors
, aggval
, &something_changed
,
5918 &cfg_changed
).walk (ENTRY_BLOCK_PTR_FOR_FN (cfun
));
5921 struct ipa_bb_info
*bi
;
5922 FOR_EACH_VEC_ELT (fbi
.bb_infos
, i
, bi
)
5923 free_ipa_bb_info (bi
);
5924 fbi
.bb_infos
.release ();
5925 free_dominance_info (CDI_DOMINATORS
);
5926 (*ipcp_transformations
)[node
->uid
].agg_values
= NULL
;
5927 (*ipcp_transformations
)[node
->uid
].bits
= NULL
;
5928 (*ipcp_transformations
)[node
->uid
].m_vr
= NULL
;
5930 vec_free (descriptors
);
5932 if (!something_changed
)
5934 else if (cfg_changed
)
5935 return TODO_update_ssa_only_virtuals
| TODO_cleanup_cfg
;
5937 return TODO_update_ssa_only_virtuals
;
5940 #include "gt-ipa-prop.h"