Daily bump.
[official-gcc.git] / gcc / cgraphclones.c
blobe310b1ce801d80dc9169fcd5aa1117a984925c18
1 /* Callgraph clones
2 Copyright (C) 2003-2014 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
10 version.
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
15 for more details.
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
27 clones
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
49 a given function.
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. */
67 #include "config.h"
68 #include "system.h"
69 #include "coretypes.h"
70 #include "tm.h"
71 #include "rtl.h"
72 #include "tree.h"
73 #include "stringpool.h"
74 #include "function.h"
75 #include "emit-rtl.h"
76 #include "basic-block.h"
77 #include "tree-ssa-alias.h"
78 #include "internal-fn.h"
79 #include "tree-eh.h"
80 #include "gimple-expr.h"
81 #include "is-a.h"
82 #include "gimple.h"
83 #include "bitmap.h"
84 #include "tree-cfg.h"
85 #include "tree-inline.h"
86 #include "langhooks.h"
87 #include "toplev.h"
88 #include "flags.h"
89 #include "debug.h"
90 #include "target.h"
91 #include "diagnostic.h"
92 #include "params.h"
93 #include "intl.h"
94 #include "function.h"
95 #include "ipa-prop.h"
96 #include "tree-iterator.h"
97 #include "tree-dump.h"
98 #include "gimple-pretty-print.h"
99 #include "coverage.h"
100 #include "ipa-inline.h"
101 #include "ipa-utils.h"
102 #include "lto-streamer.h"
103 #include "except.h"
105 /* Create clone of E in the node N represented by CALL_EXPR the callgraph. */
106 struct cgraph_edge *
107 cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n,
108 gimple call_stmt, unsigned stmt_uid, gcov_type count_scale,
109 int freq_scale, bool update_original)
111 struct cgraph_edge *new_edge;
112 gcov_type count = apply_probability (e->count, count_scale);
113 gcov_type freq;
115 /* We do not want to ignore loop nest after frequency drops to 0. */
116 if (!freq_scale)
117 freq_scale = 1;
118 freq = e->frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE;
119 if (freq > CGRAPH_FREQ_MAX)
120 freq = CGRAPH_FREQ_MAX;
122 if (e->indirect_unknown_callee)
124 tree decl;
126 if (call_stmt && (decl = gimple_call_fndecl (call_stmt))
127 /* When the call is speculative, we need to resolve it
128 via cgraph_resolve_speculation and not here. */
129 && !e->speculative)
131 struct cgraph_node *callee = cgraph_get_node (decl);
132 gcc_checking_assert (callee);
133 new_edge = cgraph_create_edge (n, callee, call_stmt, count, freq);
135 else
137 new_edge = cgraph_create_indirect_edge (n, call_stmt,
138 e->indirect_info->ecf_flags,
139 count, freq);
140 *new_edge->indirect_info = *e->indirect_info;
143 else
145 new_edge = cgraph_create_edge (n, e->callee, call_stmt, count, freq);
146 if (e->indirect_info)
148 new_edge->indirect_info
149 = ggc_alloc_cleared_cgraph_indirect_call_info ();
150 *new_edge->indirect_info = *e->indirect_info;
154 new_edge->inline_failed = e->inline_failed;
155 new_edge->indirect_inlining_edge = e->indirect_inlining_edge;
156 new_edge->lto_stmt_uid = stmt_uid;
157 /* Clone flags that depend on call_stmt availability manually. */
158 new_edge->can_throw_external = e->can_throw_external;
159 new_edge->call_stmt_cannot_inline_p = e->call_stmt_cannot_inline_p;
160 new_edge->speculative = e->speculative;
161 if (update_original)
163 e->count -= new_edge->count;
164 if (e->count < 0)
165 e->count = 0;
167 cgraph_call_edge_duplication_hooks (e, new_edge);
168 return new_edge;
171 /* Build variant of function type ORIG_TYPE skipping ARGS_TO_SKIP and the
172 return value if SKIP_RETURN is true. */
174 static tree
175 build_function_type_skip_args (tree orig_type, bitmap args_to_skip,
176 bool skip_return)
178 tree new_type = NULL;
179 tree args, new_args = NULL, t;
180 tree new_reversed;
181 int i = 0;
183 for (args = TYPE_ARG_TYPES (orig_type); args && args != void_list_node;
184 args = TREE_CHAIN (args), i++)
185 if (!args_to_skip || !bitmap_bit_p (args_to_skip, i))
186 new_args = tree_cons (NULL_TREE, TREE_VALUE (args), new_args);
188 new_reversed = nreverse (new_args);
189 if (args)
191 if (new_reversed)
192 TREE_CHAIN (new_args) = void_list_node;
193 else
194 new_reversed = void_list_node;
197 /* Use copy_node to preserve as much as possible from original type
198 (debug info, attribute lists etc.)
199 Exception is METHOD_TYPEs must have THIS argument.
200 When we are asked to remove it, we need to build new FUNCTION_TYPE
201 instead. */
202 if (TREE_CODE (orig_type) != METHOD_TYPE
203 || !args_to_skip
204 || !bitmap_bit_p (args_to_skip, 0))
206 new_type = build_distinct_type_copy (orig_type);
207 TYPE_ARG_TYPES (new_type) = new_reversed;
209 else
211 new_type
212 = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
213 new_reversed));
214 TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
217 if (skip_return)
218 TREE_TYPE (new_type) = void_type_node;
220 /* This is a new type, not a copy of an old type. Need to reassociate
221 variants. We can handle everything except the main variant lazily. */
222 t = TYPE_MAIN_VARIANT (orig_type);
223 if (t != orig_type)
225 t = build_function_type_skip_args (t, args_to_skip, skip_return);
226 TYPE_MAIN_VARIANT (new_type) = t;
227 TYPE_NEXT_VARIANT (new_type) = TYPE_NEXT_VARIANT (t);
228 TYPE_NEXT_VARIANT (t) = new_type;
230 else
232 TYPE_MAIN_VARIANT (new_type) = new_type;
233 TYPE_NEXT_VARIANT (new_type) = NULL;
236 return new_type;
239 /* Build variant of function decl ORIG_DECL skipping ARGS_TO_SKIP and the
240 return value if SKIP_RETURN is true.
242 Arguments from DECL_ARGUMENTS list can't be removed now, since they are
243 linked by TREE_CHAIN directly. The caller is responsible for eliminating
244 them when they are being duplicated (i.e. copy_arguments_for_versioning). */
246 static tree
247 build_function_decl_skip_args (tree orig_decl, bitmap args_to_skip,
248 bool skip_return)
250 tree new_decl = copy_node (orig_decl);
251 tree new_type;
253 new_type = TREE_TYPE (orig_decl);
254 if (prototype_p (new_type)
255 || (skip_return && !VOID_TYPE_P (TREE_TYPE (new_type))))
256 new_type
257 = build_function_type_skip_args (new_type, args_to_skip, skip_return);
258 TREE_TYPE (new_decl) = new_type;
260 /* For declarations setting DECL_VINDEX (i.e. methods)
261 we expect first argument to be THIS pointer. */
262 if (args_to_skip && bitmap_bit_p (args_to_skip, 0))
263 DECL_VINDEX (new_decl) = NULL_TREE;
265 /* When signature changes, we need to clear builtin info. */
266 if (DECL_BUILT_IN (new_decl)
267 && args_to_skip
268 && !bitmap_empty_p (args_to_skip))
270 DECL_BUILT_IN_CLASS (new_decl) = NOT_BUILT_IN;
271 DECL_FUNCTION_CODE (new_decl) = (enum built_in_function) 0;
273 /* The FE might have information and assumptions about the other
274 arguments. */
275 DECL_LANG_SPECIFIC (new_decl) = NULL;
276 return new_decl;
279 /* Set flags of NEW_NODE and its decl. NEW_NODE is a newly created private
280 clone or its thunk. */
282 static void
283 set_new_clone_decl_and_node_flags (cgraph_node *new_node)
285 DECL_EXTERNAL (new_node->decl) = 0;
286 DECL_COMDAT_GROUP (new_node->decl) = 0;
287 TREE_PUBLIC (new_node->decl) = 0;
288 DECL_COMDAT (new_node->decl) = 0;
289 DECL_WEAK (new_node->decl) = 0;
290 DECL_VIRTUAL_P (new_node->decl) = 0;
291 DECL_STATIC_CONSTRUCTOR (new_node->decl) = 0;
292 DECL_STATIC_DESTRUCTOR (new_node->decl) = 0;
294 new_node->externally_visible = 0;
295 new_node->local.local = 1;
296 new_node->lowered = true;
299 /* Duplicate thunk THUNK if necessary but make it to refer to NODE.
300 ARGS_TO_SKIP, if non-NULL, determines which parameters should be omitted.
301 Function can return NODE if no thunk is necessary, which can happen when
302 thunk is this_adjusting but we are removing this parameter. */
304 static cgraph_node *
305 duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node)
307 cgraph_node *new_thunk, *thunk_of;
308 thunk_of = cgraph_function_or_thunk_node (thunk->callees->callee);
310 if (thunk_of->thunk.thunk_p)
311 node = duplicate_thunk_for_node (thunk_of, node);
313 /* We need to copy arguments, at LTO these mat not be read from function
314 section. */
315 if (!DECL_ARGUMENTS (thunk->decl))
316 cgraph_get_body (thunk);
318 struct cgraph_edge *cs;
319 for (cs = node->callers; cs; cs = cs->next_caller)
320 if (cs->caller->thunk.thunk_p
321 && cs->caller->thunk.this_adjusting == thunk->thunk.this_adjusting
322 && cs->caller->thunk.fixed_offset == thunk->thunk.fixed_offset
323 && cs->caller->thunk.virtual_offset_p == thunk->thunk.virtual_offset_p
324 && cs->caller->thunk.virtual_value == thunk->thunk.virtual_value)
325 return cs->caller;
327 tree new_decl;
328 if (!node->clone.args_to_skip)
329 new_decl = copy_node (thunk->decl);
330 else
332 /* We do not need to duplicate this_adjusting thunks if we have removed
333 this. */
334 if (thunk->thunk.this_adjusting
335 && bitmap_bit_p (node->clone.args_to_skip, 0))
336 return node;
338 new_decl = build_function_decl_skip_args (thunk->decl,
339 node->clone.args_to_skip,
340 false);
343 tree *link = &DECL_ARGUMENTS (new_decl);
344 int i = 0;
345 for (tree pd = DECL_ARGUMENTS (thunk->decl); pd; pd = DECL_CHAIN (pd), i++)
347 if (!node->clone.args_to_skip
348 || !bitmap_bit_p (node->clone.args_to_skip, i))
350 tree nd = copy_node (pd);
351 DECL_CONTEXT (nd) = new_decl;
352 *link = nd;
353 link = &DECL_CHAIN (nd);
356 *link = NULL_TREE;
358 gcc_checking_assert (!DECL_STRUCT_FUNCTION (new_decl));
359 gcc_checking_assert (!DECL_INITIAL (new_decl));
360 gcc_checking_assert (!DECL_RESULT (new_decl));
361 gcc_checking_assert (!DECL_RTL_SET_P (new_decl));
363 DECL_NAME (new_decl) = clone_function_name (thunk->decl, "artificial_thunk");
364 SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
365 DECL_SECTION_NAME (new_decl) = NULL;
367 new_thunk = cgraph_create_node (new_decl);
368 set_new_clone_decl_and_node_flags (new_thunk);
369 new_thunk->definition = true;
370 new_thunk->thunk = thunk->thunk;
371 new_thunk->unique_name = in_lto_p;
372 new_thunk->former_clone_of = thunk->decl;
373 new_thunk->clone.args_to_skip = node->clone.args_to_skip;
374 new_thunk->clone.combined_args_to_skip = node->clone.combined_args_to_skip;
376 struct cgraph_edge *e = cgraph_create_edge (new_thunk, node, NULL, 0,
377 CGRAPH_FREQ_BASE);
378 e->call_stmt_cannot_inline_p = true;
379 cgraph_call_edge_duplication_hooks (thunk->callees, e);
380 if (!expand_thunk (new_thunk, false))
381 new_thunk->analyzed = true;
382 else
384 new_thunk->thunk.thunk_p = false;
385 cgraph_analyze_function (new_thunk);
387 cgraph_call_node_duplication_hooks (thunk, new_thunk);
388 return new_thunk;
391 /* If E does not lead to a thunk, simply redirect it to N. Otherwise create
392 one or more equivalent thunks for N and redirect E to the first in the
393 chain. */
395 void
396 redirect_edge_duplicating_thunks (struct cgraph_edge *e, struct cgraph_node *n)
398 cgraph_node *orig_to = cgraph_function_or_thunk_node (e->callee);
399 if (orig_to->thunk.thunk_p)
400 n = duplicate_thunk_for_node (orig_to, n);
402 cgraph_redirect_edge_callee (e, n);
405 /* Create node representing clone of N executed COUNT times. Decrease
406 the execution counts from original node too.
407 The new clone will have decl set to DECL that may or may not be the same
408 as decl of N.
410 When UPDATE_ORIGINAL is true, the counts are subtracted from the original
411 function's profile to reflect the fact that part of execution is handled
412 by node.
413 When CALL_DUPLICATOIN_HOOK is true, the ipa passes are acknowledged about
414 the new clone. Otherwise the caller is responsible for doing so later.
416 If the new node is being inlined into another one, NEW_INLINED_TO should be
417 the outline function the new one is (even indirectly) inlined to. All hooks
418 will see this in node's global.inlined_to, when invoked. Can be NULL if the
419 node is not inlined. */
421 struct cgraph_node *
422 cgraph_clone_node (struct cgraph_node *n, tree decl, gcov_type count, int freq,
423 bool update_original,
424 vec<cgraph_edge_p> redirect_callers,
425 bool call_duplication_hook,
426 struct cgraph_node *new_inlined_to,
427 bitmap args_to_skip)
429 struct cgraph_node *new_node = cgraph_create_empty_node ();
430 struct cgraph_edge *e;
431 gcov_type count_scale;
432 unsigned i;
434 new_node->decl = decl;
435 symtab_register_node (new_node);
436 new_node->origin = n->origin;
437 new_node->lto_file_data = n->lto_file_data;
438 if (new_node->origin)
440 new_node->next_nested = new_node->origin->nested;
441 new_node->origin->nested = new_node;
443 new_node->analyzed = n->analyzed;
444 new_node->definition = n->definition;
445 new_node->local = n->local;
446 new_node->externally_visible = false;
447 new_node->local.local = true;
448 new_node->global = n->global;
449 new_node->global.inlined_to = new_inlined_to;
450 new_node->rtl = n->rtl;
451 new_node->count = count;
452 new_node->frequency = n->frequency;
453 new_node->tp_first_run = n->tp_first_run;
455 new_node->clone.tree_map = NULL;
456 new_node->clone.args_to_skip = args_to_skip;
457 if (!args_to_skip)
458 new_node->clone.combined_args_to_skip = n->clone.combined_args_to_skip;
459 else if (n->clone.combined_args_to_skip)
461 new_node->clone.combined_args_to_skip = BITMAP_GGC_ALLOC ();
462 bitmap_ior (new_node->clone.combined_args_to_skip,
463 n->clone.combined_args_to_skip, args_to_skip);
465 else
466 new_node->clone.combined_args_to_skip = args_to_skip;
468 if (n->count)
470 if (new_node->count > n->count)
471 count_scale = REG_BR_PROB_BASE;
472 else
473 count_scale = GCOV_COMPUTE_SCALE (new_node->count, n->count);
475 else
476 count_scale = 0;
477 if (update_original)
479 n->count -= count;
480 if (n->count < 0)
481 n->count = 0;
484 FOR_EACH_VEC_ELT (redirect_callers, i, e)
486 /* Redirect calls to the old version node to point to its new
487 version. The only exception is when the edge was proved to
488 be unreachable during the clonning procedure. */
489 if (!e->callee
490 || DECL_BUILT_IN_CLASS (e->callee->decl) != BUILT_IN_NORMAL
491 || DECL_FUNCTION_CODE (e->callee->decl) != BUILT_IN_UNREACHABLE)
492 redirect_edge_duplicating_thunks (e, new_node);
495 for (e = n->callees;e; e=e->next_callee)
496 cgraph_clone_edge (e, new_node, e->call_stmt, e->lto_stmt_uid,
497 count_scale, freq, update_original);
499 for (e = n->indirect_calls; e; e = e->next_callee)
500 cgraph_clone_edge (e, new_node, e->call_stmt, e->lto_stmt_uid,
501 count_scale, freq, update_original);
502 ipa_clone_references (new_node, &n->ref_list);
504 new_node->next_sibling_clone = n->clones;
505 if (n->clones)
506 n->clones->prev_sibling_clone = new_node;
507 n->clones = new_node;
508 new_node->clone_of = n;
510 if (call_duplication_hook)
511 cgraph_call_node_duplication_hooks (n, new_node);
512 return new_node;
515 /* Return a new assembler name for a clone of DECL with SUFFIX. */
517 static GTY(()) unsigned int clone_fn_id_num;
519 tree
520 clone_function_name (tree decl, const char *suffix)
522 tree name = DECL_ASSEMBLER_NAME (decl);
523 size_t len = IDENTIFIER_LENGTH (name);
524 char *tmp_name, *prefix;
526 prefix = XALLOCAVEC (char, len + strlen (suffix) + 2);
527 memcpy (prefix, IDENTIFIER_POINTER (name), len);
528 strcpy (prefix + len + 1, suffix);
529 #ifndef NO_DOT_IN_LABEL
530 prefix[len] = '.';
531 #elif !defined NO_DOLLAR_IN_LABEL
532 prefix[len] = '$';
533 #else
534 prefix[len] = '_';
535 #endif
536 ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix, clone_fn_id_num++);
537 return get_identifier (tmp_name);
540 /* Create callgraph node clone with new declaration. The actual body will
541 be copied later at compilation stage.
543 TODO: after merging in ipa-sra use function call notes instead of args_to_skip
544 bitmap interface.
546 struct cgraph_node *
547 cgraph_create_virtual_clone (struct cgraph_node *old_node,
548 vec<cgraph_edge_p> redirect_callers,
549 vec<ipa_replace_map_p, va_gc> *tree_map,
550 bitmap args_to_skip,
551 const char * suffix)
553 tree old_decl = old_node->decl;
554 struct cgraph_node *new_node = NULL;
555 tree new_decl;
556 size_t len, i;
557 struct ipa_replace_map *map;
558 char *name;
560 if (!in_lto_p)
561 gcc_checking_assert (tree_versionable_function_p (old_decl));
563 gcc_assert (old_node->local.can_change_signature || !args_to_skip);
565 /* Make a new FUNCTION_DECL tree node */
566 if (!args_to_skip)
567 new_decl = copy_node (old_decl);
568 else
569 new_decl = build_function_decl_skip_args (old_decl, args_to_skip, false);
571 /* These pointers represent function body and will be populated only when clone
572 is materialized. */
573 gcc_assert (new_decl != old_decl);
574 DECL_STRUCT_FUNCTION (new_decl) = NULL;
575 DECL_ARGUMENTS (new_decl) = NULL;
576 DECL_INITIAL (new_decl) = NULL;
577 DECL_RESULT (new_decl) = NULL;
578 /* We can not do DECL_RESULT (new_decl) = NULL; here because of LTO partitioning
579 sometimes storing only clone decl instead of original. */
581 /* Generate a new name for the new version. */
582 len = IDENTIFIER_LENGTH (DECL_NAME (old_decl));
583 name = XALLOCAVEC (char, len + strlen (suffix) + 2);
584 memcpy (name, IDENTIFIER_POINTER (DECL_NAME (old_decl)), len);
585 strcpy (name + len + 1, suffix);
586 name[len] = '.';
587 DECL_NAME (new_decl) = get_identifier (name);
588 SET_DECL_ASSEMBLER_NAME (new_decl, clone_function_name (old_decl, suffix));
589 SET_DECL_RTL (new_decl, NULL);
591 new_node = cgraph_clone_node (old_node, new_decl, old_node->count,
592 CGRAPH_FREQ_BASE, false,
593 redirect_callers, false, NULL, args_to_skip);
594 /* Update the properties.
595 Make clone visible only within this translation unit. Make sure
596 that is not weak also.
597 ??? We cannot use COMDAT linkage because there is no
598 ABI support for this. */
599 if (DECL_ONE_ONLY (old_decl))
600 DECL_SECTION_NAME (new_node->decl) = NULL;
601 set_new_clone_decl_and_node_flags (new_node);
602 new_node->clone.tree_map = tree_map;
604 /* Clones of global symbols or symbols with unique names are unique. */
605 if ((TREE_PUBLIC (old_decl)
606 && !DECL_EXTERNAL (old_decl)
607 && !DECL_WEAK (old_decl)
608 && !DECL_COMDAT (old_decl))
609 || in_lto_p)
610 new_node->unique_name = true;
611 FOR_EACH_VEC_SAFE_ELT (tree_map, i, map)
612 ipa_maybe_record_reference (new_node, map->new_tree,
613 IPA_REF_ADDR, NULL);
615 cgraph_call_node_duplication_hooks (old_node, new_node);
618 return new_node;
621 /* NODE is being removed from symbol table; see if its entry can be replaced by
622 other inline clone. */
623 struct cgraph_node *
624 cgraph_find_replacement_node (struct cgraph_node *node)
626 struct cgraph_node *next_inline_clone, *replacement;
628 for (next_inline_clone = node->clones;
629 next_inline_clone
630 && next_inline_clone->decl != node->decl;
631 next_inline_clone = next_inline_clone->next_sibling_clone)
634 /* If there is inline clone of the node being removed, we need
635 to put it into the position of removed node and reorganize all
636 other clones to be based on it. */
637 if (next_inline_clone)
639 struct cgraph_node *n;
640 struct cgraph_node *new_clones;
642 replacement = next_inline_clone;
644 /* Unlink inline clone from the list of clones of removed node. */
645 if (next_inline_clone->next_sibling_clone)
646 next_inline_clone->next_sibling_clone->prev_sibling_clone
647 = next_inline_clone->prev_sibling_clone;
648 if (next_inline_clone->prev_sibling_clone)
650 gcc_assert (node->clones != next_inline_clone);
651 next_inline_clone->prev_sibling_clone->next_sibling_clone
652 = next_inline_clone->next_sibling_clone;
654 else
656 gcc_assert (node->clones == next_inline_clone);
657 node->clones = next_inline_clone->next_sibling_clone;
660 new_clones = node->clones;
661 node->clones = NULL;
663 /* Copy clone info. */
664 next_inline_clone->clone = node->clone;
666 /* Now place it into clone tree at same level at NODE. */
667 next_inline_clone->clone_of = node->clone_of;
668 next_inline_clone->prev_sibling_clone = NULL;
669 next_inline_clone->next_sibling_clone = NULL;
670 if (node->clone_of)
672 if (node->clone_of->clones)
673 node->clone_of->clones->prev_sibling_clone = next_inline_clone;
674 next_inline_clone->next_sibling_clone = node->clone_of->clones;
675 node->clone_of->clones = next_inline_clone;
678 /* Merge the clone list. */
679 if (new_clones)
681 if (!next_inline_clone->clones)
682 next_inline_clone->clones = new_clones;
683 else
685 n = next_inline_clone->clones;
686 while (n->next_sibling_clone)
687 n = n->next_sibling_clone;
688 n->next_sibling_clone = new_clones;
689 new_clones->prev_sibling_clone = n;
693 /* Update clone_of pointers. */
694 n = new_clones;
695 while (n)
697 n->clone_of = next_inline_clone;
698 n = n->next_sibling_clone;
700 return replacement;
702 else
703 return NULL;
706 /* Like cgraph_set_call_stmt but walk the clone tree and update all
707 clones sharing the same function body.
708 When WHOLE_SPECULATIVE_EDGES is true, all three components of
709 speculative edge gets updated. Otherwise we update only direct
710 call. */
712 void
713 cgraph_set_call_stmt_including_clones (struct cgraph_node *orig,
714 gimple old_stmt, gimple new_stmt,
715 bool update_speculative)
717 struct cgraph_node *node;
718 struct cgraph_edge *edge = cgraph_edge (orig, old_stmt);
720 if (edge)
721 cgraph_set_call_stmt (edge, new_stmt, update_speculative);
723 node = orig->clones;
724 if (node)
725 while (node != orig)
727 struct cgraph_edge *edge = cgraph_edge (node, old_stmt);
728 if (edge)
730 cgraph_set_call_stmt (edge, new_stmt, update_speculative);
731 /* If UPDATE_SPECULATIVE is false, it means that we are turning
732 speculative call into a real code sequence. Update the
733 callgraph edges. */
734 if (edge->speculative && !update_speculative)
736 struct cgraph_edge *direct, *indirect;
737 struct ipa_ref *ref;
739 gcc_assert (!edge->indirect_unknown_callee);
740 cgraph_speculative_call_info (edge, direct, indirect, ref);
741 direct->speculative = false;
742 indirect->speculative = false;
743 ref->speculative = false;
746 if (node->clones)
747 node = node->clones;
748 else if (node->next_sibling_clone)
749 node = node->next_sibling_clone;
750 else
752 while (node != orig && !node->next_sibling_clone)
753 node = node->clone_of;
754 if (node != orig)
755 node = node->next_sibling_clone;
760 /* Like cgraph_create_edge walk the clone tree and update all clones sharing
761 same function body. If clones already have edge for OLD_STMT; only
762 update the edge same way as cgraph_set_call_stmt_including_clones does.
764 TODO: COUNT and LOOP_DEPTH should be properly distributed based on relative
765 frequencies of the clones. */
767 void
768 cgraph_create_edge_including_clones (struct cgraph_node *orig,
769 struct cgraph_node *callee,
770 gimple old_stmt,
771 gimple stmt, gcov_type count,
772 int freq,
773 cgraph_inline_failed_t reason)
775 struct cgraph_node *node;
776 struct cgraph_edge *edge;
778 if (!cgraph_edge (orig, stmt))
780 edge = cgraph_create_edge (orig, callee, stmt, count, freq);
781 edge->inline_failed = reason;
784 node = orig->clones;
785 if (node)
786 while (node != orig)
788 struct cgraph_edge *edge = cgraph_edge (node, old_stmt);
790 /* It is possible that clones already contain the edge while
791 master didn't. Either we promoted indirect call into direct
792 call in the clone or we are processing clones of unreachable
793 master where edges has been removed. */
794 if (edge)
795 cgraph_set_call_stmt (edge, stmt);
796 else if (!cgraph_edge (node, stmt))
798 edge = cgraph_create_edge (node, callee, stmt, count,
799 freq);
800 edge->inline_failed = reason;
803 if (node->clones)
804 node = node->clones;
805 else if (node->next_sibling_clone)
806 node = node->next_sibling_clone;
807 else
809 while (node != orig && !node->next_sibling_clone)
810 node = node->clone_of;
811 if (node != orig)
812 node = node->next_sibling_clone;
817 /* Remove the node from cgraph and all inline clones inlined into it.
818 Skip however removal of FORBIDDEN_NODE and return true if it needs to be
819 removed. This allows to call the function from outer loop walking clone
820 tree. */
822 bool
823 cgraph_remove_node_and_inline_clones (struct cgraph_node *node, struct cgraph_node *forbidden_node)
825 struct cgraph_edge *e, *next;
826 bool found = false;
828 if (node == forbidden_node)
830 cgraph_remove_edge (node->callers);
831 return true;
833 for (e = node->callees; e; e = next)
835 next = e->next_callee;
836 if (!e->inline_failed)
837 found |= cgraph_remove_node_and_inline_clones (e->callee, forbidden_node);
839 cgraph_remove_node (node);
840 return found;
843 /* The edges representing the callers of the NEW_VERSION node were
844 fixed by cgraph_function_versioning (), now the call_expr in their
845 respective tree code should be updated to call the NEW_VERSION. */
847 static void
848 update_call_expr (struct cgraph_node *new_version)
850 struct cgraph_edge *e;
852 gcc_assert (new_version);
854 /* Update the call expr on the edges to call the new version. */
855 for (e = new_version->callers; e; e = e->next_caller)
857 struct function *inner_function = DECL_STRUCT_FUNCTION (e->caller->decl);
858 gimple_call_set_fndecl (e->call_stmt, new_version->decl);
859 maybe_clean_eh_stmt_fn (inner_function, e->call_stmt);
864 /* Create a new cgraph node which is the new version of
865 OLD_VERSION node. REDIRECT_CALLERS holds the callers
866 edges which should be redirected to point to
867 NEW_VERSION. ALL the callees edges of OLD_VERSION
868 are cloned to the new version node. Return the new
869 version node.
871 If non-NULL BLOCK_TO_COPY determine what basic blocks
872 was copied to prevent duplications of calls that are dead
873 in the clone. */
875 struct cgraph_node *
876 cgraph_copy_node_for_versioning (struct cgraph_node *old_version,
877 tree new_decl,
878 vec<cgraph_edge_p> redirect_callers,
879 bitmap bbs_to_copy)
881 struct cgraph_node *new_version;
882 struct cgraph_edge *e;
883 unsigned i;
885 gcc_assert (old_version);
887 new_version = cgraph_create_node (new_decl);
889 new_version->analyzed = old_version->analyzed;
890 new_version->definition = old_version->definition;
891 new_version->local = old_version->local;
892 new_version->externally_visible = false;
893 new_version->local.local = new_version->definition;
894 new_version->global = old_version->global;
895 new_version->rtl = old_version->rtl;
896 new_version->count = old_version->count;
898 for (e = old_version->callees; e; e=e->next_callee)
899 if (!bbs_to_copy
900 || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index))
901 cgraph_clone_edge (e, new_version, e->call_stmt,
902 e->lto_stmt_uid, REG_BR_PROB_BASE,
903 CGRAPH_FREQ_BASE,
904 true);
905 for (e = old_version->indirect_calls; e; e=e->next_callee)
906 if (!bbs_to_copy
907 || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index))
908 cgraph_clone_edge (e, new_version, e->call_stmt,
909 e->lto_stmt_uid, REG_BR_PROB_BASE,
910 CGRAPH_FREQ_BASE,
911 true);
912 FOR_EACH_VEC_ELT (redirect_callers, i, e)
914 /* Redirect calls to the old version node to point to its new
915 version. */
916 cgraph_redirect_edge_callee (e, new_version);
919 cgraph_call_node_duplication_hooks (old_version, new_version);
921 return new_version;
924 /* Perform function versioning.
925 Function versioning includes copying of the tree and
926 a callgraph update (creating a new cgraph node and updating
927 its callees and callers).
929 REDIRECT_CALLERS varray includes the edges to be redirected
930 to the new version.
932 TREE_MAP is a mapping of tree nodes we want to replace with
933 new ones (according to results of prior analysis).
934 OLD_VERSION_NODE is the node that is versioned.
936 If non-NULL ARGS_TO_SKIP determine function parameters to remove
937 from new version.
938 If SKIP_RETURN is true, the new version will return void.
939 If non-NULL BLOCK_TO_COPY determine what basic blocks to copy.
940 If non_NULL NEW_ENTRY determine new entry BB of the clone.
942 Return the new version's cgraph node. */
944 struct cgraph_node *
945 cgraph_function_versioning (struct cgraph_node *old_version_node,
946 vec<cgraph_edge_p> redirect_callers,
947 vec<ipa_replace_map_p, va_gc> *tree_map,
948 bitmap args_to_skip,
949 bool skip_return,
950 bitmap bbs_to_copy,
951 basic_block new_entry_block,
952 const char *clone_name)
954 tree old_decl = old_version_node->decl;
955 struct cgraph_node *new_version_node = NULL;
956 tree new_decl;
958 if (!tree_versionable_function_p (old_decl))
959 return NULL;
961 gcc_assert (old_version_node->local.can_change_signature || !args_to_skip);
963 /* Make a new FUNCTION_DECL tree node for the new version. */
964 if (!args_to_skip && !skip_return)
965 new_decl = copy_node (old_decl);
966 else
967 new_decl
968 = build_function_decl_skip_args (old_decl, args_to_skip, skip_return);
970 /* Generate a new name for the new version. */
971 DECL_NAME (new_decl) = clone_function_name (old_decl, clone_name);
972 SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
973 SET_DECL_RTL (new_decl, NULL);
975 /* When the old decl was a con-/destructor make sure the clone isn't. */
976 DECL_STATIC_CONSTRUCTOR (new_decl) = 0;
977 DECL_STATIC_DESTRUCTOR (new_decl) = 0;
979 /* Create the new version's call-graph node.
980 and update the edges of the new node. */
981 new_version_node =
982 cgraph_copy_node_for_versioning (old_version_node, new_decl,
983 redirect_callers, bbs_to_copy);
985 /* Copy the OLD_VERSION_NODE function tree to the new version. */
986 tree_function_versioning (old_decl, new_decl, tree_map, false, args_to_skip,
987 skip_return, bbs_to_copy, new_entry_block);
989 /* Update the new version's properties.
990 Make The new version visible only within this translation unit. Make sure
991 that is not weak also.
992 ??? We cannot use COMDAT linkage because there is no
993 ABI support for this. */
994 symtab_make_decl_local (new_version_node->decl);
995 DECL_VIRTUAL_P (new_version_node->decl) = 0;
996 new_version_node->externally_visible = 0;
997 new_version_node->local.local = 1;
998 new_version_node->lowered = true;
999 /* Clones of global symbols or symbols with unique names are unique. */
1000 if ((TREE_PUBLIC (old_decl)
1001 && !DECL_EXTERNAL (old_decl)
1002 && !DECL_WEAK (old_decl)
1003 && !DECL_COMDAT (old_decl))
1004 || in_lto_p)
1005 new_version_node->unique_name = true;
1007 /* Update the call_expr on the edges to call the new version node. */
1008 update_call_expr (new_version_node);
1010 cgraph_call_function_insertion_hooks (new_version_node);
1011 return new_version_node;
1014 /* Given virtual clone, turn it into actual clone. */
1016 static void
1017 cgraph_materialize_clone (struct cgraph_node *node)
1019 bitmap_obstack_initialize (NULL);
1020 node->former_clone_of = node->clone_of->decl;
1021 if (node->clone_of->former_clone_of)
1022 node->former_clone_of = node->clone_of->former_clone_of;
1023 /* Copy the OLD_VERSION_NODE function tree to the new version. */
1024 tree_function_versioning (node->clone_of->decl, node->decl,
1025 node->clone.tree_map, true,
1026 node->clone.args_to_skip, false,
1027 NULL, NULL);
1028 if (cgraph_dump_file)
1030 dump_function_to_file (node->clone_of->decl, cgraph_dump_file, dump_flags);
1031 dump_function_to_file (node->decl, cgraph_dump_file, dump_flags);
1034 /* Function is no longer clone. */
1035 if (node->next_sibling_clone)
1036 node->next_sibling_clone->prev_sibling_clone = node->prev_sibling_clone;
1037 if (node->prev_sibling_clone)
1038 node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone;
1039 else
1040 node->clone_of->clones = node->next_sibling_clone;
1041 node->next_sibling_clone = NULL;
1042 node->prev_sibling_clone = NULL;
1043 if (!node->clone_of->analyzed && !node->clone_of->clones)
1045 cgraph_release_function_body (node->clone_of);
1046 cgraph_node_remove_callees (node->clone_of);
1047 ipa_remove_all_references (&node->clone_of->ref_list);
1049 node->clone_of = NULL;
1050 bitmap_obstack_release (NULL);
1053 /* Once all functions from compilation unit are in memory, produce all clones
1054 and update all calls. We might also do this on demand if we don't want to
1055 bring all functions to memory prior compilation, but current WHOPR
1056 implementation does that and it is is bit easier to keep everything right in
1057 this order. */
1059 void
1060 cgraph_materialize_all_clones (void)
1062 struct cgraph_node *node;
1063 bool stabilized = false;
1066 if (cgraph_dump_file)
1067 fprintf (cgraph_dump_file, "Materializing clones\n");
1068 #ifdef ENABLE_CHECKING
1069 verify_cgraph ();
1070 #endif
1072 /* We can also do topological order, but number of iterations should be
1073 bounded by number of IPA passes since single IPA pass is probably not
1074 going to create clones of clones it created itself. */
1075 while (!stabilized)
1077 stabilized = true;
1078 FOR_EACH_FUNCTION (node)
1080 if (node->clone_of && node->decl != node->clone_of->decl
1081 && !gimple_has_body_p (node->decl))
1083 if (!node->clone_of->clone_of)
1084 cgraph_get_body (node->clone_of);
1085 if (gimple_has_body_p (node->clone_of->decl))
1087 if (cgraph_dump_file)
1089 fprintf (cgraph_dump_file, "cloning %s to %s\n",
1090 xstrdup (node->clone_of->name ()),
1091 xstrdup (node->name ()));
1092 if (node->clone.tree_map)
1094 unsigned int i;
1095 fprintf (cgraph_dump_file, " replace map: ");
1096 for (i = 0;
1097 i < vec_safe_length (node->clone.tree_map);
1098 i++)
1100 struct ipa_replace_map *replace_info;
1101 replace_info = (*node->clone.tree_map)[i];
1102 print_generic_expr (cgraph_dump_file, replace_info->old_tree, 0);
1103 fprintf (cgraph_dump_file, " -> ");
1104 print_generic_expr (cgraph_dump_file, replace_info->new_tree, 0);
1105 fprintf (cgraph_dump_file, "%s%s;",
1106 replace_info->replace_p ? "(replace)":"",
1107 replace_info->ref_p ? "(ref)":"");
1109 fprintf (cgraph_dump_file, "\n");
1111 if (node->clone.args_to_skip)
1113 fprintf (cgraph_dump_file, " args_to_skip: ");
1114 dump_bitmap (cgraph_dump_file, node->clone.args_to_skip);
1116 if (node->clone.args_to_skip)
1118 fprintf (cgraph_dump_file, " combined_args_to_skip:");
1119 dump_bitmap (cgraph_dump_file, node->clone.combined_args_to_skip);
1122 cgraph_materialize_clone (node);
1123 stabilized = false;
1128 FOR_EACH_FUNCTION (node)
1129 if (!node->analyzed && node->callees)
1131 cgraph_node_remove_callees (node);
1132 ipa_remove_all_references (&node->ref_list);
1134 else
1135 ipa_clear_stmts_in_references (node);
1136 if (cgraph_dump_file)
1137 fprintf (cgraph_dump_file, "Materialization Call site updates done.\n");
1138 #ifdef ENABLE_CHECKING
1139 verify_cgraph ();
1140 #endif
1141 symtab_remove_unreachable_nodes (false, cgraph_dump_file);
1144 #include "gt-cgraphclones.h"