diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2017-07-07 15:28:35 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2017-07-07 13:28:35 +0000 |
commit | 29f1e2b173f1701b66410bc3624a989e98e23724 (patch) | |
tree | b2b3db83fc40d137f7bde2edb4558d282d409c6a /gcc/ipa-inline.c | |
parent | 8b42ccf6ddfbb350776d0c1b22bddbe9ff634b48 (diff) | |
download | gcc-29f1e2b173f1701b66410bc3624a989e98e23724.zip gcc-29f1e2b173f1701b66410bc3624a989e98e23724.tar.gz gcc-29f1e2b173f1701b66410bc3624a989e98e23724.tar.bz2 |
ipa-comdats.c: Remove optimize check from gate.
* ipa-comdats.c: Remove optimize check from gate.
* ipa-fnsummary.c (ipa_fn_summary_generate): do not generate summary
for functions not optimized.
(ipa_fn_summary_read): Skip optimize check.
(ipa_fn_summary_write): Likewise.
* ipa-inline-analysis.c (do_estimate_growth_1): Check that caller
is optimized.
* ipa-inline.c (can_inline_edge_p): Not optimized functions are
uninlinable.
(can_inline_edge_p): Check flag_pcc_struct_return for match.
(check_callers): Give up on caller which is not optimized.
(inline_small_functions): Likewise.
(ipa_inline): Do not give up when not optimizing.
* ipa-visbility.c (function_and_variable_visibility): Do not optimize
away unoptimizes cdtors.
(whole_program_function_and_variable_visibility): Do
ipa_discover_readonly_nonaddressable_vars in LTO mode.
* ipa.c (process_references): Do not check optimize.
(symbol_table::remove_unreachable_nodes): Update optimize check.
(set_writeonly_bit): Update optimize check.
(pass_ipa_cdtor_merge::gate): Do not check optimize.
(pass_ipa_single_use::gate): Remove.
From-SVN: r250048
Diffstat (limited to 'gcc/ipa-inline.c')
-rw-r--r-- | gcc/ipa-inline.c | 38 |
1 files changed, 25 insertions, 13 deletions
diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 3ec7fd1..608db8f 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -322,6 +322,11 @@ can_inline_edge_p (struct cgraph_edge *e, bool report, e->inline_failed = CIF_BODY_NOT_AVAILABLE; inlinable = false; } + if (!early && !opt_for_fn (callee->decl, optimize)) + { + e->inline_failed = CIF_FUNCTION_NOT_OPTIMIZED; + inlinable = false; + } else if (callee->calls_comdat_local) { e->inline_failed = CIF_USES_COMDAT_LOCAL; @@ -402,6 +407,7 @@ can_inline_edge_p (struct cgraph_edge *e, bool report, Not even for always_inline declared functions. */ else if (check_match (flag_wrapv) || check_match (flag_trapv) + || check_match (flag_pcc_struct_return) /* When caller or callee does FP math, be sure FP codegen flags compatible. */ || ((caller_info->fp_expressions && callee_info->fp_expressions) @@ -939,7 +945,8 @@ check_callers (struct cgraph_node *node, void *has_hot_call) struct cgraph_edge *e; for (e = node->callers; e; e = e->next_caller) { - if (!opt_for_fn (e->caller->decl, flag_inline_functions_called_once)) + if (!opt_for_fn (e->caller->decl, flag_inline_functions_called_once) + || !opt_for_fn (e->caller->decl, optimize)) return true; if (!can_inline_edge_p (e, true)) return true; @@ -1746,7 +1753,8 @@ inline_small_functions (void) if (!node->global.inlined_to) { if (!node->alias && node->analyzed - && (node->has_gimple_body_p () || node->thunk.thunk_p)) + && (node->has_gimple_body_p () || node->thunk.thunk_p) + && opt_for_fn (node->decl, optimize)) { struct ipa_fn_summary *info = ipa_fn_summaries->get (node); struct ipa_dfs_info *dfs = (struct ipa_dfs_info *) node->aux; @@ -1768,12 +1776,13 @@ inline_small_functions (void) int id = dfs->scc_no + 1; for (n2 = node; n2; n2 = ((struct ipa_dfs_info *) node->aux)->next_cycle) - { - struct ipa_fn_summary *info2 = ipa_fn_summaries->get (n2); - if (info2->scc_no) - break; - info2->scc_no = id; - } + if (opt_for_fn (n2->decl, optimize)) + { + struct ipa_fn_summary *info2 = ipa_fn_summaries->get (n2); + if (info2->scc_no) + break; + info2->scc_no = id; + } } } @@ -1801,6 +1810,9 @@ inline_small_functions (void) struct cgraph_edge *next = NULL; bool has_speculative = false; + if (!opt_for_fn (node->decl, optimize)) + continue; + if (dump_file) fprintf (dump_file, "Enqueueing calls in %s.\n", node->dump_name ()); @@ -2369,9 +2381,6 @@ ipa_inline (void) int cold; bool remove_functions = false; - if (!optimize) - return 0; - cgraph_freq_base_rec = (sreal) 1 / (sreal) CGRAPH_FREQ_BASE; percent_rec = (sreal) 1 / (sreal) 100; @@ -2467,6 +2476,10 @@ ipa_inline (void) struct cgraph_edge *edge, *next; bool update=false; + if (!opt_for_fn (node->decl, optimize) + || !opt_for_fn (node->decl, flag_inline_functions_called_once)) + continue; + for (edge = node->callees; edge; edge = next) { next = edge->next_callee; @@ -2499,8 +2512,7 @@ ipa_inline (void) } /* Free ipa-prop structures if they are no longer needed. */ - if (optimize) - ipa_free_all_structures_after_iinln (); + ipa_free_all_structures_after_iinln (); if (dump_file) { |