Introduce gimple_phi and use it in various places
[official-gcc.git] / gcc / cgraphclones.c
blobc487c13f3db277b56f4ddbaaf4d9b53e5aa735ff
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, gimple 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, gimple new_stmt,
692 bool update_speculative)
694 cgraph_node *node;
695 cgraph_edge *edge = get_edge (old_stmt);
697 if (edge)
698 edge->set_call_stmt (new_stmt, update_speculative);
700 node = clones;
701 if (node)
702 while (node != this)
704 cgraph_edge *edge = node->get_edge (old_stmt);
705 if (edge)
707 edge->set_call_stmt (new_stmt, update_speculative);
708 /* If UPDATE_SPECULATIVE is false, it means that we are turning
709 speculative call into a real code sequence. Update the
710 callgraph edges. */
711 if (edge->speculative && !update_speculative)
713 cgraph_edge *direct, *indirect;
714 ipa_ref *ref;
716 gcc_assert (!edge->indirect_unknown_callee);
717 edge->speculative_call_info (direct, indirect, ref);
718 direct->speculative = false;
719 indirect->speculative = false;
720 ref->speculative = false;
723 if (node->clones)
724 node = node->clones;
725 else if (node->next_sibling_clone)
726 node = node->next_sibling_clone;
727 else
729 while (node != this && !node->next_sibling_clone)
730 node = node->clone_of;
731 if (node != this)
732 node = node->next_sibling_clone;
737 /* Like cgraph_create_edge walk the clone tree and update all clones sharing
738 same function body. If clones already have edge for OLD_STMT; only
739 update the edge same way as cgraph_set_call_stmt_including_clones does.
741 TODO: COUNT and LOOP_DEPTH should be properly distributed based on relative
742 frequencies of the clones. */
744 void
745 cgraph_node::create_edge_including_clones (cgraph_node *callee,
746 gimple old_stmt, gimple stmt,
747 gcov_type count,
748 int freq,
749 cgraph_inline_failed_t reason)
751 cgraph_node *node;
752 cgraph_edge *edge;
754 if (!get_edge (stmt))
756 edge = create_edge (callee, stmt, count, freq);
757 edge->inline_failed = reason;
760 node = clones;
761 if (node)
762 while (node != this)
764 cgraph_edge *edge = node->get_edge (old_stmt);
766 /* It is possible that clones already contain the edge while
767 master didn't. Either we promoted indirect call into direct
768 call in the clone or we are processing clones of unreachable
769 master where edges has been removed. */
770 if (edge)
771 edge->set_call_stmt (stmt);
772 else if (! node->get_edge (stmt))
774 edge = node->create_edge (callee, stmt, count, freq);
775 edge->inline_failed = reason;
778 if (node->clones)
779 node = node->clones;
780 else if (node->next_sibling_clone)
781 node = node->next_sibling_clone;
782 else
784 while (node != this && !node->next_sibling_clone)
785 node = node->clone_of;
786 if (node != this)
787 node = node->next_sibling_clone;
792 /* Remove the node from cgraph and all inline clones inlined into it.
793 Skip however removal of FORBIDDEN_NODE and return true if it needs to be
794 removed. This allows to call the function from outer loop walking clone
795 tree. */
797 bool
798 cgraph_node::remove_symbol_and_inline_clones (cgraph_node *forbidden_node)
800 cgraph_edge *e, *next;
801 bool found = false;
803 if (this == forbidden_node)
805 callers->remove ();
806 return true;
808 for (e = callees; e; e = next)
810 next = e->next_callee;
811 if (!e->inline_failed)
812 found |= e->callee->remove_symbol_and_inline_clones (forbidden_node);
814 remove ();
815 return found;
818 /* The edges representing the callers of the NEW_VERSION node were
819 fixed by cgraph_function_versioning (), now the call_expr in their
820 respective tree code should be updated to call the NEW_VERSION. */
822 static void
823 update_call_expr (cgraph_node *new_version)
825 cgraph_edge *e;
827 gcc_assert (new_version);
829 /* Update the call expr on the edges to call the new version. */
830 for (e = new_version->callers; e; e = e->next_caller)
832 function *inner_function = DECL_STRUCT_FUNCTION (e->caller->decl);
833 gimple_call_set_fndecl (e->call_stmt, new_version->decl);
834 maybe_clean_eh_stmt_fn (inner_function, e->call_stmt);
839 /* Create a new cgraph node which is the new version of
840 callgraph node. REDIRECT_CALLERS holds the callers
841 edges which should be redirected to point to
842 NEW_VERSION. ALL the callees edges of the node
843 are cloned to the new version node. Return the new
844 version node.
846 If non-NULL BLOCK_TO_COPY determine what basic blocks
847 was copied to prevent duplications of calls that are dead
848 in the clone. */
850 cgraph_node *
851 cgraph_node::create_version_clone (tree new_decl,
852 vec<cgraph_edge *> redirect_callers,
853 bitmap bbs_to_copy)
855 cgraph_node *new_version;
856 cgraph_edge *e;
857 unsigned i;
859 new_version = cgraph_node::create (new_decl);
861 new_version->analyzed = analyzed;
862 new_version->definition = definition;
863 new_version->local = local;
864 new_version->externally_visible = false;
865 new_version->no_reorder = no_reorder;
866 new_version->local.local = new_version->definition;
867 new_version->global = global;
868 new_version->rtl = rtl;
869 new_version->count = count;
871 for (e = callees; e; e=e->next_callee)
872 if (!bbs_to_copy
873 || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index))
874 e->clone (new_version, e->call_stmt,
875 e->lto_stmt_uid, REG_BR_PROB_BASE,
876 CGRAPH_FREQ_BASE,
877 true);
878 for (e = indirect_calls; e; e=e->next_callee)
879 if (!bbs_to_copy
880 || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index))
881 e->clone (new_version, e->call_stmt,
882 e->lto_stmt_uid, REG_BR_PROB_BASE,
883 CGRAPH_FREQ_BASE,
884 true);
885 FOR_EACH_VEC_ELT (redirect_callers, i, e)
887 /* Redirect calls to the old version node to point to its new
888 version. */
889 e->redirect_callee (new_version);
892 symtab->call_cgraph_duplication_hooks (this, new_version);
894 return new_version;
897 /* Perform function versioning.
898 Function versioning includes copying of the tree and
899 a callgraph update (creating a new cgraph node and updating
900 its callees and callers).
902 REDIRECT_CALLERS varray includes the edges to be redirected
903 to the new version.
905 TREE_MAP is a mapping of tree nodes we want to replace with
906 new ones (according to results of prior analysis).
908 If non-NULL ARGS_TO_SKIP determine function parameters to remove
909 from new version.
910 If SKIP_RETURN is true, the new version will return void.
911 If non-NULL BLOCK_TO_COPY determine what basic blocks to copy.
912 If non_NULL NEW_ENTRY determine new entry BB of the clone.
914 Return the new version's cgraph node. */
916 cgraph_node *
917 cgraph_node::create_version_clone_with_body
918 (vec<cgraph_edge *> redirect_callers,
919 vec<ipa_replace_map *, va_gc> *tree_map, bitmap args_to_skip,
920 bool skip_return, bitmap bbs_to_copy, basic_block new_entry_block,
921 const char *clone_name)
923 tree old_decl = decl;
924 cgraph_node *new_version_node = NULL;
925 tree new_decl;
927 if (!tree_versionable_function_p (old_decl))
928 return NULL;
930 gcc_assert (local.can_change_signature || !args_to_skip);
932 /* Make a new FUNCTION_DECL tree node for the new version. */
933 if (!args_to_skip && !skip_return)
934 new_decl = copy_node (old_decl);
935 else
936 new_decl
937 = build_function_decl_skip_args (old_decl, args_to_skip, skip_return);
939 /* Generate a new name for the new version. */
940 DECL_NAME (new_decl) = clone_function_name (old_decl, clone_name);
941 SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
942 SET_DECL_RTL (new_decl, NULL);
944 /* When the old decl was a con-/destructor make sure the clone isn't. */
945 DECL_STATIC_CONSTRUCTOR (new_decl) = 0;
946 DECL_STATIC_DESTRUCTOR (new_decl) = 0;
948 /* Create the new version's call-graph node.
949 and update the edges of the new node. */
950 new_version_node = create_version_clone (new_decl, redirect_callers,
951 bbs_to_copy);
953 if (ipa_transforms_to_apply.exists ())
954 new_version_node->ipa_transforms_to_apply
955 = ipa_transforms_to_apply.copy ();
956 /* Copy the OLD_VERSION_NODE function tree to the new version. */
957 tree_function_versioning (old_decl, new_decl, tree_map, false, args_to_skip,
958 skip_return, bbs_to_copy, new_entry_block);
960 /* Update the new version's properties.
961 Make The new version visible only within this translation unit. Make sure
962 that is not weak also.
963 ??? We cannot use COMDAT linkage because there is no
964 ABI support for this. */
965 new_version_node->make_decl_local ();
966 DECL_VIRTUAL_P (new_version_node->decl) = 0;
967 new_version_node->externally_visible = 0;
968 new_version_node->local.local = 1;
969 new_version_node->lowered = true;
970 /* Clones of global symbols or symbols with unique names are unique. */
971 if ((TREE_PUBLIC (old_decl)
972 && !DECL_EXTERNAL (old_decl)
973 && !DECL_WEAK (old_decl)
974 && !DECL_COMDAT (old_decl))
975 || in_lto_p)
976 new_version_node->unique_name = true;
978 /* Update the call_expr on the edges to call the new version node. */
979 update_call_expr (new_version_node);
981 symtab->call_cgraph_insertion_hooks (this);
982 return new_version_node;
985 /* Given virtual clone, turn it into actual clone. */
987 static void
988 cgraph_materialize_clone (cgraph_node *node)
990 bitmap_obstack_initialize (NULL);
991 node->former_clone_of = node->clone_of->decl;
992 if (node->clone_of->former_clone_of)
993 node->former_clone_of = node->clone_of->former_clone_of;
994 /* Copy the OLD_VERSION_NODE function tree to the new version. */
995 tree_function_versioning (node->clone_of->decl, node->decl,
996 node->clone.tree_map, true,
997 node->clone.args_to_skip, false,
998 NULL, NULL);
999 if (symtab->dump_file)
1001 dump_function_to_file (node->clone_of->decl, symtab->dump_file,
1002 dump_flags);
1003 dump_function_to_file (node->decl, symtab->dump_file, dump_flags);
1006 /* Function is no longer clone. */
1007 if (node->next_sibling_clone)
1008 node->next_sibling_clone->prev_sibling_clone = node->prev_sibling_clone;
1009 if (node->prev_sibling_clone)
1010 node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone;
1011 else
1012 node->clone_of->clones = node->next_sibling_clone;
1013 node->next_sibling_clone = NULL;
1014 node->prev_sibling_clone = NULL;
1015 if (!node->clone_of->analyzed && !node->clone_of->clones)
1017 node->clone_of->release_body ();
1018 node->clone_of->remove_callees ();
1019 node->clone_of->remove_all_references ();
1021 node->clone_of = NULL;
1022 bitmap_obstack_release (NULL);
1025 /* Once all functions from compilation unit are in memory, produce all clones
1026 and update all calls. We might also do this on demand if we don't want to
1027 bring all functions to memory prior compilation, but current WHOPR
1028 implementation does that and it is is bit easier to keep everything right in
1029 this order. */
1031 void
1032 symbol_table::materialize_all_clones (void)
1034 cgraph_node *node;
1035 bool stabilized = false;
1038 if (symtab->dump_file)
1039 fprintf (symtab->dump_file, "Materializing clones\n");
1040 #ifdef ENABLE_CHECKING
1041 cgraph_node::verify_cgraph_nodes ();
1042 #endif
1044 /* We can also do topological order, but number of iterations should be
1045 bounded by number of IPA passes since single IPA pass is probably not
1046 going to create clones of clones it created itself. */
1047 while (!stabilized)
1049 stabilized = true;
1050 FOR_EACH_FUNCTION (node)
1052 if (node->clone_of && node->decl != node->clone_of->decl
1053 && !gimple_has_body_p (node->decl))
1055 if (!node->clone_of->clone_of)
1056 node->clone_of->get_body ();
1057 if (gimple_has_body_p (node->clone_of->decl))
1059 if (symtab->dump_file)
1061 fprintf (symtab->dump_file, "cloning %s to %s\n",
1062 xstrdup (node->clone_of->name ()),
1063 xstrdup (node->name ()));
1064 if (node->clone.tree_map)
1066 unsigned int i;
1067 fprintf (symtab->dump_file, " replace map: ");
1068 for (i = 0;
1069 i < vec_safe_length (node->clone.tree_map);
1070 i++)
1072 ipa_replace_map *replace_info;
1073 replace_info = (*node->clone.tree_map)[i];
1074 print_generic_expr (symtab->dump_file, replace_info->old_tree, 0);
1075 fprintf (symtab->dump_file, " -> ");
1076 print_generic_expr (symtab->dump_file, replace_info->new_tree, 0);
1077 fprintf (symtab->dump_file, "%s%s;",
1078 replace_info->replace_p ? "(replace)":"",
1079 replace_info->ref_p ? "(ref)":"");
1081 fprintf (symtab->dump_file, "\n");
1083 if (node->clone.args_to_skip)
1085 fprintf (symtab->dump_file, " args_to_skip: ");
1086 dump_bitmap (symtab->dump_file,
1087 node->clone.args_to_skip);
1089 if (node->clone.args_to_skip)
1091 fprintf (symtab->dump_file, " combined_args_to_skip:");
1092 dump_bitmap (symtab->dump_file, node->clone.combined_args_to_skip);
1095 cgraph_materialize_clone (node);
1096 stabilized = false;
1101 FOR_EACH_FUNCTION (node)
1102 if (!node->analyzed && node->callees)
1104 node->remove_callees ();
1105 node->remove_all_references ();
1107 else
1108 node->clear_stmts_in_references ();
1109 if (symtab->dump_file)
1110 fprintf (symtab->dump_file, "Materialization Call site updates done.\n");
1111 #ifdef ENABLE_CHECKING
1112 cgraph_node::verify_cgraph_nodes ();
1113 #endif
1114 symtab->remove_unreachable_nodes (false, symtab->dump_file);
1117 #include "gt-cgraphclones.h"