From patchwork Thu Oct 14 13:00:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 46209 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 2B9E53858020 for ; Thu, 14 Oct 2021 13:00:46 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 2B9E53858020 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1634216446; bh=ZL8STpy/RpEAC45hBQHlcGMZF0UT3s1OkZmA5WknQvk=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=KQmMnIe5lYYrETyn0U/1N2DQSwKk7vom53u8147yn0LCMzXvDwQv+HtAZVnto9dbF cqZWsjMO0KLe+TN+gNvtii0G88YJWQT0495pGpaYHLmJN/ap2Bq2PB1sAeMqWhqTtw BeMEx0Gie9l63qVKbHhsnaG4/37vpBfEE3LTazI4= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id EB2543858C3A for ; Thu, 14 Oct 2021 13:00:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org EB2543858C3A Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 9C4C0D6E; Thu, 14 Oct 2021 06:00:16 -0700 (PDT) Received: from localhost (e121540-lin.manchester.arm.com [10.32.98.88]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 098803F70D; Thu, 14 Oct 2021 06:00:15 -0700 (PDT) To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, dje.gcc@gmail.com, segher@kernel.crashing.org, richard.sandiford@arm.com Subject: [PATCH] rs6000: Fix memory leak in rs6000_density_test Date: Thu, 14 Oct 2021 14:00:14 +0100 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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-Patchwork-Original-From: Richard Sandiford via Gcc-patches From: Richard Sandiford Reply-To: Richard Sandiford Cc: segher@kernel.crashing.org, dje.gcc@gmail.com Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" rs6000_density_test has an early exit test between a call to get_loop_body and the corresponding free. This would lead to a memory leak if the early exit is taken. Tested on powerpc64le-linux-gnu. It's obvious that moving the test avoids the leak, but there are multiple ways to write it, so: OK to install? Richard gcc/ * config/rs6000/rs6000.c (rs6000_density_test): Move early exit test further up the function. --- gcc/config/rs6000/rs6000.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index acba4d9f26c..01a95591a5d 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -5289,20 +5289,19 @@ struct rs6000_cost_data static void rs6000_density_test (rs6000_cost_data *data) { - struct loop *loop = data->loop_info; - basic_block *bbs = get_loop_body (loop); - int nbbs = loop->num_nodes; - loop_vec_info loop_vinfo = loop_vec_info_for_loop (data->loop_info); - int vec_cost = data->cost[vect_body], not_vec_cost = 0; - int i, density_pct; - /* This density test only cares about the cost of vector version of the loop, so immediately return if we are passed costing for the scalar version (namely computing single scalar iteration cost). */ if (data->costing_for_scalar) return; - for (i = 0; i < nbbs; i++) + struct loop *loop = data->loop_info; + basic_block *bbs = get_loop_body (loop); + int nbbs = loop->num_nodes; + loop_vec_info loop_vinfo = loop_vec_info_for_loop (data->loop_info); + int vec_cost = data->cost[vect_body], not_vec_cost = 0; + + for (int i = 0; i < nbbs; i++) { basic_block bb = bbs[i]; gimple_stmt_iterator gsi; @@ -5322,7 +5321,7 @@ rs6000_density_test (rs6000_cost_data *data) } free (bbs); - density_pct = (vec_cost * 100) / (vec_cost + not_vec_cost); + int density_pct = (vec_cost * 100) / (vec_cost + not_vec_cost); if (density_pct > rs6000_density_pct_threshold && vec_cost + not_vec_cost > rs6000_density_size_threshold)