]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cgraphclones.c
2019-01-09 Sandra Loosemore <sandra@codesourcery.com>
[thirdparty/gcc.git] / gcc / cgraphclones.c
CommitLineData
c02159a7 1/* Callgraph clones
fbd26352 2 Copyright (C) 2003-2019 Free Software Foundation, Inc.
c02159a7 3 Contributed by Jan Hubicka
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for more details.
16
17You should have received a copy of the GNU General Public License
18along 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"
9ef16211 70#include "backend.h"
7c29e30e 71#include "target.h"
72#include "rtl.h"
9ef16211 73#include "tree.h"
74#include "gimple.h"
b20a8bb4 75#include "stringpool.h"
7c29e30e 76#include "cgraph.h"
7c29e30e 77#include "lto-streamer.h"
bc61cadb 78#include "tree-eh.h"
073c1fd5 79#include "tree-cfg.h"
c02159a7 80#include "tree-inline.h"
930c75f4 81#include "dumpfile.h"
c02159a7 82#include "gimple-pretty-print.h"
c02159a7 83
35ee1c66 84/* Create clone of edge in the node N represented by CALL_EXPR
85 the callgraph. */
86
87cgraph_edge *
1a91d914 88cgraph_edge::clone (cgraph_node *n, gcall *call_stmt, unsigned stmt_uid,
f7f3f5f6 89 profile_count num, profile_count den,
151b9ff5 90 bool update_original)
c02159a7 91{
35ee1c66 92 cgraph_edge *new_edge;
151b9ff5 93 profile_count::adjust_for_ipa_scaling (&num, &den);
ed0831a9 94 profile_count prof_count = count.apply_scale (num, den);
c02159a7 95
35ee1c66 96 if (indirect_unknown_callee)
c02159a7 97 {
98 tree decl;
99
9ccaed86 100 if (call_stmt && (decl = gimple_call_fndecl (call_stmt))
101 /* When the call is speculative, we need to resolve it
102 via cgraph_resolve_speculation and not here. */
35ee1c66 103 && !speculative)
c02159a7 104 {
35ee1c66 105 cgraph_node *callee = cgraph_node::get (decl);
c02159a7 106 gcc_checking_assert (callee);
ed0831a9 107 new_edge = n->create_edge (callee, call_stmt, prof_count);
c02159a7 108 }
109 else
110 {
415d1b9a 111 new_edge = n->create_indirect_edge (call_stmt,
35ee1c66 112 indirect_info->ecf_flags,
ed0831a9 113 prof_count, false);
35ee1c66 114 *new_edge->indirect_info = *indirect_info;
c02159a7 115 }
116 }
117 else
118 {
ed0831a9 119 new_edge = n->create_edge (callee, call_stmt, prof_count);
35ee1c66 120 if (indirect_info)
c02159a7 121 {
122 new_edge->indirect_info
25a27413 123 = ggc_cleared_alloc<cgraph_indirect_call_info> ();
35ee1c66 124 *new_edge->indirect_info = *indirect_info;
c02159a7 125 }
126 }
127
35ee1c66 128 new_edge->inline_failed = inline_failed;
129 new_edge->indirect_inlining_edge = indirect_inlining_edge;
c02159a7 130 new_edge->lto_stmt_uid = stmt_uid;
131 /* Clone flags that depend on call_stmt availability manually. */
35ee1c66 132 new_edge->can_throw_external = can_throw_external;
133 new_edge->call_stmt_cannot_inline_p = call_stmt_cannot_inline_p;
134 new_edge->speculative = speculative;
007a6c27 135 new_edge->in_polymorphic_cdtor = in_polymorphic_cdtor;
151b9ff5 136
137 /* Update IPA profile. Local profiles need no updating in original. */
ed0831a9 138 if (update_original)
139 count = count.combine_with_ipa_count (count.ipa ()
140 - new_edge->count.ipa ());
35ee1c66 141 symtab->call_edge_duplication_hooks (this, new_edge);
c02159a7 142 return new_edge;
143}
144
98d52bcd 145/* Build variant of function type ORIG_TYPE skipping ARGS_TO_SKIP and the
146 return value if SKIP_RETURN is true. */
147
61896fab 148tree
149cgraph_build_function_type_skip_args (tree orig_type, bitmap args_to_skip,
150 bool skip_return)
98d52bcd 151{
152 tree new_type = NULL;
40e1cddf 153 tree args, new_args = NULL;
98d52bcd 154 tree new_reversed;
155 int i = 0;
156
157 for (args = TYPE_ARG_TYPES (orig_type); args && args != void_list_node;
158 args = TREE_CHAIN (args), i++)
159 if (!args_to_skip || !bitmap_bit_p (args_to_skip, i))
160 new_args = tree_cons (NULL_TREE, TREE_VALUE (args), new_args);
161
162 new_reversed = nreverse (new_args);
163 if (args)
164 {
165 if (new_reversed)
166 TREE_CHAIN (new_args) = void_list_node;
167 else
168 new_reversed = void_list_node;
169 }
170
171 /* Use copy_node to preserve as much as possible from original type
172 (debug info, attribute lists etc.)
173 Exception is METHOD_TYPEs must have THIS argument.
174 When we are asked to remove it, we need to build new FUNCTION_TYPE
175 instead. */
176 if (TREE_CODE (orig_type) != METHOD_TYPE
177 || !args_to_skip
178 || !bitmap_bit_p (args_to_skip, 0))
179 {
180 new_type = build_distinct_type_copy (orig_type);
181 TYPE_ARG_TYPES (new_type) = new_reversed;
182 }
183 else
184 {
185 new_type
186 = build_distinct_type_copy (build_function_type (TREE_TYPE (orig_type),
187 new_reversed));
188 TYPE_CONTEXT (new_type) = TYPE_CONTEXT (orig_type);
189 }
190
191 if (skip_return)
192 TREE_TYPE (new_type) = void_type_node;
193
98d52bcd 194 return new_type;
195}
196
197/* Build variant of function decl ORIG_DECL skipping ARGS_TO_SKIP and the
198 return value if SKIP_RETURN is true.
199
200 Arguments from DECL_ARGUMENTS list can't be removed now, since they are
201 linked by TREE_CHAIN directly. The caller is responsible for eliminating
202 them when they are being duplicated (i.e. copy_arguments_for_versioning). */
203
204static tree
205build_function_decl_skip_args (tree orig_decl, bitmap args_to_skip,
206 bool skip_return)
207{
208 tree new_decl = copy_node (orig_decl);
209 tree new_type;
210
211 new_type = TREE_TYPE (orig_decl);
212 if (prototype_p (new_type)
213 || (skip_return && !VOID_TYPE_P (TREE_TYPE (new_type))))
214 new_type
61896fab 215 = cgraph_build_function_type_skip_args (new_type, args_to_skip,
216 skip_return);
98d52bcd 217 TREE_TYPE (new_decl) = new_type;
218
219 /* For declarations setting DECL_VINDEX (i.e. methods)
220 we expect first argument to be THIS pointer. */
221 if (args_to_skip && bitmap_bit_p (args_to_skip, 0))
222 DECL_VINDEX (new_decl) = NULL_TREE;
223
224 /* When signature changes, we need to clear builtin info. */
a0e9bfbb 225 if (fndecl_built_in_p (new_decl)
98d52bcd 226 && args_to_skip
227 && !bitmap_empty_p (args_to_skip))
228 {
229 DECL_BUILT_IN_CLASS (new_decl) = NOT_BUILT_IN;
230 DECL_FUNCTION_CODE (new_decl) = (enum built_in_function) 0;
231 }
232 /* The FE might have information and assumptions about the other
233 arguments. */
234 DECL_LANG_SPECIFIC (new_decl) = NULL;
235 return new_decl;
236}
237
238/* Set flags of NEW_NODE and its decl. NEW_NODE is a newly created private
239 clone or its thunk. */
240
241static void
242set_new_clone_decl_and_node_flags (cgraph_node *new_node)
243{
244 DECL_EXTERNAL (new_node->decl) = 0;
98d52bcd 245 TREE_PUBLIC (new_node->decl) = 0;
246 DECL_COMDAT (new_node->decl) = 0;
247 DECL_WEAK (new_node->decl) = 0;
248 DECL_VIRTUAL_P (new_node->decl) = 0;
249 DECL_STATIC_CONSTRUCTOR (new_node->decl) = 0;
250 DECL_STATIC_DESTRUCTOR (new_node->decl) = 0;
251
252 new_node->externally_visible = 0;
253 new_node->local.local = 1;
254 new_node->lowered = true;
255}
256
257/* Duplicate thunk THUNK if necessary but make it to refer to NODE.
258 ARGS_TO_SKIP, if non-NULL, determines which parameters should be omitted.
259 Function can return NODE if no thunk is necessary, which can happen when
260 thunk is this_adjusting but we are removing this parameter. */
261
262static cgraph_node *
2e1475da 263duplicate_thunk_for_node (cgraph_node *thunk, cgraph_node *node)
98d52bcd 264{
265 cgraph_node *new_thunk, *thunk_of;
415d1b9a 266 thunk_of = thunk->callees->callee->ultimate_alias_target ();
98d52bcd 267
268 if (thunk_of->thunk.thunk_p)
2e1475da 269 node = duplicate_thunk_for_node (thunk_of, node);
98d52bcd 270
a3a6d499 271 if (!DECL_ARGUMENTS (thunk->decl))
4560777c 272 thunk->get_untransformed_body ();
a3a6d499 273
35ee1c66 274 cgraph_edge *cs;
98d52bcd 275 for (cs = node->callers; cs; cs = cs->next_caller)
276 if (cs->caller->thunk.thunk_p
98d52bcd 277 && cs->caller->thunk.fixed_offset == thunk->thunk.fixed_offset
4c7db812 278 && cs->caller->thunk.virtual_value == thunk->thunk.virtual_value
279 && cs->caller->thunk.indirect_offset == thunk->thunk.indirect_offset
280 && cs->caller->thunk.this_adjusting == thunk->thunk.this_adjusting
281 && cs->caller->thunk.virtual_offset_p == thunk->thunk.virtual_offset_p)
98d52bcd 282 return cs->caller;
283
284 tree new_decl;
2e1475da 285 if (!node->clone.args_to_skip)
98d52bcd 286 new_decl = copy_node (thunk->decl);
287 else
288 {
289 /* We do not need to duplicate this_adjusting thunks if we have removed
290 this. */
291 if (thunk->thunk.this_adjusting
2e1475da 292 && bitmap_bit_p (node->clone.args_to_skip, 0))
98d52bcd 293 return node;
294
2e1475da 295 new_decl = build_function_decl_skip_args (thunk->decl,
296 node->clone.args_to_skip,
98d52bcd 297 false);
298 }
d779c7b1 299
300 tree *link = &DECL_ARGUMENTS (new_decl);
301 int i = 0;
302 for (tree pd = DECL_ARGUMENTS (thunk->decl); pd; pd = DECL_CHAIN (pd), i++)
303 {
304 if (!node->clone.args_to_skip
305 || !bitmap_bit_p (node->clone.args_to_skip, i))
306 {
307 tree nd = copy_node (pd);
308 DECL_CONTEXT (nd) = new_decl;
309 *link = nd;
310 link = &DECL_CHAIN (nd);
311 }
312 }
313 *link = NULL_TREE;
314
98d52bcd 315 gcc_checking_assert (!DECL_STRUCT_FUNCTION (new_decl));
316 gcc_checking_assert (!DECL_INITIAL (new_decl));
317 gcc_checking_assert (!DECL_RESULT (new_decl));
318 gcc_checking_assert (!DECL_RTL_SET_P (new_decl));
319
87943388 320 DECL_NAME (new_decl) = clone_function_name_numbered (thunk->decl,
321 "artificial_thunk");
98d52bcd 322 SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
98d52bcd 323
e926b156 324 /* We need to force DECL_IGNORED_P because the new thunk is created after
325 early debug was run. */
326 DECL_IGNORED_P (new_decl) = 1;
327
415d1b9a 328 new_thunk = cgraph_node::create (new_decl);
98d52bcd 329 set_new_clone_decl_and_node_flags (new_thunk);
330 new_thunk->definition = true;
2ebf191d 331 new_thunk->local.can_change_signature = node->local.can_change_signature;
98d52bcd 332 new_thunk->thunk = thunk->thunk;
333 new_thunk->unique_name = in_lto_p;
334 new_thunk->former_clone_of = thunk->decl;
2e1475da 335 new_thunk->clone.args_to_skip = node->clone.args_to_skip;
336 new_thunk->clone.combined_args_to_skip = node->clone.combined_args_to_skip;
98d52bcd 337
151b9ff5 338 cgraph_edge *e = new_thunk->create_edge (node, NULL, new_thunk->count);
35ee1c66 339 symtab->call_edge_duplication_hooks (thunk->callees, e);
35ee1c66 340 symtab->call_cgraph_duplication_hooks (thunk, new_thunk);
98d52bcd 341 return new_thunk;
342}
343
344/* If E does not lead to a thunk, simply redirect it to N. Otherwise create
345 one or more equivalent thunks for N and redirect E to the first in the
fe3c9f1e 346 chain. Note that it is then necessary to call
347 n->expand_all_artificial_thunks once all callers are redirected. */
98d52bcd 348
349void
fe3c9f1e 350cgraph_edge::redirect_callee_duplicating_thunks (cgraph_node *n)
98d52bcd 351{
fe3c9f1e 352 cgraph_node *orig_to = callee->ultimate_alias_target ();
98d52bcd 353 if (orig_to->thunk.thunk_p)
2e1475da 354 n = duplicate_thunk_for_node (orig_to, n);
98d52bcd 355
fe3c9f1e 356 redirect_callee (n);
357}
358
359/* Call expand_thunk on all callers that are thunks and if analyze those nodes
360 that were expanded. */
361
362void
363cgraph_node::expand_all_artificial_thunks ()
364{
365 cgraph_edge *e;
366 for (e = callers; e;)
367 if (e->caller->thunk.thunk_p)
368 {
369 cgraph_node *thunk = e->caller;
370
371 e = e->next_caller;
372 if (thunk->expand_thunk (false, false))
373 {
374 thunk->thunk.thunk_p = false;
375 thunk->analyze ();
376 }
377 thunk->expand_all_artificial_thunks ();
378 }
379 else
380 e = e->next_caller;
98d52bcd 381}
c02159a7 382
9dc70d59 383void
384dump_callgraph_transformation (const cgraph_node *original,
385 const cgraph_node *clone,
386 const char *suffix)
387{
388 if (symtab->ipa_clones_dump_file)
389 {
390 fprintf (symtab->ipa_clones_dump_file,
391 "Callgraph clone;%s;%d;%s;%d;%d;%s;%d;%s;%d;%d;%s\n",
392 original->asm_name (), original->order,
393 DECL_SOURCE_FILE (original->decl),
394 DECL_SOURCE_LINE (original->decl),
395 DECL_SOURCE_COLUMN (original->decl), clone->asm_name (),
396 clone->order, DECL_SOURCE_FILE (clone->decl),
397 DECL_SOURCE_LINE (clone->decl), DECL_SOURCE_COLUMN (clone->decl),
398 suffix);
399
400 symtab->cloned_nodes.add (original);
401 symtab->cloned_nodes.add (clone);
402 }
403}
404
c02159a7 405/* Create node representing clone of N executed COUNT times. Decrease
406 the execution counts from original node too.
407 The new clone will have decl set to DECL that may or may not be the same
408 as decl of N.
409
410 When UPDATE_ORIGINAL is true, the counts are subtracted from the original
411 function's profile to reflect the fact that part of execution is handled
412 by node.
413 When CALL_DUPLICATOIN_HOOK is true, the ipa passes are acknowledged about
48f42a9a 414 the new clone. Otherwise the caller is responsible for doing so later.
415
416 If the new node is being inlined into another one, NEW_INLINED_TO should be
417 the outline function the new one is (even indirectly) inlined to. All hooks
418 will see this in node's global.inlined_to, when invoked. Can be NULL if the
419 node is not inlined. */
c02159a7 420
415d1b9a 421cgraph_node *
151b9ff5 422cgraph_node::create_clone (tree new_decl, profile_count prof_count,
415d1b9a 423 bool update_original,
424 vec<cgraph_edge *> redirect_callers,
425 bool call_duplication_hook,
35ee1c66 426 cgraph_node *new_inlined_to,
9dc70d59 427 bitmap args_to_skip, const char *suffix)
c02159a7 428{
35ee1c66 429 cgraph_node *new_node = symtab->create_empty ();
430 cgraph_edge *e;
c02159a7 431 unsigned i;
151b9ff5 432 profile_count old_count = count;
c02159a7 433
9dc70d59 434 if (new_inlined_to)
435 dump_callgraph_transformation (this, new_inlined_to, "inlining to");
436
6251b3d9 437 /* When inlining we scale precisely to prof_count, when cloning we can
438 preserve local profile. */
439 if (!new_inlined_to)
440 prof_count = count.combine_with_ipa_count (prof_count);
db9cef39 441 new_node->count = prof_count;
151b9ff5 442
443 /* Update IPA profile. Local profiles need no updating in original. */
ed0831a9 444 if (update_original)
445 count = count.combine_with_ipa_count (count.ipa () - prof_count.ipa ());
c28f0245 446 new_node->decl = new_decl;
415d1b9a 447 new_node->register_symbol ();
448 new_node->origin = origin;
449 new_node->lto_file_data = lto_file_data;
c02159a7 450 if (new_node->origin)
451 {
452 new_node->next_nested = new_node->origin->nested;
453 new_node->origin->nested = new_node;
454 }
415d1b9a 455 new_node->analyzed = analyzed;
456 new_node->definition = definition;
457 new_node->local = local;
02774f2d 458 new_node->externally_visible = false;
6b722052 459 new_node->no_reorder = no_reorder;
c02159a7 460 new_node->local.local = true;
415d1b9a 461 new_node->global = global;
48f42a9a 462 new_node->global.inlined_to = new_inlined_to;
415d1b9a 463 new_node->rtl = rtl;
415d1b9a 464 new_node->frequency = frequency;
465 new_node->tp_first_run = tp_first_run;
f852c239 466 new_node->tm_clone = tm_clone;
ce7711df 467 new_node->icf_merged = icf_merged;
7d38b7bc 468 new_node->merged_comdat = merged_comdat;
76e435b5 469 new_node->thunk = thunk;
2e1475da 470
471 new_node->clone.tree_map = NULL;
472 new_node->clone.args_to_skip = args_to_skip;
c28f0245 473 new_node->split_part = split_part;
2e1475da 474 if (!args_to_skip)
415d1b9a 475 new_node->clone.combined_args_to_skip = clone.combined_args_to_skip;
476 else if (clone.combined_args_to_skip)
2e1475da 477 {
478 new_node->clone.combined_args_to_skip = BITMAP_GGC_ALLOC ();
479 bitmap_ior (new_node->clone.combined_args_to_skip,
415d1b9a 480 clone.combined_args_to_skip, args_to_skip);
2e1475da 481 }
482 else
483 new_node->clone.combined_args_to_skip = args_to_skip;
484
f1f41a6c 485 FOR_EACH_VEC_ELT (redirect_callers, i, e)
c02159a7 486 {
487 /* Redirect calls to the old version node to point to its new
5a7ad253 488 version. The only exception is when the edge was proved to
489 be unreachable during the clonning procedure. */
490 if (!e->callee
a0e9bfbb 491 || !fndecl_built_in_p (e->callee->decl, BUILT_IN_UNREACHABLE))
fe3c9f1e 492 e->redirect_callee_duplicating_thunks (new_node);
c02159a7 493 }
fe3c9f1e 494 new_node->expand_all_artificial_thunks ();
c02159a7 495
415d1b9a 496 for (e = callees;e; e=e->next_callee)
151b9ff5 497 e->clone (new_node, e->call_stmt, e->lto_stmt_uid, new_node->count, old_count,
498 update_original);
c02159a7 499
415d1b9a 500 for (e = indirect_calls; e; e = e->next_callee)
35ee1c66 501 e->clone (new_node, e->call_stmt, e->lto_stmt_uid,
151b9ff5 502 new_node->count, old_count, update_original);
415d1b9a 503 new_node->clone_references (this);
c02159a7 504
415d1b9a 505 new_node->next_sibling_clone = clones;
506 if (clones)
507 clones->prev_sibling_clone = new_node;
508 clones = new_node;
509 new_node->clone_of = this;
c02159a7 510
511 if (call_duplication_hook)
35ee1c66 512 symtab->call_cgraph_duplication_hooks (this, new_node);
9dc70d59 513
514 if (!new_inlined_to)
515 dump_callgraph_transformation (this, new_node, suffix);
516
c02159a7 517 return new_node;
518}
519
194b1f6b 520static GTY(()) hash_map<const char *, unsigned> *clone_fn_ids;
c02159a7 521
87943388 522/* Return a new assembler name for a clone of decl named NAME. Apart
523 from the string SUFFIX, the new name will end with a unique (for
524 each NAME) unspecified number. If clone numbering is not needed
525 then the two argument clone_function_name should be used instead.
526 Should not be called directly except for by
527 lto-partition.c:privatize_symbol_name_1. */
a73afd90 528
c02159a7 529tree
87943388 530clone_function_name_numbered (const char *name, const char *suffix)
531{
194b1f6b 532 /* Initialize the function->counter mapping the first time it's
533 needed. */
534 if (!clone_fn_ids)
535 clone_fn_ids = hash_map<const char *, unsigned int>::create_ggc (64);
536 unsigned int &suffix_counter = clone_fn_ids->get_or_insert (
537 IDENTIFIER_POINTER (get_identifier (name)));
538 return clone_function_name (name, suffix, suffix_counter++);
87943388 539}
540
541/* Return a new assembler name for a clone of DECL. Apart from string
542 SUFFIX, the new name will end with a unique (for each DECL
543 assembler name) unspecified number. If clone numbering is not
544 needed then the two argument clone_function_name should be used
545 instead. */
546
547tree
548clone_function_name_numbered (tree decl, const char *suffix)
549{
550 tree name = DECL_ASSEMBLER_NAME (decl);
551 return clone_function_name_numbered (IDENTIFIER_POINTER (name),
552 suffix);
553}
554
555/* Return a new assembler name for a clone of decl named NAME. Apart
556 from the string SUFFIX, the new name will end with the specified
557 NUMBER. If clone numbering is not needed then the two argument
558 clone_function_name should be used instead. */
559
560tree
561clone_function_name (const char *name, const char *suffix,
562 unsigned long number)
c02159a7 563{
a73afd90 564 size_t len = strlen (name);
c02159a7 565 char *tmp_name, *prefix;
566
567 prefix = XALLOCAVEC (char, len + strlen (suffix) + 2);
a73afd90 568 memcpy (prefix, name, len);
c02159a7 569 strcpy (prefix + len + 1, suffix);
11075c28 570 prefix[len] = symbol_table::symbol_suffix_separator ();
87943388 571 ASM_FORMAT_PRIVATE_NAME (tmp_name, prefix, number);
c02159a7 572 return get_identifier (tmp_name);
573}
574
9175d3dd 575/* Return a new assembler name for a clone of DECL. Apart from the
576 string SUFFIX, the new name will end with the specified NUMBER. If
577 clone numbering is not needed then the two argument
578 clone_function_name should be used instead. */
579
580tree
581clone_function_name (tree decl, const char *suffix,
582 unsigned long number)
583{
584 return clone_function_name (
585 IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), suffix, number);
586}
587
87943388 588/* Return a new assembler name ending with the string SUFFIX for a
589 clone of DECL. */
a73afd90 590
591tree
592clone_function_name (tree decl, const char *suffix)
593{
87943388 594 tree identifier = DECL_ASSEMBLER_NAME (decl);
595 /* For consistency this needs to behave the same way as
596 ASM_FORMAT_PRIVATE_NAME does, but without the final number
597 suffix. */
598 char *separator = XALLOCAVEC (char, 2);
599 separator[0] = symbol_table::symbol_suffix_separator ();
600 separator[1] = 0;
601#if defined (NO_DOT_IN_LABEL) && defined (NO_DOLLAR_IN_LABEL)
602 const char *prefix = "__";
603#else
604 const char *prefix = "";
605#endif
606 char *result = ACONCAT ((prefix,
607 IDENTIFIER_POINTER (identifier),
608 separator,
609 suffix,
610 (char*)0));
611 return get_identifier (result);
a73afd90 612}
613
614
9175d3dd 615/* Create callgraph node clone with new declaration. The actual body will be
616 copied later at compilation stage. The name of the new clone will be
617 constructed from the name of the original node, SUFFIX and NUM_SUFFIX.
c02159a7 618
619 TODO: after merging in ipa-sra use function call notes instead of args_to_skip
620 bitmap interface.
621 */
35ee1c66 622cgraph_node *
415d1b9a 623cgraph_node::create_virtual_clone (vec<cgraph_edge *> redirect_callers,
624 vec<ipa_replace_map *, va_gc> *tree_map,
9175d3dd 625 bitmap args_to_skip, const char * suffix,
626 unsigned num_suffix)
c02159a7 627{
415d1b9a 628 tree old_decl = decl;
35ee1c66 629 cgraph_node *new_node = NULL;
c02159a7 630 tree new_decl;
cac1ceba 631 size_t len, i;
35ee1c66 632 ipa_replace_map *map;
cac1ceba 633 char *name;
c02159a7 634
b8681788 635 gcc_checking_assert (local.versionable);
415d1b9a 636 gcc_assert (local.can_change_signature || !args_to_skip);
c02159a7 637
638 /* Make a new FUNCTION_DECL tree node */
639 if (!args_to_skip)
640 new_decl = copy_node (old_decl);
641 else
642 new_decl = build_function_decl_skip_args (old_decl, args_to_skip, false);
79e830ee 643
644 /* These pointers represent function body and will be populated only when clone
645 is materialized. */
646 gcc_assert (new_decl != old_decl);
c02159a7 647 DECL_STRUCT_FUNCTION (new_decl) = NULL;
79e830ee 648 DECL_ARGUMENTS (new_decl) = NULL;
649 DECL_INITIAL (new_decl) = NULL;
650 DECL_RESULT (new_decl) = NULL;
f4d3c071 651 /* We cannot do DECL_RESULT (new_decl) = NULL; here because of LTO partitioning
79e830ee 652 sometimes storing only clone decl instead of original. */
c02159a7 653
654 /* Generate a new name for the new version. */
cac1ceba 655 len = IDENTIFIER_LENGTH (DECL_NAME (old_decl));
656 name = XALLOCAVEC (char, len + strlen (suffix) + 2);
657 memcpy (name, IDENTIFIER_POINTER (DECL_NAME (old_decl)), len);
658 strcpy (name + len + 1, suffix);
659 name[len] = '.';
660 DECL_NAME (new_decl) = get_identifier (name);
9175d3dd 661 SET_DECL_ASSEMBLER_NAME (new_decl,
662 clone_function_name (old_decl, suffix, num_suffix));
c02159a7 663 SET_DECL_RTL (new_decl, NULL);
664
151b9ff5 665 new_node = create_clone (new_decl, count, false,
9dc70d59 666 redirect_callers, false, NULL, args_to_skip, suffix);
415d1b9a 667
c02159a7 668 /* Update the properties.
669 Make clone visible only within this translation unit. Make sure
670 that is not weak also.
671 ??? We cannot use COMDAT linkage because there is no
672 ABI support for this. */
98d52bcd 673 set_new_clone_decl_and_node_flags (new_node);
c02159a7 674 new_node->clone.tree_map = tree_map;
033ab5d3 675 if (!implicit_section)
022a2340 676 new_node->set_section (get_section ());
5c368d8a 677
678 /* Clones of global symbols or symbols with unique names are unique. */
679 if ((TREE_PUBLIC (old_decl)
680 && !DECL_EXTERNAL (old_decl)
681 && !DECL_WEAK (old_decl)
682 && !DECL_COMDAT (old_decl))
683 || in_lto_p)
02774f2d 684 new_node->unique_name = true;
f1f41a6c 685 FOR_EACH_VEC_SAFE_ELT (tree_map, i, map)
7dab0c61 686 new_node->maybe_create_reference (map->new_tree, NULL);
2e1475da 687
415d1b9a 688 if (ipa_transforms_to_apply.exists ())
2cf4c3b3 689 new_node->ipa_transforms_to_apply
415d1b9a 690 = ipa_transforms_to_apply.copy ();
c02159a7 691
35ee1c66 692 symtab->call_cgraph_duplication_hooks (this, new_node);
c02159a7 693
694 return new_node;
695}
696
415d1b9a 697/* callgraph node being removed from symbol table; see if its entry can be
698 replaced by other inline clone. */
699cgraph_node *
700cgraph_node::find_replacement (void)
c02159a7 701{
35ee1c66 702 cgraph_node *next_inline_clone, *replacement;
c02159a7 703
415d1b9a 704 for (next_inline_clone = clones;
c02159a7 705 next_inline_clone
415d1b9a 706 && next_inline_clone->decl != decl;
c02159a7 707 next_inline_clone = next_inline_clone->next_sibling_clone)
708 ;
709
710 /* If there is inline clone of the node being removed, we need
711 to put it into the position of removed node and reorganize all
712 other clones to be based on it. */
713 if (next_inline_clone)
714 {
35ee1c66 715 cgraph_node *n;
716 cgraph_node *new_clones;
c02159a7 717
718 replacement = next_inline_clone;
719
720 /* Unlink inline clone from the list of clones of removed node. */
721 if (next_inline_clone->next_sibling_clone)
722 next_inline_clone->next_sibling_clone->prev_sibling_clone
723 = next_inline_clone->prev_sibling_clone;
724 if (next_inline_clone->prev_sibling_clone)
725 {
415d1b9a 726 gcc_assert (clones != next_inline_clone);
c02159a7 727 next_inline_clone->prev_sibling_clone->next_sibling_clone
728 = next_inline_clone->next_sibling_clone;
729 }
730 else
731 {
415d1b9a 732 gcc_assert (clones == next_inline_clone);
733 clones = next_inline_clone->next_sibling_clone;
c02159a7 734 }
735
415d1b9a 736 new_clones = clones;
737 clones = NULL;
c02159a7 738
739 /* Copy clone info. */
415d1b9a 740 next_inline_clone->clone = clone;
c02159a7 741
742 /* Now place it into clone tree at same level at NODE. */
415d1b9a 743 next_inline_clone->clone_of = clone_of;
c02159a7 744 next_inline_clone->prev_sibling_clone = NULL;
745 next_inline_clone->next_sibling_clone = NULL;
415d1b9a 746 if (clone_of)
c02159a7 747 {
415d1b9a 748 if (clone_of->clones)
749 clone_of->clones->prev_sibling_clone = next_inline_clone;
750 next_inline_clone->next_sibling_clone = clone_of->clones;
751 clone_of->clones = next_inline_clone;
c02159a7 752 }
753
754 /* Merge the clone list. */
755 if (new_clones)
756 {
757 if (!next_inline_clone->clones)
758 next_inline_clone->clones = new_clones;
759 else
760 {
761 n = next_inline_clone->clones;
762 while (n->next_sibling_clone)
415d1b9a 763 n = n->next_sibling_clone;
c02159a7 764 n->next_sibling_clone = new_clones;
765 new_clones->prev_sibling_clone = n;
766 }
767 }
768
769 /* Update clone_of pointers. */
770 n = new_clones;
771 while (n)
772 {
773 n->clone_of = next_inline_clone;
774 n = n->next_sibling_clone;
775 }
776 return replacement;
777 }
778 else
779 return NULL;
780}
781
782/* Like cgraph_set_call_stmt but walk the clone tree and update all
4d044066 783 clones sharing the same function body.
784 When WHOLE_SPECULATIVE_EDGES is true, all three components of
785 speculative edge gets updated. Otherwise we update only direct
786 call. */
c02159a7 787
788void
42acab1c 789cgraph_node::set_call_stmt_including_clones (gimple *old_stmt,
1a91d914 790 gcall *new_stmt,
415d1b9a 791 bool update_speculative)
c02159a7 792{
35ee1c66 793 cgraph_node *node;
794 cgraph_edge *edge = get_edge (old_stmt);
c02159a7 795
796 if (edge)
35ee1c66 797 edge->set_call_stmt (new_stmt, update_speculative);
c02159a7 798
415d1b9a 799 node = clones;
c02159a7 800 if (node)
415d1b9a 801 while (node != this)
c02159a7 802 {
35ee1c66 803 cgraph_edge *edge = node->get_edge (old_stmt);
c02159a7 804 if (edge)
4d044066 805 {
35ee1c66 806 edge->set_call_stmt (new_stmt, update_speculative);
4d044066 807 /* If UPDATE_SPECULATIVE is false, it means that we are turning
808 speculative call into a real code sequence. Update the
809 callgraph edges. */
810 if (edge->speculative && !update_speculative)
811 {
35ee1c66 812 cgraph_edge *direct, *indirect;
813 ipa_ref *ref;
4d044066 814
815 gcc_assert (!edge->indirect_unknown_callee);
35ee1c66 816 edge->speculative_call_info (direct, indirect, ref);
4d044066 817 direct->speculative = false;
818 indirect->speculative = false;
819 ref->speculative = false;
820 }
821 }
c02159a7 822 if (node->clones)
823 node = node->clones;
824 else if (node->next_sibling_clone)
825 node = node->next_sibling_clone;
826 else
827 {
415d1b9a 828 while (node != this && !node->next_sibling_clone)
c02159a7 829 node = node->clone_of;
415d1b9a 830 if (node != this)
c02159a7 831 node = node->next_sibling_clone;
832 }
833 }
834}
835
836/* Like cgraph_create_edge walk the clone tree and update all clones sharing
837 same function body. If clones already have edge for OLD_STMT; only
838 update the edge same way as cgraph_set_call_stmt_including_clones does.
839
840 TODO: COUNT and LOOP_DEPTH should be properly distributed based on relative
841 frequencies of the clones. */
842
843void
35ee1c66 844cgraph_node::create_edge_including_clones (cgraph_node *callee,
42acab1c 845 gimple *old_stmt, gcall *stmt,
db9cef39 846 profile_count count,
415d1b9a 847 cgraph_inline_failed_t reason)
c02159a7 848{
35ee1c66 849 cgraph_node *node;
850 cgraph_edge *edge;
c02159a7 851
415d1b9a 852 if (!get_edge (stmt))
c02159a7 853 {
151b9ff5 854 edge = create_edge (callee, stmt, count);
c02159a7 855 edge->inline_failed = reason;
856 }
857
415d1b9a 858 node = clones;
c02159a7 859 if (node)
415d1b9a 860 while (node != this)
6a353dda 861 /* Thunk clones do not get updated while copying inline function body. */
862 if (!node->thunk.thunk_p)
863 {
864 cgraph_edge *edge = node->get_edge (old_stmt);
865
866 /* It is possible that clones already contain the edge while
867 master didn't. Either we promoted indirect call into direct
868 call in the clone or we are processing clones of unreachable
869 master where edges has been removed. */
870 if (edge)
871 edge->set_call_stmt (stmt);
872 else if (! node->get_edge (stmt))
873 {
151b9ff5 874 edge = node->create_edge (callee, stmt, count);
6a353dda 875 edge->inline_failed = reason;
876 }
c02159a7 877
6a353dda 878 if (node->clones)
879 node = node->clones;
880 else if (node->next_sibling_clone)
881 node = node->next_sibling_clone;
882 else
883 {
884 while (node != this && !node->next_sibling_clone)
885 node = node->clone_of;
886 if (node != this)
887 node = node->next_sibling_clone;
888 }
889 }
c02159a7 890}
891
892/* Remove the node from cgraph and all inline clones inlined into it.
893 Skip however removal of FORBIDDEN_NODE and return true if it needs to be
894 removed. This allows to call the function from outer loop walking clone
895 tree. */
896
897bool
415d1b9a 898cgraph_node::remove_symbol_and_inline_clones (cgraph_node *forbidden_node)
c02159a7 899{
35ee1c66 900 cgraph_edge *e, *next;
c02159a7 901 bool found = false;
902
415d1b9a 903 if (this == forbidden_node)
8afc926b 904 {
35ee1c66 905 callers->remove ();
8afc926b 906 return true;
907 }
415d1b9a 908 for (e = callees; e; e = next)
c02159a7 909 {
910 next = e->next_callee;
911 if (!e->inline_failed)
415d1b9a 912 found |= e->callee->remove_symbol_and_inline_clones (forbidden_node);
c02159a7 913 }
415d1b9a 914 remove ();
c02159a7 915 return found;
916}
917
918/* The edges representing the callers of the NEW_VERSION node were
919 fixed by cgraph_function_versioning (), now the call_expr in their
920 respective tree code should be updated to call the NEW_VERSION. */
921
922static void
35ee1c66 923update_call_expr (cgraph_node *new_version)
c02159a7 924{
35ee1c66 925 cgraph_edge *e;
c02159a7 926
927 gcc_assert (new_version);
928
929 /* Update the call expr on the edges to call the new version. */
930 for (e = new_version->callers; e; e = e->next_caller)
931 {
35ee1c66 932 function *inner_function = DECL_STRUCT_FUNCTION (e->caller->decl);
02774f2d 933 gimple_call_set_fndecl (e->call_stmt, new_version->decl);
c02159a7 934 maybe_clean_eh_stmt_fn (inner_function, e->call_stmt);
935 }
936}
937
938
939/* Create a new cgraph node which is the new version of
415d1b9a 940 callgraph node. REDIRECT_CALLERS holds the callers
c02159a7 941 edges which should be redirected to point to
415d1b9a 942 NEW_VERSION. ALL the callees edges of the node
c02159a7 943 are cloned to the new version node. Return the new
944 version node.
945
946 If non-NULL BLOCK_TO_COPY determine what basic blocks
947 was copied to prevent duplications of calls that are dead
948 in the clone. */
949
415d1b9a 950cgraph_node *
951cgraph_node::create_version_clone (tree new_decl,
952 vec<cgraph_edge *> redirect_callers,
9dc70d59 953 bitmap bbs_to_copy,
954 const char *suffix)
c02159a7 955 {
35ee1c66 956 cgraph_node *new_version;
957 cgraph_edge *e;
c02159a7 958 unsigned i;
959
415d1b9a 960 new_version = cgraph_node::create (new_decl);
c02159a7 961
415d1b9a 962 new_version->analyzed = analyzed;
963 new_version->definition = definition;
964 new_version->local = local;
02774f2d 965 new_version->externally_visible = false;
6b722052 966 new_version->no_reorder = no_reorder;
02774f2d 967 new_version->local.local = new_version->definition;
415d1b9a 968 new_version->global = global;
969 new_version->rtl = rtl;
970 new_version->count = count;
c02159a7 971
415d1b9a 972 for (e = callees; e; e=e->next_callee)
c02159a7 973 if (!bbs_to_copy
974 || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index))
35ee1c66 975 e->clone (new_version, e->call_stmt,
f7f3f5f6 976 e->lto_stmt_uid, count, count,
35ee1c66 977 true);
415d1b9a 978 for (e = indirect_calls; e; e=e->next_callee)
c02159a7 979 if (!bbs_to_copy
980 || bitmap_bit_p (bbs_to_copy, gimple_bb (e->call_stmt)->index))
35ee1c66 981 e->clone (new_version, e->call_stmt,
f7f3f5f6 982 e->lto_stmt_uid, count, count,
35ee1c66 983 true);
f1f41a6c 984 FOR_EACH_VEC_ELT (redirect_callers, i, e)
c02159a7 985 {
986 /* Redirect calls to the old version node to point to its new
987 version. */
35ee1c66 988 e->redirect_callee (new_version);
c02159a7 989 }
990
35ee1c66 991 symtab->call_cgraph_duplication_hooks (this, new_version);
c02159a7 992
9dc70d59 993 dump_callgraph_transformation (this, new_version, suffix);
994
c02159a7 995 return new_version;
996 }
997
998/* Perform function versioning.
999 Function versioning includes copying of the tree and
1000 a callgraph update (creating a new cgraph node and updating
1001 its callees and callers).
1002
1003 REDIRECT_CALLERS varray includes the edges to be redirected
1004 to the new version.
1005
1006 TREE_MAP is a mapping of tree nodes we want to replace with
1007 new ones (according to results of prior analysis).
c02159a7 1008
1009 If non-NULL ARGS_TO_SKIP determine function parameters to remove
1010 from new version.
1011 If SKIP_RETURN is true, the new version will return void.
1012 If non-NULL BLOCK_TO_COPY determine what basic blocks to copy.
1013 If non_NULL NEW_ENTRY determine new entry BB of the clone.
1014
1015 Return the new version's cgraph node. */
1016
415d1b9a 1017cgraph_node *
1018cgraph_node::create_version_clone_with_body
1019 (vec<cgraph_edge *> redirect_callers,
1020 vec<ipa_replace_map *, va_gc> *tree_map, bitmap args_to_skip,
1021 bool skip_return, bitmap bbs_to_copy, basic_block new_entry_block,
9dc70d59 1022 const char *suffix)
c02159a7 1023{
415d1b9a 1024 tree old_decl = decl;
35ee1c66 1025 cgraph_node *new_version_node = NULL;
c02159a7 1026 tree new_decl;
1027
1028 if (!tree_versionable_function_p (old_decl))
1029 return NULL;
1030
415d1b9a 1031 gcc_assert (local.can_change_signature || !args_to_skip);
c02159a7 1032
1033 /* Make a new FUNCTION_DECL tree node for the new version. */
1034 if (!args_to_skip && !skip_return)
1035 new_decl = copy_node (old_decl);
1036 else
1037 new_decl
1038 = build_function_decl_skip_args (old_decl, args_to_skip, skip_return);
1039
1040 /* Generate a new name for the new version. */
87943388 1041 DECL_NAME (new_decl) = clone_function_name_numbered (old_decl, suffix);
c02159a7 1042 SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
1043 SET_DECL_RTL (new_decl, NULL);
1044
4728cefc 1045 DECL_VIRTUAL_P (new_decl) = 0;
1046
c02159a7 1047 /* When the old decl was a con-/destructor make sure the clone isn't. */
9af5ce0c 1048 DECL_STATIC_CONSTRUCTOR (new_decl) = 0;
1049 DECL_STATIC_DESTRUCTOR (new_decl) = 0;
c02159a7 1050
1051 /* Create the new version's call-graph node.
1052 and update the edges of the new node. */
415d1b9a 1053 new_version_node = create_version_clone (new_decl, redirect_callers,
9dc70d59 1054 bbs_to_copy, suffix);
c02159a7 1055
415d1b9a 1056 if (ipa_transforms_to_apply.exists ())
9be0994b 1057 new_version_node->ipa_transforms_to_apply
415d1b9a 1058 = ipa_transforms_to_apply.copy ();
c02159a7 1059 /* Copy the OLD_VERSION_NODE function tree to the new version. */
1060 tree_function_versioning (old_decl, new_decl, tree_map, false, args_to_skip,
1061 skip_return, bbs_to_copy, new_entry_block);
1062
1063 /* Update the new version's properties.
1064 Make The new version visible only within this translation unit. Make sure
1065 that is not weak also.
1066 ??? We cannot use COMDAT linkage because there is no
1067 ABI support for this. */
415d1b9a 1068 new_version_node->make_decl_local ();
02774f2d 1069 DECL_VIRTUAL_P (new_version_node->decl) = 0;
1070 new_version_node->externally_visible = 0;
c02159a7 1071 new_version_node->local.local = 1;
1072 new_version_node->lowered = true;
033ab5d3 1073 if (!implicit_section)
1074 new_version_node->set_section (get_section ());
5c368d8a 1075 /* Clones of global symbols or symbols with unique names are unique. */
1076 if ((TREE_PUBLIC (old_decl)
1077 && !DECL_EXTERNAL (old_decl)
1078 && !DECL_WEAK (old_decl)
1079 && !DECL_COMDAT (old_decl))
1080 || in_lto_p)
02774f2d 1081 new_version_node->unique_name = true;
c02159a7 1082
1083 /* Update the call_expr on the edges to call the new version node. */
1084 update_call_expr (new_version_node);
1085
b136b820 1086 symtab->call_cgraph_insertion_hooks (new_version_node);
c02159a7 1087 return new_version_node;
1088}
1089
1090/* Given virtual clone, turn it into actual clone. */
1091
1092static void
35ee1c66 1093cgraph_materialize_clone (cgraph_node *node)
c02159a7 1094{
1095 bitmap_obstack_initialize (NULL);
02774f2d 1096 node->former_clone_of = node->clone_of->decl;
c02159a7 1097 if (node->clone_of->former_clone_of)
1098 node->former_clone_of = node->clone_of->former_clone_of;
1099 /* Copy the OLD_VERSION_NODE function tree to the new version. */
02774f2d 1100 tree_function_versioning (node->clone_of->decl, node->decl,
c02159a7 1101 node->clone.tree_map, true,
1102 node->clone.args_to_skip, false,
1103 NULL, NULL);
35ee1c66 1104 if (symtab->dump_file)
c02159a7 1105 {
35ee1c66 1106 dump_function_to_file (node->clone_of->decl, symtab->dump_file,
1107 dump_flags);
1108 dump_function_to_file (node->decl, symtab->dump_file, dump_flags);
c02159a7 1109 }
1110
1111 /* Function is no longer clone. */
1112 if (node->next_sibling_clone)
1113 node->next_sibling_clone->prev_sibling_clone = node->prev_sibling_clone;
1114 if (node->prev_sibling_clone)
1115 node->prev_sibling_clone->next_sibling_clone = node->next_sibling_clone;
1116 else
1117 node->clone_of->clones = node->next_sibling_clone;
1118 node->next_sibling_clone = NULL;
1119 node->prev_sibling_clone = NULL;
02774f2d 1120 if (!node->clone_of->analyzed && !node->clone_of->clones)
c02159a7 1121 {
415d1b9a 1122 node->clone_of->release_body ();
1123 node->clone_of->remove_callees ();
51ce5652 1124 node->clone_of->remove_all_references ();
c02159a7 1125 }
1126 node->clone_of = NULL;
1127 bitmap_obstack_release (NULL);
1128}
1129
1130/* Once all functions from compilation unit are in memory, produce all clones
1131 and update all calls. We might also do this on demand if we don't want to
1132 bring all functions to memory prior compilation, but current WHOPR
47ae02b7 1133 implementation does that and it is a bit easier to keep everything right in
c02159a7 1134 this order. */
1135
1136void
35ee1c66 1137symbol_table::materialize_all_clones (void)
c02159a7 1138{
35ee1c66 1139 cgraph_node *node;
c02159a7 1140 bool stabilized = false;
4d044066 1141
c02159a7 1142
35ee1c66 1143 if (symtab->dump_file)
1144 fprintf (symtab->dump_file, "Materializing clones\n");
382ecba7 1145
1146 cgraph_node::checking_verify_cgraph_nodes ();
c02159a7 1147
1148 /* We can also do topological order, but number of iterations should be
1149 bounded by number of IPA passes since single IPA pass is probably not
1150 going to create clones of clones it created itself. */
1151 while (!stabilized)
1152 {
1153 stabilized = true;
1154 FOR_EACH_FUNCTION (node)
1155 {
02774f2d 1156 if (node->clone_of && node->decl != node->clone_of->decl
1157 && !gimple_has_body_p (node->decl))
c02159a7 1158 {
eaad46f2 1159 if (!node->clone_of->clone_of)
4560777c 1160 node->clone_of->get_untransformed_body ();
02774f2d 1161 if (gimple_has_body_p (node->clone_of->decl))
c02159a7 1162 {
35ee1c66 1163 if (symtab->dump_file)
c02159a7 1164 {
35ee1c66 1165 fprintf (symtab->dump_file, "cloning %s to %s\n",
5ae49d3e 1166 xstrdup_for_dump (node->clone_of->name ()),
1167 xstrdup_for_dump (node->name ()));
c02159a7 1168 if (node->clone.tree_map)
1169 {
1170 unsigned int i;
35ee1c66 1171 fprintf (symtab->dump_file, " replace map: ");
f1f41a6c 1172 for (i = 0;
1173 i < vec_safe_length (node->clone.tree_map);
1174 i++)
c02159a7 1175 {
35ee1c66 1176 ipa_replace_map *replace_info;
f1f41a6c 1177 replace_info = (*node->clone.tree_map)[i];
1ffa4346 1178 print_generic_expr (symtab->dump_file,
1179 replace_info->old_tree);
35ee1c66 1180 fprintf (symtab->dump_file, " -> ");
1ffa4346 1181 print_generic_expr (symtab->dump_file,
1182 replace_info->new_tree);
35ee1c66 1183 fprintf (symtab->dump_file, "%s%s;",
c02159a7 1184 replace_info->replace_p ? "(replace)":"",
1185 replace_info->ref_p ? "(ref)":"");
1186 }
35ee1c66 1187 fprintf (symtab->dump_file, "\n");
c02159a7 1188 }
1189 if (node->clone.args_to_skip)
1190 {
35ee1c66 1191 fprintf (symtab->dump_file, " args_to_skip: ");
1192 dump_bitmap (symtab->dump_file,
1193 node->clone.args_to_skip);
c02159a7 1194 }
1195 if (node->clone.args_to_skip)
1196 {
35ee1c66 1197 fprintf (symtab->dump_file, " combined_args_to_skip:");
1198 dump_bitmap (symtab->dump_file, node->clone.combined_args_to_skip);
c02159a7 1199 }
1200 }
1201 cgraph_materialize_clone (node);
1202 stabilized = false;
1203 }
1204 }
1205 }
1206 }
1207 FOR_EACH_FUNCTION (node)
02774f2d 1208 if (!node->analyzed && node->callees)
9df17e79 1209 {
415d1b9a 1210 node->remove_callees ();
51ce5652 1211 node->remove_all_references ();
9df17e79 1212 }
1213 else
51ce5652 1214 node->clear_stmts_in_references ();
35ee1c66 1215 if (symtab->dump_file)
1216 fprintf (symtab->dump_file, "Materialization Call site updates done.\n");
382ecba7 1217
1218 cgraph_node::checking_verify_cgraph_nodes ();
1219
366970c6 1220 symtab->remove_unreachable_nodes (symtab->dump_file);
c02159a7 1221}
1222
1223#include "gt-cgraphclones.h"