From: Jan Hubicka Date: Fri, 4 Dec 2015 18:02:26 +0000 (+0100) Subject: * ipa-inline.c (can_inline_edge_p) Use merged_comdat. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=88636b62bc7fae0ef7eaac6a22e5cd8107e69be8;p=gcc.git * ipa-inline.c (can_inline_edge_p) Use merged_comdat. * cgraphclones.c (cgraph_node::create_clone): Use merged_comdat. * cgraph.c (cgraph_node::dump): Dump merged_comdat. * ipa-icf.c (sem_function::merge): Drop merged_comdat when merging comdat and non-comdat. * cgraph.h (cgraph_node): Rename merged to merged_comdat. * ipa-inline-analysis.c (simple_edge_hints): Check both merged_comdat and icf_merged. * lto-symtab.c (lto_cgraph_replace_node): Update code computing merged_comdat. From-SVN: r231291 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b25e6430f9b..8b90447f105 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2015-12-04 Jan Hubicka + + * ipa-inline.c (can_inline_edge_p) Use merged_comdat. + * cgraphclones.c (cgraph_node::create_clone): Use merged_comdat. + * cgraph.c (cgraph_node::dump): Dump merged_comdat. + * ipa-icf.c (sem_function::merge): Drop merged_comdat when merging + comdat and non-comdat. + * cgraph.h (cgraph_node): Rename merged to merged_comdat. + * ipa-inline-analysis.c (simple_edge_hints): Check both merged_comdat + and icf_merged. + 2015-12-04 Paolo Bonzini * c-family/c-common.c (maybe_warn_shift_overflow): Warn on all diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 3ee1907c335..2a559785bf8 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -1994,6 +1994,8 @@ cgraph_node::dump (FILE *f) fprintf (f, " tm_clone"); if (icf_merged) fprintf (f, " icf_merged"); + if (merged_comdat) + fprintf (f, " merged_comdat"); if (nonfreeing_fn) fprintf (f, " nonfreeing_fn"); if (DECL_STATIC_CONSTRUCTOR (decl)) diff --git a/gcc/cgraph.h b/gcc/cgraph.h index 6cff4468cc0..e689fcd09d1 100644 --- a/gcc/cgraph.h +++ b/gcc/cgraph.h @@ -1333,7 +1333,7 @@ public: accesses trapping. */ unsigned nonfreeing_fn : 1; /* True if there was multiple COMDAT bodies merged by lto-symtab. */ - unsigned merged : 1; + unsigned merged_comdat : 1; /* True if function was created to be executed in parallel. */ unsigned parallelized_function : 1; /* True if function is part split out by ipa-split. */ diff --git a/gcc/cgraphclones.c b/gcc/cgraphclones.c index 143ca33d93a..f8a7d3763f8 100644 --- a/gcc/cgraphclones.c +++ b/gcc/cgraphclones.c @@ -433,7 +433,7 @@ cgraph_node::create_clone (tree new_decl, gcov_type gcov_count, int freq, new_node->tp_first_run = tp_first_run; new_node->tm_clone = tm_clone; new_node->icf_merged = icf_merged; - new_node->merged = merged; + new_node->merged_comdat = merged_comdat; new_node->clone.tree_map = NULL; new_node->clone.args_to_skip = args_to_skip; diff --git a/gcc/ipa-icf.c b/gcc/ipa-icf.c index 0c76672a2c6..18039ef7afd 100644 --- a/gcc/ipa-icf.c +++ b/gcc/ipa-icf.c @@ -1352,10 +1352,15 @@ sem_function::merge (sem_item *alias_item) gcc_assert (alias->icf_merged || remove || redirect_callers); original->icf_merged = true; - /* Inform the inliner about cross-module merging. */ - if ((original->lto_file_data || alias->lto_file_data) - && original->lto_file_data != alias->lto_file_data) - local_original->merged = original->merged = true; + /* We use merged flag to track cases where COMDAT function is known to be + compatible its callers. If we merged in non-COMDAT, we need to give up + on this optimization. */ + if (original->merged_comdat && !alias->merged_comdat) + { + if (dump_file) + fprintf (dump_file, "Dropping merged_comdat flag.\n\n"); + local_original->merged_comdat = original->merged_comdat = false; + } if (remove) { diff --git a/gcc/ipa-inline-analysis.c b/gcc/ipa-inline-analysis.c index cf7766b7d14..6392083d6be 100644 --- a/gcc/ipa-inline-analysis.c +++ b/gcc/ipa-inline-analysis.c @@ -3708,7 +3708,7 @@ simple_edge_hints (struct cgraph_edge *edge) if (callee->lto_file_data && edge->caller->lto_file_data && edge->caller->lto_file_data != callee->lto_file_data - && !callee->merged) + && !callee->merged_comdat && !callee->icf_merged) hints |= INLINE_HINT_cross_module; return hints; diff --git a/gcc/ipa-inline.c b/gcc/ipa-inline.c index 01bfe0effda..f2fd84ba66b 100644 --- a/gcc/ipa-inline.c +++ b/gcc/ipa-inline.c @@ -466,7 +466,7 @@ can_inline_edge_p (struct cgraph_edge *e, bool report, optimized with the optimization flags of module they are used in. Also do not care about mixing up size/speed optimization when DECL_DISREGARD_INLINE_LIMITS is set. */ - else if ((callee->merged + else if ((callee->merged_comdat && !lookup_attribute ("optimize", DECL_ATTRIBUTES (caller->decl))) || DECL_DISREGARD_INLINE_LIMITS (callee->decl)) diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog index a508999e0f6..df2eaa9483e 100644 --- a/gcc/lto/ChangeLog +++ b/gcc/lto/ChangeLog @@ -1,3 +1,8 @@ +2015-12-04 Jan Hubicka + + * lto-symtab.c (lto_cgraph_replace_node): Update code computing + merged_comdat. + 2015-12-01 Jan Hubicka * lto.c (compare_tree_sccs_1): Do not compare TYPE_ALIAS_SET. diff --git a/gcc/lto/lto-symtab.c b/gcc/lto/lto-symtab.c index 235df67e2ce..e5055b593a8 100644 --- a/gcc/lto/lto-symtab.c +++ b/gcc/lto/lto-symtab.c @@ -63,8 +63,9 @@ lto_cgraph_replace_node (struct cgraph_node *node, gcc_assert (!prevailing_node->global.inlined_to); prevailing_node->mark_address_taken (); } - if (node->definition && prevailing_node->definition) - prevailing_node->merged = true; + if (node->definition && prevailing_node->definition + && DECL_COMDAT (node->decl) && DECL_COMDAT (prevailing_node->decl)) + prevailing_node->merged_comdat = true; /* Redirect all incoming edges. */ compatible_p