From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 6D31B3854838 for ; Fri, 8 Jan 2021 14:27:09 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 6D31B3854838 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.cz Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=mliska@suse.cz X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id 64B9FAD11; Fri, 8 Jan 2021 14:27:08 +0000 (UTC) From: =?UTF-8?Q?Martin_Li=c5=a1ka?= Subject: [PATCH] if-to-switch: remove memory leaks To: gcc-patches@gcc.gnu.org Message-ID: <1786fedc-b48b-091a-bdf1-e8afa31767ba@suse.cz> Date: Fri, 8 Jan 2021 15:27:08 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.6.0 MIME-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, 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: , X-List-Received-Date: Fri, 08 Jan 2021 14:27:11 -0000 The patch removes some memory leaks spotted by valgrind. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin gcc/ChangeLog: * gimple-if-to-switch.cc (struct condition_info): Use auto_var. (if_chain::is_beneficial): Delete clusters (find_conditions): Make second argument of conditions_in_bbs a pointer so that we control over it's lifetime. (pass_if_to_switch::execute): Delete them. --- gcc/gimple-if-to-switch.cc | 97 ++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 41 deletions(-) diff --git a/gcc/gimple-if-to-switch.cc b/gcc/gimple-if-to-switch.cc index 6dba4e2c39c..560753d0311 100644 --- a/gcc/gimple-if-to-switch.cc +++ b/gcc/gimple-if-to-switch.cc @@ -59,7 +59,7 @@ using namespace tree_switch_conversion; struct condition_info { - typedef vec> mapping_vec; + typedef auto_vec> mapping_vec; condition_info (gcond *cond): m_cond (cond), m_bb (gimple_bb (cond)), m_forwarder_bb (NULL), m_ranges (), m_true_edge (NULL), m_false_edge (NULL), @@ -75,7 +75,7 @@ struct condition_info gcond *m_cond; basic_block m_bb; basic_block m_forwarder_bb; - vec m_ranges; + auto_vec m_ranges; edge m_true_edge; edge m_false_edge; mapping_vec m_true_edge_phi_mapping; @@ -253,6 +253,10 @@ if_chain::is_beneficial () r = output.length () < filtered_clusters.length (); if (r) dump_clusters (&output, "BT can be built"); + + for (unsigned i = 0; i < output.length (); i++) + delete output[i]; + output.release (); return r; } @@ -377,7 +381,7 @@ convert_if_conditions_to_switch (if_chain *chain) static void find_conditions (basic_block bb, - hash_map *conditions_in_bbs) + hash_map *conditions_in_bbs) { gimple_stmt_iterator gsi = gsi_last_nondebug_bb (bb); if (gsi_end_p (gsi)) @@ -394,7 +398,7 @@ find_conditions (basic_block bb, tree rhs = gimple_cond_rhs (cond); tree_code code = gimple_cond_code (cond); - condition_info info (cond); + condition_info *info = new condition_info (cond); gassign *def; if (code == NE_EXPR @@ -405,49 +409,53 @@ find_conditions (basic_block bb, enum tree_code rhs_code = gimple_assign_rhs_code (def); if (rhs_code == BIT_IOR_EXPR) { - info.m_ranges.safe_grow (2, true); - init_range_entry (&info.m_ranges[0], gimple_assign_rhs1 (def), NULL); - init_range_entry (&info.m_ranges[1], gimple_assign_rhs2 (def), NULL); + info->m_ranges.safe_grow (2, true); + init_range_entry (&info->m_ranges[0], gimple_assign_rhs1 (def), NULL); + init_range_entry (&info->m_ranges[1], gimple_assign_rhs2 (def), NULL); } } else { - info.m_ranges.safe_grow (1, true); - init_range_entry (&info.m_ranges[0], NULL_TREE, cond); + info->m_ranges.safe_grow (1, true); + init_range_entry (&info->m_ranges[0], NULL_TREE, cond); } /* All identified ranges must have equal expression and IN_P flag. */ - if (!info.m_ranges.is_empty ()) + if (!info->m_ranges.is_empty ()) { edge true_edge, false_edge; - tree expr = info.m_ranges[0].exp; - bool in_p = info.m_ranges[0].in_p; + tree expr = info->m_ranges[0].exp; + bool in_p = info->m_ranges[0].in_p; extract_true_false_edges_from_block (bb, &true_edge, &false_edge); - info.m_true_edge = in_p ? true_edge : false_edge; - info.m_false_edge = in_p ? false_edge : true_edge; - - for (unsigned i = 0; i < info.m_ranges.length (); ++i) - if (info.m_ranges[i].exp == NULL_TREE - || !INTEGRAL_TYPE_P (TREE_TYPE (info.m_ranges[i].exp)) - || info.m_ranges[i].low == NULL_TREE - || info.m_ranges[i].high == NULL_TREE - || (TYPE_PRECISION (TREE_TYPE (info.m_ranges[i].low)) - != TYPE_PRECISION (TREE_TYPE (info.m_ranges[i].high)))) - return; - - for (unsigned i = 1; i < info.m_ranges.length (); ++i) - if (info.m_ranges[i].exp != expr - || info.m_ranges[i].in_p != in_p) - return; - - info.record_phi_mapping (info.m_true_edge, - &info.m_true_edge_phi_mapping); - info.record_phi_mapping (info.m_false_edge, - &info.m_false_edge_phi_mapping); + info->m_true_edge = in_p ? true_edge : false_edge; + info->m_false_edge = in_p ? false_edge : true_edge; + + for (unsigned i = 0; i < info->m_ranges.length (); ++i) + if (info->m_ranges[i].exp == NULL_TREE + || !INTEGRAL_TYPE_P (TREE_TYPE (info->m_ranges[i].exp)) + || info->m_ranges[i].low == NULL_TREE + || info->m_ranges[i].high == NULL_TREE + || (TYPE_PRECISION (TREE_TYPE (info->m_ranges[i].low)) + != TYPE_PRECISION (TREE_TYPE (info->m_ranges[i].high)))) + goto exit; + + for (unsigned i = 1; i < info->m_ranges.length (); ++i) + if (info->m_ranges[i].exp != expr + || info->m_ranges[i].in_p != in_p) + goto exit; + + info->record_phi_mapping (info->m_true_edge, + &info->m_true_edge_phi_mapping); + info->record_phi_mapping (info->m_false_edge, + &info->m_false_edge_phi_mapping); conditions_in_bbs->put (bb, info); } + return; + +exit: + delete info; } namespace { @@ -487,7 +495,7 @@ unsigned int pass_if_to_switch::execute (function *fun) { auto_vec all_candidates; - hash_map conditions_in_bbs; + hash_map conditions_in_bbs; basic_block bb; FOR_EACH_BB_FN (bb, fun) @@ -507,9 +515,10 @@ pass_if_to_switch::execute (function *fun) continue; bitmap_set_bit (seen_bbs, bb->index); - condition_info *info = conditions_in_bbs.get (bb); - if (info) + condition_info **slot = conditions_in_bbs.get (bb); + if (slot) { + condition_info *info = *slot; if_chain *chain = new if_chain (); chain->m_entries.safe_push (info); /* Try to find a chain starting in this BB. */ @@ -518,19 +527,19 @@ pass_if_to_switch::execute (function *fun) if (!single_pred_p (gimple_bb (info->m_cond))) break; edge e = single_pred_edge (gimple_bb (info->m_cond)); - condition_info *info2 = conditions_in_bbs.get (e->src); - if (!info2 || info->m_ranges[0].exp != info2->m_ranges[0].exp) + condition_info **info2 = conditions_in_bbs.get (e->src); + if (!info2 || info->m_ranges[0].exp != (*info2)->m_ranges[0].exp) break; /* It is important that the blocks are linked through FALSE_EDGE. For an expression of index != VALUE, true and false edges are flipped. */ - if (info2->m_false_edge != e) + if ((*info2)->m_false_edge != e) break; - chain->m_entries.safe_push (info2); + chain->m_entries.safe_push (*info2); bitmap_set_bit (seen_bbs, e->src->index); - info = info2; + info = *info2; } chain->m_entries.reverse (); @@ -546,6 +555,8 @@ pass_if_to_switch::execute (function *fun) chain->m_entries.length ()); all_candidates.safe_push (chain); } + else + delete chain; } } @@ -557,6 +568,10 @@ pass_if_to_switch::execute (function *fun) free (rpo); + for (hash_map::iterator it + = conditions_in_bbs.begin (); it != conditions_in_bbs.end (); ++it) + delete (*it).second; + if (!all_candidates.is_empty ()) { free_dominance_info (CDI_DOMINATORS); -- 2.29.2