diff mbox

Fix partitioning of inline thunks

Message ID 20160515221909.GB33559@kam.mff.cuni.cz
State New
Headers show

Commit Message

Jan Hubicka May 15, 2016, 10:19 p.m. UTC
Hi,
this patch fixes the partitioner WRT inlined thunks. When thunk is offline, we
must place it into the same unit as its target (because ASM thunk output machinery
is not designed for non-local calls). However when thunk is inlined it behave
like other functions and in particular we do not want to drag inline clone into
an unit where it is defined.

I hope this fixed the xalancbmk ICE reported, but I did not double check since
I do not have build tree handy.  It fixed Firefox ICE at sameplace that appears
after applying the previous patch.

Bootstrapped/regtested x86_64-linux, will commit it tomorrow.

	* lto-cgraph.c (compute_ltrans_boundary, output_symtab): Fix handling
	of inline thunks

	* lto-partition.c (add_symbol_to_partition_1): Likewise.
diff mbox

Patch

Index: lto-cgraph.c
===================================================================
--- lto-cgraph.c	(revision 236211)
+++ lto-cgraph.c	(working copy)
@@ -972,7 +972,7 @@  compute_ltrans_boundary (lto_symtab_enco
       if (node->alias && node->analyzed)
 	create_references (encoder, node);
       if (cnode
-	  && cnode->thunk.thunk_p)
+	  && cnode->thunk.thunk_p && !cnode->global.inlined_to)
 	add_node_to (encoder, cnode->callees->callee, false);
       while (node->transparent_alias && node->analyzed)
 	{
@@ -1028,7 +1028,7 @@  output_symtab (void)
     {
       node = dyn_cast <cgraph_node *> (lto_symtab_encoder_deref (encoder, i));
       if (node
-	  && (node->thunk.thunk_p
+	  && ((node->thunk.thunk_p && !node->global.inlined_to)
 	      || lto_symtab_encoder_in_partition_p (encoder, node)))
 	{
 	  output_outgoing_cgraph_edges (node->callees, ob, encoder);
Index: lto/lto-partition.c
===================================================================
--- lto/lto-partition.c	(revision 236211)
+++ lto/lto-partition.c	(working copy)
@@ -163,7 +163,7 @@  add_symbol_to_partition_1 (ltrans_partit
 
       /* Add all thunks associated with the function.  */
       for (e = cnode->callers; e; e = e->next_caller)
-	if (e->caller->thunk.thunk_p)
+	if (e->caller->thunk.thunk_p && !e->caller->global.inlined_to)
 	  add_symbol_to_partition_1 (part, e->caller);
 
       /* Instrumented version is actually the same function.