Commit 88636b62 by Jan Hubicka Committed by 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.

	* lto-symtab.c (lto_cgraph_replace_node): Update code computing
	merged_comdat.

From-SVN: r231291
parent c5404f1c
2015-12-04 Jan Hubicka <hubicka@ucw.cz>
* 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 <bonzini@gnu.org> 2015-12-04 Paolo Bonzini <bonzini@gnu.org>
* c-family/c-common.c (maybe_warn_shift_overflow): Warn on all * c-family/c-common.c (maybe_warn_shift_overflow): Warn on all
...@@ -1994,6 +1994,8 @@ cgraph_node::dump (FILE *f) ...@@ -1994,6 +1994,8 @@ cgraph_node::dump (FILE *f)
fprintf (f, " tm_clone"); fprintf (f, " tm_clone");
if (icf_merged) if (icf_merged)
fprintf (f, " icf_merged"); fprintf (f, " icf_merged");
if (merged_comdat)
fprintf (f, " merged_comdat");
if (nonfreeing_fn) if (nonfreeing_fn)
fprintf (f, " nonfreeing_fn"); fprintf (f, " nonfreeing_fn");
if (DECL_STATIC_CONSTRUCTOR (decl)) if (DECL_STATIC_CONSTRUCTOR (decl))
......
...@@ -1333,7 +1333,7 @@ public: ...@@ -1333,7 +1333,7 @@ public:
accesses trapping. */ accesses trapping. */
unsigned nonfreeing_fn : 1; unsigned nonfreeing_fn : 1;
/* True if there was multiple COMDAT bodies merged by lto-symtab. */ /* 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. */ /* True if function was created to be executed in parallel. */
unsigned parallelized_function : 1; unsigned parallelized_function : 1;
/* True if function is part split out by ipa-split. */ /* True if function is part split out by ipa-split. */
......
...@@ -433,7 +433,7 @@ cgraph_node::create_clone (tree new_decl, gcov_type gcov_count, int freq, ...@@ -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->tp_first_run = tp_first_run;
new_node->tm_clone = tm_clone; new_node->tm_clone = tm_clone;
new_node->icf_merged = icf_merged; 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.tree_map = NULL;
new_node->clone.args_to_skip = args_to_skip; new_node->clone.args_to_skip = args_to_skip;
......
...@@ -1352,10 +1352,15 @@ sem_function::merge (sem_item *alias_item) ...@@ -1352,10 +1352,15 @@ sem_function::merge (sem_item *alias_item)
gcc_assert (alias->icf_merged || remove || redirect_callers); gcc_assert (alias->icf_merged || remove || redirect_callers);
original->icf_merged = true; original->icf_merged = true;
/* Inform the inliner about cross-module merging. */ /* We use merged flag to track cases where COMDAT function is known to be
if ((original->lto_file_data || alias->lto_file_data) compatible its callers. If we merged in non-COMDAT, we need to give up
&& original->lto_file_data != alias->lto_file_data) on this optimization. */
local_original->merged = original->merged = true; 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) if (remove)
{ {
......
...@@ -3708,7 +3708,7 @@ simple_edge_hints (struct cgraph_edge *edge) ...@@ -3708,7 +3708,7 @@ simple_edge_hints (struct cgraph_edge *edge)
if (callee->lto_file_data && edge->caller->lto_file_data if (callee->lto_file_data && edge->caller->lto_file_data
&& edge->caller->lto_file_data != callee->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; hints |= INLINE_HINT_cross_module;
return hints; return hints;
......
...@@ -466,7 +466,7 @@ can_inline_edge_p (struct cgraph_edge *e, bool report, ...@@ -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. optimized with the optimization flags of module they are used in.
Also do not care about mixing up size/speed optimization when Also do not care about mixing up size/speed optimization when
DECL_DISREGARD_INLINE_LIMITS is set. */ DECL_DISREGARD_INLINE_LIMITS is set. */
else if ((callee->merged else if ((callee->merged_comdat
&& !lookup_attribute ("optimize", && !lookup_attribute ("optimize",
DECL_ATTRIBUTES (caller->decl))) DECL_ATTRIBUTES (caller->decl)))
|| DECL_DISREGARD_INLINE_LIMITS (callee->decl)) || DECL_DISREGARD_INLINE_LIMITS (callee->decl))
......
2015-12-04 Jan Hubicka <hubicka@ucw.cz>
* lto-symtab.c (lto_cgraph_replace_node): Update code computing
merged_comdat.
2015-12-01 Jan Hubicka <hubicka@ucw.cz> 2015-12-01 Jan Hubicka <hubicka@ucw.cz>
* lto.c (compare_tree_sccs_1): Do not compare TYPE_ALIAS_SET. * lto.c (compare_tree_sccs_1): Do not compare TYPE_ALIAS_SET.
......
...@@ -63,8 +63,9 @@ lto_cgraph_replace_node (struct cgraph_node *node, ...@@ -63,8 +63,9 @@ lto_cgraph_replace_node (struct cgraph_node *node,
gcc_assert (!prevailing_node->global.inlined_to); gcc_assert (!prevailing_node->global.inlined_to);
prevailing_node->mark_address_taken (); prevailing_node->mark_address_taken ();
} }
if (node->definition && prevailing_node->definition) if (node->definition && prevailing_node->definition
prevailing_node->merged = true; && DECL_COMDAT (node->decl) && DECL_COMDAT (prevailing_node->decl))
prevailing_node->merged_comdat = true;
/* Redirect all incoming edges. */ /* Redirect all incoming edges. */
compatible_p compatible_p
......
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