From patchwork Mon Apr 11 14:15:42 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Jambor X-Patchwork-Id: 90604 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id A31B6B6F18 for ; Tue, 12 Apr 2011 00:15:55 +1000 (EST) Received: (qmail 1818 invoked by alias); 11 Apr 2011 14:15:52 -0000 Received: (qmail 1807 invoked by uid 22791); 11 Apr 2011 14:15:50 -0000 X-SWARE-Spam-Status: No, hits=-4.6 required=5.0 tests=AWL, BAYES_50, RCVD_IN_DNSWL_HI, TW_BJ, TW_UV, TW_VC X-Spam-Check-By: sourceware.org Received: from cantor.suse.de (HELO mx1.suse.de) (195.135.220.2) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 11 Apr 2011 14:15:44 +0000 Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.221.2]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id 1710F93F46; Mon, 11 Apr 2011 16:15:43 +0200 (CEST) Date: Mon, 11 Apr 2011 16:15:42 +0200 From: Martin Jambor To: Jan Hubicka Cc: GCC Patches Subject: Re: [PATCH 4/7] Removal of cgraph_node function Message-ID: <20110411141542.GC1659@virgil.arch.suse.de> Mail-Followup-To: Jan Hubicka , GCC Patches References: <20110406232220.922143392@virgil.suse.cz> <20110406232245.685459535@virgil.suse.cz> <20110411102836.GD32348@kam.mff.cuni.cz> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20110411102836.GD32348@kam.mff.cuni.cz> User-Agent: Mutt/1.5.21 (2010-09-15) X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, On Mon, Apr 11, 2011 at 12:28:36PM +0200, Jan Hubicka wrote: > > 2011-04-06 Martin Jambor > > > > * cgraph.h (cgraph_node): Remove function declaration. > > (cgraph_create_node): Declare. > > (cgraph_get_create_node): Likewise. > > > > * cgraph.c (cgraph_create_node): Renamed to cgraph_create_node_1. > > Updated all callers. > > (cgraph_node): Renamed to cgraph_create_node, assert that a node for > > the decl does not already exist. Call cgraph_get_create_node instead > > of cgraph_node. > > (cgraph_get_create_node): New function. > > (cgraph_same_body_alias): Update comment. > > (cgraph_set_call_stmt): Call cgraph_get_node instead of cgraph_node, > > assert it does not return NULL. > > (cgraph_update_edges_for_call_stmt): Likewise. > > (cgraph_clone_edge): Likewise. > > (cgraph_create_virtual_clone): Likewise. > > (cgraph_update_edges_for_call_stmt_node): Call cgraph_get_create_node > > instead of cgraph_node. > > (cgraph_add_new_function): Call cgraph_create_node or > > cgraph_get_create_node instead of cgraph_node. > > > > * cgraphbuild.c (record_reference): Call cgraph_get_create_node > > instead of cgraph_node. > > (record_eh_tables): Likewise. > > (mark_address): Likewise. > > (mark_load): Likewise. > > (build_cgraph_edges): Call cgraph_get_create_node instead > > of cgraph_node. > > (rebuild_cgraph_edges): Likewise. > > > > * cgraphunit.c (cgraph_finalize_function): Call cgraph_get_create_node > > instead of cgraph_node. > > (cgraph_copy_node_for_versioning): Call cgraph_create_node instead of > > cgraph_node. > > > > * lto-symtab.c (lto_symtab_merge_cgraph_nodes_1): Call > > cgraph_create_node instead of cgraph_node. > > > > * c-decl.c (finish_function): Call cgraph_get_create_node instead > > of cgraph_node. > > * lto-cgraph.c (input_node): Likewise. > > * lto-streamer-in.c (input_function): Likewise. > > * varasm.c (mark_decl_referenced): Likewise. > > (assemble_alias): Likewise. > > > > gcc/c-family/ > > * c-gimplify.c (c_genericize): Call cgraph_get_create_node instead > > of cgraph_node. > > > > gcc/cp/ > > * cp/class.c (cp_fold_obj_type_ref): Call cgraph_get_create_node > > instead of cgraph_node. > > * cp/decl2.c (cxx_callgraph_analyze_expr): Likewise. > > (cp_write_global_declarations): Likewise. > > * cp/optimize.c (maybe_clone_body): Likewise. > > * cp/semantics.c (maybe_add_lambda_conv_op): Likewise. > > * cp/mangle.c (mangle_decl): Likewise. > > * cp/method.c (make_alias_for_thunk): Likewise. > > (use_thunk): Likewise. > > > > gcc/ada/ > > * gcc-interface/utils.c (end_subprog_body): Call > > cgraph_get_create_node instead of cgraph_node. > > > > gcc/fortran/ > > * trans-decl.c (gfc_generate_function_code): Call > > cgraph_get_create_node instead of cgraph_node. > > > > gcc/objc/ > > * objc-act.c (mark_referenced_methods): Call cgraph_get_create_node > > instead of cgraph_node. > > OK. > > Index: src/gcc/lto-cgraph.c > > =================================================================== > > --- src.orig/gcc/lto-cgraph.c > > +++ src/gcc/lto-cgraph.c > > @@ -1045,7 +1045,7 @@ input_node (struct lto_file_decl_data *f > > 0, CGRAPH_FREQ_BASE, 0, false, NULL); > > } > > else > > - node = cgraph_node (fn_decl); > > + node = cgraph_get_create_node (fn_decl); > > > > node->count = lto_input_sleb128 (ib); > > node->count_materialization_scale = lto_input_sleb128 (ib); > > Index: src/gcc/lto-streamer-in.c > > =================================================================== > > --- src.orig/gcc/lto-streamer-in.c > > +++ src/gcc/lto-streamer-in.c > > @@ -1301,7 +1301,7 @@ input_function (tree fn_decl, struct dat > > DECL_INITIAL (fn_decl) = lto_input_tree (ib, data_in); > > gcc_assert (DECL_INITIAL (fn_decl)); > > DECL_SAVED_TREE (fn_decl) = NULL_TREE; > > - node = cgraph_node (fn_decl); > > + node = cgraph_get_create_node (fn_decl); > > I would expect those two to be cgraph_create_node and cgraph_get_node or we > have latent bug somewhere. Did you have particular reason for the choice here? > I guess we can handle this incrementally. cgraph_create_node was aborting on the assert. I don't remember on which testcases(s) but they are in our testcase so we can have a look. > > Index: src/gcc/cgraphbuild.c > > =================================================================== > > --- src.orig/gcc/cgraphbuild.c > > +++ src/gcc/cgraphbuild.c > > @@ -74,9 +74,9 @@ record_reference (tree *tp, int *walk_su > > if (TREE_CODE (decl) == FUNCTION_DECL) > > { > > if (!ctx->only_vars) > > - cgraph_mark_address_taken_node (cgraph_node (decl)); > > + cgraph_mark_address_taken_node (cgraph_get_create_node (decl)); > > ipa_record_reference (NULL, ctx->varpool_node, > > - cgraph_node (decl), NULL, > > + cgraph_get_node (decl), NULL, > > Please CSE the cgraph_get_create_node call here. In both cases we want > get_create_node, during the later cgraph builds the new nodes ight become needed > as result of devirtualization and external construvctor folding. > I see, I have changed the hunk into the following and will commit it as such after re-testing: Thanks, Martin Index: src/gcc/cgraphbuild.c =================================================================== --- src.orig/gcc/cgraphbuild.c +++ src/gcc/cgraphbuild.c @@ -73,10 +73,10 @@ record_reference (tree *tp, int *walk_su decl = get_base_var (*tp); if (TREE_CODE (decl) == FUNCTION_DECL) { + struct cgraph_node *node = cgraph_get_create_node (decl); if (!ctx->only_vars) - cgraph_mark_address_taken_node (cgraph_node (decl)); - ipa_record_reference (NULL, ctx->varpool_node, - cgraph_node (decl), NULL, + cgraph_mark_address_taken_node (node); + ipa_record_reference (NULL, ctx->varpool_node, node, NULL, IPA_REF_ADDR, NULL); }