From patchwork Wed Jul 8 14:57:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pierre-Marie de Rodat X-Patchwork-Id: 1325243 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=adacore.com 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 4B22VQ59Mgz9sRN for ; Thu, 9 Jul 2020 00:58:06 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B84AF384C002; Wed, 8 Jul 2020 14:57:40 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from rock.gnat.com (rock.gnat.com [205.232.38.15]) by sourceware.org (Postfix) with ESMTP id 6AB493861966 for ; Wed, 8 Jul 2020 14:57:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 6AB493861966 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=adacore.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=derodat@adacore.com Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 179C856090; Wed, 8 Jul 2020 10:57:34 -0400 (EDT) X-Virus-Scanned: Debian amavisd-new at gnat.com Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id TSrYXMsoO+6t; Wed, 8 Jul 2020 10:57:34 -0400 (EDT) Received: from tron.gnat.com (tron.gnat.com [IPv6:2620:20:4000:0:46a8:42ff:fe0e:e294]) by rock.gnat.com (Postfix) with ESMTP id 0654B56091; Wed, 8 Jul 2020 10:57:34 -0400 (EDT) Received: by tron.gnat.com (Postfix, from userid 4862) id 05788114; Wed, 8 Jul 2020 10:57:34 -0400 (EDT) Date: Wed, 8 Jul 2020 10:57:34 -0400 From: Pierre-Marie de Rodat To: gcc-patches@gcc.gnu.org Subject: [Ada] Remove excessive validity checks on in-parameters Message-ID: <20200708145733.GA27482@adacore.com> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Spam-Status: No, score=-8.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.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: , Cc: Piotr Trojanek Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Routine Safe_To_Capture_Value was written to capture just the "value", which only made sense for assignable entities. However, it was later employed to capture other properties, e.g. the value being [non-]null or valid. Those properties can be captured for non-assignable entities as well, e.g. constants and in-parameters (as is done here). Tested on x86_64-pc-linux-gnu, committed on trunk gcc/ada/ * sem_util.ads, sem_util.adb (Safe_To_Capture_Value): Return True for in-parameters. diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -25718,23 +25718,25 @@ package body Sem_Util is is begin -- The only entities for which we track constant values are variables - -- which are not renamings, constants, out parameters, and in out - -- parameters, so check if we have this case. + -- which are not renamings, constants and formal parameters, so check + -- if we have this case. -- Note: it may seem odd to track constant values for constants, but in -- fact this routine is used for other purposes than simply capturing - -- the value. In particular, the setting of Known[_Non]_Null. + -- the value. In particular, the setting of Known[_Non]_Null and + -- Is_Known_Valid. if (Ekind (Ent) = E_Variable and then No (Renamed_Object (Ent))) - or else - Ekind_In (Ent, E_Constant, E_Out_Parameter, E_In_Out_Parameter) + or else + Ekind (Ent) = E_Constant + or else + Is_Formal (Ent) then null; - -- For conditionals, we also allow loop parameters and all formals, - -- including in parameters. + -- For conditionals, we also allow loop parameters - elsif Cond and then Ekind_In (Ent, E_Loop_Parameter, E_In_Parameter) then + elsif Cond and then Ekind (Ent) = E_Loop_Parameter then null; -- For all other cases, not just unsafe, but impossible to capture diff --git a/gcc/ada/sem_util.ads b/gcc/ada/sem_util.ads --- a/gcc/ada/sem_util.ads +++ b/gcc/ada/sem_util.ads @@ -2743,13 +2743,14 @@ package Sem_Util is (N : Node_Id; Ent : Entity_Id; Cond : Boolean := False) return Boolean; - -- The caller is interested in capturing a value (either the current value, - -- or an indication that the value is non-null) for the given entity Ent. - -- This value can only be captured if sequential execution semantics can be - -- properly guaranteed so that a subsequent reference will indeed be sure - -- that this current value indication is correct. The node N is the - -- construct which resulted in the possible capture of the value (this - -- is used to check if we are in a conditional). + -- The caller is interested in capturing a value (either the current + -- value, an indication that the value is [non-]null or an indication that + -- the value is valid) for the given entity Ent. This value can only be + -- captured if sequential execution semantics can be properly guaranteed so + -- that a subsequent reference will indeed be sure that this current value + -- indication is correct. The node N is the construct which resulted in + -- the possible capture of the value (this is used to check if we are in + -- a conditional). -- -- Cond is used to skip the test for being inside a conditional. It is used -- in the case of capturing values from if/while tests, which already do a