diff mbox

-fstrict-aliasing fixes 6/6: permit inlining of comdats

Message ID 20151204180425.GA55053@kam.mff.cuni.cz
State New
Headers show

Commit Message

Jan Hubicka Dec. 4, 2015, 6:04 p.m. UTC
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.

Comments

H.J. Lu Dec. 4, 2015, 11:39 p.m. UTC | #1
On Fri, Dec 4, 2015 at 10:04 AM, Jan Hubicka <hubicka@ucw.cz> wrote:
> 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.

This may have caused:

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68708


H.J.
diff mbox

Patch

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