diff options
author | Jan Hubicka <jh@suse.cz> | 2007-01-24 23:45:00 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2007-01-24 22:45:00 +0000 |
commit | b7c27d5169bfb98ea4d73c52c4e17961cb9ab160 (patch) | |
tree | 97625f5e54c9473e50dcef3cfe1a4f3808aee7d8 /gcc/ipa-inline.c | |
parent | 078b307321410f5a8e580df2a4c7dd8e980354b1 (diff) | |
download | gcc-b7c27d5169bfb98ea4d73c52c4e17961cb9ab160.zip gcc-b7c27d5169bfb98ea4d73c52c4e17961cb9ab160.tar.gz gcc-b7c27d5169bfb98ea4d73c52c4e17961cb9ab160.tar.bz2 |
ipa-inline.c (initial_insns, max_insns): Delete.
* ipa-inline.c (initial_insns, max_insns): Delete.
(compute_max_insns): New function.
(cgraph_decide_inlining_of_small_function): Use it; take minimal amount
of insns as base for code growth.
(cgraph_decide_inlining): Make initial_insns local; do not compute
max_insns.
* params.def (PARAM_INLINE_UNIT_GROWTH): Set to 60.
* doc/invoke.texi (inline-unit-growth): Update docs.
From-SVN: r121144
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r-- | gcc/ipa-inline.c | 38 |
1 files changed, 27 insertions, 11 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 646b72e..803bc9d 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -169,9 +169,7 @@ cgraph_decide_inlining_incrementally (struct cgraph_node *, enum inlining_mode, /* Statistics we collect about inlining algorithm. */ static int ncalls_inlined; static int nfunctions_inlined; -static int initial_insns; static int overall_insns; -static int max_insns; static gcov_type max_count; /* Estimate size of the function after inlining WHAT into TO. */ @@ -753,6 +751,19 @@ cgraph_set_inline_failed (struct cgraph_node *node, const char *reason) e->inline_failed = reason; } +/* Given whole compilation unit esitmate of INSNS, compute how large we can + allow the unit to grow. */ +static int +compute_max_insns (int insns) +{ + int max_insns = insns; + if (max_insns < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS)) + max_insns = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS); + + return max_insns = ((HOST_WIDEST_INT) max_insns + * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100); +} + /* We use greedy algorithm for inlining of small functions: All inline candidates are put into prioritized heap based on estimated growth of the overall number of instructions and then update the estimates. @@ -768,6 +779,7 @@ cgraph_decide_inlining_of_small_functions (void) const char *failed_reason; fibheap_t heap = fibheap_new (); bitmap updated_nodes = BITMAP_ALLOC (NULL); + int min_insns, max_insns; if (dump_file) fprintf (dump_file, "\nDeciding on smaller functions:\n"); @@ -796,6 +808,10 @@ cgraph_decide_inlining_of_small_functions (void) edge->aux = fibheap_insert (heap, cgraph_edge_badness (edge), edge); } } + + max_insns = compute_max_insns (overall_insns); + min_insns = overall_insns; + while (overall_insns <= max_insns && (edge = fibheap_extract_min (heap))) { int old_insns = overall_insns; @@ -923,6 +939,14 @@ cgraph_decide_inlining_of_small_functions (void) edge->caller->global.insns, overall_insns - old_insns); } + if (min_insns > overall_insns) + { + min_insns = overall_insns; + max_insns = compute_max_insns (min_insns); + + if (dump_file) + fprintf (dump_file, "New minimal insns reached: %i\n", min_insns); + } } while ((edge = fibheap_extract_min (heap)) != NULL) { @@ -949,6 +973,7 @@ cgraph_decide_inlining (void) XCNEWVEC (struct cgraph_node *, cgraph_n_nodes); int old_insns = 0; int i; + int initial_insns; max_count = 0; for (node = cgraph_nodes; node; node = node->next) @@ -965,13 +990,6 @@ cgraph_decide_inlining (void) overall_insns = initial_insns; gcc_assert (!max_count || (profile_info && flag_branch_probabilities)); - max_insns = overall_insns; - if (max_insns < PARAM_VALUE (PARAM_LARGE_UNIT_INSNS)) - max_insns = PARAM_VALUE (PARAM_LARGE_UNIT_INSNS); - - max_insns = ((HOST_WIDEST_INT) max_insns - * (100 + PARAM_VALUE (PARAM_INLINE_UNIT_GROWTH)) / 100); - nnodes = cgraph_postorder (order); if (dump_file) @@ -996,12 +1014,10 @@ cgraph_decide_inlining (void) /* Handle nodes to be flattened, but don't update overall unit size. */ if (lookup_attribute ("flatten", DECL_ATTRIBUTES (node->decl)) != NULL) { - int old_overall_insns = overall_insns; if (dump_file) fprintf (dump_file, "Flattening %s\n", cgraph_node_name (node)); cgraph_decide_inlining_incrementally (node, INLINE_ALL, 0); - overall_insns = old_overall_insns; } if (!node->local.disregard_inline_limits) |