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