Merge branch 'vendor/GCC50' - gcc 5.0 snapshot 1 FEB 2015
[dragonfly.git] / contrib / gcc-5.0 / gcc / ipa-inline-transform.c
1 /* Callgraph transformations to handle inlining
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 /* The inline decisions are stored in callgraph in "inline plan" and
22    applied later.
23
24    To mark given call inline, use inline_call function.
25    The function marks the edge inlinable and, if necessary, produces
26    virtual clone in the callgraph representing the new copy of callee's
27    function body.
28
29    The inline plan is applied on given function body by inline_transform.  */
30
31 #include "config.h"
32 #include "system.h"
33 #include "coretypes.h"
34 #include "tm.h"
35 #include "hash-set.h"
36 #include "machmode.h"
37 #include "vec.h"
38 #include "double-int.h"
39 #include "input.h"
40 #include "alias.h"
41 #include "symtab.h"
42 #include "wide-int.h"
43 #include "inchash.h"
44 #include "tree.h"
45 #include "langhooks.h"
46 #include "intl.h"
47 #include "coverage.h"
48 #include "ggc.h"
49 #include "tree-cfg.h"
50 #include "hash-map.h"
51 #include "is-a.h"
52 #include "plugin-api.h"
53 #include "hard-reg-set.h"
54 #include "input.h"
55 #include "function.h"
56 #include "ipa-ref.h"
57 #include "cgraph.h"
58 #include "alloc-pool.h"
59 #include "symbol-summary.h"
60 #include "ipa-prop.h"
61 #include "ipa-inline.h"
62 #include "tree-inline.h"
63 #include "tree-pass.h"
64
65 int ncalls_inlined;
66 int nfunctions_inlined;
67 bool speculation_removed;
68
69 /* Scale frequency of NODE edges by FREQ_SCALE.  */
70
71 static void
72 update_noncloned_frequencies (struct cgraph_node *node,
73                               int freq_scale)
74 {
75   struct cgraph_edge *e;
76
77   /* We do not want to ignore high loop nest after freq drops to 0.  */
78   if (!freq_scale)
79     freq_scale = 1;
80   for (e = node->callees; e; e = e->next_callee)
81     {
82       e->frequency = e->frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE;
83       if (e->frequency > CGRAPH_FREQ_MAX)
84         e->frequency = CGRAPH_FREQ_MAX;
85       if (!e->inline_failed)
86         update_noncloned_frequencies (e->callee, freq_scale);
87     }
88   for (e = node->indirect_calls; e; e = e->next_callee)
89     {
90       e->frequency = e->frequency * (gcov_type) freq_scale / CGRAPH_FREQ_BASE;
91       if (e->frequency > CGRAPH_FREQ_MAX)
92         e->frequency = CGRAPH_FREQ_MAX;
93     }
94 }
95
96 /* We removed or are going to remove the last call to NODE.
97    Return true if we can and want proactively remove the NODE now.
98    This is important to do, since we want inliner to know when offline
99    copy of function was removed.  */
100
101 static bool
102 can_remove_node_now_p_1 (struct cgraph_node *node, struct cgraph_edge *e)
103 {
104   ipa_ref *ref;
105
106   FOR_EACH_ALIAS (node, ref)
107     {
108       cgraph_node *alias = dyn_cast <cgraph_node *> (ref->referring);
109       if ((alias->callers && alias->callers != e)
110           || !can_remove_node_now_p_1 (alias, e))
111         return false;
112     }
113   /* FIXME: When address is taken of DECL_EXTERNAL function we still
114      can remove its offline copy, but we would need to keep unanalyzed node in
115      the callgraph so references can point to it.  */
116   return (!node->address_taken
117           && node->can_remove_if_no_direct_calls_p ()
118           /* Inlining might enable more devirtualizing, so we want to remove
119              those only after all devirtualizable virtual calls are processed.
120              Lacking may edges in callgraph we just preserve them post
121              inlining.  */
122           && (!DECL_VIRTUAL_P (node->decl)
123               || !opt_for_fn (node->decl, flag_devirtualize))
124           /* During early inlining some unanalyzed cgraph nodes might be in the
125              callgraph and they might reffer the function in question.  */
126           && !cgraph_new_nodes.exists ());
127 }
128
129 /* We are going to eliminate last direct call to NODE (or alias of it) via edge E.
130    Verify that the NODE can be removed from unit and if it is contained in comdat
131    group that the whole comdat group is removable.  */
132
133 static bool
134 can_remove_node_now_p (struct cgraph_node *node, struct cgraph_edge *e)
135 {
136   struct cgraph_node *next;
137   if (!can_remove_node_now_p_1 (node, e))
138     return false;
139
140   /* When we see same comdat group, we need to be sure that all
141      items can be removed.  */
142   if (!node->same_comdat_group || !node->externally_visible)
143     return true;
144   for (next = dyn_cast<cgraph_node *> (node->same_comdat_group);
145        next != node; next = dyn_cast<cgraph_node *> (next->same_comdat_group))
146     {
147       if (next->alias)
148         continue;
149       if ((next->callers && next->callers != e)
150           || !can_remove_node_now_p_1 (next, e))
151         return false;
152     }
153   return true;
154 }
155
156 /* Return true if NODE is a master clone with non-inline clones.  */
157
158 static bool
159 master_clone_with_noninline_clones_p (struct cgraph_node *node)
160 {
161   if (node->clone_of)
162     return false;
163
164   for (struct cgraph_node *n = node->clones; n; n = n->next_sibling_clone)
165     if (n->decl != node->decl)
166       return true;
167
168   return false;
169 }
170
171 /* E is expected to be an edge being inlined.  Clone destination node of
172    the edge and redirect it to the new clone.
173    DUPLICATE is used for bookkeeping on whether we are actually creating new
174    clones or re-using node originally representing out-of-line function call.
175    By default the offline copy is removed, when it appears dead after inlining.
176    UPDATE_ORIGINAL prevents this transformation.
177    If OVERALL_SIZE is non-NULL, the size is updated to reflect the
178    transformation.
179    FREQ_SCALE specify the scaling of frequencies of call sites.  */
180
181 void
182 clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
183                      bool update_original, int *overall_size, int freq_scale)
184 {
185   struct cgraph_node *inlining_into;
186   struct cgraph_edge *next;
187
188   if (e->caller->global.inlined_to)
189     inlining_into = e->caller->global.inlined_to;
190   else
191     inlining_into = e->caller;
192
193   if (duplicate)
194     {
195       /* We may eliminate the need for out-of-line copy to be output.
196          In that case just go ahead and re-use it.  This is not just an
197          memory optimization.  Making offline copy of fuction disappear
198          from the program will improve future decisions on inlining.  */
199       if (!e->callee->callers->next_caller
200           /* Recursive inlining never wants the master clone to
201              be overwritten.  */
202           && update_original
203           && can_remove_node_now_p (e->callee, e)
204           /* We cannot overwrite a master clone with non-inline clones
205              until after these clones are materialized.  */
206           && !master_clone_with_noninline_clones_p (e->callee))
207         {
208           /* TODO: When callee is in a comdat group, we could remove all of it,
209              including all inline clones inlined into it.  That would however
210              need small function inlining to register edge removal hook to
211              maintain the priority queue.
212
213              For now we keep the ohter functions in the group in program until
214              cgraph_remove_unreachable_functions gets rid of them.  */
215           gcc_assert (!e->callee->global.inlined_to);
216           e->callee->dissolve_same_comdat_group_list ();
217           if (e->callee->definition
218               && inline_account_function_p (e->callee))
219             {
220               gcc_assert (!e->callee->alias);
221               if (overall_size)
222                 *overall_size -= inline_summaries->get (e->callee)->size;
223               nfunctions_inlined++;
224             }
225           duplicate = false;
226           e->callee->externally_visible = false;
227           update_noncloned_frequencies (e->callee, e->frequency);
228         }
229       else
230         {
231           struct cgraph_node *n;
232
233           if (freq_scale == -1)
234             freq_scale = e->frequency;
235           n = e->callee->create_clone (e->callee->decl,
236                                        MIN (e->count, e->callee->count),
237                                        freq_scale,
238                                        update_original, vNULL, true,
239                                        inlining_into,
240                                        NULL);
241           n->used_as_abstract_origin = e->callee->used_as_abstract_origin;
242           e->redirect_callee (n);
243         }
244     }
245   else
246     e->callee->dissolve_same_comdat_group_list ();
247
248   e->callee->global.inlined_to = inlining_into;
249
250   /* Recursively clone all bodies.  */
251   for (e = e->callee->callees; e; e = next)
252     {
253       next = e->next_callee;
254       if (!e->inline_failed)
255         clone_inlined_nodes (e, duplicate, update_original, overall_size, freq_scale);
256       if (e->speculative && !speculation_useful_p (e, true))
257         {
258           e->resolve_speculation (NULL);
259           speculation_removed = true;
260         }
261     }
262 }
263
264
265 /* Mark edge E as inlined and update callgraph accordingly.  UPDATE_ORIGINAL
266    specify whether profile of original function should be updated.  If any new
267    indirect edges are discovered in the process, add them to NEW_EDGES, unless
268    it is NULL. If UPDATE_OVERALL_SUMMARY is false, do not bother to recompute overall
269    size of caller after inlining. Caller is required to eventually do it via
270    inline_update_overall_summary.
271    If callee_removed is non-NULL, set it to true if we removed callee node.
272
273    Return true iff any new callgraph edges were discovered as a
274    result of inlining.  */
275
276 bool
277 inline_call (struct cgraph_edge *e, bool update_original,
278              vec<cgraph_edge *> *new_edges,
279              int *overall_size, bool update_overall_summary,
280              bool *callee_removed)
281 {
282   int old_size = 0, new_size = 0;
283   struct cgraph_node *to = NULL;
284   struct cgraph_edge *curr = e;
285   struct cgraph_node *callee = e->callee->ultimate_alias_target ();
286   bool new_edges_found = false;
287
288 #ifdef ENABLE_CHECKING
289   int estimated_growth = estimate_edge_growth (e);
290   bool predicated = inline_edge_summary (e)->predicate != NULL;
291 #endif
292
293   speculation_removed = false;
294   /* Don't inline inlined edges.  */
295   gcc_assert (e->inline_failed);
296   /* Don't even think of inlining inline clone.  */
297   gcc_assert (!callee->global.inlined_to);
298
299   e->inline_failed = CIF_OK;
300   DECL_POSSIBLY_INLINED (callee->decl) = true;
301
302   to = e->caller;
303   if (to->global.inlined_to)
304     to = to->global.inlined_to;
305
306   /* If aliases are involved, redirect edge to the actual destination and
307      possibly remove the aliases.  */
308   if (e->callee != callee)
309     {
310       struct cgraph_node *alias = e->callee, *next_alias;
311       e->redirect_callee (callee);
312       while (alias && alias != callee)
313         {
314           if (!alias->callers
315               && can_remove_node_now_p (alias,
316                                         !e->next_caller && !e->prev_caller ? e : NULL))
317             {
318               next_alias = alias->get_alias_target ();
319               alias->remove ();
320               if (callee_removed)
321                 *callee_removed = true;
322               alias = next_alias;
323             }
324           else
325             break;
326         }
327     }
328
329   clone_inlined_nodes (e, true, update_original, overall_size, e->frequency);
330
331   gcc_assert (curr->callee->global.inlined_to == to);
332
333   old_size = inline_summaries->get (to)->size;
334   inline_merge_summary (e);
335   if (opt_for_fn (e->caller->decl, optimize))
336     new_edges_found = ipa_propagate_indirect_call_infos (curr, new_edges);
337   if (update_overall_summary)
338    inline_update_overall_summary (to);
339   new_size = inline_summaries->get (to)->size;
340
341   if (callee->calls_comdat_local)
342     to->calls_comdat_local = true;
343   else if (to->calls_comdat_local && callee->comdat_local_p ())
344     {
345       struct cgraph_edge *se = to->callees;
346       for (; se; se = se->next_callee)
347         if (se->inline_failed && se->callee->comdat_local_p ())
348           break;
349       if (se == NULL)
350         to->calls_comdat_local = false;
351     }
352
353 #ifdef ENABLE_CHECKING
354   /* Verify that estimated growth match real growth.  Allow off-by-one
355      error due to INLINE_SIZE_SCALE roudoff errors.  */
356   gcc_assert (!update_overall_summary || !overall_size || new_edges_found
357               || abs (estimated_growth - (new_size - old_size)) <= 1
358               || speculation_removed
359               /* FIXME: a hack.  Edges with false predicate are accounted
360                  wrong, we should remove them from callgraph.  */
361               || predicated);
362 #endif
363
364   /* Account the change of overall unit size; external functions will be
365      removed and are thus not accounted.  */
366   if (overall_size && inline_account_function_p (to))
367     *overall_size += new_size - old_size;
368   ncalls_inlined++;
369
370   /* This must happen after inline_merge_summary that rely on jump
371      functions of callee to not be updated.  */
372   return new_edges_found;
373 }
374
375
376 /* Copy function body of NODE and redirect all inline clones to it.
377    This is done before inline plan is applied to NODE when there are
378    still some inline clones if it.
379
380    This is necessary because inline decisions are not really transitive
381    and the other inline clones may have different bodies.  */
382
383 static struct cgraph_node *
384 save_inline_function_body (struct cgraph_node *node)
385 {
386   struct cgraph_node *first_clone, *n;
387
388   if (dump_file)
389     fprintf (dump_file, "\nSaving body of %s for later reuse\n",
390              node->name ());
391  
392   gcc_assert (node == cgraph_node::get (node->decl));
393
394   /* first_clone will be turned into real function.  */
395   first_clone = node->clones;
396   first_clone->decl = copy_node (node->decl);
397   first_clone->decl->decl_with_vis.symtab_node = first_clone;
398   gcc_assert (first_clone == cgraph_node::get (first_clone->decl));
399
400   /* Now reshape the clone tree, so all other clones descends from
401      first_clone.  */
402   if (first_clone->next_sibling_clone)
403     {
404       for (n = first_clone->next_sibling_clone; n->next_sibling_clone; n = n->next_sibling_clone)
405         n->clone_of = first_clone;
406       n->clone_of = first_clone;
407       n->next_sibling_clone = first_clone->clones;
408       if (first_clone->clones)
409         first_clone->clones->prev_sibling_clone = n;
410       first_clone->clones = first_clone->next_sibling_clone;
411       first_clone->next_sibling_clone->prev_sibling_clone = NULL;
412       first_clone->next_sibling_clone = NULL;
413       gcc_assert (!first_clone->prev_sibling_clone);
414     }
415   first_clone->clone_of = NULL;
416
417   /* Now node in question has no clones.  */
418   node->clones = NULL;
419
420   /* Inline clones share decl with the function they are cloned
421      from.  Walk the whole clone tree and redirect them all to the
422      new decl.  */
423   if (first_clone->clones)
424     for (n = first_clone->clones; n != first_clone;)
425       {
426         gcc_assert (n->decl == node->decl);
427         n->decl = first_clone->decl;
428         if (n->clones)
429           n = n->clones;
430         else if (n->next_sibling_clone)
431           n = n->next_sibling_clone;
432         else
433           {
434             while (n != first_clone && !n->next_sibling_clone)
435               n = n->clone_of;
436             if (n != first_clone)
437               n = n->next_sibling_clone;
438           }
439       }
440
441   /* Copy the OLD_VERSION_NODE function tree to the new version.  */
442   tree_function_versioning (node->decl, first_clone->decl,
443                             NULL, true, NULL, false,
444                             NULL, NULL);
445
446   /* The function will be short lived and removed after we inline all the clones,
447      but make it internal so we won't confuse ourself.  */
448   DECL_EXTERNAL (first_clone->decl) = 0;
449   TREE_PUBLIC (first_clone->decl) = 0;
450   DECL_COMDAT (first_clone->decl) = 0;
451   first_clone->ipa_transforms_to_apply.release ();
452
453   /* When doing recursive inlining, the clone may become unnecessary.
454      This is possible i.e. in the case when the recursive function is proved to be
455      non-throwing and the recursion happens only in the EH landing pad.
456      We can not remove the clone until we are done with saving the body.
457      Remove it now.  */
458   if (!first_clone->callers)
459     {
460       first_clone->remove_symbol_and_inline_clones ();
461       first_clone = NULL;
462     }
463 #ifdef ENABLE_CHECKING
464   else
465     first_clone->verify ();
466 #endif
467   return first_clone;
468 }
469
470 /* Return true when function body of DECL still needs to be kept around
471    for later re-use.  */
472 static bool
473 preserve_function_body_p (struct cgraph_node *node)
474 {
475   gcc_assert (symtab->global_info_ready);
476   gcc_assert (!node->alias && !node->thunk.thunk_p);
477
478   /* Look if there is any clone around.  */
479   if (node->clones)
480     return true;
481   return false;
482 }
483
484 /* Apply inline plan to function.  */
485
486 unsigned int
487 inline_transform (struct cgraph_node *node)
488 {
489   unsigned int todo = 0;
490   struct cgraph_edge *e, *next;
491   bool has_inline = false;
492  
493   /* FIXME: Currently the pass manager is adding inline transform more than
494      once to some clones.  This needs revisiting after WPA cleanups.  */
495   if (cfun->after_inlining)
496     return 0;
497
498   /* We might need the body of this function so that we can expand
499      it inline somewhere else.  */
500   if (preserve_function_body_p (node))
501     save_inline_function_body (node);
502
503   for (e = node->callees; e; e = next)
504     {
505       if (!e->inline_failed)
506         has_inline = true;
507       next = e->next_callee;
508       e->redirect_call_stmt_to_callee ();
509     }
510   node->remove_all_references ();
511
512   timevar_push (TV_INTEGRATION);
513   if (node->callees && (opt_for_fn (node->decl, optimize) || has_inline))
514     todo = optimize_inline_calls (current_function_decl);
515   timevar_pop (TV_INTEGRATION);
516
517   cfun->always_inline_functions_inlined = true;
518   cfun->after_inlining = true;
519   todo |= execute_fixup_cfg ();
520
521   if (!(todo & TODO_update_ssa_any))
522     /* Redirecting edges might lead to a need for vops to be recomputed.  */
523     todo |= TODO_update_ssa_only_virtuals;
524
525   return todo;
526 }