Update gimple.texi class hierarchy diagram
[official-gcc.git] / gcc / cgraphclones.c
blobbf348846418defe6fbbabdce073f4d0a2cbe7a98
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 edge in the node N represented by CALL_EXPR
106 the callgraph. */
108 cgraph_edge *
109 cgraph_edge::clone (cgraph_node *n, gcall *call_stmt, unsigned stmt_uid,
110 gcov_type count_scale, int freq_scale, bool update_original)
112 cgraph_edge *new_edge;
113 gcov_type gcov_count = apply_probability (count, count_scale);
114 gcov_type freq;
116 /* We do not want to ignore loop nest after frequency drops to 0. */
117 if (!freq_scale)
118 freq_scale = 1;
119 freq = frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE;
120 if (freq > CGRAPH_FREQ_MAX)
121 freq = CGRAPH_FREQ_MAX;
123 if (indirect_unknown_callee)
125 tree decl;
127 if (call_stmt && (decl = gimple_call_fndecl (call_stmt))
128 /* When the call is speculative, we need to resolve it
129 via cgraph_resolve_speculation and not here. */
130 && !speculative)
132 cgraph_node *callee = cgraph_node::get (decl);
133 gcc_checking_assert (callee);
134 new_edge = n->create_edge (callee, call_stmt, gcov_count, freq);
136 else
138 new_edge = n->create_indirect_edge (call_stmt,
139 indirect_info->ecf_flags,
140 count, freq, false);
141 *new_edge->indirect_info = *indirect_info;
144 else
146 new_edge = n->create_edge (callee, call_stmt, gcov_count, freq);
147 if (indirect_info)
149 new_edge->indirect_info
150 = ggc_cleared_alloc<cgraph_indirect_call_info> ();
151 *new_edge->indirect_info = *indirect_info;
155 new_edge->inline_failed = inline_failed;
156 new_edge->indirect_inlining_edge = indirect_inlining_edge;
157 new_edge->lto_stmt_uid = stmt_uid;
158 /* Clone flags that depend on call_stmt availability manually. */
159 new_edge->can_throw_external = can_throw_external;
160 new_edge->call_stmt_cannot_inline_p = call_stmt_cannot_inline_p;
161 new_edge->speculative = speculative;
162 new_edge->in_polymorphic_cdtor = in_polymorphic_cdtor;
163 if (update_original)
165 count -= new_edge->count;
166 if (count < 0)
167 count = 0;
169 symtab->call_edge_duplication_hooks (this, new_edge);
170 return new_edge;
173 /* Build variant of function type ORIG_TYPE skipping ARGS_TO_SKIP and the
174 return value if SKIP_RETURN is true. */
176 static tree
177 build_function_type_skip_args (tree orig_type, bitmap args_to_skip,
178 bool skip_return)
180 tree new_type = NULL;
181 tree args, new_args = NULL;
182 tree new_reversed;
183 int i = 0;
185 for (args = TYPE_ARG_TYPES (orig_type); args && args != void_list_node;
186 args = TREE_CHAIN (args), i++)
187 if (!args_to_skip || !bitmap_bit_p (args_to_skip, i))
188 new_args = tree_cons (NULL_TREE, TREE_VALUE (args), new_args);
190 new_reversed = nreverse (new_args);
191 if (args)
193 if (new_reversed)
194 TREE_CHAIN (new_args) = void_list_node;
195 else
196 new_reversed = void_list_node;
199 /* Use copy_node to preserve as much as possible from original type
200 (debug info, attribute lists etc.)
201 Exception is METHOD_TYPEs must have THIS argument.
202 When we are asked to remove it, we need to build new FUNCTION_TYPE
203 instead. */
204 if (TREE_CODE (orig_type) != METHOD_TYPE
205 || !args_to_skip
206 || !bitmap_bit_p (args_to_skip, 0))
208 new_type = build_distinct_type_copy (orig_type);
209 TYPE_ARG_TYPES (new_type) = new_reversed;
211 else
213 new_type
214 = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
215 new_reversed));
216 TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
219 if (skip_return)
220 TREE_TYPE (new_type) = void_type_node;
222 return new_type;
225 /* Build variant of function decl ORIG_DECL skipping ARGS_TO_SKIP and the
226 return value if SKIP_RETURN is true.
228 Arguments from DECL_ARGUMENTS list can't be removed now, since they are
229 linked by TREE_CHAIN directly. The caller is responsible for eliminating
230 them when they are being duplicated (i.e. copy_arguments_for_versioning). */
232 static tree
233 build_function_decl_skip_args (tree orig_decl, bitmap args_to_skip,
234 bool skip_return)
236 tree new_decl = copy_node (orig_decl);
237 tree new_type;
239 new_type = TREE_TYPE (orig_decl);
240 if (prototype_p (new_type)
241 || (skip_return && !VOID_TYPE_P (TREE_TYPE (new_type))))
242 new_type
243 = build_function_type_skip_args (new_type, args_to_skip, skip_return);
244 TREE_TYPE (new_decl) = new_type;
246 /* For declarations setting DECL_VINDEX (i.e. methods)
247 we expect first argument to be THIS pointer. */
248 if (args_to_skip && bitmap_bit_p (args_to_skip, 0))
249 DECL_VINDEX (new_decl) = NULL_TREE;
251 /* When signature changes, we need to clear builtin info. */
252 if (DECL_BUILT_IN (new_decl)
253 && args_to_skip
254 && !bitmap_empty_p (args_to_skip))
256 DECL_BUILT_IN_CLASS (new_decl) = NOT_BUILT_IN;
257 DECL_FUNCTION_CODE (new_decl) = (enum built_in_function) 0;
259 /* The FE might have information and assumptions about the other
260 arguments. */
261 DECL_LANG_SPECIFIC (new_decl) = NULL;
262 return new_decl;
265 /* Set flags of NEW_NODE and its decl. NEW_NODE is a newly created private
266 clone or its thunk. */
268 static void
269 set_new_clone_decl_and_node_flags (cgraph_node *new_node)
271 DECL_EXTERNAL (new_node->decl) = 0;
272 TREE_PUBLIC (new_node->decl) = 0;
273 DECL_COMDAT (new_node->decl) = 0;
274 DECL_WEAK (new_node->decl) = 0;
275 DECL_VIRTUAL_P (new_node->decl) = 0;
276 DECL_STATIC_CONSTRUCTOR (new_node->decl) = 0;
277 DECL_STATIC_DESTRUCTOR (new_node->decl) = 0;
279 new_node->externally_visible = 0;
280 new_node->local.local = 1;
281 new_node->lowered = true;
284 /* Duplicate thunk THUNK if necessary but make it to refer to NODE.
285 ARGS_TO_SKIP, if non-NULL, determines which parameters should be omitted.
286 Function can return NODE if no thunk is necessary, which can happen when
287 thunk is this_adjusting but we are removing this parameter. */
289 static cgraph_node *
290 duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node)
292 cgraph_node *new_thunk, *thunk_of;
293 thunk_of = thunk->callees->callee->ultimate_alias_target ();
295 if (thunk_of->thunk.thunk_p)
296 node = duplicate_thunk_for_node (thunk_of, node);
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 if (new_thunk->expand_thunk (false, false))
361 new_thunk->thunk.thunk_p = false;
362 new_thunk->analyze ();
365 symtab->call_cgraph_duplication_hooks (thunk, new_thunk);
366 return new_thunk;
369 /* If E does not lead to a thunk, simply redirect it to N. Otherwise create
370 one or more equivalent thunks for N and redirect E to the first in the
371 chain. */
373 void
374 redirect_edge_duplicating_thunks (cgraph_edge *e, cgraph_node *n)
376 cgraph_node *orig_to = e->callee->ultimate_alias_target ();
377 if (orig_to->thunk.thunk_p)
378 n = duplicate_thunk_for_node (orig_to, n);
380 e->redirect_callee (n);
383 /* Create node representing clone of N executed COUNT times. Decrease
384 the execution counts from original node too.
385 The new clone will have decl set to DECL that may or may not be the same
386 as decl of N.
388 When UPDATE_ORIGINAL is true, the counts are subtracted from the original
389 function's profile to reflect the fact that part of execution is handled
390 by node.
391 When CALL_DUPLICATOIN_HOOK is true, the ipa passes are acknowledged about
392 the new clone. Otherwise the caller is responsible for doing so later.
394 If the new node is being inlined into another one, NEW_INLINED_TO should be
395 the outline function the new one is (even indirectly) inlined to. All hooks
396 will see this in node's global.inlined_to, when invoked. Can be NULL if the
397 node is not inlined. */
399 cgraph_node *
400 cgraph_node::create_clone (tree decl, gcov_type gcov_count, int freq,
401 bool update_original,
402 vec<cgraph_edge *> redirect_callers,
403 bool call_duplication_hook,
404 cgraph_node *new_inlined_to,
405 bitmap args_to_skip)
407 cgraph_node *new_node = symtab->create_empty ();
408 cgraph_edge *e;
409 gcov_type count_scale;
410 unsigned i;
412 new_node->decl = decl;
413 new_node->register_symbol ();
414 new_node->origin = origin;
415 new_node->lto_file_data = lto_file_data;
416 if (new_node->origin)
418 new_node->next_nested = new_node->origin->nested;
419 new_node->origin->nested = new_node;
421 new_node->analyzed = analyzed;
422 new_node->definition = definition;
423 new_node->local = local;
424 new_node->externally_visible = false;
425 new_node->no_reorder = no_reorder;
426 new_node->local.local = true;
427 new_node->global = global;
428 new_node->global.inlined_to = new_inlined_to;
429 new_node->rtl = rtl;
430 new_node->count = count;
431 new_node->frequency = frequency;
432 new_node->tp_first_run = tp_first_run;
433 new_node->tm_clone = tm_clone;
435 new_node->clone.tree_map = NULL;
436 new_node->clone.args_to_skip = args_to_skip;
437 if (!args_to_skip)
438 new_node->clone.combined_args_to_skip = clone.combined_args_to_skip;
439 else if (clone.combined_args_to_skip)
441 new_node->clone.combined_args_to_skip = BITMAP_GGC_ALLOC ();
442 bitmap_ior (new_node->clone.combined_args_to_skip,
443 clone.combined_args_to_skip, args_to_skip);
445 else
446 new_node->clone.combined_args_to_skip = args_to_skip;
448 if (count)
450 if (new_node->count > count)
451 count_scale = REG_BR_PROB_BASE;
452 else
453 count_scale = GCOV_COMPUTE_SCALE (new_node->count, count);
455 else
456 count_scale = 0;
457 if (update_original)
459 count -= gcov_count;
460 if (count < 0)
461 count = 0;
464 FOR_EACH_VEC_ELT (redirect_callers, i, e)
466 /* Redirect calls to the old version node to point to its new
467 version. The only exception is when the edge was proved to
468 be unreachable during the clonning procedure. */
469 if (!e->callee
470 || DECL_BUILT_IN_CLASS (e->callee->decl) != BUILT_IN_NORMAL
471 || DECL_FUNCTION_CODE (e->callee->decl) != BUILT_IN_UNREACHABLE)
472 redirect_edge_duplicating_thunks (e, new_node);
475 for (e = callees;e; e=e->next_callee)
476 e->clone (new_node, e->call_stmt, e->lto_stmt_uid, count_scale,
477 freq, update_original);
479 for (e = indirect_calls; e; e = e->next_callee)
480 e->clone (new_node, e->call_stmt, e->lto_stmt_uid,
481 count_scale, freq, update_original);
482 new_node->clone_references (this);
484 new_node->next_sibling_clone = clones;
485 if (clones)
486 clones->prev_sibling_clone = new_node;
487 clones = new_node;
488 new_node->clone_of = this;
490 if (call_duplication_hook)
491 symtab->call_cgraph_duplication_hooks (this, new_node);
492 return new_node;
495 /* Return a new assembler name for a clone of DECL with SUFFIX. */
497 static GTY(()) unsigned int clone_fn_id_num;
499 tree
500 clone_function_name (tree decl, const char *suffix)
502 tree name = DECL_ASSEMBLER_NAME (decl);
503 size_t len = IDENTIFIER_LENGTH (name);
504 char *tmp_name, *prefix;
506 prefix = XALLOCAVEC (char, len + strlen (suffix) + 2);
507 memcpy (prefix, IDENTIFIER_POINTER (name), len);
508 strcpy (prefix + len + 1, suffix);
509 #ifndef NO_DOT_IN_LABEL
510 prefix[len] = '.';
511 #elif !defined NO_DOLLAR_IN_LABEL
512 prefix[len] = '$';
513 #else
514 prefix[len] = '_';
515 #endif
516 ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix, clone_fn_id_num++);
517 return get_identifier (tmp_name);
520 /* Create callgraph node clone with new declaration. The actual body will
521 be copied later at compilation stage.
523 TODO: after merging in ipa-sra use function call notes instead of args_to_skip
524 bitmap interface.
526 cgraph_node *
527 cgraph_node::create_virtual_clone (vec<cgraph_edge *> redirect_callers,
528 vec<ipa_replace_map *, va_gc> *tree_map,
529 bitmap args_to_skip, const char * suffix)
531 tree old_decl = decl;
532 cgraph_node *new_node = NULL;
533 tree new_decl;
534 size_t len, i;
535 ipa_replace_map *map;
536 char *name;
538 if (!in_lto_p)
539 gcc_checking_assert (tree_versionable_function_p (old_decl));
541 gcc_assert (local.can_change_signature || !args_to_skip);
543 /* Make a new FUNCTION_DECL tree node */
544 if (!args_to_skip)
545 new_decl = copy_node (old_decl);
546 else
547 new_decl = build_function_decl_skip_args (old_decl, args_to_skip, false);
549 /* These pointers represent function body and will be populated only when clone
550 is materialized. */
551 gcc_assert (new_decl != old_decl);
552 DECL_STRUCT_FUNCTION (new_decl) = NULL;
553 DECL_ARGUMENTS (new_decl) = NULL;
554 DECL_INITIAL (new_decl) = NULL;
555 DECL_RESULT (new_decl) = NULL;
556 /* We can not do DECL_RESULT (new_decl) = NULL; here because of LTO partitioning
557 sometimes storing only clone decl instead of original. */
559 /* Generate a new name for the new version. */
560 len = IDENTIFIER_LENGTH (DECL_NAME (old_decl));
561 name = XALLOCAVEC (char, len + strlen (suffix) + 2);
562 memcpy (name, IDENTIFIER_POINTER (DECL_NAME (old_decl)), len);
563 strcpy (name + len + 1, suffix);
564 name[len] = '.';
565 DECL_NAME (new_decl) = get_identifier (name);
566 SET_DECL_ASSEMBLER_NAME (new_decl, clone_function_name (old_decl, suffix));
567 SET_DECL_RTL (new_decl, NULL);
569 new_node = create_clone (new_decl, count, CGRAPH_FREQ_BASE, false,
570 redirect_callers, false, NULL, args_to_skip);
572 /* Update the properties.
573 Make clone visible only within this translation unit. Make sure
574 that is not weak also.
575 ??? We cannot use COMDAT linkage because there is no
576 ABI support for this. */
577 set_new_clone_decl_and_node_flags (new_node);
578 new_node->clone.tree_map = tree_map;
580 /* Clones of global symbols or symbols with unique names are unique. */
581 if ((TREE_PUBLIC (old_decl)
582 && !DECL_EXTERNAL (old_decl)
583 && !DECL_WEAK (old_decl)
584 && !DECL_COMDAT (old_decl))
585 || in_lto_p)
586 new_node->unique_name = true;
587 FOR_EACH_VEC_SAFE_ELT (tree_map, i, map)
588 new_node->maybe_create_reference (map->new_tree, IPA_REF_ADDR, NULL);
590 if (ipa_transforms_to_apply.exists ())
591 new_node->ipa_transforms_to_apply
592 = ipa_transforms_to_apply.copy ();
594 symtab->call_cgraph_duplication_hooks (this, new_node);
596 return new_node;
599 /* callgraph node being removed from symbol table; see if its entry can be
600 replaced by other inline clone. */
601 cgraph_node *
602 cgraph_node::find_replacement (void)
604 cgraph_node *next_inline_clone, *replacement;
606 for (next_inline_clone = clones;
607 next_inline_clone
608 && next_inline_clone->decl != decl;
609 next_inline_clone = next_inline_clone->next_sibling_clone)
612 /* If there is inline clone of the node being removed, we need
613 to put it into the position of removed node and reorganize all
614 other clones to be based on it. */
615 if (next_inline_clone)
617 cgraph_node *n;
618 cgraph_node *new_clones;
620 replacement = next_inline_clone;
622 /* Unlink inline clone from the list of clones of removed node. */
623 if (next_inline_clone->next_sibling_clone)
624 next_inline_clone->next_sibling_clone->prev_sibling_clone
625 = next_inline_clone->prev_sibling_clone;
626 if (next_inline_clone->prev_sibling_clone)
628 gcc_assert (clones != next_inline_clone);
629 next_inline_clone->prev_sibling_clone->next_sibling_clone
630 = next_inline_clone->next_sibling_clone;
632 else
634 gcc_assert (clones == next_inline_clone);
635 clones = next_inline_clone->next_sibling_clone;
638 new_clones = clones;
639 clones = NULL;
641 /* Copy clone info. */
642 next_inline_clone->clone = clone;
644 /* Now place it into clone tree at same level at NODE. */
645 next_inline_clone->clone_of = clone_of;
646 next_inline_clone->prev_sibling_clone = NULL;
647 next_inline_clone->next_sibling_clone = NULL;
648 if (clone_of)
650 if (clone_of->clones)
651 clone_of->clones->prev_sibling_clone = next_inline_clone;
652 next_inline_clone->next_sibling_clone = clone_of->clones;
653 clone_of->clones = next_inline_clone;
656 /* Merge the clone list. */
657 if (new_clones)
659 if (!next_inline_clone->clones)
660 next_inline_clone->clones = new_clones;
661 else
663 n = next_inline_clone->clones;
664 while (n->next_sibling_clone)
665 n = n->next_sibling_clone;
666 n->next_sibling_clone = new_clones;
667 new_clones->prev_sibling_clone = n;
671 /* Update clone_of pointers. */
672 n = new_clones;
673 while (n)
675 n->clone_of = next_inline_clone;
676 n = n->next_sibling_clone;
678 return replacement;
680 else
681 return NULL;
684 /* Like cgraph_set_call_stmt but walk the clone tree and update all
685 clones sharing the same function body.
686 When WHOLE_SPECULATIVE_EDGES is true, all three components of
687 speculative edge gets updated. Otherwise we update only direct
688 call. */
690 void
691 cgraph_node::set_call_stmt_including_clones (gimple old_stmt,
692 gcall *new_stmt,
693 bool update_speculative)
695 cgraph_node *node;
696 cgraph_edge *edge = get_edge (old_stmt);
698 if (edge)
699 edge->set_call_stmt (new_stmt, update_speculative);
701 node = clones;
702 if (node)
703 while (node != this)
705 cgraph_edge *edge = node->get_edge (old_stmt);
706 if (edge)
708 edge->set_call_stmt (new_stmt, update_speculative);
709 /* If UPDATE_SPECULATIVE is false, it means that we are turning
710 speculative call into a real code sequence. Update the
711 callgraph edges. */
712 if (edge->speculative && !update_speculative)
714 cgraph_edge *direct, *indirect;
715 ipa_ref *ref;
717 gcc_assert (!edge->indirect_unknown_callee);
718 edge->speculative_call_info (direct, indirect, ref);
719 direct->speculative = false;
720 indirect->speculative = false;
721 ref->speculative = false;
724 if (node->clones)
725 node = node->clones;
726 else if (node->next_sibling_clone)
727 node = node->next_sibling_clone;
728 else
730 while (node != this && !node->next_sibling_clone)
731 node = node->clone_of;
732 if (node != this)
733 node = node->next_sibling_clone;
738 /* Like cgraph_create_edge walk the clone tree and update all clones sharing
739 same function body. If clones already have edge for OLD_STMT; only
740 update the edge same way as cgraph_set_call_stmt_including_clones does.
742 TODO: COUNT and LOOP_DEPTH should be properly distributed based on relative
743 frequencies of the clones. */
745 void
746 cgraph_node::create_edge_including_clones (cgraph_node *callee,
747 gimple old_stmt, gcall *stmt,
748 gcov_type count,
749 int freq,
750 cgraph_inline_failed_t reason)
752 cgraph_node *node;
753 cgraph_edge *edge;
755 if (!get_edge (stmt))
757 edge = create_edge (callee, stmt, count, freq);
758 edge->inline_failed = reason;
761 node = clones;
762 if (node)
763 while (node != this)
765 cgraph_edge *edge = node->get_edge (old_stmt);
767 /* It is possible that clones already contain the edge while
768 master didn't. Either we promoted indirect call into direct
769 call in the clone or we are processing clones of unreachable
770 master where edges has been removed. */
771 if (edge)
772 edge->set_call_stmt (stmt);
773 else if (! node->get_edge (stmt))
775 edge = node->create_edge (callee, stmt, count, freq);
776 edge->inline_failed = reason;
779 if (node->clones)
780 node = node->clones;
781 else if (node->next_sibling_clone)
782 node = node->next_sibling_clone;
783 else
785 while (node != this && !node->next_sibling_clone)
786 node = node->clone_of;
787 if (node != this)
788 node = node->next_sibling_clone;
793 /* Remove the node from cgraph and all inline clones inlined into it.
794 Skip however removal of FORBIDDEN_NODE and return true if it needs to be
795 removed. This allows to call the function from outer loop walking clone
796 tree. */
798 bool
799 cgraph_node::remove_symbol_and_inline_clones (cgraph_node *forbidden_node)
801 cgraph_edge *e, *next;
802 bool found = false;
804 if (this == forbidden_node)
806 callers->remove ();
807 return true;
809 for (e = callees; e; e = next)
811 next = e->next_callee;
812 if (!e->inline_failed)
813 found |= e->callee->remove_symbol_and_inline_clones (forbidden_node);
815 remove ();
816 return found;
819 /* The edges representing the callers of the NEW_VERSION node were
820 fixed by cgraph_function_versioning (), now the call_expr in their
821 respective tree code should be updated to call the NEW_VERSION. */
823 static void
824 update_call_expr (cgraph_node *new_version)
826 cgraph_edge *e;
828 gcc_assert (new_version);
830 /* Update the call expr on the edges to call the new version. */
831 for (e = new_version->callers; e; e = e->next_caller)
833 function *inner_function = DECL_STRUCT_FUNCTION (e->caller->decl);
834 gimple_call_set_fndecl (e->call_stmt, new_version->decl);
835 maybe_clean_eh_stmt_fn (inner_function, e->call_stmt);
840 /* Create a new cgraph node which is the new version of
841 callgraph node. REDIRECT_CALLERS holds the callers
842 edges which should be redirected to point to
843 NEW_VERSION. ALL the callees edges of the node
844 are cloned to the new version node. Return the new
845 version node.
847 If non-NULL BLOCK_TO_COPY determine what basic blocks
848 was copied to prevent duplications of calls that are dead
849 in the clone. */
851 cgraph_node *
852 cgraph_node::create_version_clone (tree new_decl,
853 vec<cgraph_edge *> redirect_callers,
854 bitmap bbs_to_copy)
856 cgraph_node *new_version;
857 cgraph_edge *e;
858 unsigned i;
860 new_version = cgraph_node::create (new_decl);
862 new_version->analyzed = analyzed;
863 new_version->definition = definition;
864 new_version->local = local;
865 new_version->externally_visible = false;
866 new_version->no_reorder = no_reorder;
867 new_version->local.local = new_version->definition;
868 new_version->global = global;
869 new_version->rtl = rtl;
870 new_version->count = count;
872 for (e = callees; e; e=e->next_callee)
873 if (!bbs_to_copy
874 || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index))
875 e->clone (new_version, e->call_stmt,
876 e->lto_stmt_uid, REG_BR_PROB_BASE,
877 CGRAPH_FREQ_BASE,
878 true);
879 for (e = indirect_calls; e; e=e->next_callee)
880 if (!bbs_to_copy
881 || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index))
882 e->clone (new_version, e->call_stmt,
883 e->lto_stmt_uid, REG_BR_PROB_BASE,
884 CGRAPH_FREQ_BASE,
885 true);
886 FOR_EACH_VEC_ELT (redirect_callers, i, e)
888 /* Redirect calls to the old version node to point to its new
889 version. */
890 e->redirect_callee (new_version);
893 symtab->call_cgraph_duplication_hooks (this, new_version);
895 return new_version;
898 /* Perform function versioning.
899 Function versioning includes copying of the tree and
900 a callgraph update (creating a new cgraph node and updating
901 its callees and callers).
903 REDIRECT_CALLERS varray includes the edges to be redirected
904 to the new version.
906 TREE_MAP is a mapping of tree nodes we want to replace with
907 new ones (according to results of prior analysis).
909 If non-NULL ARGS_TO_SKIP determine function parameters to remove
910 from new version.
911 If SKIP_RETURN is true, the new version will return void.
912 If non-NULL BLOCK_TO_COPY determine what basic blocks to copy.
913 If non_NULL NEW_ENTRY determine new entry BB of the clone.
915 Return the new version's cgraph node. */
917 cgraph_node *
918 cgraph_node::create_version_clone_with_body
919 (vec<cgraph_edge *> redirect_callers,
920 vec<ipa_replace_map *, va_gc> *tree_map, bitmap args_to_skip,
921 bool skip_return, bitmap bbs_to_copy, basic_block new_entry_block,
922 const char *clone_name)
924 tree old_decl = decl;
925 cgraph_node *new_version_node = NULL;
926 tree new_decl;
928 if (!tree_versionable_function_p (old_decl))
929 return NULL;
931 gcc_assert (local.can_change_signature || !args_to_skip);
933 /* Make a new FUNCTION_DECL tree node for the new version. */
934 if (!args_to_skip && !skip_return)
935 new_decl = copy_node (old_decl);
936 else
937 new_decl
938 = build_function_decl_skip_args (old_decl, args_to_skip, skip_return);
940 /* Generate a new name for the new version. */
941 DECL_NAME (new_decl) = clone_function_name (old_decl, clone_name);
942 SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
943 SET_DECL_RTL (new_decl, NULL);
945 /* When the old decl was a con-/destructor make sure the clone isn't. */
946 DECL_STATIC_CONSTRUCTOR (new_decl) = 0;
947 DECL_STATIC_DESTRUCTOR (new_decl) = 0;
949 /* Create the new version's call-graph node.
950 and update the edges of the new node. */
951 new_version_node = create_version_clone (new_decl, redirect_callers,
952 bbs_to_copy);
954 if (ipa_transforms_to_apply.exists ())
955 new_version_node->ipa_transforms_to_apply
956 = ipa_transforms_to_apply.copy ();
957 /* Copy the OLD_VERSION_NODE function tree to the new version. */
958 tree_function_versioning (old_decl, new_decl, tree_map, false, args_to_skip,
959 skip_return, bbs_to_copy, new_entry_block);
961 /* Update the new version's properties.
962 Make The new version visible only within this translation unit. Make sure
963 that is not weak also.
964 ??? We cannot use COMDAT linkage because there is no
965 ABI support for this. */
966 new_version_node->make_decl_local ();
967 DECL_VIRTUAL_P (new_version_node->decl) = 0;
968 new_version_node->externally_visible = 0;
969 new_version_node->local.local = 1;
970 new_version_node->lowered = true;
971 /* Clones of global symbols or symbols with unique names are unique. */
972 if ((TREE_PUBLIC (old_decl)
973 && !DECL_EXTERNAL (old_decl)
974 && !DECL_WEAK (old_decl)
975 && !DECL_COMDAT (old_decl))
976 || in_lto_p)
977 new_version_node->unique_name = true;
979 /* Update the call_expr on the edges to call the new version node. */
980 update_call_expr (new_version_node);
982 symtab->call_cgraph_insertion_hooks (this);
983 return new_version_node;
986 /* Given virtual clone, turn it into actual clone. */
988 static void
989 cgraph_materialize_clone (cgraph_node *node)
991 bitmap_obstack_initialize (NULL);
992 node->former_clone_of = node->clone_of->decl;
993 if (node->clone_of->former_clone_of)
994 node->former_clone_of = node->clone_of->former_clone_of;
995 /* Copy the OLD_VERSION_NODE function tree to the new version. */
996 tree_function_versioning (node->clone_of->decl, node->decl,
997 node->clone.tree_map, true,
998 node->clone.args_to_skip, false,
999 NULL, NULL);
1000 if (symtab->dump_file)
1002 dump_function_to_file (node->clone_of->decl, symtab->dump_file,
1003 dump_flags);
1004 dump_function_to_file (node->decl, symtab->dump_file, dump_flags);
1007 /* Function is no longer clone. */
1008 if (node->next_sibling_clone)
1009 node->next_sibling_clone->prev_sibling_clone = node->prev_sibling_clone;
1010 if (node->prev_sibling_clone)
1011 node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone;
1012 else
1013 node->clone_of->clones = node->next_sibling_clone;
1014 node->next_sibling_clone = NULL;
1015 node->prev_sibling_clone = NULL;
1016 if (!node->clone_of->analyzed && !node->clone_of->clones)
1018 node->clone_of->release_body ();
1019 node->clone_of->remove_callees ();
1020 node->clone_of->remove_all_references ();
1022 node->clone_of = NULL;
1023 bitmap_obstack_release (NULL);
1026 /* Once all functions from compilation unit are in memory, produce all clones
1027 and update all calls. We might also do this on demand if we don't want to
1028 bring all functions to memory prior compilation, but current WHOPR
1029 implementation does that and it is is bit easier to keep everything right in
1030 this order. */
1032 void
1033 symbol_table::materialize_all_clones (void)
1035 cgraph_node *node;
1036 bool stabilized = false;
1039 if (symtab->dump_file)
1040 fprintf (symtab->dump_file, "Materializing clones\n");
1041 #ifdef ENABLE_CHECKING
1042 cgraph_node::verify_cgraph_nodes ();
1043 #endif
1045 /* We can also do topological order, but number of iterations should be
1046 bounded by number of IPA passes since single IPA pass is probably not
1047 going to create clones of clones it created itself. */
1048 while (!stabilized)
1050 stabilized = true;
1051 FOR_EACH_FUNCTION (node)
1053 if (node->clone_of && node->decl != node->clone_of->decl
1054 && !gimple_has_body_p (node->decl))
1056 if (!node->clone_of->clone_of)
1057 node->clone_of->get_body ();
1058 if (gimple_has_body_p (node->clone_of->decl))
1060 if (symtab->dump_file)
1062 fprintf (symtab->dump_file, "cloning %s to %s\n",
1063 xstrdup (node->clone_of->name ()),
1064 xstrdup (node->name ()));
1065 if (node->clone.tree_map)
1067 unsigned int i;
1068 fprintf (symtab->dump_file, " replace map: ");
1069 for (i = 0;
1070 i < vec_safe_length (node->clone.tree_map);
1071 i++)
1073 ipa_replace_map *replace_info;
1074 replace_info = (*node->clone.tree_map)[i];
1075 print_generic_expr (symtab->dump_file, replace_info->old_tree, 0);
1076 fprintf (symtab->dump_file, " -> ");
1077 print_generic_expr (symtab->dump_file, replace_info->new_tree, 0);
1078 fprintf (symtab->dump_file, "%s%s;",
1079 replace_info->replace_p ? "(replace)":"",
1080 replace_info->ref_p ? "(ref)":"");
1082 fprintf (symtab->dump_file, "\n");
1084 if (node->clone.args_to_skip)
1086 fprintf (symtab->dump_file, " args_to_skip: ");
1087 dump_bitmap (symtab->dump_file,
1088 node->clone.args_to_skip);
1090 if (node->clone.args_to_skip)
1092 fprintf (symtab->dump_file, " combined_args_to_skip:");
1093 dump_bitmap (symtab->dump_file, node->clone.combined_args_to_skip);
1096 cgraph_materialize_clone (node);
1097 stabilized = false;
1102 FOR_EACH_FUNCTION (node)
1103 if (!node->analyzed && node->callees)
1105 node->remove_callees ();
1106 node->remove_all_references ();
1108 else
1109 node->clear_stmts_in_references ();
1110 if (symtab->dump_file)
1111 fprintf (symtab->dump_file, "Materialization Call site updates done.\n");
1112 #ifdef ENABLE_CHECKING
1113 cgraph_node::verify_cgraph_nodes ();
1114 #endif
1115 symtab->remove_unreachable_nodes (false, symtab->dump_file);
1118 #include "gt-cgraphclones.h"