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 <rguent...@suse.de>
Novell / SUSE Labs
SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746
GF: Jeff Hawn, Jennifer Guild, Felix Imendörffer

Reply via email to