]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/cgraphclones.c
alias.c: Reorder #include statements and remove duplicates.
[thirdparty/gcc.git] / gcc / cgraphclones.c
1 /* Callgraph clones
2 Copyright (C) 2003-2015 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
4
5 This file is part of GCC.
6
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.
11
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.
16
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/>. */
20
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.
24
25 To allow whole program optimization without actual presence of function
26 bodies, an additional infrastructure is provided for so-called virtual
27 clones
28
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).
32
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.
38
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.
42
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.
50
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.
54
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.
61
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. */
66
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"
101
102 /* Create clone of edge in the node N represented by CALL_EXPR
103 the callgraph. */
104
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)
108 {
109 cgraph_edge *new_edge;
110 gcov_type gcov_count = apply_probability (count, count_scale);
111 gcov_type freq;
112
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;
119
120 if (indirect_unknown_callee)
121 {
122 tree decl;
123
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)
128 {
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);
132 }
133 else
134 {
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;
139 }
140 }
141 else
142 {
143 new_edge = n->create_edge (callee, call_stmt, gcov_count, freq);
144 if (indirect_info)
145 {
146 new_edge->indirect_info
147 = ggc_cleared_alloc<cgraph_indirect_call_info> ();
148 *new_edge->indirect_info = *indirect_info;
149 }
150 }
151
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)
161 {
162 count -= new_edge->count;
163 if (count < 0)
164 count = 0;
165 }
166 symtab->call_edge_duplication_hooks (this, new_edge);
167 return new_edge;
168 }
169
170 /* Build variant of function type ORIG_TYPE skipping ARGS_TO_SKIP and the
171 return value if SKIP_RETURN is true. */
172
173 static tree
174 build_function_type_skip_args (tree orig_type, bitmap args_to_skip,
175 bool skip_return)
176 {
177 tree new_type = NULL;
178 tree args, new_args = NULL;
179 tree new_reversed;
180 int i = 0;
181
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);
186
187 new_reversed = nreverse (new_args);
188 if (args)
189 {
190 if (new_reversed)
191 TREE_CHAIN (new_args) = void_list_node;
192 else
193 new_reversed = void_list_node;
194 }
195
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))
204 {
205 new_type = build_distinct_type_copy (orig_type);
206 TYPE_ARG_TYPES (new_type) = new_reversed;
207 }
208 else
209 {
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);
214 }
215
216 if (skip_return)
217 TREE_TYPE (new_type) = void_type_node;
218
219 return new_type;
220 }
221
222 /* Build variant of function decl ORIG_DECL skipping ARGS_TO_SKIP and the
223 return value if SKIP_RETURN is true.
224
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). */
228
229 static tree
230 build_function_decl_skip_args (tree orig_decl, bitmap args_to_skip,
231 bool skip_return)
232 {
233 tree new_decl = copy_node (orig_decl);
234 tree new_type;
235
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;
242
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;
247
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))
252 {
253 DECL_BUILT_IN_CLASS (new_decl) = NOT_BUILT_IN;
254 DECL_FUNCTION_CODE (new_decl) = (enum built_in_function) 0;
255 }
256 /* The FE might have information and assumptions about the other
257 arguments. */
258 DECL_LANG_SPECIFIC (new_decl) = NULL;
259 return new_decl;
260 }
261
262 /* Set flags of NEW_NODE and its decl. NEW_NODE is a newly created private
263 clone or its thunk. */
264
265 static void
266 set_new_clone_decl_and_node_flags (cgraph_node *new_node)
267 {
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;
275
276 new_node->externally_visible = 0;
277 new_node->local.local = 1;
278 new_node->lowered = true;
279 }
280
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. */
285
286 static cgraph_node *
287 duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node)
288 {
289 cgraph_node *new_thunk, *thunk_of;
290 thunk_of = thunk->callees->callee->ultimate_alias_target ();
291
292 if (thunk_of->thunk.thunk_p)
293 node = duplicate_thunk_for_node (thunk_of, node);
294
295 if (!DECL_ARGUMENTS (thunk->decl))
296 thunk->get_untransformed_body ();
297
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;
306
307 tree new_decl;
308 if (!node->clone.args_to_skip)
309 new_decl = copy_node (thunk->decl);
310 else
311 {
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;
317
318 new_decl = build_function_decl_skip_args (thunk->decl,
319 node->clone.args_to_skip,
320 false);
321 }
322
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++)
326 {
327 if (!node->clone.args_to_skip
328 || !bitmap_bit_p (node->clone.args_to_skip, i))
329 {
330 tree nd = copy_node (pd);
331 DECL_CONTEXT (nd) = new_decl;
332 *link = nd;
333 link = &DECL_CHAIN (nd);
334 }
335 }
336 *link = NULL_TREE;
337
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));
342
343 DECL_NAME (new_decl) = clone_function_name (thunk->decl, "artificial_thunk");
344 SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
345
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;
354
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;
361 }
362
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. */
367
368 void
369 cgraph_edge::redirect_callee_duplicating_thunks (cgraph_node *n)
370 {
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);
374
375 redirect_callee (n);
376 }
377
378 /* Call expand_thunk on all callers that are thunks and if analyze those nodes
379 that were expanded. */
380
381 void
382 cgraph_node::expand_all_artificial_thunks ()
383 {
384 cgraph_edge *e;
385 for (e = callers; e;)
386 if (e->caller->thunk.thunk_p)
387 {
388 cgraph_node *thunk = e->caller;
389
390 e = e->next_caller;
391 if (thunk->expand_thunk (false, false))
392 {
393 thunk->thunk.thunk_p = false;
394 thunk->analyze ();
395 }
396 thunk->expand_all_artificial_thunks ();
397 }
398 else
399 e = e->next_caller;
400 }
401
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.
406
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.
412
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. */
417
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)
425 {
426 cgraph_node *new_node = symtab->create_empty ();
427 cgraph_edge *e;
428 gcov_type count_scale;
429 unsigned i;
430
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)
436 {
437 new_node->next_nested = new_node->origin->nested;
438 new_node->origin->nested = new_node;
439 }
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;
455
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)
462 {
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);
466 }
467 else
468 new_node->clone.combined_args_to_skip = args_to_skip;
469
470 if (count)
471 {
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);
476 }
477 else
478 count_scale = 0;
479 if (update_original)
480 {
481 count -= gcov_count;
482 if (count < 0)
483 count = 0;
484 }
485
486 FOR_EACH_VEC_ELT (redirect_callers, i, e)
487 {
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);
495 }
496 new_node->expand_all_artificial_thunks ();
497
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);
501
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);
506
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;
512
513 if (call_duplication_hook)
514 symtab->call_cgraph_duplication_hooks (this, new_node);
515 return new_node;
516 }
517
518 static GTY(()) unsigned int clone_fn_id_num;
519
520 /* Return a new assembler name for a clone with SUFFIX of a decl named
521 NAME. */
522
523 tree
524 clone_function_name_1 (const char *name, const char *suffix)
525 {
526 size_t len = strlen (name);
527 char *tmp_name, *prefix;
528
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);
541 }
542
543 /* Return a new assembler name for a clone of DECL with SUFFIX. */
544
545 tree
546 clone_function_name (tree decl, const char *suffix)
547 {
548 tree name = DECL_ASSEMBLER_NAME (decl);
549 return clone_function_name_1 (IDENTIFIER_POINTER (name), suffix);
550 }
551
552
553 /* Create callgraph node clone with new declaration. The actual body will
554 be copied later at compilation stage.
555
556 TODO: after merging in ipa-sra use function call notes instead of args_to_skip
557 bitmap interface.
558 */
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)
563 {
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;
570
571 gcc_checking_assert (local.versionable);
572 gcc_assert (local.can_change_signature || !args_to_skip);
573
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);
579
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. */
589
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);
599
600 new_node = create_clone (new_decl, count, CGRAPH_FREQ_BASE, false,
601 redirect_callers, false, NULL, args_to_skip);
602
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 ());
612
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);
622
623 if (ipa_transforms_to_apply.exists ())
624 new_node->ipa_transforms_to_apply
625 = ipa_transforms_to_apply.copy ();
626
627 symtab->call_cgraph_duplication_hooks (this, new_node);
628
629 return new_node;
630 }
631
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)
636 {
637 cgraph_node *next_inline_clone, *replacement;
638
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)
643 ;
644
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)
649 {
650 cgraph_node *n;
651 cgraph_node *new_clones;
652
653 replacement = next_inline_clone;
654
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)
660 {
661 gcc_assert (clones != next_inline_clone);
662 next_inline_clone->prev_sibling_clone->next_sibling_clone
663 = next_inline_clone->next_sibling_clone;
664 }
665 else
666 {
667 gcc_assert (clones == next_inline_clone);
668 clones = next_inline_clone->next_sibling_clone;
669 }
670
671 new_clones = clones;
672 clones = NULL;
673
674 /* Copy clone info. */
675 next_inline_clone->clone = clone;
676
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)
682 {
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;
687 }
688
689 /* Merge the clone list. */
690 if (new_clones)
691 {
692 if (!next_inline_clone->clones)
693 next_inline_clone->clones = new_clones;
694 else
695 {
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;
701 }
702 }
703
704 /* Update clone_of pointers. */
705 n = new_clones;
706 while (n)
707 {
708 n->clone_of = next_inline_clone;
709 n = n->next_sibling_clone;
710 }
711 return replacement;
712 }
713 else
714 return NULL;
715 }
716
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. */
722
723 void
724 cgraph_node::set_call_stmt_including_clones (gimple *old_stmt,
725 gcall *new_stmt,
726 bool update_speculative)
727 {
728 cgraph_node *node;
729 cgraph_edge *edge = get_edge (old_stmt);
730
731 if (edge)
732 edge->set_call_stmt (new_stmt, update_speculative);
733
734 node = clones;
735 if (node)
736 while (node != this)
737 {
738 cgraph_edge *edge = node->get_edge (old_stmt);
739 if (edge)
740 {
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)
746 {
747 cgraph_edge *direct, *indirect;
748 ipa_ref *ref;
749
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;
755 }
756 }
757 if (node->clones)
758 node = node->clones;
759 else if (node->next_sibling_clone)
760 node = node->next_sibling_clone;
761 else
762 {
763 while (node != this && !node->next_sibling_clone)
764 node = node->clone_of;
765 if (node != this)
766 node = node->next_sibling_clone;
767 }
768 }
769 }
770
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.
774
775 TODO: COUNT and LOOP_DEPTH should be properly distributed based on relative
776 frequencies of the clones. */
777
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)
784 {
785 cgraph_node *node;
786 cgraph_edge *edge;
787
788 if (!get_edge (stmt))
789 {
790 edge = create_edge (callee, stmt, count, freq);
791 edge->inline_failed = reason;
792 }
793
794 node = clones;
795 if (node)
796 while (node != this)
797 {
798 cgraph_edge *edge = node->get_edge (old_stmt);
799
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))
807 {
808 edge = node->create_edge (callee, stmt, count, freq);
809 edge->inline_failed = reason;
810 }
811
812 if (node->clones)
813 node = node->clones;
814 else if (node->next_sibling_clone)
815 node = node->next_sibling_clone;
816 else
817 {
818 while (node != this && !node->next_sibling_clone)
819 node = node->clone_of;
820 if (node != this)
821 node = node->next_sibling_clone;
822 }
823 }
824 }
825
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. */
830
831 bool
832 cgraph_node::remove_symbol_and_inline_clones (cgraph_node *forbidden_node)
833 {
834 cgraph_edge *e, *next;
835 bool found = false;
836
837 if (this == forbidden_node)
838 {
839 callers->remove ();
840 return true;
841 }
842 for (e = callees; e; e = next)
843 {
844 next = e->next_callee;
845 if (!e->inline_failed)
846 found |= e->callee->remove_symbol_and_inline_clones (forbidden_node);
847 }
848 remove ();
849 return found;
850 }
851
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. */
855
856 static void
857 update_call_expr (cgraph_node *new_version)
858 {
859 cgraph_edge *e;
860
861 gcc_assert (new_version);
862
863 /* Update the call expr on the edges to call the new version. */
864 for (e = new_version->callers; e; e = e->next_caller)
865 {
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);
869 }
870 }
871
872
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.
879
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. */
883
884 cgraph_node *
885 cgraph_node::create_version_clone (tree new_decl,
886 vec<cgraph_edge *> redirect_callers,
887 bitmap bbs_to_copy)
888 {
889 cgraph_node *new_version;
890 cgraph_edge *e;
891 unsigned i;
892
893 new_version = cgraph_node::create (new_decl);
894
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;
904
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)
920 {
921 /* Redirect calls to the old version node to point to its new
922 version. */
923 e->redirect_callee (new_version);
924 }
925
926 symtab->call_cgraph_duplication_hooks (this, new_version);
927
928 return new_version;
929 }
930
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).
935
936 REDIRECT_CALLERS varray includes the edges to be redirected
937 to the new version.
938
939 TREE_MAP is a mapping of tree nodes we want to replace with
940 new ones (according to results of prior analysis).
941
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.
947
948 Return the new version's cgraph node. */
949
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)
956 {
957 tree old_decl = decl;
958 cgraph_node *new_version_node = NULL;
959 tree new_decl;
960
961 if (!tree_versionable_function_p (old_decl))
962 return NULL;
963
964 gcc_assert (local.can_change_signature || !args_to_skip);
965
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);
972
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);
977
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;
981
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);
986
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);
993
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;
1013
1014 /* Update the call_expr on the edges to call the new version node. */
1015 update_call_expr (new_version_node);
1016
1017 symtab->call_cgraph_insertion_hooks (this);
1018 return new_version_node;
1019 }
1020
1021 /* Given virtual clone, turn it into actual clone. */
1022
1023 static void
1024 cgraph_materialize_clone (cgraph_node *node)
1025 {
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)
1036 {
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);
1040 }
1041
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)
1052 {
1053 node->clone_of->release_body ();
1054 node->clone_of->remove_callees ();
1055 node->clone_of->remove_all_references ();
1056 }
1057 node->clone_of = NULL;
1058 bitmap_obstack_release (NULL);
1059 }
1060
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. */
1066
1067 void
1068 symbol_table::materialize_all_clones (void)
1069 {
1070 cgraph_node *node;
1071 bool stabilized = false;
1072
1073
1074 if (symtab->dump_file)
1075 fprintf (symtab->dump_file, "Materializing clones\n");
1076
1077 cgraph_node::checking_verify_cgraph_nodes ();
1078
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)
1083 {
1084 stabilized = true;
1085 FOR_EACH_FUNCTION (node)
1086 {
1087 if (node->clone_of && node->decl != node->clone_of->decl
1088 && !gimple_has_body_p (node->decl))
1089 {
1090 if (!node->clone_of->clone_of)
1091 node->clone_of->get_untransformed_body ();
1092 if (gimple_has_body_p (node->clone_of->decl))
1093 {
1094 if (symtab->dump_file)
1095 {
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)
1100 {
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++)
1106 {
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)":"");
1115 }
1116 fprintf (symtab->dump_file, "\n");
1117 }
1118 if (node->clone.args_to_skip)
1119 {
1120 fprintf (symtab->dump_file, " args_to_skip: ");
1121 dump_bitmap (symtab->dump_file,
1122 node->clone.args_to_skip);
1123 }
1124 if (node->clone.args_to_skip)
1125 {
1126 fprintf (symtab->dump_file, " combined_args_to_skip:");
1127 dump_bitmap (symtab->dump_file, node->clone.combined_args_to_skip);
1128 }
1129 }
1130 cgraph_materialize_clone (node);
1131 stabilized = false;
1132 }
1133 }
1134 }
1135 }
1136 FOR_EACH_FUNCTION (node)
1137 if (!node->analyzed && node->callees)
1138 {
1139 node->remove_callees ();
1140 node->remove_all_references ();
1141 }
1142 else
1143 node->clear_stmts_in_references ();
1144 if (symtab->dump_file)
1145 fprintf (symtab->dump_file, "Materialization Call site updates done.\n");
1146
1147 cgraph_node::checking_verify_cgraph_nodes ();
1148
1149 symtab->remove_unreachable_nodes (symtab->dump_file);
1150 }
1151
1152 #include "gt-cgraphclones.h"