[RFA] Cgraph alias reorg 7/14 (no longer try to diable devirtualization on thunks)

Richard Guenther rguenther@suse.de
Fri Jun 10 13:53:00 GMT 2011


On Fri, 10 Jun 2011, Jan Hubicka wrote:

> Hi,
> code to refuse thunks in gimple_get_virt_method_for_binfo is no-op since I
> comitted the thunk rewrite: thunks no longer have same_bodyy_alias flag set.
> Only case where it chould diable the devirtualization is when NODE is NULL,
> but that won't really happen for thunks anyway.
> Consequentely this patch removes the code.
> 
> Regtested/bootstrapped x86_64-linux, OK?

Ok.

Thanks,
Richard.

> Honza
> 
> 	* ipa-cp.c (ipcp_process_devirtualization_opportunities):
> 	Update call of gimple_get_virt_method_for_binfo.
> 	* gimple-fold.c (gimple_get_virt_method_for_binfo): Remove
> 	refuse_thunks parameter.
> 	(gimple_fold_call): Update.
> 	* ipa-prop.c (try_make_edge_direct_virtual_call): Update.
> Index: ipa-cp.c
> ===================================================================
> *** ipa-cp.c	(revision 174895)
> --- ipa-cp.c	(working copy)
> *************** ipcp_process_devirtualization_opportunit
> *** 1190,1197 ****
>   	  binfo = get_binfo_at_offset (binfo, anc_offset, otr_type);
>   	  if (!binfo)
>   	    continue;
> ! 	  target = gimple_get_virt_method_for_binfo (token, binfo, &delta,
> ! 						     false);
>   	}
>         else
>   	{
> --- 1190,1196 ----
>   	  binfo = get_binfo_at_offset (binfo, anc_offset, otr_type);
>   	  if (!binfo)
>   	    continue;
> ! 	  target = gimple_get_virt_method_for_binfo (token, binfo, &delta);
>   	}
>         else
>   	{
> *************** ipcp_process_devirtualization_opportunit
> *** 1214,1220 ****
>   		  break;
>   		}
>   
> ! 	      t = gimple_get_virt_method_for_binfo (token, binfo, &d, true);
>   	      if (!t)
>   		{
>   		  target = NULL_TREE;
> --- 1213,1219 ----
>   		  break;
>   		}
>   
> ! 	      t = gimple_get_virt_method_for_binfo (token, binfo, &d);
>   	      if (!t)
>   		{
>   		  target = NULL_TREE;
> Index: gimple-fold.c
> ===================================================================
> *** gimple-fold.c	(revision 174895)
> --- gimple-fold.c	(working copy)
> *************** gimple_fold_builtin (gimple stmt)
> *** 1373,1383 ****
>   
>   tree
>   gimple_get_virt_method_for_binfo (HOST_WIDE_INT token, tree known_binfo,
> ! 				  tree *delta, bool refuse_thunks)
>   {
>     HOST_WIDE_INT i;
>     tree v, fndecl;
> -   struct cgraph_node *node;
>   
>     v = BINFO_VIRTUALS (known_binfo);
>     /* If there is no virtual methods leave the OBJ_TYPE_REF alone.  */
> --- 1373,1382 ----
>   
>   tree
>   gimple_get_virt_method_for_binfo (HOST_WIDE_INT token, tree known_binfo,
> ! 				  tree *delta)
>   {
>     HOST_WIDE_INT i;
>     tree v, fndecl;
>   
>     v = BINFO_VIRTUALS (known_binfo);
>     /* If there is no virtual methods leave the OBJ_TYPE_REF alone.  */
> *************** gimple_get_virt_method_for_binfo (HOST_W
> *** 1396,1413 ****
>       return NULL_TREE;
>   
>     fndecl = TREE_VALUE (v);
> -   node = cgraph_get_node_or_alias (fndecl);
> -   if (refuse_thunks
> -       && (!node
> -     /* Bail out if it is a thunk declaration.  Since simple this_adjusting
> -        thunks are represented by a constant in TREE_PURPOSE of items in
> -        BINFO_VIRTUALS, this is a more complicate type which we cannot handle as
> -        yet.
> - 
> -        FIXME: Remove the following condition once we are able to represent
> -        thunk information on call graph edges.  */
> - 	  || (node->same_body_alias && node->thunk.thunk_p)))
> -     return NULL_TREE;
>   
>     /* When cgraph node is missing and function is not public, we cannot
>        devirtualize.  This can happen in WHOPR when the actual method
> --- 1395,1400 ----
> *************** gimple_fold_call (gimple_stmt_iterator *
> *** 1557,1563 ****
>         if (!binfo)
>   	return false;
>         token = TREE_INT_CST_LOW (OBJ_TYPE_REF_TOKEN (callee));
> !       fndecl = gimple_get_virt_method_for_binfo (token, binfo, &delta, false);
>         if (!fndecl)
>   	return false;
>         gcc_assert (integer_zerop (delta));
> --- 1544,1550 ----
>         if (!binfo)
>   	return false;
>         token = TREE_INT_CST_LOW (OBJ_TYPE_REF_TOKEN (callee));
> !       fndecl = gimple_get_virt_method_for_binfo (token, binfo, &delta);
>         if (!fndecl)
>   	return false;
>         gcc_assert (integer_zerop (delta));
> Index: ipa-prop.c
> ===================================================================
> *** ipa-prop.c	(revision 174895)
> --- ipa-prop.c	(working copy)
> *************** try_make_edge_direct_virtual_call (struc
> *** 1771,1777 ****
>     type = ie->indirect_info->otr_type;
>     binfo = get_binfo_at_offset (binfo, ie->indirect_info->anc_offset, type);
>     if (binfo)
> !     target = gimple_get_virt_method_for_binfo (token, binfo, &delta, true);
>     else
>       return NULL;
>   
> --- 1771,1777 ----
>     type = ie->indirect_info->otr_type;
>     binfo = get_binfo_at_offset (binfo, ie->indirect_info->anc_offset, type);
>     if (binfo)
> !     target = gimple_get_virt_method_for_binfo (token, binfo, &delta);
>     else
>       return NULL;
>   
> Index: gimple.h
> ===================================================================
> *** gimple.h	(revision 174895)
> --- gimple.h	(working copy)
> *************** unsigned get_gimple_rhs_num_ops (enum tr
> *** 904,910 ****
>   gimple gimple_alloc_stat (enum gimple_code, unsigned MEM_STAT_DECL);
>   const char *gimple_decl_printable_name (tree, int);
>   bool gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace);
> ! tree gimple_get_virt_method_for_binfo (HOST_WIDE_INT, tree, tree *, bool);
>   void gimple_adjust_this_by_delta (gimple_stmt_iterator *, tree);
>   tree gimple_extract_devirt_binfo_from_cst (tree);
>   /* Returns true iff T is a valid GIMPLE statement.  */
> --- 904,910 ----
>   gimple gimple_alloc_stat (enum gimple_code, unsigned MEM_STAT_DECL);
>   const char *gimple_decl_printable_name (tree, int);
>   bool gimple_fold_call (gimple_stmt_iterator *gsi, bool inplace);
> ! tree gimple_get_virt_method_for_binfo (HOST_WIDE_INT, tree, tree *);
>   void gimple_adjust_this_by_delta (gimple_stmt_iterator *, tree);
>   tree gimple_extract_devirt_binfo_from_cst (tree);
>   /* Returns true iff T is a valid GIMPLE statement.  */
> 
> 

-- 
Richard Guenther <rguenther@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer


More information about the Gcc-patches mailing list