aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/cgraph.c2
-rw-r--r--gcc/cgraph.h2
-rw-r--r--gcc/cgraphclones.c2
-rw-r--r--gcc/ipa-icf.c13
-rw-r--r--gcc/ipa-inline-analysis.c2
-rw-r--r--gcc/ipa-inline.c2
-rw-r--r--gcc/lto/ChangeLog5
-rw-r--r--gcc/lto/lto-symtab.c5
9 files changed, 34 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b25e643..8b90447 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+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>
* c-family/c-common.c (maybe_warn_shift_overflow): Warn on all
diff --git a/gcc/cgraph.c b/gcc/cgraph.c
index 3ee1907..2a55978 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 6cff446..e689fcd 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 143ca33..f8a7d37 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 0c76672..18039ef 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 cf7766b..6392083 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 01bfe0e..f2fd84b 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 a508999..df2eaa9 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,8 @@
+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>
* 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 235df67..e5055b5 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