2 Copyright (C) 2003-2015 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
5 This file is part of GCC.
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3. If not see
19 <http://www.gnu.org/licenses/>. */
21 /* This module provide facilities for clonning functions. I.e. creating
22 new functions based on existing functions with simple modifications,
23 such as replacement of parameters.
25 To allow whole program optimization without actual presence of function
26 bodies, an additional infrastructure is provided for so-called virtual
29 A virtual clone in the callgraph is a function that has no
30 associated body, just a description of how to create its body based
31 on a different function (which itself may be a virtual clone).
33 The description of function modifications includes adjustments to
34 the function's signature (which allows, for example, removing or
35 adding function arguments), substitutions to perform on the
36 function body, and, for inlined functions, a pointer to the
37 function that it will be inlined into.
39 It is also possible to redirect any edge of the callgraph from a
40 function to its virtual clone. This implies updating of the call
41 site to adjust for the new function signature.
43 Most of the transformations performed by inter-procedural
44 optimizations can be represented via virtual clones. For
45 instance, a constant propagation pass can produce a virtual clone
46 of the function which replaces one of its arguments by a
47 constant. The inliner can represent its decisions by producing a
48 clone of a function whose body will be later integrated into
51 Using virtual clones, the program can be easily updated
52 during the Execute stage, solving most of pass interactions
53 problems that would otherwise occur during Transform.
55 Virtual clones are later materialized in the LTRANS stage and
56 turned into real functions. Passes executed after the virtual
57 clone were introduced also perform their Transform stage
58 on new functions, so for a pass there is no significant
59 difference between operating on a real function or a virtual
60 clone introduced before its Execute stage.
62 Optimization passes then work on virtual clones introduced before
63 their Execute stage as if they were real functions. The
64 only difference is that clones are not visible during the
65 Generate Summary stage. */
69 #include "coretypes.h"
75 #include "alloc-pool.h"
76 #include "stringpool.h"
80 #include "lto-streamer.h"
82 #include "fold-const.h"
83 #include "internal-fn.h"
86 #include "tree-inline.h"
87 #include "langhooks.h"
93 #include "symbol-summary.h"
95 #include "tree-iterator.h"
96 #include "tree-dump.h"
97 #include "gimple-pretty-print.h"
98 #include "ipa-inline.h"
99 #include "ipa-utils.h"
102 /* Create clone of edge in the node N represented by CALL_EXPR
106 cgraph_edge::clone (cgraph_node
*n
, gcall
*call_stmt
, unsigned stmt_uid
,
107 gcov_type count_scale
, int freq_scale
, bool update_original
)
109 cgraph_edge
*new_edge
;
110 gcov_type gcov_count
= apply_probability (count
, count_scale
);
113 /* We do not want to ignore loop nest after frequency drops to 0. */
116 freq
= frequency
* (gcov_type
) freq_scale
/ CGRAPH_FREQ_BASE
;
117 if (freq
> CGRAPH_FREQ_MAX
)
118 freq
= CGRAPH_FREQ_MAX
;
120 if (indirect_unknown_callee
)
124 if (call_stmt
&& (decl
= gimple_call_fndecl (call_stmt
))
125 /* When the call is speculative, we need to resolve it
126 via cgraph_resolve_speculation and not here. */
129 cgraph_node
*callee
= cgraph_node::get (decl
);
130 gcc_checking_assert (callee
);
131 new_edge
= n
->create_edge (callee
, call_stmt
, gcov_count
, freq
);
135 new_edge
= n
->create_indirect_edge (call_stmt
,
136 indirect_info
->ecf_flags
,
138 *new_edge
->indirect_info
= *indirect_info
;
143 new_edge
= n
->create_edge (callee
, call_stmt
, gcov_count
, freq
);
146 new_edge
->indirect_info
147 = ggc_cleared_alloc
<cgraph_indirect_call_info
> ();
148 *new_edge
->indirect_info
= *indirect_info
;
152 new_edge
->inline_failed
= inline_failed
;
153 new_edge
->indirect_inlining_edge
= indirect_inlining_edge
;
154 new_edge
->lto_stmt_uid
= stmt_uid
;
155 /* Clone flags that depend on call_stmt availability manually. */
156 new_edge
->can_throw_external
= can_throw_external
;
157 new_edge
->call_stmt_cannot_inline_p
= call_stmt_cannot_inline_p
;
158 new_edge
->speculative
= speculative
;
159 new_edge
->in_polymorphic_cdtor
= in_polymorphic_cdtor
;
162 count
-= new_edge
->count
;
166 symtab
->call_edge_duplication_hooks (this, new_edge
);
170 /* Build variant of function type ORIG_TYPE skipping ARGS_TO_SKIP and the
171 return value if SKIP_RETURN is true. */
174 build_function_type_skip_args (tree orig_type
, bitmap args_to_skip
,
177 tree new_type
= NULL
;
178 tree args
, new_args
= NULL
;
182 for (args
= TYPE_ARG_TYPES (orig_type
); args
&& args
!= void_list_node
;
183 args
= TREE_CHAIN (args
), i
++)
184 if (!args_to_skip
|| !bitmap_bit_p (args_to_skip
, i
))
185 new_args
= tree_cons (NULL_TREE
, TREE_VALUE (args
), new_args
);
187 new_reversed
= nreverse (new_args
);
191 TREE_CHAIN (new_args
) = void_list_node
;
193 new_reversed
= void_list_node
;
196 /* Use copy_node to preserve as much as possible from original type
197 (debug info, attribute lists etc.)
198 Exception is METHOD_TYPEs must have THIS argument.
199 When we are asked to remove it, we need to build new FUNCTION_TYPE
201 if (TREE_CODE (orig_type
) != METHOD_TYPE
203 || !bitmap_bit_p (args_to_skip
, 0))
205 new_type
= build_distinct_type_copy (orig_type
);
206 TYPE_ARG_TYPES (new_type
) = new_reversed
;
211 = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type
),
213 TYPE_CONTEXT (new_type
) = TYPE_CONTEXT (orig_type
);
217 TREE_TYPE (new_type
) = void_type_node
;
222 /* Build variant of function decl ORIG_DECL skipping ARGS_TO_SKIP and the
223 return value if SKIP_RETURN is true.
225 Arguments from DECL_ARGUMENTS list can't be removed now, since they are
226 linked by TREE_CHAIN directly. The caller is responsible for eliminating
227 them when they are being duplicated (i.e. copy_arguments_for_versioning). */
230 build_function_decl_skip_args (tree orig_decl
, bitmap args_to_skip
,
233 tree new_decl
= copy_node (orig_decl
);
236 new_type
= TREE_TYPE (orig_decl
);
237 if (prototype_p (new_type
)
238 || (skip_return
&& !VOID_TYPE_P (TREE_TYPE (new_type
))))
240 = build_function_type_skip_args (new_type
, args_to_skip
, skip_return
);
241 TREE_TYPE (new_decl
) = new_type
;
243 /* For declarations setting DECL_VINDEX (i.e. methods)
244 we expect first argument to be THIS pointer. */
245 if (args_to_skip
&& bitmap_bit_p (args_to_skip
, 0))
246 DECL_VINDEX (new_decl
) = NULL_TREE
;
248 /* When signature changes, we need to clear builtin info. */
249 if (DECL_BUILT_IN (new_decl
)
251 && !bitmap_empty_p (args_to_skip
))
253 DECL_BUILT_IN_CLASS (new_decl
) = NOT_BUILT_IN
;
254 DECL_FUNCTION_CODE (new_decl
) = (enum built_in_function
) 0;
256 /* The FE might have information and assumptions about the other
258 DECL_LANG_SPECIFIC (new_decl
) = NULL
;
262 /* Set flags of NEW_NODE and its decl. NEW_NODE is a newly created private
263 clone or its thunk. */
266 set_new_clone_decl_and_node_flags (cgraph_node
*new_node
)
268 DECL_EXTERNAL (new_node
->decl
) = 0;
269 TREE_PUBLIC (new_node
->decl
) = 0;
270 DECL_COMDAT (new_node
->decl
) = 0;
271 DECL_WEAK (new_node
->decl
) = 0;
272 DECL_VIRTUAL_P (new_node
->decl
) = 0;
273 DECL_STATIC_CONSTRUCTOR (new_node
->decl
) = 0;
274 DECL_STATIC_DESTRUCTOR (new_node
->decl
) = 0;
276 new_node
->externally_visible
= 0;
277 new_node
->local
.local
= 1;
278 new_node
->lowered
= true;
281 /* Duplicate thunk THUNK if necessary but make it to refer to NODE.
282 ARGS_TO_SKIP, if non-NULL, determines which parameters should be omitted.
283 Function can return NODE if no thunk is necessary, which can happen when
284 thunk is this_adjusting but we are removing this parameter. */
287 duplicate_thunk_for_node (cgraph_node
*thunk
, cgraph_node
*node
)
289 cgraph_node
*new_thunk
, *thunk_of
;
290 thunk_of
= thunk
->callees
->callee
->ultimate_alias_target ();
292 if (thunk_of
->thunk
.thunk_p
)
293 node
= duplicate_thunk_for_node (thunk_of
, node
);
295 if (!DECL_ARGUMENTS (thunk
->decl
))
296 thunk
->get_untransformed_body ();
299 for (cs
= node
->callers
; cs
; cs
= cs
->next_caller
)
300 if (cs
->caller
->thunk
.thunk_p
301 && cs
->caller
->thunk
.this_adjusting
== thunk
->thunk
.this_adjusting
302 && cs
->caller
->thunk
.fixed_offset
== thunk
->thunk
.fixed_offset
303 && cs
->caller
->thunk
.virtual_offset_p
== thunk
->thunk
.virtual_offset_p
304 && cs
->caller
->thunk
.virtual_value
== thunk
->thunk
.virtual_value
)
308 if (!node
->clone
.args_to_skip
)
309 new_decl
= copy_node (thunk
->decl
);
312 /* We do not need to duplicate this_adjusting thunks if we have removed
314 if (thunk
->thunk
.this_adjusting
315 && bitmap_bit_p (node
->clone
.args_to_skip
, 0))
318 new_decl
= build_function_decl_skip_args (thunk
->decl
,
319 node
->clone
.args_to_skip
,
323 tree
*link
= &DECL_ARGUMENTS (new_decl
);
325 for (tree pd
= DECL_ARGUMENTS (thunk
->decl
); pd
; pd
= DECL_CHAIN (pd
), i
++)
327 if (!node
->clone
.args_to_skip
328 || !bitmap_bit_p (node
->clone
.args_to_skip
, i
))
330 tree nd
= copy_node (pd
);
331 DECL_CONTEXT (nd
) = new_decl
;
333 link
= &DECL_CHAIN (nd
);
338 gcc_checking_assert (!DECL_STRUCT_FUNCTION (new_decl
));
339 gcc_checking_assert (!DECL_INITIAL (new_decl
));
340 gcc_checking_assert (!DECL_RESULT (new_decl
));
341 gcc_checking_assert (!DECL_RTL_SET_P (new_decl
));
343 DECL_NAME (new_decl
) = clone_function_name (thunk
->decl
, "artificial_thunk");
344 SET_DECL_ASSEMBLER_NAME (new_decl
, DECL_NAME (new_decl
));
346 new_thunk
= cgraph_node::create (new_decl
);
347 set_new_clone_decl_and_node_flags (new_thunk
);
348 new_thunk
->definition
= true;
349 new_thunk
->thunk
= thunk
->thunk
;
350 new_thunk
->unique_name
= in_lto_p
;
351 new_thunk
->former_clone_of
= thunk
->decl
;
352 new_thunk
->clone
.args_to_skip
= node
->clone
.args_to_skip
;
353 new_thunk
->clone
.combined_args_to_skip
= node
->clone
.combined_args_to_skip
;
355 cgraph_edge
*e
= new_thunk
->create_edge (node
, NULL
, 0,
357 e
->call_stmt_cannot_inline_p
= true;
358 symtab
->call_edge_duplication_hooks (thunk
->callees
, e
);
359 symtab
->call_cgraph_duplication_hooks (thunk
, new_thunk
);
363 /* If E does not lead to a thunk, simply redirect it to N. Otherwise create
364 one or more equivalent thunks for N and redirect E to the first in the
365 chain. Note that it is then necessary to call
366 n->expand_all_artificial_thunks once all callers are redirected. */
369 cgraph_edge::redirect_callee_duplicating_thunks (cgraph_node
*n
)
371 cgraph_node
*orig_to
= callee
->ultimate_alias_target ();
372 if (orig_to
->thunk
.thunk_p
)
373 n
= duplicate_thunk_for_node (orig_to
, n
);
378 /* Call expand_thunk on all callers that are thunks and if analyze those nodes
379 that were expanded. */
382 cgraph_node::expand_all_artificial_thunks ()
385 for (e
= callers
; e
;)
386 if (e
->caller
->thunk
.thunk_p
)
388 cgraph_node
*thunk
= e
->caller
;
391 if (thunk
->expand_thunk (false, false))
393 thunk
->thunk
.thunk_p
= false;
396 thunk
->expand_all_artificial_thunks ();
402 /* Create node representing clone of N executed COUNT times. Decrease
403 the execution counts from original node too.
404 The new clone will have decl set to DECL that may or may not be the same
407 When UPDATE_ORIGINAL is true, the counts are subtracted from the original
408 function's profile to reflect the fact that part of execution is handled
410 When CALL_DUPLICATOIN_HOOK is true, the ipa passes are acknowledged about
411 the new clone. Otherwise the caller is responsible for doing so later.
413 If the new node is being inlined into another one, NEW_INLINED_TO should be
414 the outline function the new one is (even indirectly) inlined to. All hooks
415 will see this in node's global.inlined_to, when invoked. Can be NULL if the
416 node is not inlined. */
419 cgraph_node::create_clone (tree new_decl
, gcov_type gcov_count
, int freq
,
420 bool update_original
,
421 vec
<cgraph_edge
*> redirect_callers
,
422 bool call_duplication_hook
,
423 cgraph_node
*new_inlined_to
,
426 cgraph_node
*new_node
= symtab
->create_empty ();
428 gcov_type count_scale
;
431 new_node
->decl
= new_decl
;
432 new_node
->register_symbol ();
433 new_node
->origin
= origin
;
434 new_node
->lto_file_data
= lto_file_data
;
435 if (new_node
->origin
)
437 new_node
->next_nested
= new_node
->origin
->nested
;
438 new_node
->origin
->nested
= new_node
;
440 new_node
->analyzed
= analyzed
;
441 new_node
->definition
= definition
;
442 new_node
->local
= local
;
443 new_node
->externally_visible
= false;
444 new_node
->no_reorder
= no_reorder
;
445 new_node
->local
.local
= true;
446 new_node
->global
= global
;
447 new_node
->global
.inlined_to
= new_inlined_to
;
449 new_node
->count
= count
;
450 new_node
->frequency
= frequency
;
451 new_node
->tp_first_run
= tp_first_run
;
452 new_node
->tm_clone
= tm_clone
;
453 new_node
->icf_merged
= icf_merged
;
454 new_node
->merged
= merged
;
456 new_node
->clone
.tree_map
= NULL
;
457 new_node
->clone
.args_to_skip
= args_to_skip
;
458 new_node
->split_part
= split_part
;
460 new_node
->clone
.combined_args_to_skip
= clone
.combined_args_to_skip
;
461 else if (clone
.combined_args_to_skip
)
463 new_node
->clone
.combined_args_to_skip
= BITMAP_GGC_ALLOC ();
464 bitmap_ior (new_node
->clone
.combined_args_to_skip
,
465 clone
.combined_args_to_skip
, args_to_skip
);
468 new_node
->clone
.combined_args_to_skip
= args_to_skip
;
472 if (new_node
->count
> count
)
473 count_scale
= REG_BR_PROB_BASE
;
475 count_scale
= GCOV_COMPUTE_SCALE (new_node
->count
, count
);
486 FOR_EACH_VEC_ELT (redirect_callers
, i
, e
)
488 /* Redirect calls to the old version node to point to its new
489 version. The only exception is when the edge was proved to
490 be unreachable during the clonning procedure. */
492 || DECL_BUILT_IN_CLASS (e
->callee
->decl
) != BUILT_IN_NORMAL
493 || DECL_FUNCTION_CODE (e
->callee
->decl
) != BUILT_IN_UNREACHABLE
)
494 e
->redirect_callee_duplicating_thunks (new_node
);
496 new_node
->expand_all_artificial_thunks ();
498 for (e
= callees
;e
; e
=e
->next_callee
)
499 e
->clone (new_node
, e
->call_stmt
, e
->lto_stmt_uid
, count_scale
,
500 freq
, update_original
);
502 for (e
= indirect_calls
; e
; e
= e
->next_callee
)
503 e
->clone (new_node
, e
->call_stmt
, e
->lto_stmt_uid
,
504 count_scale
, freq
, update_original
);
505 new_node
->clone_references (this);
507 new_node
->next_sibling_clone
= clones
;
509 clones
->prev_sibling_clone
= new_node
;
511 new_node
->clone_of
= this;
513 if (call_duplication_hook
)
514 symtab
->call_cgraph_duplication_hooks (this, new_node
);
518 static GTY(()) unsigned int clone_fn_id_num
;
520 /* Return a new assembler name for a clone with SUFFIX of a decl named
524 clone_function_name_1 (const char *name
, const char *suffix
)
526 size_t len
= strlen (name
);
527 char *tmp_name
, *prefix
;
529 prefix
= XALLOCAVEC (char, len
+ strlen (suffix
) + 2);
530 memcpy (prefix
, name
, len
);
531 strcpy (prefix
+ len
+ 1, suffix
);
532 #ifndef NO_DOT_IN_LABEL
534 #elif !defined NO_DOLLAR_IN_LABEL
539 ASM_FORMAT_PRIVATE_NAME (tmp_name
, prefix
, clone_fn_id_num
++);
540 return get_identifier (tmp_name
);
543 /* Return a new assembler name for a clone of DECL with SUFFIX. */
546 clone_function_name (tree decl
, const char *suffix
)
548 tree name
= DECL_ASSEMBLER_NAME (decl
);
549 return clone_function_name_1 (IDENTIFIER_POINTER (name
), suffix
);
553 /* Create callgraph node clone with new declaration. The actual body will
554 be copied later at compilation stage.
556 TODO: after merging in ipa-sra use function call notes instead of args_to_skip
560 cgraph_node::create_virtual_clone (vec
<cgraph_edge
*> redirect_callers
,
561 vec
<ipa_replace_map
*, va_gc
> *tree_map
,
562 bitmap args_to_skip
, const char * suffix
)
564 tree old_decl
= decl
;
565 cgraph_node
*new_node
= NULL
;
568 ipa_replace_map
*map
;
571 gcc_checking_assert (local
.versionable
);
572 gcc_assert (local
.can_change_signature
|| !args_to_skip
);
574 /* Make a new FUNCTION_DECL tree node */
576 new_decl
= copy_node (old_decl
);
578 new_decl
= build_function_decl_skip_args (old_decl
, args_to_skip
, false);
580 /* These pointers represent function body and will be populated only when clone
582 gcc_assert (new_decl
!= old_decl
);
583 DECL_STRUCT_FUNCTION (new_decl
) = NULL
;
584 DECL_ARGUMENTS (new_decl
) = NULL
;
585 DECL_INITIAL (new_decl
) = NULL
;
586 DECL_RESULT (new_decl
) = NULL
;
587 /* We can not do DECL_RESULT (new_decl) = NULL; here because of LTO partitioning
588 sometimes storing only clone decl instead of original. */
590 /* Generate a new name for the new version. */
591 len
= IDENTIFIER_LENGTH (DECL_NAME (old_decl
));
592 name
= XALLOCAVEC (char, len
+ strlen (suffix
) + 2);
593 memcpy (name
, IDENTIFIER_POINTER (DECL_NAME (old_decl
)), len
);
594 strcpy (name
+ len
+ 1, suffix
);
596 DECL_NAME (new_decl
) = get_identifier (name
);
597 SET_DECL_ASSEMBLER_NAME (new_decl
, clone_function_name (old_decl
, suffix
));
598 SET_DECL_RTL (new_decl
, NULL
);
600 new_node
= create_clone (new_decl
, count
, CGRAPH_FREQ_BASE
, false,
601 redirect_callers
, false, NULL
, args_to_skip
);
603 /* Update the properties.
604 Make clone visible only within this translation unit. Make sure
605 that is not weak also.
606 ??? We cannot use COMDAT linkage because there is no
607 ABI support for this. */
608 set_new_clone_decl_and_node_flags (new_node
);
609 new_node
->clone
.tree_map
= tree_map
;
610 if (!implicit_section
)
611 new_node
->set_section (get_section ());
613 /* Clones of global symbols or symbols with unique names are unique. */
614 if ((TREE_PUBLIC (old_decl
)
615 && !DECL_EXTERNAL (old_decl
)
616 && !DECL_WEAK (old_decl
)
617 && !DECL_COMDAT (old_decl
))
619 new_node
->unique_name
= true;
620 FOR_EACH_VEC_SAFE_ELT (tree_map
, i
, map
)
621 new_node
->maybe_create_reference (map
->new_tree
, IPA_REF_ADDR
, NULL
);
623 if (ipa_transforms_to_apply
.exists ())
624 new_node
->ipa_transforms_to_apply
625 = ipa_transforms_to_apply
.copy ();
627 symtab
->call_cgraph_duplication_hooks (this, new_node
);
632 /* callgraph node being removed from symbol table; see if its entry can be
633 replaced by other inline clone. */
635 cgraph_node::find_replacement (void)
637 cgraph_node
*next_inline_clone
, *replacement
;
639 for (next_inline_clone
= clones
;
641 && next_inline_clone
->decl
!= decl
;
642 next_inline_clone
= next_inline_clone
->next_sibling_clone
)
645 /* If there is inline clone of the node being removed, we need
646 to put it into the position of removed node and reorganize all
647 other clones to be based on it. */
648 if (next_inline_clone
)
651 cgraph_node
*new_clones
;
653 replacement
= next_inline_clone
;
655 /* Unlink inline clone from the list of clones of removed node. */
656 if (next_inline_clone
->next_sibling_clone
)
657 next_inline_clone
->next_sibling_clone
->prev_sibling_clone
658 = next_inline_clone
->prev_sibling_clone
;
659 if (next_inline_clone
->prev_sibling_clone
)
661 gcc_assert (clones
!= next_inline_clone
);
662 next_inline_clone
->prev_sibling_clone
->next_sibling_clone
663 = next_inline_clone
->next_sibling_clone
;
667 gcc_assert (clones
== next_inline_clone
);
668 clones
= next_inline_clone
->next_sibling_clone
;
674 /* Copy clone info. */
675 next_inline_clone
->clone
= clone
;
677 /* Now place it into clone tree at same level at NODE. */
678 next_inline_clone
->clone_of
= clone_of
;
679 next_inline_clone
->prev_sibling_clone
= NULL
;
680 next_inline_clone
->next_sibling_clone
= NULL
;
683 if (clone_of
->clones
)
684 clone_of
->clones
->prev_sibling_clone
= next_inline_clone
;
685 next_inline_clone
->next_sibling_clone
= clone_of
->clones
;
686 clone_of
->clones
= next_inline_clone
;
689 /* Merge the clone list. */
692 if (!next_inline_clone
->clones
)
693 next_inline_clone
->clones
= new_clones
;
696 n
= next_inline_clone
->clones
;
697 while (n
->next_sibling_clone
)
698 n
= n
->next_sibling_clone
;
699 n
->next_sibling_clone
= new_clones
;
700 new_clones
->prev_sibling_clone
= n
;
704 /* Update clone_of pointers. */
708 n
->clone_of
= next_inline_clone
;
709 n
= n
->next_sibling_clone
;
717 /* Like cgraph_set_call_stmt but walk the clone tree and update all
718 clones sharing the same function body.
719 When WHOLE_SPECULATIVE_EDGES is true, all three components of
720 speculative edge gets updated. Otherwise we update only direct
724 cgraph_node::set_call_stmt_including_clones (gimple
*old_stmt
,
726 bool update_speculative
)
729 cgraph_edge
*edge
= get_edge (old_stmt
);
732 edge
->set_call_stmt (new_stmt
, update_speculative
);
738 cgraph_edge
*edge
= node
->get_edge (old_stmt
);
741 edge
->set_call_stmt (new_stmt
, update_speculative
);
742 /* If UPDATE_SPECULATIVE is false, it means that we are turning
743 speculative call into a real code sequence. Update the
745 if (edge
->speculative
&& !update_speculative
)
747 cgraph_edge
*direct
, *indirect
;
750 gcc_assert (!edge
->indirect_unknown_callee
);
751 edge
->speculative_call_info (direct
, indirect
, ref
);
752 direct
->speculative
= false;
753 indirect
->speculative
= false;
754 ref
->speculative
= false;
759 else if (node
->next_sibling_clone
)
760 node
= node
->next_sibling_clone
;
763 while (node
!= this && !node
->next_sibling_clone
)
764 node
= node
->clone_of
;
766 node
= node
->next_sibling_clone
;
771 /* Like cgraph_create_edge walk the clone tree and update all clones sharing
772 same function body. If clones already have edge for OLD_STMT; only
773 update the edge same way as cgraph_set_call_stmt_including_clones does.
775 TODO: COUNT and LOOP_DEPTH should be properly distributed based on relative
776 frequencies of the clones. */
779 cgraph_node::create_edge_including_clones (cgraph_node
*callee
,
780 gimple
*old_stmt
, gcall
*stmt
,
783 cgraph_inline_failed_t reason
)
788 if (!get_edge (stmt
))
790 edge
= create_edge (callee
, stmt
, count
, freq
);
791 edge
->inline_failed
= reason
;
798 cgraph_edge
*edge
= node
->get_edge (old_stmt
);
800 /* It is possible that clones already contain the edge while
801 master didn't. Either we promoted indirect call into direct
802 call in the clone or we are processing clones of unreachable
803 master where edges has been removed. */
805 edge
->set_call_stmt (stmt
);
806 else if (! node
->get_edge (stmt
))
808 edge
= node
->create_edge (callee
, stmt
, count
, freq
);
809 edge
->inline_failed
= reason
;
814 else if (node
->next_sibling_clone
)
815 node
= node
->next_sibling_clone
;
818 while (node
!= this && !node
->next_sibling_clone
)
819 node
= node
->clone_of
;
821 node
= node
->next_sibling_clone
;
826 /* Remove the node from cgraph and all inline clones inlined into it.
827 Skip however removal of FORBIDDEN_NODE and return true if it needs to be
828 removed. This allows to call the function from outer loop walking clone
832 cgraph_node::remove_symbol_and_inline_clones (cgraph_node
*forbidden_node
)
834 cgraph_edge
*e
, *next
;
837 if (this == forbidden_node
)
842 for (e
= callees
; e
; e
= next
)
844 next
= e
->next_callee
;
845 if (!e
->inline_failed
)
846 found
|= e
->callee
->remove_symbol_and_inline_clones (forbidden_node
);
852 /* The edges representing the callers of the NEW_VERSION node were
853 fixed by cgraph_function_versioning (), now the call_expr in their
854 respective tree code should be updated to call the NEW_VERSION. */
857 update_call_expr (cgraph_node
*new_version
)
861 gcc_assert (new_version
);
863 /* Update the call expr on the edges to call the new version. */
864 for (e
= new_version
->callers
; e
; e
= e
->next_caller
)
866 function
*inner_function
= DECL_STRUCT_FUNCTION (e
->caller
->decl
);
867 gimple_call_set_fndecl (e
->call_stmt
, new_version
->decl
);
868 maybe_clean_eh_stmt_fn (inner_function
, e
->call_stmt
);
873 /* Create a new cgraph node which is the new version of
874 callgraph node. REDIRECT_CALLERS holds the callers
875 edges which should be redirected to point to
876 NEW_VERSION. ALL the callees edges of the node
877 are cloned to the new version node. Return the new
880 If non-NULL BLOCK_TO_COPY determine what basic blocks
881 was copied to prevent duplications of calls that are dead
885 cgraph_node::create_version_clone (tree new_decl
,
886 vec
<cgraph_edge
*> redirect_callers
,
889 cgraph_node
*new_version
;
893 new_version
= cgraph_node::create (new_decl
);
895 new_version
->analyzed
= analyzed
;
896 new_version
->definition
= definition
;
897 new_version
->local
= local
;
898 new_version
->externally_visible
= false;
899 new_version
->no_reorder
= no_reorder
;
900 new_version
->local
.local
= new_version
->definition
;
901 new_version
->global
= global
;
902 new_version
->rtl
= rtl
;
903 new_version
->count
= count
;
905 for (e
= callees
; e
; e
=e
->next_callee
)
907 || bitmap_bit_p (bbs_to_copy
, gimple_bb (e
->call_stmt
)->index
))
908 e
->clone (new_version
, e
->call_stmt
,
909 e
->lto_stmt_uid
, REG_BR_PROB_BASE
,
912 for (e
= indirect_calls
; e
; e
=e
->next_callee
)
914 || bitmap_bit_p (bbs_to_copy
, gimple_bb (e
->call_stmt
)->index
))
915 e
->clone (new_version
, e
->call_stmt
,
916 e
->lto_stmt_uid
, REG_BR_PROB_BASE
,
919 FOR_EACH_VEC_ELT (redirect_callers
, i
, e
)
921 /* Redirect calls to the old version node to point to its new
923 e
->redirect_callee (new_version
);
926 symtab
->call_cgraph_duplication_hooks (this, new_version
);
931 /* Perform function versioning.
932 Function versioning includes copying of the tree and
933 a callgraph update (creating a new cgraph node and updating
934 its callees and callers).
936 REDIRECT_CALLERS varray includes the edges to be redirected
939 TREE_MAP is a mapping of tree nodes we want to replace with
940 new ones (according to results of prior analysis).
942 If non-NULL ARGS_TO_SKIP determine function parameters to remove
944 If SKIP_RETURN is true, the new version will return void.
945 If non-NULL BLOCK_TO_COPY determine what basic blocks to copy.
946 If non_NULL NEW_ENTRY determine new entry BB of the clone.
948 Return the new version's cgraph node. */
951 cgraph_node::create_version_clone_with_body
952 (vec
<cgraph_edge
*> redirect_callers
,
953 vec
<ipa_replace_map
*, va_gc
> *tree_map
, bitmap args_to_skip
,
954 bool skip_return
, bitmap bbs_to_copy
, basic_block new_entry_block
,
955 const char *clone_name
)
957 tree old_decl
= decl
;
958 cgraph_node
*new_version_node
= NULL
;
961 if (!tree_versionable_function_p (old_decl
))
964 gcc_assert (local
.can_change_signature
|| !args_to_skip
);
966 /* Make a new FUNCTION_DECL tree node for the new version. */
967 if (!args_to_skip
&& !skip_return
)
968 new_decl
= copy_node (old_decl
);
971 = build_function_decl_skip_args (old_decl
, args_to_skip
, skip_return
);
973 /* Generate a new name for the new version. */
974 DECL_NAME (new_decl
) = clone_function_name (old_decl
, clone_name
);
975 SET_DECL_ASSEMBLER_NAME (new_decl
, DECL_NAME (new_decl
));
976 SET_DECL_RTL (new_decl
, NULL
);
978 /* When the old decl was a con-/destructor make sure the clone isn't. */
979 DECL_STATIC_CONSTRUCTOR (new_decl
) = 0;
980 DECL_STATIC_DESTRUCTOR (new_decl
) = 0;
982 /* Create the new version's call-graph node.
983 and update the edges of the new node. */
984 new_version_node
= create_version_clone (new_decl
, redirect_callers
,
987 if (ipa_transforms_to_apply
.exists ())
988 new_version_node
->ipa_transforms_to_apply
989 = ipa_transforms_to_apply
.copy ();
990 /* Copy the OLD_VERSION_NODE function tree to the new version. */
991 tree_function_versioning (old_decl
, new_decl
, tree_map
, false, args_to_skip
,
992 skip_return
, bbs_to_copy
, new_entry_block
);
994 /* Update the new version's properties.
995 Make The new version visible only within this translation unit. Make sure
996 that is not weak also.
997 ??? We cannot use COMDAT linkage because there is no
998 ABI support for this. */
999 new_version_node
->make_decl_local ();
1000 DECL_VIRTUAL_P (new_version_node
->decl
) = 0;
1001 new_version_node
->externally_visible
= 0;
1002 new_version_node
->local
.local
= 1;
1003 new_version_node
->lowered
= true;
1004 if (!implicit_section
)
1005 new_version_node
->set_section (get_section ());
1006 /* Clones of global symbols or symbols with unique names are unique. */
1007 if ((TREE_PUBLIC (old_decl
)
1008 && !DECL_EXTERNAL (old_decl
)
1009 && !DECL_WEAK (old_decl
)
1010 && !DECL_COMDAT (old_decl
))
1012 new_version_node
->unique_name
= true;
1014 /* Update the call_expr on the edges to call the new version node. */
1015 update_call_expr (new_version_node
);
1017 symtab
->call_cgraph_insertion_hooks (this);
1018 return new_version_node
;
1021 /* Given virtual clone, turn it into actual clone. */
1024 cgraph_materialize_clone (cgraph_node
*node
)
1026 bitmap_obstack_initialize (NULL
);
1027 node
->former_clone_of
= node
->clone_of
->decl
;
1028 if (node
->clone_of
->former_clone_of
)
1029 node
->former_clone_of
= node
->clone_of
->former_clone_of
;
1030 /* Copy the OLD_VERSION_NODE function tree to the new version. */
1031 tree_function_versioning (node
->clone_of
->decl
, node
->decl
,
1032 node
->clone
.tree_map
, true,
1033 node
->clone
.args_to_skip
, false,
1035 if (symtab
->dump_file
)
1037 dump_function_to_file (node
->clone_of
->decl
, symtab
->dump_file
,
1039 dump_function_to_file (node
->decl
, symtab
->dump_file
, dump_flags
);
1042 /* Function is no longer clone. */
1043 if (node
->next_sibling_clone
)
1044 node
->next_sibling_clone
->prev_sibling_clone
= node
->prev_sibling_clone
;
1045 if (node
->prev_sibling_clone
)
1046 node
->prev_sibling_clone
->next_sibling_clone
= node
->next_sibling_clone
;
1048 node
->clone_of
->clones
= node
->next_sibling_clone
;
1049 node
->next_sibling_clone
= NULL
;
1050 node
->prev_sibling_clone
= NULL
;
1051 if (!node
->clone_of
->analyzed
&& !node
->clone_of
->clones
)
1053 node
->clone_of
->release_body ();
1054 node
->clone_of
->remove_callees ();
1055 node
->clone_of
->remove_all_references ();
1057 node
->clone_of
= NULL
;
1058 bitmap_obstack_release (NULL
);
1061 /* Once all functions from compilation unit are in memory, produce all clones
1062 and update all calls. We might also do this on demand if we don't want to
1063 bring all functions to memory prior compilation, but current WHOPR
1064 implementation does that and it is a bit easier to keep everything right in
1068 symbol_table::materialize_all_clones (void)
1071 bool stabilized
= false;
1074 if (symtab
->dump_file
)
1075 fprintf (symtab
->dump_file
, "Materializing clones\n");
1077 cgraph_node::checking_verify_cgraph_nodes ();
1079 /* We can also do topological order, but number of iterations should be
1080 bounded by number of IPA passes since single IPA pass is probably not
1081 going to create clones of clones it created itself. */
1085 FOR_EACH_FUNCTION (node
)
1087 if (node
->clone_of
&& node
->decl
!= node
->clone_of
->decl
1088 && !gimple_has_body_p (node
->decl
))
1090 if (!node
->clone_of
->clone_of
)
1091 node
->clone_of
->get_untransformed_body ();
1092 if (gimple_has_body_p (node
->clone_of
->decl
))
1094 if (symtab
->dump_file
)
1096 fprintf (symtab
->dump_file
, "cloning %s to %s\n",
1097 xstrdup_for_dump (node
->clone_of
->name ()),
1098 xstrdup_for_dump (node
->name ()));
1099 if (node
->clone
.tree_map
)
1102 fprintf (symtab
->dump_file
, " replace map: ");
1104 i
< vec_safe_length (node
->clone
.tree_map
);
1107 ipa_replace_map
*replace_info
;
1108 replace_info
= (*node
->clone
.tree_map
)[i
];
1109 print_generic_expr (symtab
->dump_file
, replace_info
->old_tree
, 0);
1110 fprintf (symtab
->dump_file
, " -> ");
1111 print_generic_expr (symtab
->dump_file
, replace_info
->new_tree
, 0);
1112 fprintf (symtab
->dump_file
, "%s%s;",
1113 replace_info
->replace_p
? "(replace)":"",
1114 replace_info
->ref_p
? "(ref)":"");
1116 fprintf (symtab
->dump_file
, "\n");
1118 if (node
->clone
.args_to_skip
)
1120 fprintf (symtab
->dump_file
, " args_to_skip: ");
1121 dump_bitmap (symtab
->dump_file
,
1122 node
->clone
.args_to_skip
);
1124 if (node
->clone
.args_to_skip
)
1126 fprintf (symtab
->dump_file
, " combined_args_to_skip:");
1127 dump_bitmap (symtab
->dump_file
, node
->clone
.combined_args_to_skip
);
1130 cgraph_materialize_clone (node
);
1136 FOR_EACH_FUNCTION (node
)
1137 if (!node
->analyzed
&& node
->callees
)
1139 node
->remove_callees ();
1140 node
->remove_all_references ();
1143 node
->clear_stmts_in_references ();
1144 if (symtab
->dump_file
)
1145 fprintf (symtab
->dump_file
, "Materialization Call site updates done.\n");
1147 cgraph_node::checking_verify_cgraph_nodes ();
1149 symtab
->remove_unreachable_nodes (symtab
->dump_file
);
1152 #include "gt-cgraphclones.h"