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