* omp-low.c (lower_omp_target): Remove unreachable code & merge
[official-gcc.git] / gcc / cgraphclones.c
blob12fc933cc37d1b1ab1638bc86aece2d42401fc6c
1 /* Callgraph clones
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
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 "backend.h"
71 #include "target.h"
72 #include "rtl.h"
73 #include "tree.h"
74 #include "gimple.h"
75 #include "alloc-pool.h"
76 #include "stringpool.h"
77 #include "emit-rtl.h"
78 #include "cgraph.h"
79 #include "coverage.h"
80 #include "lto-streamer.h"
81 #include "alias.h"
82 #include "fold-const.h"
83 #include "internal-fn.h"
84 #include "tree-eh.h"
85 #include "tree-cfg.h"
86 #include "tree-inline.h"
87 #include "langhooks.h"
88 #include "toplev.h"
89 #include "flags.h"
90 #include "debug.h"
91 #include "params.h"
92 #include "intl.h"
93 #include "symbol-summary.h"
94 #include "ipa-prop.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"
100 #include "except.h"
102 /* Create clone of edge in the node N represented by CALL_EXPR
103 the callgraph. */
105 cgraph_edge *
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);
111 gcov_type freq;
113 /* We do not want to ignore loop nest after frequency drops to 0. */
114 if (!freq_scale)
115 freq_scale = 1;
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)
122 tree decl;
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. */
127 && !speculative)
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);
133 else
135 new_edge = n->create_indirect_edge (call_stmt,
136 indirect_info->ecf_flags,
137 count, freq, false);
138 *new_edge->indirect_info = *indirect_info;
141 else
143 new_edge = n->create_edge (callee, call_stmt, gcov_count, freq);
144 if (indirect_info)
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;
160 if (update_original)
162 count -= new_edge->count;
163 if (count < 0)
164 count = 0;
166 symtab->call_edge_duplication_hooks (this, new_edge);
167 return new_edge;
170 /* Build variant of function type ORIG_TYPE skipping ARGS_TO_SKIP and the
171 return value if SKIP_RETURN is true. */
173 static tree
174 build_function_type_skip_args (tree orig_type, bitmap args_to_skip,
175 bool skip_return)
177 tree new_type = NULL;
178 tree args, new_args = NULL;
179 tree new_reversed;
180 int i = 0;
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);
188 if (args)
190 if (new_reversed)
191 TREE_CHAIN (new_args) = void_list_node;
192 else
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
200 instead. */
201 if (TREE_CODE (orig_type) != METHOD_TYPE
202 || !args_to_skip
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;
208 else
210 new_type
211 = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
212 new_reversed));
213 TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
216 if (skip_return)
217 TREE_TYPE (new_type) = void_type_node;
219 return new_type;
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). */
229 static tree
230 build_function_decl_skip_args (tree orig_decl, bitmap args_to_skip,
231 bool skip_return)
233 tree new_decl = copy_node (orig_decl);
234 tree new_type;
236 new_type = TREE_TYPE (orig_decl);
237 if (prototype_p (new_type)
238 || (skip_return && !VOID_TYPE_P (TREE_TYPE (new_type))))
239 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)
250 && args_to_skip
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
257 arguments. */
258 DECL_LANG_SPECIFIC (new_decl) = NULL;
259 return new_decl;
262 /* Set flags of NEW_NODE and its decl. NEW_NODE is a newly created private
263 clone or its thunk. */
265 static void
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. */
286 static cgraph_node *
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 ();
298 cgraph_edge *cs;
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)
305 return cs->caller;
307 tree new_decl;
308 if (!node->clone.args_to_skip)
309 new_decl = copy_node (thunk->decl);
310 else
312 /* We do not need to duplicate this_adjusting thunks if we have removed
313 this. */
314 if (thunk->thunk.this_adjusting
315 && bitmap_bit_p (node->clone.args_to_skip, 0))
316 return node;
318 new_decl = build_function_decl_skip_args (thunk->decl,
319 node->clone.args_to_skip,
320 false);
323 tree *link = &DECL_ARGUMENTS (new_decl);
324 int i = 0;
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;
332 *link = nd;
333 link = &DECL_CHAIN (nd);
336 *link = NULL_TREE;
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,
356 CGRAPH_FREQ_BASE);
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);
360 return 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. */
368 void
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);
375 redirect_callee (n);
378 /* Call expand_thunk on all callers that are thunks and if analyze those nodes
379 that were expanded. */
381 void
382 cgraph_node::expand_all_artificial_thunks ()
384 cgraph_edge *e;
385 for (e = callers; e;)
386 if (e->caller->thunk.thunk_p)
388 cgraph_node *thunk = e->caller;
390 e = e->next_caller;
391 if (thunk->expand_thunk (false, false))
393 thunk->thunk.thunk_p = false;
394 thunk->analyze ();
396 thunk->expand_all_artificial_thunks ();
398 else
399 e = e->next_caller;
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
405 as decl of N.
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
409 by node.
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. */
418 cgraph_node *
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,
424 bitmap args_to_skip)
426 cgraph_node *new_node = symtab->create_empty ();
427 cgraph_edge *e;
428 gcov_type count_scale;
429 unsigned i;
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;
448 new_node->rtl = rtl;
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;
459 if (!args_to_skip)
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);
467 else
468 new_node->clone.combined_args_to_skip = args_to_skip;
470 if (count)
472 if (new_node->count > count)
473 count_scale = REG_BR_PROB_BASE;
474 else
475 count_scale = GCOV_COMPUTE_SCALE (new_node->count, count);
477 else
478 count_scale = 0;
479 if (update_original)
481 count -= gcov_count;
482 if (count < 0)
483 count = 0;
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. */
491 if (!e->callee
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;
508 if (clones)
509 clones->prev_sibling_clone = new_node;
510 clones = new_node;
511 new_node->clone_of = this;
513 if (call_duplication_hook)
514 symtab->call_cgraph_duplication_hooks (this, new_node);
515 return 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
521 NAME. */
523 tree
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
533 prefix[len] = '.';
534 #elif !defined NO_DOLLAR_IN_LABEL
535 prefix[len] = '$';
536 #else
537 prefix[len] = '_';
538 #endif
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. */
545 tree
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
557 bitmap interface.
559 cgraph_node *
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;
566 tree new_decl;
567 size_t len, i;
568 ipa_replace_map *map;
569 char *name;
571 gcc_checking_assert (local.versionable);
572 gcc_assert (local.can_change_signature || !args_to_skip);
574 /* Make a new FUNCTION_DECL tree node */
575 if (!args_to_skip)
576 new_decl = copy_node (old_decl);
577 else
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
581 is materialized. */
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);
595 name[len] = '.';
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))
618 || in_lto_p)
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);
629 return new_node;
632 /* callgraph node being removed from symbol table; see if its entry can be
633 replaced by other inline clone. */
634 cgraph_node *
635 cgraph_node::find_replacement (void)
637 cgraph_node *next_inline_clone, *replacement;
639 for (next_inline_clone = clones;
640 next_inline_clone
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)
650 cgraph_node *n;
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;
665 else
667 gcc_assert (clones == next_inline_clone);
668 clones = next_inline_clone->next_sibling_clone;
671 new_clones = clones;
672 clones = NULL;
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;
681 if (clone_of)
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. */
690 if (new_clones)
692 if (!next_inline_clone->clones)
693 next_inline_clone->clones = new_clones;
694 else
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. */
705 n = new_clones;
706 while (n)
708 n->clone_of = next_inline_clone;
709 n = n->next_sibling_clone;
711 return replacement;
713 else
714 return NULL;
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
721 call. */
723 void
724 cgraph_node::set_call_stmt_including_clones (gimple *old_stmt,
725 gcall *new_stmt,
726 bool update_speculative)
728 cgraph_node *node;
729 cgraph_edge *edge = get_edge (old_stmt);
731 if (edge)
732 edge->set_call_stmt (new_stmt, update_speculative);
734 node = clones;
735 if (node)
736 while (node != this)
738 cgraph_edge *edge = node->get_edge (old_stmt);
739 if (edge)
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
744 callgraph edges. */
745 if (edge->speculative && !update_speculative)
747 cgraph_edge *direct, *indirect;
748 ipa_ref *ref;
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;
757 if (node->clones)
758 node = node->clones;
759 else if (node->next_sibling_clone)
760 node = node->next_sibling_clone;
761 else
763 while (node != this && !node->next_sibling_clone)
764 node = node->clone_of;
765 if (node != this)
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. */
778 void
779 cgraph_node::create_edge_including_clones (cgraph_node *callee,
780 gimple *old_stmt, gcall *stmt,
781 gcov_type count,
782 int freq,
783 cgraph_inline_failed_t reason)
785 cgraph_node *node;
786 cgraph_edge *edge;
788 if (!get_edge (stmt))
790 edge = create_edge (callee, stmt, count, freq);
791 edge->inline_failed = reason;
794 node = clones;
795 if (node)
796 while (node != this)
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. */
804 if (edge)
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;
812 if (node->clones)
813 node = node->clones;
814 else if (node->next_sibling_clone)
815 node = node->next_sibling_clone;
816 else
818 while (node != this && !node->next_sibling_clone)
819 node = node->clone_of;
820 if (node != this)
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
829 tree. */
831 bool
832 cgraph_node::remove_symbol_and_inline_clones (cgraph_node *forbidden_node)
834 cgraph_edge *e, *next;
835 bool found = false;
837 if (this == forbidden_node)
839 callers->remove ();
840 return true;
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);
848 remove ();
849 return found;
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. */
856 static void
857 update_call_expr (cgraph_node *new_version)
859 cgraph_edge *e;
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
878 version node.
880 If non-NULL BLOCK_TO_COPY determine what basic blocks
881 was copied to prevent duplications of calls that are dead
882 in the clone. */
884 cgraph_node *
885 cgraph_node::create_version_clone (tree new_decl,
886 vec<cgraph_edge *> redirect_callers,
887 bitmap bbs_to_copy)
889 cgraph_node *new_version;
890 cgraph_edge *e;
891 unsigned i;
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)
906 if (!bbs_to_copy
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,
910 CGRAPH_FREQ_BASE,
911 true);
912 for (e = indirect_calls; e; e=e->next_callee)
913 if (!bbs_to_copy
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,
917 CGRAPH_FREQ_BASE,
918 true);
919 FOR_EACH_VEC_ELT (redirect_callers, i, e)
921 /* Redirect calls to the old version node to point to its new
922 version. */
923 e->redirect_callee (new_version);
926 symtab->call_cgraph_duplication_hooks (this, new_version);
928 return 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
937 to the new version.
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
943 from new version.
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. */
950 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;
959 tree new_decl;
961 if (!tree_versionable_function_p (old_decl))
962 return NULL;
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);
969 else
970 new_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,
985 bbs_to_copy);
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))
1011 || in_lto_p)
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. */
1023 static void
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,
1034 NULL, NULL);
1035 if (symtab->dump_file)
1037 dump_function_to_file (node->clone_of->decl, symtab->dump_file,
1038 dump_flags);
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;
1047 else
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
1065 this order. */
1067 void
1068 symbol_table::materialize_all_clones (void)
1070 cgraph_node *node;
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. */
1082 while (!stabilized)
1084 stabilized = true;
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)
1101 unsigned int i;
1102 fprintf (symtab->dump_file, " replace map: ");
1103 for (i = 0;
1104 i < vec_safe_length (node->clone.tree_map);
1105 i++)
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);
1131 stabilized = false;
1136 FOR_EACH_FUNCTION (node)
1137 if (!node->analyzed && node->callees)
1139 node->remove_callees ();
1140 node->remove_all_references ();
1142 else
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"