projects
/
gcc.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
libitm.exp: Reorder lib loads into dependency order.
[gcc.git]
/
gcc
/
ipa-inline-transform.c
diff --git
a/gcc/ipa-inline-transform.c
b/gcc/ipa-inline-transform.c
index 60a29628aee33c40a5177804ffe5e5bb029d8a66..9e131a4aa0e78c9ea428004196fbc4763c0ed711 100644
(file)
--- a/
gcc/ipa-inline-transform.c
+++ b/
gcc/ipa-inline-transform.c
@@
-1,6
+1,5
@@
/* Callgraph transformations to handle inlining
/* Callgraph transformations to handle inlining
- Copyright (C) 2003, 2004, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+ Copyright (C) 2003-2013 Free Software Foundation, Inc.
Contributed by Jan Hubicka
This file is part of GCC.
Contributed by Jan Hubicka
This file is part of GCC.
@@
-93,9
+92,7
@@
can_remove_node_now_p_1 (struct cgraph_node *node)
those only after all devirtualizable virtual calls are processed.
Lacking may edges in callgraph we just preserve them post
inlining. */
those only after all devirtualizable virtual calls are processed.
Lacking may edges in callgraph we just preserve them post
inlining. */
- && (!DECL_VIRTUAL_P (node->symbol.decl)
- || (!DECL_COMDAT (node->symbol.decl)
- && !DECL_EXTERNAL (node->symbol.decl)))
+ && !DECL_VIRTUAL_P (node->symbol.decl)
/* During early inlining some unanalyzed cgraph nodes might be in the
callgraph and they might reffer the function in question. */
&& !cgraph_new_nodes);
/* During early inlining some unanalyzed cgraph nodes might be in the
callgraph and they might reffer the function in question. */
&& !cgraph_new_nodes);
@@
-156,7
+153,7
@@
clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
cgraph_remove_unreachable_functions gets rid of them. */
gcc_assert (!e->callee->global.inlined_to);
symtab_dissolve_same_comdat_group_list ((symtab_node) e->callee);
cgraph_remove_unreachable_functions gets rid of them. */
gcc_assert (!e->callee->global.inlined_to);
symtab_dissolve_same_comdat_group_list ((symtab_node) e->callee);
- if (e->callee->
analyzed
&& !DECL_EXTERNAL (e->callee->symbol.decl))
+ if (e->callee->
symbol.definition
&& !DECL_EXTERNAL (e->callee->symbol.decl))
{
if (overall_size)
*overall_size -= inline_summary (e->callee)->size;
{
if (overall_size)
*overall_size -= inline_summary (e->callee)->size;
@@
-171,7
+168,7
@@
clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
struct cgraph_node *n;
n = cgraph_clone_node (e->callee, e->callee->symbol.decl,
e->count, e->frequency,
struct cgraph_node *n;
n = cgraph_clone_node (e->callee, e->callee->symbol.decl,
e->count, e->frequency,
- update_original, NULL, true);
+ update_original,
v
NULL, true);
cgraph_redirect_edge_callee (e, n);
}
}
cgraph_redirect_edge_callee (e, n);
}
}
@@
-202,7
+199,7
@@
clone_inlined_nodes (struct cgraph_edge *e, bool duplicate,
bool
inline_call (struct cgraph_edge *e, bool update_original,
bool
inline_call (struct cgraph_edge *e, bool update_original,
-
VEC (cgraph_edge_p, heap) *
*new_edges,
+
vec<cgraph_edge_p>
*new_edges,
int *overall_size, bool update_overall_summary)
{
int old_size = 0, new_size = 0;
int *overall_size, bool update_overall_summary)
{
int old_size = 0, new_size = 0;
@@
-239,7
+236,7
@@
inline_call (struct cgraph_edge *e, bool update_original,
if (!alias->callers
&& can_remove_node_now_p (alias, e))
{
if (!alias->callers
&& can_remove_node_now_p (alias, e))
{
- next_alias = cgraph_alias_
aliased_node
(alias);
+ next_alias = cgraph_alias_
target
(alias);
cgraph_remove_node (alias);
alias = next_alias;
}
cgraph_remove_node (alias);
alias = next_alias;
}
@@
-259,17
+256,21
@@
inline_call (struct cgraph_edge *e, bool update_original,
if (update_overall_summary)
inline_update_overall_summary (to);
new_size = inline_summary (to)->size;
if (update_overall_summary)
inline_update_overall_summary (to);
new_size = inline_summary (to)->size;
+
#ifdef ENABLE_CHECKING
/* Verify that estimated growth match real growth. Allow off-by-one
error due to INLINE_SIZE_SCALE roudoff errors. */
#ifdef ENABLE_CHECKING
/* Verify that estimated growth match real growth. Allow off-by-one
error due to INLINE_SIZE_SCALE roudoff errors. */
- gcc_assert (!update_overall_summary || !overall_size
+ gcc_assert (!update_overall_summary || !overall_size
|| new_edges_found
|| abs (estimated_growth - (new_size - old_size)) <= 1
/* FIXME: a hack. Edges with false predicate are accounted
wrong, we should remove them from callgraph. */
|| predicated);
#endif
|| abs (estimated_growth - (new_size - old_size)) <= 1
/* FIXME: a hack. Edges with false predicate are accounted
wrong, we should remove them from callgraph. */
|| predicated);
#endif
-
- if (overall_size)
+
+ /* Account the change of overall unit size; external functions will be
+ removed and are thus not accounted. */
+ if (overall_size
+ && !DECL_EXTERNAL (to->symbol.decl))
*overall_size += new_size - old_size;
ncalls_inlined++;
*overall_size += new_size - old_size;
ncalls_inlined++;
@@
-346,7
+347,8
@@
save_inline_function_body (struct cgraph_node *node)
/* Copy the OLD_VERSION_NODE function tree to the new version. */
tree_function_versioning (node->symbol.decl, first_clone->symbol.decl,
/* Copy the OLD_VERSION_NODE function tree to the new version. */
tree_function_versioning (node->symbol.decl, first_clone->symbol.decl,
- NULL, true, NULL, false, NULL, NULL);
+ NULL, true, NULL, false,
+ NULL, NULL);
/* The function will be short lived and removed after we inline all the clones,
but make it internal so we won't confuse ourself. */
/* The function will be short lived and removed after we inline all the clones,
but make it internal so we won't confuse ourself. */
@@
-354,9
+356,7
@@
save_inline_function_body (struct cgraph_node *node)
DECL_COMDAT_GROUP (first_clone->symbol.decl) = NULL_TREE;
TREE_PUBLIC (first_clone->symbol.decl) = 0;
DECL_COMDAT (first_clone->symbol.decl) = 0;
DECL_COMDAT_GROUP (first_clone->symbol.decl) = NULL_TREE;
TREE_PUBLIC (first_clone->symbol.decl) = 0;
DECL_COMDAT (first_clone->symbol.decl) = 0;
- VEC_free (ipa_opt_pass, heap,
- first_clone->ipa_transforms_to_apply);
- first_clone->ipa_transforms_to_apply = NULL;
+ first_clone->ipa_transforms_to_apply.release ();
/* When doing recursive inlining, the clone may become unnecessary.
This is possible i.e. in the case when the recursive function is proved to be
/* When doing recursive inlining, the clone may become unnecessary.
This is possible i.e. in the case when the recursive function is proved to be
@@
-381,7
+381,7
@@
static bool
preserve_function_body_p (struct cgraph_node *node)
{
gcc_assert (cgraph_global_info_ready);
preserve_function_body_p (struct cgraph_node *node)
{
gcc_assert (cgraph_global_info_ready);
- gcc_assert (!node->alias && !node->thunk.thunk_p);
+ gcc_assert (!node->
symbol.
alias && !node->thunk.thunk_p);
/* Look if there is any clone around. */
if (node->clones)
/* Look if there is any clone around. */
if (node->clones)