diff options
author | Jan Hubicka <jh@suse.cz> | 2005-09-24 14:43:30 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2005-09-24 12:43:30 +0000 |
commit | 06191a239b2fe34bcc7338dcefdb1f3b9289c239 (patch) | |
tree | 65dc8daa11fadff0c648fecf430944f0ddcca2f3 | |
parent | 26b7ebf6bf2dac324aaba62bab4b07863abe2c37 (diff) | |
download | gcc-06191a239b2fe34bcc7338dcefdb1f3b9289c239.zip gcc-06191a239b2fe34bcc7338dcefdb1f3b9289c239.tar.gz gcc-06191a239b2fe34bcc7338dcefdb1f3b9289c239.tar.bz2 |
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
-rw-r--r-- | gcc/ChangeLog | 17 | ||||
-rw-r--r-- | gcc/cgraph.c | 4 | ||||
-rw-r--r-- | gcc/cgraph.h | 8 | ||||
-rw-r--r-- | gcc/cgraphunit.c | 10 | ||||
-rw-r--r-- | gcc/ipa-inline.c | 26 | ||||
-rw-r--r-- | gcc/tree-optimize.c | 2 |
6 files changed, 47 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9327a19..48bf615 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,20 @@ +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> Pete Steinmetz <steinmtz@us.ibm.com> diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 7a67f6d..32fbe30 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -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. */ struct cgraph_edge * 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) { struct cgraph_edge *new; @@ -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_edge *e; - int count_scale; + gcov_type count_scale; new->decl = n->decl; new->origin = n->origin; diff --git a/gcc/cgraph.h b/gcc/cgraph.h index ccb2cdd..42a74f5 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -242,7 +242,7 @@ struct cgraph_rtl_info *cgraph_rtl_info (tree); const char * cgraph_node_name (struct cgraph_node *); struct cgraph_edge * cgraph_clone_edge (struct cgraph_edge *, struct cgraph_node *, - tree, int, int, bool); + tree, gcov_type, int, bool); struct cgraph_node * cgraph_clone_node (struct cgraph_node *, gcov_type, int, bool); @@ -276,8 +276,6 @@ bool cgraph_inline_p (struct cgraph_edge *, const char **reason); bool cgraph_preserve_function_body_p (tree); void verify_cgraph (void); 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_reset_static_var_maps (void); void init_cgraph (void); @@ -290,7 +288,7 @@ int cgraph_postorder (struct cgraph_node **); /* In ipa-inline.c */ bool cgraph_decide_inlining_incrementally (struct cgraph_node *, bool); -void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool); -void cgraph_mark_inline_edge (struct cgraph_edge *); +void cgraph_clone_inlined_nodes (struct cgraph_edge *, bool, bool); +void cgraph_mark_inline_edge (struct cgraph_edge *, bool); bool cgraph_default_inline_p (struct cgraph_node *, const char **); #endif /* GCC_CGRAPH_H */ diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c index e357a25..181ee4e 100644 --- a/gcc/cgraphunit.c +++ b/gcc/cgraphunit.c @@ -663,8 +663,18 @@ verify_cgraph_node (struct cgraph_node *node) cgraph_node_name (e->caller), cgraph_node_name (e->callee)); error_found = true; } + if (node->count < 0) + { + error ("Execution count is negative"); + error_found = true; + } 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 (node->global.inlined_to diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 927813e..d91ca66 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -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. */ 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; @@ -131,7 +131,7 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool 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); } @@ -143,13 +143,15 @@ cgraph_clone_inlined_nodes (struct cgraph_edge *e, bool duplicate) /* Recursively clone all bodies. */ for (e = e->callee->callees; e; e = e->next_callee) 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 -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; struct cgraph_node *to = NULL, *what; @@ -161,7 +163,7 @@ cgraph_mark_inline_edge (struct cgraph_edge *e) DECL_POSSIBLY_INLINED (e->callee->decl) = true; e->callee->global.inlined = true; - cgraph_clone_inlined_nodes (e, true); + cgraph_clone_inlined_nodes (e, true, update_original); what = e->callee; @@ -200,7 +202,7 @@ cgraph_mark_inline (struct cgraph_edge *edge) next = e->next_caller; if (e->caller == to && e->inline_failed) { - cgraph_mark_inline_edge (e); + cgraph_mark_inline_edge (e, true); if (e == edge) edge = next; times++; @@ -520,7 +522,7 @@ cgraph_flatten_node (struct cgraph_node *node, htab_t cycles) { if (dump_file) 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); } else if (dump_file) @@ -571,7 +573,7 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node) master_clone->needed = true; for (e = master_clone->callees; e; e = e->next_callee) 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. */ while (!fibheap_empty (heap) @@ -623,7 +625,7 @@ cgraph_decide_recursive_inlining (struct cgraph_node *node) fprintf (dump_file, "\n"); } 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); n++; } @@ -808,7 +810,7 @@ cgraph_decide_inlining_of_small_functions (void) continue; } callee = edge->callee; - cgraph_mark_inline_edge (edge); + cgraph_mark_inline_edge (edge, true); update_callee_keys (heap, callee, updated_nodes); } where = edge->caller; @@ -930,7 +932,7 @@ cgraph_decide_inlining (void) if (cgraph_recursive_inlining_p (e->caller, e->callee, &e->inline_failed)) continue; - cgraph_mark_inline_edge (e); + cgraph_mark_inline_edge (e, true); if (dump_file) fprintf (dump_file, " Inlined into %s which now has %i insns.\n", diff --git a/gcc/tree-optimize.c b/gcc/tree-optimize.c index 782982e..0678889 100644 --- a/gcc/tree-optimize.c +++ b/gcc/tree-optimize.c @@ -375,7 +375,7 @@ tree_rest_of_compilation (tree fndecl) saved_node = cgraph_clone_node (node, node->count, 1, false); for (e = saved_node->callees; e; e = e->next_callee) 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; save_body (fndecl, &cfun->saved_args, &cfun->saved_static_chain_decl); |