public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [RFA] Cgraph alias reorg 7/14 (no longer try to diable devirtualization on thunks)
@ 2011-06-10 13:23 Jan Hubicka
  2011-06-10 13:53 ` Richard Guenther
  0 siblings, 1 reply; 2+ messages in thread
From: Jan Hubicka @ 2011-06-10 13:23 UTC (permalink / raw)
  To: gcc-patches, mjambor, rguenther

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?

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.  */

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [RFA] Cgraph alias reorg 7/14 (no longer try to diable devirtualization on thunks)
  2011-06-10 13:23 [RFA] Cgraph alias reorg 7/14 (no longer try to diable devirtualization on thunks) Jan Hubicka
@ 2011-06-10 13:53 ` Richard Guenther
  0 siblings, 0 replies; 2+ messages in thread
From: Richard Guenther @ 2011-06-10 13:53 UTC (permalink / raw)
  To: Jan Hubicka; +Cc: gcc-patches, mjambor

[-- Attachment #1: Type: TEXT/PLAIN, Size: 6366 bytes --]

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-06-10 13:31 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-10 13:23 [RFA] Cgraph alias reorg 7/14 (no longer try to diable devirtualization on thunks) Jan Hubicka
2011-06-10 13:53 ` Richard Guenther

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).