From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 8356 invoked by alias); 22 Feb 2010 15:45:07 -0000 Received: (qmail 8297 invoked by uid 22791); 22 Feb 2010 15:45:05 -0000 X-SWARE-Spam-Status: No, hits=-2.4 required=5.0 tests=AWL,BAYES_00 X-Spam-Check-By: sourceware.org Received: from nikam-dmz.ms.mff.cuni.cz (HELO nikam.ms.mff.cuni.cz) (195.113.20.16) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 22 Feb 2010 15:44:58 +0000 Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id B18FA9ACAFE; Mon, 22 Feb 2010 16:44:55 +0100 (CET) Date: Mon, 22 Feb 2010 15:52:00 -0000 From: Jan Hubicka To: Martin Jambor Cc: GCC Patches , Jan Hubicka Subject: Re: [PATCH 2/6] Indirect call graph edges Message-ID: <20100222154455.GB3026@kam.mff.cuni.cz> References: <20100213180136.555197900@alvy.suse.cz> <20100213180157.129177066@alvy.suse.cz> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20100213180157.129177066@alvy.suse.cz> 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: 2010-02/txt/msg00876.txt.bz2 > 2010-02-10 Martin Jambor > > * cgraph.h (struct cgraph_node): New field indirect_calls. > (struct cgraph_indirect_call_info): New type. > (struct cgraph_edge): Removed field indirect_call. New fields > indirect_info, indirect_inlining_edge and indirect_unknown_callee. > (cgraph_create_indirect_edge): Declare. > (cgraph_make_edge_direct): Likewise. > (enum LTO_cgraph_tags): New item LTO_cgraph_indirect_edge. > * ipa-prop.h (struct ipa_param_call_note): Removed. > (struct ipa_node_params): Removed field param_calls. > * cgraph.c (cgraph_add_edge_to_call_site_hash): New function. > (cgraph_edge): Search also among the indirect edges, use > cgraph_add_edge_to_call_site_hash to add edges to the call site hash. > (cgraph_set_call_stmt): Possibly turn an indirect edge into a direct > one, use cgraph_add_edge_to_call_site_hash to add edges to the call > site hash. > (initialize_inline_failed): Assign a reason to indirect edges. > (cgraph_create_edge_1): New function. > (cgraph_create_edge): Moved some functionality to > cgraph_create_edge_1. > (cgraph_create_indirect_edge): New function. > (cgraph_edge_remove_callee): Add an assert checking for > non-indirectness. > (cgraph_edge_remove_caller): Special-case indirect edges. > (cgraph_remove_edge): Likewise. > (cgraph_set_edge_callee): New function. > (cgraph_redirect_edge_callee): Use cgraph_set_edge_callee. > (cgraph_make_edge_direct): New function. > (cgraph_update_edges_for_call_stmt_node): Do nothing only when also > the declaration of the call statement matches. > (cgraph_node_remove_callees): Special-case indirect edges. > (cgraph_clone_edge): Likewise. > (cgraph_clone_node): Clone also the indirect edges. > (dump_cgraph_node): Dump indirect_inlining_edge flag instead of > indirect_call, dump count of indirect_calls edges. > * ipa-prop.c (ipa_note_param_call): Create indirect edges instead of > creating notes. New parameter node. > (ipa_analyze_call_uses): New parameter node, pass it on to > ipa_note_param_call. > (ipa_analyze_stmt_uses): Likewise. > (ipa_analyze_params_uses): Pass node to ipa_analyze_stmt_uses. > (print_edge_addition_message): Work on edges rather than on notes. > (update_call_notes_after_inlining): Likewise. > (ipa_free_node_params_substructures): Do not free notes. > (ipa_node_duplication_hook): Do not duplicate notes. > (ipa_write_param_call_note): Removed. > (ipa_read_param_call_note): Removed. > (ipa_write_indirect_edge_info): New function. > (ipa_read_indirect_edge_info): Likewise. > (ipa_write_node_info): Do not stream notes, do stream information > in indirect edges. > (ipa_read_node_info): Likewise. > (lto_ipa_fixup_call_notes): Removed. > * ipa-cp.c (pass_ipa_cp): Set stmt_fixup to NULL. > * ipa-inline.c (pass_ipa_inline): Likewise. > * cgraphunit.c (verify_cgraph_node): Check also indirect edges. > * cif-code.def (INDIRECT_UNKNOWN_CALL): New reason. > * tree-inline.c (copy_bb): Removed an unnecessary double check for > is_gimple_call. > * tree-inline.c (get_indirect_callee_fndecl): Do not consider indirect > edges. > * lto-cgraph.c (output_outgoing_cgraph_edges): New function. > (output_cgraph): Stream also indirect edges. > (lto_output_edge): Added capability to stream indirect edges. > (input_edge): Likewise. > (input_cgraph_1): Likewise. > > * testsuite/gcc.dg/lto/20091209-1_0.c: New testcase. OK (for pretty-ipa). As Richard commented, we will need way of collecting list of indirect callers for need of passes propagating data across callgraph. That can be done incrementally. We need way to get list of possible destinations that should be fed in by PTA. Honza