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