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

Jan Hubicka hubicka@ucw.cz
Fri Jun 10 13:23:00 GMT 2011


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



More information about the Gcc-patches mailing list