Commit 06191a23 by Jan Hubicka Committed by Jan Hubicka

cgraph.c (cgraph_clone_edge): Make the scale gcov_type.


	* cgraph.c (cgraph_clone_edge): Make the scale gcov_type.
	(cgraph_clone_node): Likewise.
	* cgraph.h (cgraph_clone_edge): Update prototype.
	(cgraph_mark_inline_edge, cgraph_clone_inlined_nodes): Remove
	duplicated prototypes; add updating argument.
	* cgraphunit.c (verify_cgraph_node): Verify that counts are non-negative.
	* ipa-inline.c (cgraph_clone_inlined_nodes): Allow clonning without
	updating profile.
	(cgraph_mark_inline_edge): Likewise.
	(cgraph_mark_inline): Update use of cgraph_mark_inline_edge.
	(cgraph_flatten_node): Likewise.
	(cgraph_decide_recursive_inlining): Likewise.
	(cgraph_decide_inlining_of_small_function): Likewise.
	* tree-optimize.c (tree_rest_of_compilation): Likewise.

From-SVN: r104601
parent 26b7ebf6
2005-09-24 Jan Hubicka <jh@suse.cz>
* cgraph.c (cgraph_clone_edge): Make the scale gcov_type.
(cgraph_clone_node): Likewise.
* cgraph.h (cgraph_clone_edge): Update prototype.
(cgraph_mark_inline_edge, cgraph_clone_inlined_nodes): Remove
duplicated prototypes; add updating argument.
* cgraphunit.c (verify_cgraph_node): Verify that counts are non-negative.
* ipa-inline.c (cgraph_clone_inlined_nodes): Allow clonning without
updating profile.
(cgraph_mark_inline_edge): Likewise.
(cgraph_mark_inline): Update use of cgraph_mark_inline_edge.
(cgraph_flatten_node): Likewise.
(cgraph_decide_recursive_inlining): Likewise.
(cgraph_decide_inlining_of_small_function): Likewise.
* tree-optimize.c (tree_rest_of_compilation): Likewise.
2005-09-23 David Edelsohn <edelsohn@gnu.org> 2005-09-23 David Edelsohn <edelsohn@gnu.org>
Pete Steinmetz <steinmtz@us.ibm.com> Pete Steinmetz <steinmtz@us.ibm.com>
......
...@@ -884,7 +884,7 @@ cgraph_function_possibly_inlined_p (tree decl) ...@@ -884,7 +884,7 @@ cgraph_function_possibly_inlined_p (tree decl)
/* Create clone of E in the node N represented by CALL_EXPR the callgraph. */ /* Create clone of E in the node N represented by CALL_EXPR the callgraph. */
struct cgraph_edge * struct cgraph_edge *
cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n, cgraph_clone_edge (struct cgraph_edge *e, struct cgraph_node *n,
tree call_stmt, int count_scale, int loop_nest, tree call_stmt, gcov_type count_scale, int loop_nest,
bool update_original) bool update_original)
{ {
struct cgraph_edge *new; struct cgraph_edge *new;
...@@ -911,7 +911,7 @@ cgraph_clone_node (struct cgraph_node *n, gcov_type count, int loop_nest, ...@@ -911,7 +911,7 @@ cgraph_clone_node (struct cgraph_node *n, gcov_type count, int loop_nest,
{ {
struct cgraph_node *new = cgraph_create_node (); struct cgraph_node *new = cgraph_create_node ();
struct cgraph_edge *e; struct cgraph_edge *e;
int count_scale; gcov_type count_scale;
new->decl = n->decl; new->decl = n->decl;
new->origin = n->origin; new->origin = n->origin;
......
...@@ -242,7 +242,7 @@ struct cgraph_rtl_info *cgraph_rtl_info (tree); ...@@ -242,7 +242,7 @@ struct cgraph_rtl_info *cgraph_rtl_info (tree);
const char * cgraph_node_name (struct cgraph_node *); const char * cgraph_node_name (struct cgraph_node *);
struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *, struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *,
struct cgraph_node *, struct cgraph_node *,
tree, int, int, bool); tree, gcov_type, int, bool);
struct cgraph_node * cgraph_clone_node (struct cgraph_node *, gcov_type, struct cgraph_node * cgraph_clone_node (struct cgraph_node *, gcov_type,
int, bool); int, bool);
...@@ -276,8 +276,6 @@ bool cgraph_inline_p (struct cgraph_edge *, const char **reason); ...@@ -276,8 +276,6 @@ bool cgraph_inline_p (struct cgraph_edge *, const char **reason);
bool cgraph_preserve_function_body_p (tree); bool cgraph_preserve_function_body_p (tree);
void verify_cgraph (void); void verify_cgraph (void);
void verify_cgraph_node (struct cgraph_node *); void verify_cgraph_node (struct cgraph_node *);
void cgraph_mark_inline_edge (struct cgraph_edge *e);
void cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate);
void cgraph_build_static_cdtor (char which, tree body, int priority); void cgraph_build_static_cdtor (char which, tree body, int priority);
void cgraph_reset_static_var_maps (void); void cgraph_reset_static_var_maps (void);
void init_cgraph (void); void init_cgraph (void);
...@@ -290,7 +288,7 @@ int cgraph_postorder (struct cgraph_node **); ...@@ -290,7 +288,7 @@ int cgraph_postorder (struct cgraph_node **);
/* In ipa-inline.c */ /* In ipa-inline.c */
bool cgraph_decide_inlining_incrementally (struct cgraph_node *, bool); bool cgraph_decide_inlining_incrementally (struct cgraph_node *, bool);
void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool); void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool, bool);
void cgraph_mark_inline_edge (struct cgraph_edge *); void cgraph_mark_inline_edge (struct cgraph_edge *, bool);
bool cgraph_default_inline_p (struct cgraph_node *, const char **); bool cgraph_default_inline_p (struct cgraph_node *, const char **);
#endif /* GCC_CGRAPH_H */ #endif /* GCC_CGRAPH_H */
...@@ -663,8 +663,18 @@ verify_cgraph_node (struct cgraph_node *node) ...@@ -663,8 +663,18 @@ verify_cgraph_node (struct cgraph_node *node)
cgraph_node_name (e->caller), cgraph_node_name (e->callee)); cgraph_node_name (e->caller), cgraph_node_name (e->callee));
error_found = true; error_found = true;
} }
if (node->count < 0)
{
error ("Execution count is negative");
error_found = true;
}
for (e = node->callers; e; e = e->next_caller) for (e = node->callers; e; e = e->next_caller)
{ {
if (e->count < 0)
{
error ("caller edge count is negative");
error_found = true;
}
if (!e->inline_failed) if (!e->inline_failed)
{ {
if (node->global.inlined_to if (node->global.inlined_to
......
...@@ -113,7 +113,7 @@ cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to, ...@@ -113,7 +113,7 @@ cgraph_estimate_size_after_inlining (int times, struct cgraph_node *to,
clones or re-using node originally representing out-of-line function call. clones or re-using node originally representing out-of-line function call.
*/ */
void void
cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate) cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate, bool update_original)
{ {
struct cgraph_node *n; struct cgraph_node *n;
...@@ -131,7 +131,7 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate) ...@@ -131,7 +131,7 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate)
} }
else if (duplicate) else if (duplicate)
{ {
n = cgraph_clone_node (e->callee, e->count, e->loop_nest, true); n = cgraph_clone_node (e->callee, e->count, e->loop_nest, update_original);
cgraph_redirect_edge_callee (e, n); cgraph_redirect_edge_callee (e, n);
} }
...@@ -143,13 +143,15 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate) ...@@ -143,13 +143,15 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate)
/* Recursively clone all bodies. */ /* Recursively clone all bodies. */
for (e = e->callee->callees; e; e = e->next_callee) for (e = e->callee->callees; e; e = e->next_callee)
if (!e->inline_failed) if (!e->inline_failed)
cgraph_clone_inlined_nodes (e, duplicate); cgraph_clone_inlined_nodes (e, duplicate, update_original);
} }
/* Mark edge E as inlined and update callgraph accordingly. */ /* Mark edge E as inlined and update callgraph accordingly.
UPDATE_ORIGINAL specify whether profile of original function should be
updated. */
void void
cgraph_mark_inline_edge (struct cgraph_edge *e) cgraph_mark_inline_edge (struct cgraph_edge *e, bool update_original)
{ {
int old_insns = 0, new_insns = 0; int old_insns = 0, new_insns = 0;
struct cgraph_node *to = NULL, *what; struct cgraph_node *to = NULL, *what;
...@@ -161,7 +163,7 @@ cgraph_mark_inline_edge (struct cgraph_edge *e) ...@@ -161,7 +163,7 @@ cgraph_mark_inline_edge (struct cgraph_edge *e)
DECL_POSSIBLY_INLINED (e->callee->decl) = true; DECL_POSSIBLY_INLINED (e->callee->decl) = true;
e->callee->global.inlined = true; e->callee->global.inlined = true;
cgraph_clone_inlined_nodes (e, true); cgraph_clone_inlined_nodes (e, true, update_original);
what = e->callee; what = e->callee;
...@@ -200,7 +202,7 @@ cgraph_mark_inline (struct cgraph_edge *edge) ...@@ -200,7 +202,7 @@ cgraph_mark_inline (struct cgraph_edge *edge)
next = e->next_caller; next = e->next_caller;
if (e->caller == to && e->inline_failed) if (e->caller == to && e->inline_failed)
{ {
cgraph_mark_inline_edge (e); cgraph_mark_inline_edge (e, true);
if (e == edge) if (e == edge)
edge = next; edge = next;
times++; times++;
...@@ -520,7 +522,7 @@ cgraph_flatten_node (struct cgraph_node *node, htab_t cycles) ...@@ -520,7 +522,7 @@ cgraph_flatten_node (struct cgraph_node *node, htab_t cycles)
{ {
if (dump_file) if (dump_file)
fprintf (dump_file, " inlining %s", cgraph_node_name (e->callee)); fprintf (dump_file, " inlining %s", cgraph_node_name (e->callee));
cgraph_mark_inline_edge (e); cgraph_mark_inline_edge (e, true);
cgraph_flatten_node (e->callee, cycles); cgraph_flatten_node (e->callee, cycles);
} }
else if (dump_file) else if (dump_file)
...@@ -571,7 +573,7 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node) ...@@ -571,7 +573,7 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node)
master_clone->needed = true; master_clone->needed = true;
for (e = master_clone->callees; e; e = e->next_callee) for (e = master_clone->callees; e; e = e->next_callee)
if (!e->inline_failed) if (!e->inline_failed)
cgraph_clone_inlined_nodes (e, true); cgraph_clone_inlined_nodes (e, true, false);
/* Do the inlining and update list of recursive call during process. */ /* Do the inlining and update list of recursive call during process. */
while (!fibheap_empty (heap) while (!fibheap_empty (heap)
...@@ -623,7 +625,7 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node) ...@@ -623,7 +625,7 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node)
fprintf (dump_file, "\n"); fprintf (dump_file, "\n");
} }
cgraph_redirect_edge_callee (curr, master_clone); cgraph_redirect_edge_callee (curr, master_clone);
cgraph_mark_inline_edge (curr); cgraph_mark_inline_edge (curr, false);
lookup_recursive_calls (node, curr->callee, heap); lookup_recursive_calls (node, curr->callee, heap);
n++; n++;
} }
...@@ -808,7 +810,7 @@ cgraph_decide_inlining_of_small_functions (void) ...@@ -808,7 +810,7 @@ cgraph_decide_inlining_of_small_functions (void)
continue; continue;
} }
callee = edge->callee; callee = edge->callee;
cgraph_mark_inline_edge (edge); cgraph_mark_inline_edge (edge, true);
update_callee_keys (heap, callee, updated_nodes); update_callee_keys (heap, callee, updated_nodes);
} }
where = edge->caller; where = edge->caller;
...@@ -930,7 +932,7 @@ cgraph_decide_inlining (void) ...@@ -930,7 +932,7 @@ cgraph_decide_inlining (void)
if (cgraph_recursive_inlining_p (e->caller, e->callee, if (cgraph_recursive_inlining_p (e->caller, e->callee,
&e->inline_failed)) &e->inline_failed))
continue; continue;
cgraph_mark_inline_edge (e); cgraph_mark_inline_edge (e, true);
if (dump_file) if (dump_file)
fprintf (dump_file, fprintf (dump_file,
" Inlined into %s which now has %i insns.\n", " Inlined into %s which now has %i insns.\n",
......
...@@ -375,7 +375,7 @@ tree_rest_of_compilation (tree fndecl) ...@@ -375,7 +375,7 @@ tree_rest_of_compilation (tree fndecl)
saved_node = cgraph_clone_node (node, node->count, 1, false); saved_node = cgraph_clone_node (node, node->count, 1, false);
for (e = saved_node->callees; e; e = e->next_callee) for (e = saved_node->callees; e; e = e->next_callee)
if (!e->inline_failed) if (!e->inline_failed)
cgraph_clone_inlined_nodes (e, true); cgraph_clone_inlined_nodes (e, true, false);
} }
cfun->saved_static_chain_decl = cfun->static_chain_decl; cfun->saved_static_chain_decl = cfun->static_chain_decl;
save_body (fndecl, &cfun->saved_args, &cfun->saved_static_chain_decl); save_body (fndecl, &cfun->saved_args, &cfun->saved_static_chain_decl);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment