From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30862 invoked by alias); 6 Apr 2011 23:26:01 -0000 Received: (qmail 30565 invoked by uid 22791); 6 Apr 2011 23:25:58 -0000 X-SWARE-Spam-Status: No, hits=-3.5 required=5.0 tests=AWL,BAYES_00,TW_FN X-Spam-Check-By: sourceware.org Received: from cantor2.suse.de (HELO mx2.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Wed, 06 Apr 2011 23:25:49 +0000 Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.221.2]) by mx2.suse.de (Postfix) with ESMTP id 9A90C8765C for ; Thu, 7 Apr 2011 01:25:48 +0200 (CEST) Resent-From: Martin Jambor Resent-Date: Thu, 7 Apr 2011 01:25:48 +0200 Resent-Message-ID: <20110406232548.GC27755@virgil.arch.suse.de> Resent-To: GCC Patches Message-Id: <20110406232245.369880493@virgil.suse.cz> User-Agent: quilt/0.48-16.4 Date: Wed, 06 Apr 2011 23:26:00 -0000 From: Martin Jambor To: GCC Patches Cc: Jan Hubicka Subject: [PATCH 2/7] cgraph_node -> cgraph_get_node conversions accepting NULL results References: <20110406232220.922143392@virgil.suse.cz> Content-Disposition: inline; filename=get_cgraph_fixup.diff X-IsSubscribed: yes 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-04/txt/msg00520.txt.bz2 Hi, this patch converts a number of calls to cgraph_node to calls to cgraph_get_node and provides means to deal with returned NULL value. These are essentially the places where lazy node creation was happening for no good reason. Bootstrapped and tested separately on x86_64-linux without any problems, tests on other platforms (together with the other patches) in progress. OK for trunk? Thanks, Martin 2011-04-06 Martin Jambor gcc/ * cgraph.c (cgraph_local_info): Call cgraph_get_node instead of cgraph_node, handle NULL return value. (cgraph_global_info): Likewise. (cgraph_rtl_info): Likewise. * tree-inline.c (estimate_num_insns): Likewise. * gimplify.c (unshare_body): Likewise. (unvisit_body): Likewise. (gimplify_body): Likewise. * predict.c (optimize_function_for_size_p): Likewise. * tree-ssa-alias.c (ref_maybe_used_by_call_p_1): Likewise. (call_may_clobber_ref_p_1): Likewise. * varasm.c (function_section_1): Likewise. (assemble_start_function): Likewise. gcc/java/ * decl.c (java_mark_decl_local): Call cgraph_get_node instead of cgraph_node and handle returned NULL. Index: src/gcc/cgraph.c =================================================================== --- src.orig/gcc/cgraph.c +++ src/gcc/cgraph.c @@ -1766,7 +1766,9 @@ cgraph_local_info (tree decl) struct cgraph_node *node; gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); - node = cgraph_node (decl); + node = cgraph_get_node (decl); + if (!node) + return NULL; return &node->local; } @@ -1778,7 +1780,9 @@ cgraph_global_info (tree decl) struct cgraph_node *node; gcc_assert (TREE_CODE (decl) == FUNCTION_DECL && cgraph_global_info_ready); - node = cgraph_node (decl); + node = cgraph_get_node (decl); + if (!node) + return NULL; return &node->global; } @@ -1790,9 +1794,10 @@ cgraph_rtl_info (tree decl) struct cgraph_node *node; gcc_assert (TREE_CODE (decl) == FUNCTION_DECL); - node = cgraph_node (decl); - if (decl != current_function_decl - && !TREE_ASM_WRITTEN (node->decl)) + node = cgraph_get_node (decl); + if (!node + || (decl != current_function_decl + && !TREE_ASM_WRITTEN (node->decl))) return NULL; return &node->rtl; } Index: src/gcc/tree-inline.c =================================================================== --- src.orig/gcc/tree-inline.c +++ src/gcc/tree-inline.c @@ -3470,10 +3470,11 @@ estimate_num_insns (gimple stmt, eni_wei case GIMPLE_CALL: { tree decl = gimple_call_fndecl (stmt); + struct cgraph_node *node; /* Do not special case builtins where we see the body. This just confuse inliner. */ - if (!decl || cgraph_node (decl)->analyzed) + if (!decl || !(node = cgraph_get_node (decl)) || node->analyzed) ; /* For buitins that are likely expanded to nothing or inlined do not account operand costs. */ Index: src/gcc/gimplify.c =================================================================== --- src.orig/gcc/gimplify.c +++ src/gcc/gimplify.c @@ -959,11 +959,11 @@ copy_if_shared (tree *tp) static void unshare_body (tree *body_p, tree fndecl) { - struct cgraph_node *cgn = cgraph_node (fndecl); + struct cgraph_node *cgn = cgraph_get_node (fndecl); copy_if_shared (body_p); - if (body_p == &DECL_SAVED_TREE (fndecl)) + if (cgn && body_p == &DECL_SAVED_TREE (fndecl)) for (cgn = cgn->nested; cgn; cgn = cgn->next_nested) unshare_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl); } @@ -1000,11 +1000,11 @@ unmark_visited (tree *tp) static void unvisit_body (tree *body_p, tree fndecl) { - struct cgraph_node *cgn = cgraph_node (fndecl); + struct cgraph_node *cgn = cgraph_get_node (fndecl); unmark_visited (body_p); - if (body_p == &DECL_SAVED_TREE (fndecl)) + if (cgn && body_p == &DECL_SAVED_TREE (fndecl)) for (cgn = cgn->nested; cgn; cgn = cgn->next_nested) unvisit_body (&DECL_SAVED_TREE (cgn->decl), cgn->decl); } @@ -7695,6 +7695,7 @@ gimplify_body (tree *body_p, tree fndecl gimple_seq parm_stmts, seq; gimple outer_bind; struct gimplify_ctx gctx; + struct cgraph_node *cgn; timevar_push (TV_TREE_GIMPLIFY); @@ -7712,7 +7713,8 @@ gimplify_body (tree *body_p, tree fndecl unshare_body (body_p, fndecl); unvisit_body (body_p, fndecl); - if (cgraph_node (fndecl)->origin) + cgn = cgraph_get_node (fndecl); + if (cgn && cgn->origin) nonlocal_vlas = pointer_set_create (); /* Make sure input_location isn't set to something weird. */ Index: src/gcc/predict.c =================================================================== --- src.orig/gcc/predict.c +++ src/gcc/predict.c @@ -214,10 +214,11 @@ probably_never_executed_bb_p (const_basi bool optimize_function_for_size_p (struct function *fun) { + struct cgraph_node *node; return (optimize_size || (fun && fun->decl - && (cgraph_node (fun->decl)->frequency - == NODE_FREQUENCY_UNLIKELY_EXECUTED))); + && (node = cgraph_get_node (fun->decl)) + && (node->frequency == NODE_FREQUENCY_UNLIKELY_EXECUTED))); } /* Return true when current function should always be optimized for speed. */ Index: src/gcc/tree-ssa-alias.c =================================================================== --- src.orig/gcc/tree-ssa-alias.c +++ src/gcc/tree-ssa-alias.c @@ -1245,14 +1245,18 @@ ref_maybe_used_by_call_p_1 (gimple call, /* Check if base is a global static variable that is not read by the function. */ - if (TREE_CODE (base) == VAR_DECL + if (callee != NULL_TREE + && TREE_CODE (base) == VAR_DECL && TREE_STATIC (base)) { + struct cgraph_node *node = cgraph_get_node (callee); bitmap not_read; - if (callee != NULL_TREE - && (not_read - = ipa_reference_get_not_read_global (cgraph_node (callee))) + /* FIXME: Callee can be an OMP builtin that does not have a call graph + node yet. We should enforce that there are nodes for all decls in the + IL and remove this check instead. */ + if (node + && (not_read = ipa_reference_get_not_read_global (node)) && bitmap_bit_p (not_read, DECL_UID (base))) goto process_args; } @@ -1512,10 +1516,11 @@ call_may_clobber_ref_p_1 (gimple call, a && TREE_CODE (base) == VAR_DECL && TREE_STATIC (base)) { + struct cgraph_node *node = cgraph_get_node (callee); bitmap not_written; - if ((not_written - = ipa_reference_get_not_written_global (cgraph_node (callee))) + if (node + && (not_written = ipa_reference_get_not_written_global (node)) && bitmap_bit_p (not_written, DECL_UID (base))) return false; } Index: src/gcc/varasm.c =================================================================== --- src.orig/gcc/varasm.c +++ src/gcc/varasm.c @@ -605,11 +605,14 @@ function_section_1 (tree decl, bool forc if (decl) { - struct cgraph_node *node = cgraph_node (decl); + struct cgraph_node *node = cgraph_get_node (decl); - freq = node->frequency; - startup = node->only_called_at_startup; - exit = node->only_called_at_exit; + if (node) + { + freq = node->frequency; + startup = node->only_called_at_startup; + exit = node->only_called_at_exit; + } } if (force_cold) freq = NODE_FREQUENCY_UNLIKELY_EXECUTED; @@ -1607,11 +1610,12 @@ assemble_start_function (tree decl, cons } else if (DECL_SECTION_NAME (decl)) { + struct cgraph_node *node = cgraph_get_node (current_function_decl); /* Calls to function_section rely on first_function_block_is_cold being accurate. */ - first_function_block_is_cold - = (cgraph_node (current_function_decl)->frequency - == NODE_FREQUENCY_UNLIKELY_EXECUTED); + first_function_block_is_cold = (node + && node->frequency + == NODE_FREQUENCY_UNLIKELY_EXECUTED); } in_cold_section_p = first_function_block_is_cold; Index: src/gcc/java/decl.c =================================================================== --- src.orig/gcc/java/decl.c +++ src/gcc/java/decl.c @@ -1928,7 +1928,10 @@ java_mark_decl_local (tree decl) #ifdef ENABLE_CHECKING /* Double check that we didn't pass the function to the callgraph early. */ if (TREE_CODE (decl) == FUNCTION_DECL) - gcc_assert (!cgraph_node (decl)->local.finalized); + { + struct cgraph_node *node = cgraph_get_node (decl); + gcc_assert (!node || !node->local.finalized); + } #endif gcc_assert (!DECL_RTL_SET_P (decl)); }