From patchwork Fri Feb 9 10:26:21 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 85508 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 09C543858404 for ; Fri, 9 Feb 2024 10:26:49 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.223.130]) by sourceware.org (Postfix) with ESMTPS id C3A3B3858C35 for ; Fri, 9 Feb 2024 10:26:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org C3A3B3858C35 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de ARC-Filter: OpenARC Filter v1.0.0 sourceware.org C3A3B3858C35 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=195.135.223.130 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1707474384; cv=none; b=u56f/3e/UzRFh+xEwIfcFD44mlC6jtiWUp2LAlHa+IiYxnIuYT4D4y5fmNy2GOi91vql5mPHjC4d3tlkoOeTmZx26paAXPN6qrDXpuDuF1kxVQ8n/Q+T4vykkJls4Cv+aTUUX0uL9hKaYOG0wUhJY5BwFfw082mbr5KRB8Ynl0Y= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1707474384; c=relaxed/simple; bh=QfMEfY59tkfCPkMpu9LDiklkixLEuylpEtqayHFF10M=; h=DKIM-Signature:DKIM-Signature:DKIM-Signature:DKIM-Signature:Date: From:To:Subject:MIME-Version; b=eIyfUW0BGyzibcaxUtPw4oZ/RxgSdVYneX9jJDshZ9tj2j0bi1dRp12Y0lMxyv26qgCeLkQUGzGT5vBgDzMMZ1GXEiY9RNAhexbo+UVWDdVX4lFsb2iWE2/6O8IcJsNFHyYKlNBvP+FUyoDFV+sXcCrIEs88r/gQ04VPez8kGNI= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from [10.168.4.150] (unknown [10.168.4.150]) (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 smtp-out1.suse.de (Postfix) with ESMTPS id 9F8FC21FB1; Fri, 9 Feb 2024 10:26:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1707474381; h=from:from:reply-to:date:date:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=a66MEbC0GnZ9QmebDxs/4SuvqbLXGNjfnQ4g2sDHmWk=; b=zSsWoXCK+Yr68rwrbF8d5fEHK3vpdYDeLqCGvkTqfMoify6f9xNq+NGAIUIM1CO+LLkNY3 BNgDeASMSFc8oHaONCe1Dc7OoPD1Zr9fprSZ8W+rAoBRLdrkIwRFwTtCBWaKFcLH8xD+3e PnQka9kw7RePJIv4ZWFgdpCaESxMuHo= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1707474381; h=from:from:reply-to:date:date:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=a66MEbC0GnZ9QmebDxs/4SuvqbLXGNjfnQ4g2sDHmWk=; b=Bjgv+pUO+TSOzlP1SHe9cHJVHlvqfmIR1pcyWB4V7M6FF6Xpr1LdnLlVIdSPg1XTQhykAU 8rI3zVWNaliaVQCw== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1707474381; h=from:from:reply-to:date:date:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=a66MEbC0GnZ9QmebDxs/4SuvqbLXGNjfnQ4g2sDHmWk=; b=zSsWoXCK+Yr68rwrbF8d5fEHK3vpdYDeLqCGvkTqfMoify6f9xNq+NGAIUIM1CO+LLkNY3 BNgDeASMSFc8oHaONCe1Dc7OoPD1Zr9fprSZ8W+rAoBRLdrkIwRFwTtCBWaKFcLH8xD+3e PnQka9kw7RePJIv4ZWFgdpCaESxMuHo= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1707474381; h=from:from:reply-to:date:date:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=a66MEbC0GnZ9QmebDxs/4SuvqbLXGNjfnQ4g2sDHmWk=; b=Bjgv+pUO+TSOzlP1SHe9cHJVHlvqfmIR1pcyWB4V7M6FF6Xpr1LdnLlVIdSPg1XTQhykAU 8rI3zVWNaliaVQCw== Date: Fri, 9 Feb 2024 11:26:21 +0100 (CET) From: Richard Biener To: gcc-patches@gcc.gnu.org cc: jeffreyalaw@gmail.com Subject: [PATCH] rtl-optimization/113597 - recover base term for argument pointers MIME-Version: 1.0 Authentication-Results: smtp-out1.suse.de; none X-Spamd-Result: default: False [-0.60 / 50.00]; ARC_NA(0.00)[]; FROM_HAS_DN(0.00)[]; FREEMAIL_ENVRCPT(0.00)[gmail.com]; TO_MATCH_ENVRCPT_ALL(0.00)[]; MIME_GOOD(-0.10)[text/plain]; TO_DN_NONE(0.00)[]; MISSING_MID(2.50)[]; DKIM_SIGNED(0.00)[suse.de:s=susede2_rsa,suse.de:s=susede2_ed25519]; RCPT_COUNT_TWO(0.00)[2]; FUZZY_BLOCKED(0.00)[rspamd.com]; RCVD_COUNT_ZERO(0.00)[0]; FROM_EQ_ENVFROM(0.00)[]; MIME_TRACE(0.00)[0:+]; FREEMAIL_CC(0.00)[gmail.com]; BAYES_HAM(-3.00)[100.00%] X-Spam-Level: X-Spam-Score: -0.60 X-Spam-Status: No, score=-10.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, MISSING_MID, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Message-Id: <20240209102649.09C543858404@sourceware.org> The following allows a base term to be derived from an existing MEM_EXPR, notably the points-to set of a MEM_REF base. For the testcase in the PR this helps RTL DSE elide stores to a stack temporary. This covers pointers to NONLOCAL which can be mapped to arg_base_value, helping to disambiguate against other special bases (ADDRESS) as well as PARM_DECL accesses. Bootstrapped and tested on x86_64-unknown-linux-gnu. This is an attempt to recover some of the losses from dumbing down find_base_{term,value}. I did give my ideas how to properly do this during stage1 a start, I will post a short incomplete RFC series later today. OK for trunk? I've included all languages in testing and also tested with -m32 but details of RTL alias analysis might escape me ... Thanks, Richard. PR rtl-optimization/113597 * alias.cc (find_base_term): Add argument for the whole mem and derive a base term from its MEM_EXPR. (true_dependence_1): Pass down the MEMs to find_base_term. (write_dependence_p): Likewise. (may_alias_p): Likewise. --- gcc/alias.cc | 43 ++++++++++++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/gcc/alias.cc b/gcc/alias.cc index 6fad4b29d31..e33c56b0e80 100644 --- a/gcc/alias.cc +++ b/gcc/alias.cc @@ -40,6 +40,9 @@ along with GCC; see the file COPYING3. If not see #include "rtl-iter.h" #include "cgraph.h" #include "ipa-utils.h" +#include "stringpool.h" +#include "value-range.h" +#include "tree-ssanames.h" /* The aliasing API provided here solves related but different problems: @@ -190,6 +193,10 @@ static struct { arguments, since we do not know at this level whether accesses based on different arguments can alias. The ADDRESS has id 0. + This is solely useful to disambiguate against other ADDRESS + bases as we know incoming pointers cannot point to local + stack, frame or argument space. + 2. stack_pointer_rtx, frame_pointer_rtx, hard_frame_pointer_rtx (if distinct from frame_pointer_rtx) and arg_pointer_rtx. Each of these rtxes has a separate ADDRESS associated with it, @@ -2113,12 +2120,34 @@ find_base_term (rtx x, vec, 32> visited_vals; rtx res = find_base_term (x, visited_vals); for (unsigned i = 0; i < visited_vals.length (); ++i) visited_vals[i].first->locs = visited_vals[i].second; + if (!res && mem && MEM_EXPR (mem)) + { + tree base = get_base_address (MEM_EXPR (mem)); + if (TREE_CODE (base) == PARM_DECL + && DECL_RTL_SET_P (base)) + /* We need to look at how we expanded a PARM_DECL. It might be in + the argument space (UNIQUE_BASE_VALUE_ARGP) or it might + be spilled (UNIQUE_BASE_VALUE_FP/UNIQUE_BASE_VALUE_HFP). */ + res = find_base_term (DECL_RTL (base)); + else if (TREE_CODE (base) == MEM_REF + && TREE_CODE (TREE_OPERAND (base, 0)) == SSA_NAME + && SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0))) + { + auto pt = &SSA_NAME_PTR_INFO (TREE_OPERAND (base, 0))->pt; + if (pt->nonlocal + && !pt->anything + && !pt->escaped + && !pt->ipa_escaped + && bitmap_empty_p (pt->vars)) + res = arg_base_value; + } + } return res; } @@ -3035,13 +3064,13 @@ true_dependence_1 (const_rtx mem, machine_mode mem_mode, rtx mem_addr, if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x)) return true; - base = find_base_term (x_addr); + base = find_base_term (x_addr, x); if (base && (GET_CODE (base) == LABEL_REF || (GET_CODE (base) == SYMBOL_REF && CONSTANT_POOL_ADDRESS_P (base)))) return false; - rtx mem_base = find_base_term (true_mem_addr); + rtx mem_base = find_base_term (true_mem_addr, mem); if (! base_alias_check (x_addr, base, true_mem_addr, mem_base, GET_MODE (x), mem_mode)) return false; @@ -3142,7 +3171,7 @@ write_dependence_p (const_rtx mem, if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x)) return true; - base = find_base_term (true_mem_addr); + base = find_base_term (true_mem_addr, mem); if (! writep && base && (GET_CODE (base) == LABEL_REF @@ -3150,7 +3179,7 @@ write_dependence_p (const_rtx mem, && CONSTANT_POOL_ADDRESS_P (base)))) return false; - rtx x_base = find_base_term (true_x_addr); + rtx x_base = find_base_term (true_x_addr, x); if (! base_alias_check (true_x_addr, x_base, true_mem_addr, base, GET_MODE (x), GET_MODE (mem))) return false; @@ -3265,8 +3294,8 @@ may_alias_p (const_rtx mem, const_rtx x) if (MEM_ADDR_SPACE (mem) != MEM_ADDR_SPACE (x)) return true; - rtx x_base = find_base_term (x_addr); - rtx mem_base = find_base_term (mem_addr); + rtx x_base = find_base_term (x_addr, x); + rtx mem_base = find_base_term (mem_addr, mem); if (! base_alias_check (x_addr, x_base, mem_addr, mem_base, GET_MODE (x), GET_MODE (mem_addr))) return false;