From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 11754 invoked by alias); 10 Jun 2011 13:03:19 -0000 Received: (qmail 11354 invoked by uid 22791); 10 Jun 2011 13:03:17 -0000 X-SWARE-Spam-Status: No, hits=-1.7 required=5.0 tests=AWL,BAYES_00,TW_DY,TW_FN,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from nikam.ms.mff.cuni.cz (HELO nikam.ms.mff.cuni.cz) (195.113.20.16) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 10 Jun 2011 13:02:54 +0000 Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id 192389AC86F; Fri, 10 Jun 2011 15:02:53 +0200 (CEST) Date: Fri, 10 Jun 2011 13:23:00 -0000 From: Jan Hubicka To: gcc-patches@gcc.gnu.org, mjambor@suse.cz, rguenther@suse.de Subject: [RFA] Cgraph alias reorg 7/14 (no longer try to diable devirtualization on thunks) Message-ID: <20110610130252.GE28776@kam.mff.cuni.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org X-SW-Source: 2011-06/txt/msg00835.txt.bz2 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. */