Hi,
this is the patch implementing renaming and fixing logic in ipa-icf/lto-symtab
WRT compuattion of this flag.  I don't seem to be able to construct testcase for
this: the merged flag is currently used in inliner only to decide whether to
ingore optimize_size/optimize levels which should not lead to wrong code and
I can't grep LTO dumps from testsuite.

Bootstrapped/regtested x86_64-linux, comitted
Honza

        * 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.
Index: cgraphclones.c
===================================================================
--- cgraphclones.c      (revision 231239)
+++ cgraphclones.c      (working copy)
@@ -433,7 +433,7 @@ cgraph_node::create_clone (tree new_decl
   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;
Index: ipa-icf.c
===================================================================
--- ipa-icf.c   (revision 231239)
+++ ipa-icf.c   (working copy)
@@ -1352,10 +1352,15 @@ sem_function::merge (sem_item *alias_ite
   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)
     {
Index: ipa-inline.c
===================================================================
--- ipa-inline.c        (revision 231239)
+++ ipa-inline.c        (working copy)
@@ -466,7 +466,7 @@ can_inline_edge_p (struct cgraph_edge *e
          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))
Index: ipa-inline-analysis.c
===================================================================
--- ipa-inline-analysis.c       (revision 231239)
+++ ipa-inline-analysis.c       (working copy)
@@ -3708,7 +3708,7 @@ simple_edge_hints (struct cgraph_edge *e
 
   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;
Index: cgraph.c
===================================================================
--- cgraph.c    (revision 231239)
+++ cgraph.c    (working copy)
@@ -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))
Index: cgraph.h
===================================================================
--- cgraph.h    (revision 231239)
+++ cgraph.h    (working copy)
@@ -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.  */
Index: lto/lto-symtab.c
===================================================================
--- lto/lto-symtab.c    (revision 231239)
+++ lto/lto-symtab.c    (working copy)
@@ -63,8 +63,9 @@ lto_cgraph_replace_node (struct cgraph_n
       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

Reply via email to