xref: /netbsd-src/external/gpl3/gcc.old/dist/gcc/cgraphclones.c (revision bdc22b2e01993381dcefeff2bc9b56ca75a4235c)
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