From patchwork Tue Nov 24 15:16:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Hubicka X-Patchwork-Id: 1405610 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=ucw.cz Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4CgSKF4BBpz9sSf for ; Wed, 25 Nov 2020 02:16:15 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5F57639450DB; Tue, 24 Nov 2020 15:16:12 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from nikam.ms.mff.cuni.cz (nikam.ms.mff.cuni.cz [195.113.20.16]) by sourceware.org (Postfix) with ESMTPS id B2ADE386189C for ; Tue, 24 Nov 2020 15:16:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org B2ADE386189C Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=ucw.cz Authentication-Results: sourceware.org; spf=none smtp.mailfrom=hubicka@kam.mff.cuni.cz Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id 4123528276C; Tue, 24 Nov 2020 16:16:05 +0100 (CET) Date: Tue, 24 Nov 2020 16:16:05 +0100 From: Jan Hubicka To: gcc-patches@gcc.gnu.org, rguenther@suse.de Subject: Free more of CFG in release_function_body Message-ID: <20201124151605.GA56013@kam.mff.cuni.cz> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-Spam-Status: No, score=-15.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, HEADER_FROM_DIFFERENT_DOMAINS, KAM_DMARC_STATUS, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Hi, at the end of processing function body we loop over basic blocks and free all edges while we do not free the rest. I think this is leftover from time eges was not garbage collected and we was not using ggc_free. It makes more sense to free all associated structures (which is importnat for WPA memory footprint). Bootstrapped/regtested x86_64-linux, OK? Honza * cfg.c (free_block): New function. (clear_edges): Rename to .... (free_cfg): ... this one; also free BBs and vectors. (expunge_block): Update comment. * cfg.h (clear_edges): Rename to ... (free_cfg): ... this one. * cgraph.c (release_function_body): Use free_cfg. diff --git a/gcc/cfg.c b/gcc/cfg.c index de0e71db850..fc78e48d6e1 100644 --- a/gcc/cfg.c +++ b/gcc/cfg.c @@ -25,7 +25,7 @@ along with GCC; see the file COPYING3. If not see Available functionality: - Initialization/deallocation - init_flow, clear_edges + init_flow, free_cfg - Low level basic block manipulation alloc_block, expunge_block - Edge manipulation @@ -83,7 +83,7 @@ init_flow (struct function *the_fun) the_fun->cfg->bb_flags_allocated = BB_ALL_FLAGS; } -/* Helper function for remove_edge and clear_edges. Frees edge structure +/* Helper function for remove_edge and free_cffg. Frees edge structure without actually removing it from the pred/succ arrays. */ static void @@ -93,29 +93,41 @@ free_edge (function *fn, edge e) ggc_free (e); } -/* Free the memory associated with the edge structures. */ +/* Free basic block BB. */ + +static void +free_block (basic_block bb) +{ + vec_free (bb->succs); + vec_free (bb->preds); + ggc_free (bb); +} + +/* Free the memory associated with the CFG in FN. */ void -clear_edges (struct function *fn) +free_cfg (struct function *fn) { - basic_block bb; edge e; edge_iterator ei; + basic_block next; - FOR_EACH_BB_FN (bb, fn) + for (basic_block bb = ENTRY_BLOCK_PTR_FOR_FN (fn); bb; bb = next) { + next = bb->next_bb; FOR_EACH_EDGE (e, ei, bb->succs) free_edge (fn, e); - vec_safe_truncate (bb->succs, 0); - vec_safe_truncate (bb->preds, 0); + free_block (bb); } - FOR_EACH_EDGE (e, ei, ENTRY_BLOCK_PTR_FOR_FN (fn)->succs) - free_edge (fn, e); - vec_safe_truncate (EXIT_BLOCK_PTR_FOR_FN (fn)->preds, 0); - vec_safe_truncate (ENTRY_BLOCK_PTR_FOR_FN (fn)->succs, 0); - gcc_assert (!n_edges_for_fn (fn)); + /* Sanity check that dominance tree is freed. */ + gcc_assert (!fn->cfg->x_dom_computed[0] && !fn->cfg->x_dom_computed[1]); + + vec_free (fn->cfg->x_label_to_block_map); + vec_free (basic_block_info_for_fn (fn)); + ggc_free (fn->cfg); + fn->cfg = NULL; } /* Allocate memory for basic_block. */ @@ -190,8 +202,8 @@ expunge_block (basic_block b) /* We should be able to ggc_free here, but we are not. The dead SSA_NAMES are left pointing to dead statements that are pointing to dead basic blocks making garbage collector to die. - We should be able to release all dead SSA_NAMES and at the same time we should - clear out BB pointer of dead statements consistently. */ + We should be able to release all dead SSA_NAMES and at the same time we + should clear out BB pointer of dead statements consistently. */ } /* Connect E to E->src. */ diff --git a/gcc/cfg.h b/gcc/cfg.h index 93fde6df2bf..a9c8300f173 100644 --- a/gcc/cfg.h +++ b/gcc/cfg.h @@ -82,7 +82,7 @@ struct GTY(()) control_flow_graph { extern void init_flow (function *); -extern void clear_edges (function *); +extern void free_cfg (function *); extern basic_block alloc_block (void); extern void link_block (basic_block, basic_block); extern void unlink_block (basic_block); diff --git a/gcc/cgraph.c b/gcc/cgraph.c index 19dfe2be23b..5c48a1bb92b 100644 --- a/gcc/cgraph.c +++ b/gcc/cgraph.c @@ -1811,7 +1811,7 @@ release_function_body (tree decl) gcc_assert (!dom_info_available_p (fn, CDI_DOMINATORS)); gcc_assert (!dom_info_available_p (fn, CDI_POST_DOMINATORS)); delete_tree_cfg_annotations (fn); - clear_edges (fn); + free_cfg (fn); fn->cfg = NULL; } if (fn->value_histograms)