From patchwork Sat Nov 13 14:21:49 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Hubicka X-Patchwork-Id: 1554714 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: bilbo.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.a=rsa-sha256 header.s=default header.b=nydEFvz+; dkim-atps=neutral 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+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) 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 bilbo.ozlabs.org (Postfix) with ESMTPS id 4HryNq2XcKz9sCD for ; Sun, 14 Nov 2021 01:23:21 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 4B9853857C50 for ; Sat, 13 Nov 2021 14:23:18 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4B9853857C50 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1636813398; bh=lS6recaJwX4xGhs8RnD+jdKLwlqkH6Yc+/BVZ34ya8s=; h=Resent-From:Resent-Date:Resent-To:Date:To:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=nydEFvz+6U4NN/RV4xLMxarSVkb2Z2zGET1QthKPgyZBesmnX36yKNtzn/MciY/mF JoAIxmej0m+lr8v855jmVBnLgJIrcodpSOMtsAXe/n0BM+b4x+yYtPiIW35obyj6wD BsbnuYc8IxRvACCNy3TnZfQC0yqVz/6ApRBAfDfk= 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 09C903858403 for ; Sat, 13 Nov 2021 14:22:37 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 09C903858403 Received: by nikam.ms.mff.cuni.cz (Postfix, from userid 16202) id 2A2A9280872; Sat, 13 Nov 2021 15:22:36 +0100 (CET) Resent-From: Jan Hubicka Resent-Date: Sat, 13 Nov 2021 15:22:36 +0100 Resent-Message-ID: <20211113142236.GE13726@kam.mff.cuni.cz> Resent-To: gcc-patches@gcc.gnu.org Date: Sat, 13 Nov 2021 15:21:49 +0100 To: gcc-pathces@gcc.gnu.org Subject: Remember fnspec EAF flags in modref summary Message-ID: <20211113142149.GD13726@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=-1.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, GIT_PATCH_0, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP, UNWANTED_LANGUAGE_BODY 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: Jan Hubicka via Gcc-patches From: Jan Hubicka Reply-To: Jan Hubicka Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Sender: "Gcc-patches" Hi, this patch stores eaf flags from fnspec to modref summaries. THis makes them survive signature changes and also improves IPA propagation in case modref is not able to autodetect given flag. Bootstrapped/regtested x86_64-linux, comitted. Honza gcc/ChangeLog: * attr-fnspec.h (attr_fnspec::arg_eaf_flags): Break out from ... * gimple.c (gimple_call_arg_flags): ... here. * ipa-modref.c (analyze_parms): Record flags known from fnspec. (modref_merge_call_site_flags): Use arg_eaf_flags. diff --git a/gcc/attr-fnspec.h b/gcc/attr-fnspec.h index 1154c30e7b0..cd618cb342b 100644 --- a/gcc/attr-fnspec.h +++ b/gcc/attr-fnspec.h @@ -264,6 +264,29 @@ public: return str[1] == 'C' || str[1] == 'P'; } + /* Return EAF flags for arg I. */ + int + arg_eaf_flags (unsigned int i) + { + int flags = 0; + + if (!arg_specified_p (i)) + ; + else if (!arg_used_p (i)) + flags = EAF_UNUSED; + else + { + if (arg_direct_p (i)) + flags |= EAF_NO_INDIRECT_READ | EAF_NO_INDIRECT_ESCAPE + | EAF_NOT_RETURNED_INDIRECTLY | EAF_NO_INDIRECT_CLOBBER; + if (arg_noescape_p (i)) + flags |= EAF_NO_DIRECT_ESCAPE | EAF_NO_INDIRECT_ESCAPE; + if (arg_readonly_p (i)) + flags |= EAF_NO_DIRECT_CLOBBER | EAF_NO_INDIRECT_CLOBBER; + } + return flags; + } + /* Check validity of the string. */ void verify (); diff --git a/gcc/gimple.c b/gcc/gimple.c index 1e0fad92e15..037c6e4c827 100644 --- a/gcc/gimple.c +++ b/gcc/gimple.c @@ -1567,22 +1567,7 @@ gimple_call_arg_flags (const gcall *stmt, unsigned arg) int flags = 0; if (fnspec.known_p ()) - { - if (!fnspec.arg_specified_p (arg)) - ; - else if (!fnspec.arg_used_p (arg)) - flags = EAF_UNUSED; - else - { - if (fnspec.arg_direct_p (arg)) - flags |= EAF_NO_INDIRECT_READ | EAF_NO_INDIRECT_ESCAPE - | EAF_NOT_RETURNED_INDIRECTLY | EAF_NO_INDIRECT_CLOBBER; - if (fnspec.arg_noescape_p (arg)) - flags |= EAF_NO_DIRECT_ESCAPE | EAF_NO_INDIRECT_ESCAPE; - if (fnspec.arg_readonly_p (arg)) - flags |= EAF_NO_DIRECT_CLOBBER | EAF_NO_INDIRECT_CLOBBER; - } - } + flags = fnspec.arg_eaf_flags (arg); tree callee = gimple_call_fndecl (stmt); if (callee) { diff --git a/gcc/ipa-modref.c b/gcc/ipa-modref.c index 90985cc1326..669dbe45a3d 100644 --- a/gcc/ipa-modref.c +++ b/gcc/ipa-modref.c @@ -2476,6 +2476,14 @@ analyze_parms (modref_summary *summary, modref_summary_lto *summary_lto, /* Do the dataflow. */ eaf_analysis.propagate (); + tree attr = lookup_attribute ("fn spec", + TYPE_ATTRIBUTES + (TREE_TYPE (current_function_decl))); + attr_fnspec fnspec (attr + ? TREE_STRING_POINTER (TREE_VALUE (TREE_VALUE (attr))) + : ""); + + /* Store results to summaries. */ for (tree parm = DECL_ARGUMENTS (current_function_decl); parm; parm_index++, parm = TREE_CHAIN (parm)) @@ -2502,6 +2510,18 @@ analyze_parms (modref_summary *summary, modref_summary_lto *summary_lto, continue; } int flags = eaf_analysis.get_ssa_name_flags (name); + int attr_flags = fnspec.arg_eaf_flags (parm_index); + + if (dump_file && (flags | attr_flags) != flags && !(flags & EAF_UNUSED)) + { + fprintf (dump_file, + " Flags for param %i combined with fnspec flags:", + (int)parm_index); + dump_eaf_flags (dump_file, attr_flags, false); + fprintf (dump_file, " determined: "); + dump_eaf_flags (dump_file, flags, true); + } + flags |= attr_flags; /* Eliminate useless flags so we do not end up storing unnecessary summaries. */ @@ -2522,8 +2542,8 @@ analyze_parms (modref_summary *summary, modref_summary_lto *summary_lto, " Flags for param %i combined with IPA pass:", (int)parm_index); dump_eaf_flags (dump_file, past, false); - fprintf (dump_file, " local "); - dump_eaf_flags (dump_file, flags | past, true); + fprintf (dump_file, " determined: "); + dump_eaf_flags (dump_file, flags, true); } if (!(flags & EAF_UNUSED)) flags |= past; @@ -2561,7 +2581,7 @@ analyze_parms (modref_summary *summary, modref_summary_lto *summary_lto, fprintf (dump_file, " Retslot flags combined with IPA pass:"); dump_eaf_flags (dump_file, past, false); - fprintf (dump_file, " local "); + fprintf (dump_file, " determined: "); dump_eaf_flags (dump_file, flags, true); } if (!(flags & EAF_UNUSED)) @@ -2591,7 +2611,7 @@ analyze_parms (modref_summary *summary, modref_summary_lto *summary_lto, fprintf (dump_file, " Static chain flags combined with IPA pass:"); dump_eaf_flags (dump_file, past, false); - fprintf (dump_file, " local "); + fprintf (dump_file, " determined: "); dump_eaf_flags (dump_file, flags, true); } if (!(flags & EAF_UNUSED)) @@ -4503,27 +4523,7 @@ modref_merge_call_site_flags (escape_summary *sum, if (fnspec_sum) { attr_fnspec fnspec (fnspec_sum->fnspec); - int fnspec_flags = 0; - - if (fnspec.arg_specified_p (ee->arg)) - { - if (!fnspec.arg_used_p (ee->arg)) - fnspec_flags = EAF_UNUSED; - else - { - if (fnspec.arg_direct_p (ee->arg)) - fnspec_flags |= EAF_NO_INDIRECT_READ - | EAF_NO_INDIRECT_ESCAPE - | EAF_NOT_RETURNED_INDIRECTLY - | EAF_NO_INDIRECT_CLOBBER; - if (fnspec.arg_noescape_p (ee->arg)) - fnspec_flags |= EAF_NO_DIRECT_ESCAPE - | EAF_NO_INDIRECT_ESCAPE; - if (fnspec.arg_readonly_p (ee->arg)) - flags |= EAF_NO_DIRECT_CLOBBER | EAF_NO_INDIRECT_CLOBBER; - } - } - implicit_flags |= fnspec_flags; + implicit_flags |= fnspec.arg_eaf_flags (ee->arg); } if (!ee->direct) implicit_flags = deref_flags (implicit_flags, ignore_stores);