This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: gcc-4_9 inlines less funcs than gcc-4_8 because of used_as_abstract_origin flag.


Hi,
this is patch I commited to mainline

2014-11-22  Jan Hubicka  <hubicka@ucw.cz>

	* ipa.c (symbol_table::remove_unreachable_nodes): Mark all inline clones
	as having abstract origin used.
	* ipa-inline-transform.c (can_remove_node_now_p_1): Drop abstract origin check.
	(clone_inlined_nodes): Copy abstract originflag.
	* ipa-cgraph.c (working): Use get_create to get abstract origin node.
Index: ipa.c
===================================================================
--- ipa.c	(revision 217890)
+++ ipa.c	(working copy)
@@ -360,9 +360,18 @@ symbol_table::remove_unreachable_nodes (
 	      && DECL_ABSTRACT_ORIGIN (node->decl))
 	    {
 	      struct cgraph_node *origin_node
-	      = cgraph_node::get_create (DECL_ABSTRACT_ORIGIN (node->decl));
-	      origin_node->used_as_abstract_origin = true;
-	      enqueue_node (origin_node, &first, &reachable);
+	      = cgraph_node::get (DECL_ABSTRACT_ORIGIN (node->decl));
+	      if (origin_node && !origin_node->used_as_abstract_origin)
+		{
+	          origin_node->used_as_abstract_origin = true;
+		  gcc_assert (!origin_node->prev_sibling_clone);
+		  gcc_assert (!origin_node->next_sibling_clone);
+		  for (cgraph_node *n = origin_node->clones; n;
+		       n = n->next_sibling_clone)
+		    if (n->decl == DECL_ABSTRACT_ORIGIN (node->decl))
+		      n->used_as_abstract_origin = true;
+	          enqueue_node (origin_node, &first, &reachable);
+		}
 	    }
 	  /* If any symbol in a comdat group is reachable, force
 	     all externally visible symbols in the same comdat
Index: ipa-inline-transform.c
===================================================================
--- ipa-inline-transform.c	(revision 217890)
+++ ipa-inline-transform.c	(working copy)
@@ -100,7 +100,6 @@ can_remove_node_now_p_1 (struct cgraph_n
      the callgraph so references can point to it.  */
   return (!node->address_taken
 	  && !node->has_aliases_p ()
-	  && !node->used_as_abstract_origin
 	  && node->can_remove_if_no_direct_calls_p ()
 	  /* Inlining might enable more devirtualizing, so we want to remove
 	     those only after all devirtualizable virtual calls are processed.
@@ -218,6 +217,7 @@ clone_inlined_nodes (struct cgraph_edge
 				       update_original, vNULL, true,
 				       inlining_into,
 				       NULL);
+	  n->used_as_abstract_origin = e->callee->used_as_abstract_origin;
 	  e->redirect_callee (n);
 	}
     }
Index: lto-cgraph.c
===================================================================
--- lto-cgraph.c	(revision 217890)
+++ lto-cgraph.c	(working copy)
@@ -877,7 +877,8 @@ compute_ltrans_boundary (lto_symtab_enco
       if (DECL_ABSTRACT_ORIGIN (node->decl))
 	{
 	  struct cgraph_node *origin_node
-	  = cgraph_node::get (DECL_ABSTRACT_ORIGIN (node->decl));
+	  = cgraph_node::get_create (DECL_ABSTRACT_ORIGIN (node->decl));
+	  origin_node->used_as_abstract_origin = true;
 	  add_node_to (encoder, origin_node, true);
 	}
     }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]