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